[
  {
    "path": ".gitignore",
    "content": "lib/*\nobj/*\n"
  },
  {
    "path": "Make.bat",
    "content": "echo off\n\nset SRCDIR=libc\nset OBJDIR=obj\nset LIBDIR=lib\n\nset CC=bin\\gbdk-n-compile.bat\nset CA=bin\\gbdk-n-assemble.bat\n\n:: Build examples\nif \"%1\"==\"examples\" (\n\tcd examples\n\techo Building: galaxy && cd galaxy && call Make.bat\n\techo. && echo Building: paint && cd ../paint && call Make.bat\n\techo. && echo Building: space && cd ../space && call Make.bat\n\techo. && echo Building: thumby && cd ../thumby && call Make.bat\n\tcd ..\\..\n\tgoto end\n)\n\n:: Clean libc + examples\nif \"%1\"==\"clean\" (\n\techo Cleaning: libc\n\n\tif exist %OBJDIR% rd /s/q %OBJDIR%\n\tif exist %LIBDIR% rd /s/q %LIBDIR%\n\t\n\tcd examples\n\techo Cleaning: galaxy && cd galaxy && call Make.bat clean\n\techo Cleaning: paint && cd ..\\paint && call Make.bat clean\n\techo Cleaning: space && cd ..\\space && call Make.bat clean\n\techo Cleaning: thumby && cd ..\\thumby && call Make.bat clean\n\tcd ..\\..\n\techo.\n\tgoto end\n)\n\n:: Build libc sources\nif not exist %OBJDIR% md %OBJDIR%\n\necho Building gb.lib && echo.\n\nfor %%A in (%SRCDIR%\\*.c) do (\n\tif exist %OBJDIR%\\%%~nA.rel del %OBJDIR%\\%%~nA.rel\n\techo Compiling: %%~nxA && call %CC% %SRCDIR%\\%%~nA.c -o %OBJDIR%\\%%~nA.rel\n\tif not exist %OBJDIR%\\%%~nA.rel echo. && echo Build failed! && echo. && pause && goto end\n)\nfor %%A in (%SRCDIR%\\*.s) do (\n\tif exist %OBJDIR%\\%%~nA.rel del %OBJDIR%\\%%~nA.rel\n\techo Assembling: %%~nxA && call %CA% %OBJDIR%\\%%~nA.rel %SRCDIR%\\%%~nA.s\n\tif not exist %OBJDIR%\\%%~nA.rel echo. && echo Build failed! && echo. && pause && goto end\n)\n\nif not exist %LIBDIR% md %LIBDIR%\nif exist %LIBDIR%\\crt0.rel del %LIBDIR%\\crt0.rel\ncopy /b/v/y %OBJDIR%\\crt0.rel %LIBDIR%\\crt0.rel\n\n:: Write list of inputs for the library\nif exist %LIBDIR%\\gb.lib del %LIBDIR%\\gb.lib\nfor %%A in (%OBJDIR%\\*.rel) do (\n\tsdar -qv %LIBDIR%\\gb.lib %%A\n)\n\necho.\nif not exist %LIBDIR%\\gb.lib (\n\techo Build failed!\n) else (\n\techo Build succeeded!\n)\necho.\n\n:end"
  },
  {
    "path": "Makefile",
    "content": "SRCDIR=./libc\nOBJDIR=./obj\nLIBDIR=./lib\n\nCC=bin/gbdk-n-compile.sh\nCA=bin/gbdk-n-assemble.sh\n\n.PHONY: lib\nlib: $(LIBDIR)/gb.lib $(LIBDIR)/crt0.rel\n\n$(LIBDIR)/gb.lib: $(LIBDIR)/crt0.rel\n\tsdar -qv $(LIBDIR)/gb.lib $(OBJDIR)/*.rel\n\n$(LIBDIR)/crt0.rel:\n\tchmod u+x bin/*\n\tmkdir -p $(OBJDIR)\n\t$(CC) $(SRCDIR)/digits.c -o $(OBJDIR)/digits.rel\n\t$(CC) $(SRCDIR)/gprint.c -o $(OBJDIR)/gprint.rel\n\t$(CC) $(SRCDIR)/gprintf.c -o $(OBJDIR)/gprintf.rel\n\t$(CC) $(SRCDIR)/gprintln.c -o $(OBJDIR)/gprintln.rel\n\t$(CC) $(SRCDIR)/gprintn.c -o $(OBJDIR)/gprintn.rel\n\n\t$(CA) $(OBJDIR)/arand.rel $(SRCDIR)/arand.s\n\t$(CA) $(OBJDIR)/cgb.rel $(SRCDIR)/cgb.s\n\t$(CA) $(OBJDIR)/cpy_data.rel $(SRCDIR)/cpy_data.s\n\t$(CA) $(OBJDIR)/delay.rel $(SRCDIR)/delay.s\n\t$(CA) $(OBJDIR)/drawing.rel $(SRCDIR)/drawing.s\n\t$(CA) $(OBJDIR)/f_ibm_sh.rel $(SRCDIR)/f_ibm_sh.s\n\t$(CA) $(OBJDIR)/f_italic.rel $(SRCDIR)/f_italic.s\n\t$(CA) $(OBJDIR)/f_min.rel $(SRCDIR)/f_min.s\n\t$(CA) $(OBJDIR)/font.rel $(SRCDIR)/font.s\n\t$(CA) $(OBJDIR)/f_spect.rel $(SRCDIR)/f_spect.s\n\t$(CA) $(OBJDIR)/get_bk_t.rel $(SRCDIR)/get_bk_t.s\n\t$(CA) $(OBJDIR)/get_data.rel $(SRCDIR)/get_data.s\n\t$(CA) $(OBJDIR)/get_prop.rel $(SRCDIR)/get_prop.s\n\t$(CA) $(OBJDIR)/get_spr.rel $(SRCDIR)/get_spr.s\n\t$(CA) $(OBJDIR)/get_wi_t.rel $(SRCDIR)/get_wi_t.s\n\t$(CA) $(OBJDIR)/get_xy_t.rel $(SRCDIR)/get_xy_t.s\n\t$(CA) $(OBJDIR)/global.rel $(SRCDIR)/global.s\n\t$(CA) $(OBJDIR)/hiramcpy.rel $(SRCDIR)/hiramcpy.s\n\t$(CA) $(OBJDIR)/ibmfixed.rel $(SRCDIR)/ibmfixed.s\n\t$(CA) $(OBJDIR)/init_tt.rel $(SRCDIR)/init_tt.s\n\t$(CA) $(OBJDIR)/input.rel $(SRCDIR)/input.s\n\t$(CA) $(OBJDIR)/mv_bkg.rel $(SRCDIR)/mv_bkg.s\n\t$(CA) $(OBJDIR)/mv_spr.rel $(SRCDIR)/mv_spr.s\n\t$(CA) $(OBJDIR)/mv_win.rel $(SRCDIR)/mv_win.s\n\t$(CA) $(OBJDIR)/pad.rel $(SRCDIR)/pad.s\n\t$(CA) $(OBJDIR)/rand.rel $(SRCDIR)/rand.s\n\t$(CA) $(OBJDIR)/sample.rel $(SRCDIR)/sample.s\n\t$(CA) $(OBJDIR)/scroll_b.rel $(SRCDIR)/scroll_b.s\n\t$(CA) $(OBJDIR)/scroll_s.rel $(SRCDIR)/scroll_s.s\n\t$(CA) $(OBJDIR)/scroll_w.rel $(SRCDIR)/scroll_w.s\n\t$(CA) $(OBJDIR)/serial.rel $(SRCDIR)/serial.s\n\t$(CA) $(OBJDIR)/set_bk_t.rel $(SRCDIR)/set_bk_t.s\n\t$(CA) $(OBJDIR)/set_data.rel $(SRCDIR)/set_data.s\n\t$(CA) $(OBJDIR)/set_prop.rel $(SRCDIR)/set_prop.s\n\t$(CA) $(OBJDIR)/set_spr.rel $(SRCDIR)/set_spr.s\n\t$(CA) $(OBJDIR)/set_wi_t.rel $(SRCDIR)/set_wi_t.s\n\t$(CA) $(OBJDIR)/set_xy_t.rel $(SRCDIR)/set_xy_t.s\n\t$(CA) $(OBJDIR)/sfr.rel $(SRCDIR)/sfr.s\n\t$(CA) $(OBJDIR)/sgb.rel $(SRCDIR)/sgb.s\n\t$(CA) $(OBJDIR)/crt0.rel $(SRCDIR)/crt0.s\n\n\tmkdir -p $(LIBDIR)\n\tcp $(OBJDIR)/crt0.rel $(LIBDIR)/\n\n\n.PHONY: examples\nexamples: lib\n\t$(MAKE) -C examples/galaxy\n\t$(MAKE) -C examples/space\n\t$(MAKE) -C examples/thumby\n\t$(MAKE) -C examples/paint\n\n.PHONY: clean\nclean:\n\trm -rf $(OBJDIR)/*\n\trm -rf $(LIBDIR)/*\n\t$(MAKE) -C examples/galaxy clean\n\t$(MAKE) -C examples/space clean\n\t$(MAKE) -C examples/thumby clean\n\t$(MAKE) -C examples/paint clean\n"
  },
  {
    "path": "README.md",
    "content": "# gbdk-n\n\n#### Background\n\nThe Gameboy Development Kit (GBDK) is an SDK for developing applications/games for the gameboy platform. The library bundles a custom version of the Small Device C Compiler (SDCC), libraries & examples.\n\nThe latest update of GBDK was a long time ago (mid 2002). Since then the SDCC compiler has gotten native support for compiling and linking fully functional gameboy roms. \n\nHowever GBDK is still useful since it contains libraries for developing applications for the gameboy family. This project aims to update the libraries to be compatible with new versions of SDCC and provide helpers for building roms.\n\nThe GBDK libraries are copied from the latest source release on sourceforge: http://sourceforge.net/projects/gbdk/files/gbdk/2.96/\n\n#### Usage\n\n##### Building the library:\n`$ make`\n\n##### Building the examples:\n`$ make examples`\n\n##### Building custom ROMs:\nNOTE: All commands listed below are simply wrappers to SDCC, see the SDCC documentation for flags and general usage.\n\n* Compile / assemble .c files and .asm files into .rel files using the gbdk-n-compile.sh and gbdk-n-assemble.sh commands respectively.\n* Link together one or more .rel files into an .ihx file using the gbdk-n-link.sh command.\n* Create a ready to use .gb rom file from the .ihx file with the gbdk-n-make-rom.sh command.\n\nFor exact commands, please see the Makefiles for the example programs.\n"
  },
  {
    "path": "bin/gbdk-n-assemble.bat",
    "content": "set GBDK_DIR=%~dp0..\n\nsdasgb -plosgff -I\"libc\" %*\n"
  },
  {
    "path": "bin/gbdk-n-assemble.sh",
    "content": "#!/bin/sh\n\nGBDK_DIR=\"$( cd \"$( dirname \"$0\" )\" && pwd )/..\"\n\nset -x\n\nsdasgb -plosgff -I\"libc\" \"$@\"\n"
  },
  {
    "path": "bin/gbdk-n-compile.bat",
    "content": "set GBDK_DIR=%~dp0..\n\nsdcc -mgbz80 --no-std-crt0 -I \"%GBDK_DIR%\\include\" -I \"%GBDK_DIR%\\include\\asm\" -c %*"
  },
  {
    "path": "bin/gbdk-n-compile.sh",
    "content": "#!/bin/sh\n\nGBDK_DIR=\"$( cd \"$( dirname \"$0\" )\" && pwd )/..\"\n\nset -x\n  \nsdcc -mgbz80 --no-std-crt0 -I \"$GBDK_DIR/include\" -I \"$GBDK_DIR/include/asm\" -c \"$@\"\n"
  },
  {
    "path": "bin/gbdk-n-link.bat",
    "content": "set GBDK_DIR=%~dp0..\n  \nsdcc -mgbz80 --no-std-crt0 --data-loc 0xc0a0 -L \"%GBDK_DIR%\\lib\" \"%GBDK_DIR%\\lib\\crt0.rel\" gb.lib -o a.ihx %*\n"
  },
  {
    "path": "bin/gbdk-n-link.sh",
    "content": "#!/bin/sh\n\nGBDK_DIR=\"$( cd \"$( dirname \"$0\" )\" && pwd )/..\"\n\nset -x\n  \nsdcc -mgbz80 --no-std-crt0 --data-loc 0xc0a0 -L \"$GBDK_DIR/lib\" \"$GBDK_DIR/lib/crt0.rel\" gb.lib -o a.ihx \"$@\"\n"
  },
  {
    "path": "bin/gbdk-n-make-rom.bat",
    "content": "makebin -Z %*\n"
  },
  {
    "path": "bin/gbdk-n-make-rom.sh",
    "content": "#!/bin/sh\n\nset -x\n\nmakebin -Z \"$@\"\n"
  },
  {
    "path": "examples/galaxy/Make.bat",
    "content": "echo off\nset BIN=..\\..\\bin\nset OBJ=obj\n\nif \"%1\"==\"clean\" (\n\tif exist %OBJ% rd /s/q %OBJ%\n\tif exist galaxy.gb del galaxy.gb\n\tgoto end\n)\n\nif not exist %OBJ% mkdir %OBJ%\ncall %BIN%\\gbdk-n-compile.bat galaxy.c -o %OBJ%\\galaxy.rel\ncall %BIN%\\gbdk-n-link.bat %OBJ%\\galaxy.rel -o %OBJ%\\galaxy.ihx\ncall %BIN%\\gbdk-n-make-rom.bat %OBJ%\\galaxy.ihx galaxy.gb\n\n:end\n"
  },
  {
    "path": "examples/galaxy/Makefile",
    "content": "BIN=../../bin\nOBJ=./obj\n\n\n\nbuild:\n\tmkdir -p $(OBJ)\n\t$(BIN)/gbdk-n-compile.sh galaxy.c -o $(OBJ)/galaxy.rel\n\t$(BIN)/gbdk-n-link.sh $(OBJ)/galaxy.rel -o $(OBJ)/galaxy.ihx\n\t$(BIN)/gbdk-n-make-rom.sh $(OBJ)/galaxy.ihx galaxy.gb\n\nclean:\n\trm -rf $(OBJ)\n\trm -f galaxy.gb\n"
  },
  {
    "path": "examples/galaxy/galaxy.c",
    "content": "/*\n * C version of the 'space' assembly demo.\n *\n * Little demo illustrating how to use the graphical possibilities\n *  of the GB (background, window and animated sprite)\n * I have used fixed-point values for both the position and\n *  speed of objects to get smooth movements\n * \n * OBJ data             : 0x8000 -> 0x8FFF (unsigned)\n * Window data          : 0x8800 -> 0x97FF (unsigned)\n * Background data      : 0x8800 -> 0x97FF (signed)\n * \n * Tiled 0xFC -> 0xFF are standard tiles (all black -> all white)\n * \n * Keys:\n * Arrow keys           : Change the speed (and direction) of the sprite\n * Arrow keys + A       : Change the speed (and direction) of the window\n * Arrow keys + B       : Change the speed (and direction) of the background\n * START                : Open/close the door\n * SELECT               : Basic fading effect\n * \n * Note that the window is kept in the lower right part of the screen\n * since it can't be made transparent\n */\n\n#include <gb/gb.h>\n\nconst unsigned char std_data[] = {\n\n  /* Basic tiles (0xFC to 0xFF) */\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,\n  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n};\n\nconst unsigned char earth_data[] = {\n\n  /* Tile 0x00 */\n  0x07,0x07,0x18,0x1F,0x32,0x2D,0x71,0x4E,0x70,0x4F,0xF8,0x87,0xF8,0x87,0xF8,0x87,\n  0xFC,0x83,0xFE,0x81,0x7F,0x40,0x7F,0x40,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0xF0,0x30,0x78,0x88,0x3C,0xC4,0x5C,0xA4,0x9E,0x62,0x3E,0xC2,0x3E,0xC2,\n  0x5E,0xA2,0x7E,0x82,0x0C,0xF4,0x0C,0xF4,0x98,0x68,0xB0,0x70,0xC0,0xC0,0x00,0x00,\n  0x07,0x07,0x1F,0x18,0x2F,0x30,0x4F,0x70,0x6F,0x50,0x9F,0xE0,0x9F,0xE0,0xBF,0xC0,\n  0xFF,0x80,0xB7,0xC8,0x63,0x5C,0x43,0x7C,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0xB0,0x70,0x18,0xE8,0x0C,0xF4,0x0C,0xF4,0x82,0x7E,0x82,0x7E,0x86,0x7A,\n  0xC6,0x3A,0xE6,0x1A,0xF4,0x0C,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,\n\n  /* Tile 0x08 */\n  0x07,0x07,0x1E,0x19,0x20,0x3F,0x40,0x7F,0x42,0x7D,0x81,0xFE,0x81,0xFE,0x83,0xFC,\n  0xD7,0xA8,0xBB,0xC4,0x6E,0x51,0x7C,0x43,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0x70,0xB0,0xE8,0x18,0xF4,0x0C,0xF4,0x0C,0xFE,0x02,0xFE,0x02,0xFE,0x02,\n  0xFE,0x02,0x7E,0x82,0x3C,0xC4,0x3C,0xC4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,\n  0x07,0x07,0x1B,0x1C,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xE0,0x9F,0x90,0xEF,0x89,0xF6,\n  0x8D,0xF2,0x9F,0xE0,0x5E,0x61,0x6F,0x50,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0xB0,0x70,0x28,0xD8,0x04,0xFC,0x2C,0xD4,0x1E,0xE2,0x1E,0xE2,0x3E,0xC2,\n  0x7E,0x82,0xB6,0x4A,0xE4,0x1C,0xC4,0x3C,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,\n\n  /* Tile 0x10 */\n  0x07,0x07,0x18,0x1F,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xEE,0x91,0xF1,0x8E,0xE0,0x9F,\n  0xE0,0x9F,0xF1,0x8E,0x71,0x4E,0x72,0x4D,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0xF0,0x30,0x08,0xF8,0x04,0xFC,0x04,0xFC,0x02,0xFE,0x02,0xFE,0x92,0x6E,\n  0xD6,0x2A,0xFE,0x02,0xEC,0x14,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,\n  0x07,0x07,0x1D,0x1A,0x36,0x29,0x5C,0x63,0x6C,0x53,0xCE,0xB1,0x9F,0xE0,0x9E,0xE1,\n  0xAE,0xD1,0xBF,0xC0,0x47,0x78,0x47,0x78,0x2F,0x30,0x1F,0x18,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0x70,0xB0,0x08,0xF8,0x04,0xFC,0x04,0xFC,0xE2,0x1E,0x32,0xCE,0x0E,0xF2,\n  0x0E,0xF2,0x1E,0xE2,0x1C,0xE4,0x2C,0xD4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00,\n\n  /* Tile 0x18 */\n  0x07,0x07,0x1E,0x19,0x33,0x2C,0x49,0x76,0x42,0x7D,0xC4,0xBB,0xC1,0xBE,0xC1,0xBE,\n  0xE2,0x9D,0xF3,0x8C,0x78,0x47,0x78,0x47,0x3C,0x23,0x1C,0x1B,0x07,0x07,0x00,0x00,\n  0xC0,0xC0,0x70,0xB0,0x68,0x98,0xC4,0x3C,0xC4,0x3C,0xEE,0x12,0xF2,0x0E,0xE2,0x1E,\n  0xE2,0x1E,0xF2,0x0E,0x7C,0x84,0x7C,0x84,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n};\n\nconst unsigned char frame_data[] = {\n\n  /* Tile 0x00 */\n  0xFF,0x00,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,\n  0xFF,0x00,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0x7F,0x80,\n  0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0x7F,\n  0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,\n  0xFF,0x00,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F,\n  0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x00,\n  0xFF,0x70,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0xFF,0x70,0xFF,0x00,0xFF,0x00,0xFF,0x01,\n  0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0xFF,0xFF,\n\n  /* Tile 0x08 */\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,\n  0x00,0xFF,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0xFF,0xFF,\n  0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,\n  0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFE,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0xFF,\n  0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,\n  0xFF,0x01,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F,\n  0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,\n  0x01,0xFF,0x01,0xFF,0x03,0xFD,0x07,0xF9,0x0F,0xF1,0x1F,0xE1,0x3F,0xC1,0x7F,0x81,\n\n  /* Tile 0x10 */\n  0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,\n  0x01,0xFF,0x01,0xFE,0x03,0xFC,0x77,0xF8,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0x7F,0xF0,\n  0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFF,0x0E,\n  0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x7F,\n  0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0xFF,0xFF,\n\n  /* Door1 */\n\n  /* Tile 0x15 */\n  0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,\n  0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,\n\n  /* Door2 */\n\n  /* Tile 0x18 */\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,\n  0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,\n  0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,\n  0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n\n  /* Door3 */\n\n  /* Tile 0x1C */\n  0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,\n  0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,\n  0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n\n  /* Door4 */\n\n  /* Tile 0x20 */\n  0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n};\n\nconst unsigned char bkg_data[] = {\n\n  /* Tile 0x00 */\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFE,0xFF,\n\n  /* Tile 0x08 */\n  0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7D,0xFE,0x7C,0x39,\n  0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFD,\n  0xBB,0x01,0xC7,0x83,0xC7,0x83,0xC7,0x83,0xBB,0x01,0x7C,0x39,0x7D,0xFE,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,\n  0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,0xAF,0x77,0x27,0x8F,0xDF,0x8F,0x27,0x8F,\n\n  /* Tile 0x10 */\n  0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFB,0xFF,0xF7,0xEF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xBF,0xFF,0xDF,0xEF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xAF,0x77,0xFF,0xFB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,\n\n  /* Tile 0x18 */\n  0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7D,0xFE,0x7C,0x39,\n  0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFD,\n\n  /* Tile 0x20 */\n  0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFE,0xFD,0xFD,0xFE,0xFE,0xFF,\n  0xAB,0x11,0xC7,0x83,0x83,0xC7,0xC7,0x83,0xAB,0x11,0x7C,0x39,0x7D,0xFE,0xFE,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x7F,\n  0xFB,0xFF,0xFF,0xFD,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xFD,0xFB,0xFF,0xFF,0xFF,\n  0xEF,0xFF,0xFF,0xDF,0x3F,0xBF,0x3F,0x7F,0x3F,0xBF,0xFF,0xDF,0xEF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFD,0xFE,0xFE,0xFD,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,\n\n  /* Tile 0x28 */\n  0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n  0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n};\n\n/*\n * Image size: 0x40 x 0x40\n * Number of tiles (total - unique): 0x40 - 0x2D\n */\n\nconst unsigned char bkg_tiles[] = {\n  0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC,\n  0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A,\n  0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC,\n  0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14,\n  0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC,\n  0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20,\n  0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26,\n  0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n};\n\n/*\n * Image size: 0x10 x 0x70\n * Number of tiles (total - unique): 0x1C - 0x1C\n */\n\nconst unsigned char earth_tiles[] = {\n  0x00,0x02,\n  0x04,0x06,\n  0x08,0x0A,\n  0x0C,0x0E,\n  0x10,0x12,\n  0x14,0x16,\n  0x18,0x1A\n};\n\n/*\n * Image size: 0x80 x 0x50\n * Number of tiles (total - unique): 0xA0 - 0x15\n */\n\nconst unsigned char frame_tiles[] = {\n  0x80,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x84,\n  0x85,0x86,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x8B,0x8C,\n  0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F,\n  0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90,\n  0x8E,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x8D,\n  0x85,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x82,0x8C,\n  0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F,\n  0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90,\n  0x8E,0x91,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0x92,0x8D,\n  0x93,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x94\n};\n\n/*\n * Image size: 0x60 x 0x30\n * Number of tiles (total - unique): 0x48 - 0x03\n */\n\nconst unsigned char door1_tiles[] = {\n  0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,\n  0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,\n  0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\n  0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,\n  0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,\n  0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\n\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n};\n\n/*\n * Image size: 0x60 x 0x30\n * Number of tiles (total - unique): 0x48 - 0x04\n */\n\nconst unsigned char door2_tiles[] = {\n  0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,\n  0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\n  0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,\n  0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,\n  0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,\n  0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,\n\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n};\n\n/*\n * Image size: 0x60 x 0x30\n * Number of tiles (total - unique): 0x48 - 0x04\n */\n\nconst unsigned char door3_tiles[] = {\n  0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,\n  0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,\n  0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,\n  0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,\n  0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,\n  0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,\n\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n};\n\n/*\n * Image size: 0x60 x 0x30\n * Number of tiles (total - unique): 0x48 - 0x01\n */\n\nconst unsigned char door4_tiles[] = {\n  0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,\n  0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,\n  0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,\n  0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,\n  0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,\n  0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,\n\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,\n  0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n};\n\n/* Should really be const, but sdcc doesnt yet support it. */\nconst unsigned char * const film[] = {\n  &door1_tiles[0x0C*0],\n  &door2_tiles[0x0C*0],\n  &door3_tiles[0x0C*0],\n  &door4_tiles[0x0C*0],\n  &door1_tiles[0x0C*1],\n  &door2_tiles[0x0C*1],\n  &door3_tiles[0x0C*1],\n  &door4_tiles[0x0C*1],\n  &door1_tiles[0x0C*2],\n  &door2_tiles[0x0C*2],\n  &door3_tiles[0x0C*2],\n  &door4_tiles[0x0C*2],\n  &door1_tiles[0x0C*3],\n  &door2_tiles[0x0C*3],\n  &door3_tiles[0x0C*3],\n  &door4_tiles[0x0C*3],\n  &door1_tiles[0x0C*4],\n  &door2_tiles[0x0C*4],\n  &door3_tiles[0x0C*4],\n  &door4_tiles[0x0C*4],\n  &door1_tiles[0x0C*5],\n  &door2_tiles[0x0C*5],\n  &door3_tiles[0x0C*5],\n  &door4_tiles[0x0C*5],\n  &door1_tiles[0x0C*6]\n};\n\n#define NBDFRAMES 0x18                  /* Nb frames for the door */\n#define NBSFRAMES 0x07                  /* Nb frames for the sprite */\n#define WINSZX    0x80                  /* Size of the picture in the window */\n#define WINSZY    0x50\n#define MINWINX   (MAXWNDPOSX-WINSZX+1) /* Bounds of the window origin */\n#define MINWINY   (MAXWNDPOSY-WINSZY+1)\n#define MAXWINX   MAXWNDPOSX\n#define MAXWINY   MAXWNDPOSY\n#define FADESTEP  0x10                  /* Nb steps for the fading effect */\n#define STARTFADE (0x06*FADESTEP)       /* Initial value for the fading effect */\n\n#define CLOSED  0x00\n#define OPENING 0x01\n#define OPENED  0x02\n#define CLOSING 0x03\n\nstatic UBYTE time;  /* Global \"time\" value (counter) */\nUBYTE doorstate;    /* State of the door (OPENED, CLOSED...) */\nUBYTE doorpos;      /* Current position in the door animation */\nstatic UBYTE color; /* Current color for fading effect */\nUBYTE sframe;       /* Current frame of the sprite */\nfixed bposx, bposy; /* Background position (fixed point) */\nfixed bspx, bspy;   /* Background speed (fixed point) */\nfixed wposx, wposy; /* Window position (fixed point) */\nfixed wspx, wspy;   /* Window speed (fixed point) */\nfixed sposx, sposy; /* Sprite position (fixed point) */\nfixed sspx, sspy;   /* Sprite speed (fixed point) */\n\nvoid fade();\nvoid scroll();\nvoid door();\nvoid animate_sprite();\nvoid tile_sprite();\nvoid place_sprite();\n\n/* Fade the screen (off and on) */\nvoid fade()\n{\n  if(color == 0)\n    return;\n  switch(color)\n    {\n    case STARTFADE:\n    case STARTFADE-4*FADESTEP:\n      BGP_REG = 0xF9U;\n      break;\n    case STARTFADE-FADESTEP:\n    case STARTFADE-3*FADESTEP:\n      BGP_REG = 0xFEU;\n      break;\n    case STARTFADE-2*FADESTEP:\n      BGP_REG = 0xFFU;\n      break;\n    case STARTFADE-5*FADESTEP:\n      BGP_REG = 0xE4U;\n      break;\n    }\n  color--;\n}\n\n/* Scroll the background, the window and the sprite */\nvoid scroll()\n{\n  /* Update background */\n  bposx.w += bspx.w;\n  bposy.w += bspy.w;\n  SCX_REG = bposx.b.h;\n  SCY_REG = bposy.b.h;\n\n  /* Update window */\n  wposx.w += wspx.w ;\n  wposy.w += wspy.w ;\n  /* X position */\n  if(wposx.b.h >= MAXWINX) {\n    wposx.b.h = MAXWINX;\n    /* Invert speed */\n    wspx.w = -(WORD)wspx.w;\n  } else if(wposx.b.h <= MINWINX) {\n    wposx.b.h = MINWINX;\n    /* Invert speed */\n    wspx.w = -(WORD)wspx.w;\n  }\n  WX_REG = wposx.b.h;\n  /* Y position */\n  if(wposy.b.h >= MAXWINY) {\n    wposy.b.h = MAXWINY;\n    /* Invert speed */\n    wspy.w = -(WORD)wspy.w;\n  } else if(wposy.b.h <= MINWINY) {\n    wposy.b.h = MINWINY;\n    /* Invert speed */\n    wspy.w = -(WORD)wspy.w;\n  }\n  WY_REG = wposy.b.h;\n\n  /* Update sprite */\n  sposx.w += sspx.w;\n  sposy.w += sspy.w;\n  place_sprite();\n}\n\n/* Open and close the door */\nvoid door()\n{\n  if(doorstate == OPENING) {\n    doorpos++;\n    /* Draw the door in the window */\n    set_win_tiles(2, 2, 12, 6, film[doorpos]);\n    if(doorpos == NBDFRAMES)\n      doorstate = OPENED;\n  } else if(doorstate == CLOSING) {\n    doorpos--;\n    /* Draw the door in the window */\n    set_win_tiles(2, 2, 12, 6, film[doorpos]);\n    if(doorpos == 0)\n      doorstate = CLOSED;\n  }\n}\n\n/* Animate sprite */\nvoid animate_sprite()\n{\n  if((time&0x07) == 0) {\n    sframe++;\n    if(sframe == NBSFRAMES)\n      sframe = 0;\n    tile_sprite();\n  }\n}\n\n/* Set sprite tiles */\nvoid tile_sprite()\n{\n  UBYTE s;\n\n  s = sframe<<1;\n  set_sprite_tile(0, earth_tiles[s]);\n  set_sprite_tile(1, earth_tiles[s+1]);\n}\n\n/* Place sprite */\nvoid place_sprite()\n{\n  move_sprite(0, sposx.b.h, sposy.b.h);\n  move_sprite(1, sposx.b.h+8, sposy.b.h);\n}\n\nvoid main()\n{\n  UBYTE i, j;\n\n  disable_interrupts();\n  DISPLAY_OFF;\n  LCDC_REG = 0x67;\n  /*\n   * LCD        = Off\n   * WindowBank = 0x9C00\n   * Window     = On\n   * BG Chr     = 0x8800\n   * BG Bank    = 0x9800\n   * OBJ        = 8x16\n   * OBJ        = On\n   * BG         = On\n   */\n\n  doorstate = CLOSED;\n\n  /* Set palettes */\n  BGP_REG = OBP0_REG = OBP1_REG = 0xE4U;\n\n  /* Initialize the background */\n  set_bkg_data(0xFC, 0x04, std_data);\n  set_bkg_data(0x00, 0x2D, bkg_data);\n  /*\n   * Draw the background\n   *\n   * Width  = 0x100 = 0x20 * 8\n   * Height = 0x100 = 0x20 * 8\n   */\n  for(i = 0; i < 32; i+=8)\n    for(j = 0; j < 32; j+=8)\n      set_bkg_tiles(i, j, 8, 8, bkg_tiles);\n  bposx.w = 0;\n  SCX_REG = 0;\n  bposy.w = 0;\n  SCY_REG = 0;\n  bspx.w = 0xFF00;\n  bspy.w = 0x0080;\n\n  /* Initialize the window */\n  set_win_data(0x80, 0x21, frame_data);\n  /*\n   * Draw the frame in the window\n   *\n   * Width  = 0x80 = 0x10 * 8\n   * Height = 0x50 = 0x0A * 8\n   */\n  set_win_tiles(0, 0, 16, 10, frame_tiles);\n  /*\n   * Draw the door in the window\n   *\n   * Width  = 0x60 = 0x20 * 12\n   * Height = 0x30 = 0x20 * 6\n   */\n  set_win_tiles(2, 2, 12, 6, door1_tiles);\n  wposx.b.h = MAXWNDPOSX;\n  wposx.b.l = 0;\n  WX_REG = MAXWNDPOSX;\n  wposy.b.h = MAXWNDPOSY;\n  wposy.b.l = 0;\n  WY_REG = MAXWNDPOSY;\n  wspx.w = 0xFF80;\n  wspy.w = 0xFFC0;\n\n  /* Initialize the sprite */\n  set_sprite_data(0x00, 0x1C, earth_data);\n  set_sprite_prop(0, 0x00);\n  set_sprite_prop(1, 0x00);\n  sframe = 0;\n  sposx.w  = 0x1000;\n  sposy.w  = 0x1000;\n  sspx.w  = 0x0040;\n  sspy.w  = 0x0040;\n  tile_sprite();\n  place_sprite();\n\n  DISPLAY_ON;\n  enable_interrupts();\n\n  while(1) {\n    /* Skip four VBLs (slow down animation) */\n    for(i = 0; i < 4; i++)\n      wait_vbl_done();\n    time++;\n    fade();\n    door();\n    scroll();\n    animate_sprite();\n    i = joypad();\n    if(i & J_B) {\n      if(i & J_UP)\n\tbspy.w -= 0x0010;\n      if(i & J_DOWN)\n\tbspy.w += 0x0010;\n      if(i & J_LEFT)\n\tbspx.w -= 0x0010;\n      if(i & J_RIGHT)\n\tbspx.w += 0x0010;\n    } else if(i & J_A) {\n      if(i & J_UP)\n\twspy.w -= 0x0010;\n      if(i & J_DOWN)\n\twspy.w += 0x0010;\n      if(i & J_LEFT)\n\twspx.w -= 0x0010;\n      if(i & J_RIGHT)\n\twspx.w += 0x0010;\n    } else {\n      if(i & J_SELECT)\n\tcolor = STARTFADE;\n      if(i & J_START)\n\tif(doorstate == CLOSED) {\n\t  doorstate = OPENING;\n\t  doorpos = 0;\n\t} else if(doorstate == OPENED) {\n\t  doorstate = CLOSING;\n\t  doorpos = NBDFRAMES;\n\t}\n      if(i & J_UP)\n\tsspy.w -= 0x0010;\n      if(i & J_DOWN)\n\tsspy.w += 0x0010;\n      if(i & J_LEFT)\n\tsspx.w -= 0x0010;\n      if(i & J_RIGHT)\n\tsspx.w += 0x0010;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/paint/Make.bat",
    "content": "echo off\nset BIN=..\\..\\bin\nset OBJ=obj\n\nif \"%1\"==\"clean\" (\n\tif exist %OBJ% rd /s/q %OBJ%\n\tif exist paint.gb del paint.gb\n\tgoto end\n)\n\nif not exist %OBJ% mkdir %OBJ%\ncall %BIN%\\gbdk-n-compile.bat paint.c -o %OBJ%\\paint.rel\ncall %BIN%\\gbdk-n-link.bat %OBJ%\\paint.rel -o %OBJ%\\paint.ihx\ncall %BIN%\\gbdk-n-make-rom.bat %OBJ%\\paint.ihx paint.gb\n\n:end\n"
  },
  {
    "path": "examples/paint/Makefile",
    "content": "BIN=../../bin\nOBJ=./obj\n\n\n\nbuild:\n\tmkdir -p $(OBJ)\n\t$(BIN)/gbdk-n-compile.sh paint.c -o $(OBJ)/paint.rel\n\t$(BIN)/gbdk-n-link.sh $(OBJ)/paint.rel -o $(OBJ)/paint.ihx\n\t$(BIN)/gbdk-n-make-rom.sh $(OBJ)/paint.ihx paint.gb\n\nclean:\n\trm -rf $(OBJ)\n\trm -f paint.gb\n"
  },
  {
    "path": "examples/paint/paint.c",
    "content": "#include <gb/gb.h>\n#include <gb/drawing.h>\n\n#define NB_TOOLS 18\n#define NB_DATA_TILES 48\n\n#define ARROW 0\n#define PEN 1\n#define BRUSH 2\n#define FILL 3\n#define ERASER 4\n#define CROSS 5\n\n#define UNSELECTED 0\n#define SELECTED 1\n\n#define FIRST_TOOL 0\n#define LAST_TOOL 9\n#define FIRST_COLOR 10\n#define LAST_COLOR 13\n#define FIRST_MODE 14\n#define LAST_MODE 17\n\n#define NULL 0\n\ntypedef struct icon_info_\n{\n  UBYTE data_idx; /* Index of data in the data array */\n  UBYTE x, y, w, h; /* Position and size (in tiles) */\n  UBYTE up, down, left, right; /* Index of next icons (for cursor movements) */\n  UBYTE cursor; /* Cursor associated with icon */\n} icon_info;\n\ntypedef struct cursor_info_\n{\n  UBYTE data_idx; /* Index of data in the data array */\n  UBYTE w, h; /* Size (in tiles) */\n  UBYTE hot_x, hot_y; /* Position of hot point, relatice to top-left of sprite (in pixels) */\n} cursor_info;\n\nconst icon_info icons[] =\n{\n  /* Pen */\n  { 0, 0, 0, 2, 2, 10, 2, 1, 1, 1 }, /* 0 */\n  /* Brush */\n  { 4, 2, 0, 2, 2, 14, 3, 0, 0, 2 }, /* 1 */\n  /* Fill */\n  { 8, 0, 2, 2, 2, 0, 4, 3, 3, 3 }, /* 2 */\n  /* Eraser */\n  { 12, 2, 2, 2, 2, 1, 5, 2, 2, 4 }, /* 3 */\n  /* Line */\n  { 16, 0, 4, 2, 2, 2, 6, 5, 5, 5 }, /* 4 */\n  /* Line */\n  { 20, 2, 4, 2, 2, 3, 7, 4, 4, 5 }, /* 5 */\n  /* Rectangle */\n  { 24, 0, 6, 2, 2, 4, 8, 7, 7, 5 }, /* 6 */\n  /* Oval */\n  { 28, 2, 6, 2, 2, 5, 9, 6, 6, 5 }, /* 7 */\n  /* Filled rectangle */\n  { 32, 0, 8, 2, 2, 6, 10, 9, 9, 5 }, /* 8 */\n  /* Filled oval */\n  { 36, 2, 8, 2, 2, 7, 14, 8, 8, 5 }, /* 9 */\n  /* Color */\n  { 40, 0, 10, 1, 1, 8, 11, 16, 12, 0 }, /* 10 */\n  { 41, 0, 11, 1, 1, 10, 0, 17, 13, 0 }, /* 11 */\n  { 42, 1, 10, 1, 1, 8, 13, 10, 14, 0 }, /* 12 */\n  { 43, 1, 11, 1, 1, 12, 0, 11, 15, 0 }, /* 13 */\n  /* Mode */\n  { 44, 2, 10, 1, 1, 9, 15, 12, 16, 0 }, /* 14 */\n  { 45, 2, 11, 1, 1, 14, 1, 13, 17, 0 }, /* 15 */\n  { 46, 3, 10, 1, 1, 9, 17, 14, 10, 0 }, /* 16 */\n  { 47, 3, 11, 1, 1, 16, 1, 15, 11, 0 } /* 17 */\n};\n\nconst unsigned char data[NB_DATA_TILES][0x10] =\n{\n  /* Pen */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x01 },\n  { 0x7E,0x02,0x7D,0x05,0x7B,0x0A,0x77,0x14,0x7F,0x18,0x7F,0x27,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x0D,0xF6,0x15,0xEE,0x29,0xDE,0x51,0xBE,0xA1,0x7E,0x41 },\n  { 0xFE,0x81,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0xFD,0xFE,0x01,0x00,0xFF },\n  /* Brush */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x01 },\n  { 0x7E,0x02,0x7D,0x0D,0x7F,0x1E,0x7F,0x1E,0x7F,0x1D,0x7F,0x11,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x0D,0xF6,0x15,0xEE,0x29,0xDE,0x51,0xBE,0xA1,0x7E,0x41 },\n  { 0xFE,0x81,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0xFD,0xFE,0xFD,0xFE,0x01,0x00,0xFF },\n  /* Fill */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x01,0x7F,0x02,0x7E,0x0C,0x7D,0x18,0x7E,0x1D },\n  { 0x7F,0x1B,0x7F,0x19,0x7F,0x18,0x7F,0x08,0x7F,0x08,0x7F,0x08,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x81,0xFE,0x41,0x7E,0x21,0xBE,0x71,0x5E,0xE9,0xAE,0xC5 },\n  { 0x5E,0x89,0xBE,0x11,0xFE,0xA1,0xFE,0x41,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Eraser */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x01,0x7E,0x02,0x7C,0x04 },\n  { 0x78,0x08,0x7F,0x1F,0x71,0x11,0x7F,0x1F,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0xF9,0x1E,0x19,0x2E,0x29,0x5E,0x51 },\n  { 0xBE,0xA1,0x7E,0x41,0xFE,0x81,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Line */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x20,0x7F,0x10,0x7F,0x08,0x7F,0x04,0x7F,0x02,0x7F,0x01 },\n  { 0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01 },\n  { 0xFE,0x81,0xFE,0x41,0xFE,0x21,0xFE,0x11,0xFE,0x09,0xFE,0x05,0xFE,0x01,0x00,0xFF },\n  /* Arc */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x1E,0x7F,0x01,0x7F,0x00,0x7F,0x00,0x7F,0x00 },\n  { 0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x81,0xFE,0x41,0xFE,0x21,0xFE,0x11 },\n  { 0xFE,0x11,0xFE,0x09,0xFE,0x09,0xFE,0x09,0xFE,0x09,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Rectangle */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x3F,0x7F,0x20,0x7F,0x20,0x7F,0x20,0x7F,0x20 },\n  { 0x7F,0x20,0x7F,0x20,0x7F,0x20,0x7F,0x20,0x7F,0x3F,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0xFD,0xFE,0x05,0xFE,0x05,0xFE,0x05,0xFE,0x05 },\n  { 0xFE,0x05,0xFE,0x05,0xFE,0x05,0xFE,0x05,0xFE,0xFD,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Oval */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x03,0x7F,0x0C,0x7F,0x10,0x7F,0x20,0x7F,0x20 },\n  { 0x7F,0x20,0x7F,0x20,0x7F,0x10,0x7F,0x0C,0x7F,0x03,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0xC1,0xFE,0x31,0xFE,0x09,0xFE,0x05,0xFE,0x05 },\n  { 0xFE,0x05,0xFE,0x05,0xFE,0x09,0xFE,0x31,0xFE,0xC1,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Filled rectangle */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x3F,0x6A,0x3F,0x75,0x3F,0x6A,0x3F,0x75,0x3F },\n  { 0x6A,0x3F,0x75,0x3F,0x6A,0x3F,0x75,0x3F,0x7F,0x3F,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0xFD,0xAE,0xFD,0x56,0xFD,0xAE,0xFD,0x56,0xFD },\n  { 0xAE,0xFD,0x56,0xFD,0xAE,0xFD,0x56,0xFD,0xFE,0xFD,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Filled oval */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x00,0x7F,0x03,0x7E,0x0F,0x75,0x1F,0x6A,0x3F,0x75,0x3F },\n  { 0x6A,0x3F,0x75,0x3F,0x7A,0x1F,0x7D,0x0F,0x7F,0x03,0x7F,0x00,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x00,0xFE,0x01,0xFE,0x01,0xFE,0xC1,0xBE,0xF1,0x5E,0xF9,0xAE,0xFD,0x56,0xFD },\n  { 0xAE,0xFD,0x56,0xFD,0xAE,0xF9,0x7E,0xF1,0xFE,0xC1,0xFE,0x01,0xFE,0x01,0x00,0xFF },\n  /* Color */\n  { 0x00,0x00,0x7F,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40 },\n  { 0x40,0x7F,0x40,0x7F,0x40,0x7F,0x40,0x7F,0x40,0x7F,0x40,0x7F,0x7F,0x7F,0x00,0x7F },\n  { 0x00,0x00,0xFE,0xFF,0xFE,0x03,0xFE,0x03,0xFE,0x03,0xFE,0x03,0xFE,0x03,0xFE,0x03 },\n  { 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0xFF },\n  /* Mode */\n  { 0x00,0x00,0x7F,0x00,0x7F,0x0C,0x7F,0x10,0x7F,0x08,0x7F,0x04,0x7F,0x18,0x7F,0x00 },\n  { 0x7F,0x00,0x7F,0x08,0x7F,0x14,0x7F,0x14,0x7F,0x14,0x7F,0x08,0x7F,0x00,0x00,0x7F },\n  { 0x00,0x01,0xFE,0x01,0xFE,0x29,0xFE,0x29,0xFE,0x11,0xFE,0x29,0xFE,0x29,0xFE,0x01 },\n  { 0xFE,0x01,0xFE,0x11,0xFE,0x29,0xFE,0x39,0xFE,0x29,0xFE,0x29,0xFE,0x01,0x00,0xFF }\n};\n\nconst unsigned char selected_data[NB_DATA_TILES][0x10] =\n{\n  /* Pen */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFE },\n  { 0x81,0xFD,0x82,0xFA,0x84,0xF5,0x88,0xEB,0x80,0xE7,0x80,0xD8,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xF2,0x09,0xEA,0x11,0xD6,0x21,0xAE,0x41,0x5E,0x81,0xBE },\n  { 0x01,0x7E,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x02,0x01,0xFE,0xFF,0x00 },\n  /* Brush */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFE },\n  { 0x81,0xFD,0x82,0xF2,0x80,0xE1,0x80,0xE1,0x80,0xE2,0x80,0xEE,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xF2,0x09,0xEA,0x11,0xD6,0x21,0xAE,0x41,0x5E,0x81,0xBE },\n  { 0x01,0x7E,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x02,0x01,0x02,0x01,0xFE,0xFF,0x00 },\n  /* Fill */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFE,0x80,0xFD,0x81,0xF3,0x82,0xE7,0x81,0xE2 },\n  { 0x80,0xE4,0x80,0xE7,0x80,0xE7,0x80,0xF7,0x80,0xF7,0x80,0xF7,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0x7E,0x01,0xBE,0x81,0xDE,0x41,0x8E,0xA1,0x16,0x51,0x3A },\n  { 0xA1,0x76,0x41,0xEE,0x01,0x5E,0x01,0xBE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Eraser */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFE,0x81,0xFD,0x83,0xFB },\n  { 0x87,0xF7,0x80,0xE0,0x8E,0xEE,0x80,0xE0,0x80,0xFF,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x06,0xE1,0xE6,0xD1,0xD6,0xA1,0xAE },\n  { 0x41,0x5E,0x81,0xBE,0x01,0x7E,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Line */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xDF,0x80,0xEF,0x80,0xF7,0x80,0xFB,0x80,0xFD,0x80,0xFE },\n  { 0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE },\n  { 0x01,0x7E,0x01,0xBE,0x01,0xDE,0x01,0xEE,0x01,0xF6,0x01,0xFA,0x01,0xFE,0xFF,0x00 },\n  /* Arc */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xE1,0x80,0xFE,0x80,0xFF,0x80,0xFF,0x80,0xFF },\n  { 0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0x7E,0x01,0xBE,0x01,0xDE,0x01,0xEE },\n  { 0x01,0xEE,0x01,0xF6,0x01,0xF6,0x01,0xF6,0x01,0xF6,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Rectangle */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xC0,0x80,0xDF,0x80,0xDF,0x80,0xDF,0x80,0xDF },\n  { 0x80,0xDF,0x80,0xDF,0x80,0xDF,0x80,0xDF,0x80,0xC0,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0x02,0x01,0xFA,0x01,0xFA,0x01,0xFA,0x01,0xFA },\n  { 0x01,0xFA,0x01,0xFA,0x01,0xFA,0x01,0xFA,0x01,0x02,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Oval */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFC,0x80,0xF3,0x80,0xEF,0x80,0xDF,0x80,0xDF },\n  { 0x80,0xDF,0x80,0xDF,0x80,0xEF,0x80,0xF3,0x80,0xFC,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0x3E,0x01,0xCE,0x01,0xF6,0x01,0xFA,0x01,0xFA },\n  { 0x01,0xFA,0x01,0xFA,0x01,0xF6,0x01,0xCE,0x01,0x3E,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Filled rectangle */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xC0,0x9F,0xC0,0x9F,0xC0,0x9F,0xC0,0x9F,0xC0 },\n  { 0x9F,0xC0,0x9F,0xC0,0x9F,0xC0,0x9F,0xC0,0x80,0xC0,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0x02,0xF9,0x02,0xF9,0x02,0xF9,0x02,0xF9,0x02 },\n  { 0xF9,0x02,0xF9,0x02,0xF9,0x02,0xF9,0x02,0x01,0x02,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Filled oval */\n  { 0xFF,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFC,0x83,0xF0,0x8F,0xE0,0x9F,0xC0,0x9F,0xC0 },\n  { 0x9F,0xC0,0x9F,0xC0,0x8F,0xE0,0x83,0xF0,0x80,0xFC,0x80,0xFF,0x80,0xFF,0xFF,0x80 },\n  { 0xFF,0xFF,0x01,0xFE,0x01,0xFE,0x01,0x3E,0xC1,0x0E,0xF1,0x06,0xF9,0x02,0xF9,0x02 },\n  { 0xF9,0x02,0xF9,0x02,0xF1,0x06,0xC1,0x0E,0x01,0x3E,0x01,0xFE,0x01,0xFE,0xFF,0x00 },\n  /* Color */\n  { 0x00,0x00,0x7F,0x7F,0x61,0x61,0x52,0x52,0x4C,0x4C,0x4C,0x4C,0x52,0x52,0x61,0x61 },\n  { 0x40,0x5E,0x40,0x6D,0x40,0x73,0x40,0x73,0x40,0x6D,0x40,0x5E,0x7F,0x7F,0x00,0x7F },\n  { 0x00,0x00,0xFE,0xFF,0xFE,0x87,0xFE,0x4B,0xFE,0x33,0xFE,0x33,0xFE,0x4B,0xFE,0x87 },\n  { 0x7A,0x7B,0xB6,0xB7,0xCE,0xCF,0xCE,0xCF,0xB6,0xB7,0x7A,0x7B,0xFE,0xFF,0x00,0xFF },\n  /* Mode */\n  { 0x00,0x00,0x7F,0x7F,0x73,0x73,0x6F,0x6F,0x77,0x77,0x7B,0x7B,0x67,0x67,0x7F,0x7F },\n  { 0x7F,0x7F,0x77,0x77,0x6B,0x6B,0x6B,0x6B,0x6B,0x6B,0x77,0x77,0x7F,0x7F,0x00,0x7F },\n  { 0x00,0x01,0xFE,0xFF,0xD6,0xD7,0xD6,0xD7,0xEE,0xEF,0xD6,0xD7,0xD6,0xD7,0xFE,0xFF },\n  { 0xFE,0xFF,0xEE,0xEF,0xD6,0xD7,0xC6,0xC7,0xD6,0xD7,0xD6,0xD7,0xFE,0xFF,0x00,0xFF }\n};\n\nconst cursor_info cursors[] =\n{\n  /* Arrow */\n  { 0, 1, 1, 0, 0 },\n  /* Pen */\n  { 1, 2, 2, 0, 15 },\n  /* Brush */\n  { 5, 2, 2, 0, 15 },\n  /* Fill */\n  { 9, 2, 2, 2, 15 },\n  /* Eraser */\n  { 13, 2, 2, 0, 15 },\n  /* Cross */\n  { 17, 2, 2, 5, 10 }\n};\n\nconst unsigned char cursors_data[][0x10] = {\n  /* Arrow */\n  { 0xFF,0x00,0xFF,0x7E,0xFF,0x7C,0xFE,0x78,0xFF,0x7C,0xFF,0x6E,0xFF,0x46,0xEF,0x00 },\n  /* Pen */\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x01 },\n  { 0x0F,0x02,0x1F,0x05,0x3F,0x0A,0x7F,0x14,0x7E,0x28,0xFC,0x30,0xF8,0x40,0x60,0x00 },\n  { 0x00,0x00,0x00,0x00,0x3C,0x00,0x7C,0x18,0xFC,0x28,0xFC,0x50,0xF8,0xA0,0xF0,0x40 },\n  { 0xE0,0x80,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\n  /* Brush */\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x01,0x0F,0x02 },\n  { 0x1F,0x05,0x7F,0x0A,0xFF,0x34,0xFE,0x78,0xFC,0x78,0xFC,0x70,0xF8,0x40,0x60,0x00 },\n  { 0x00,0x00,0x00,0x00,0x78,0x00,0xF8,0x30,0xF8,0x50,0xF8,0xA0,0xF0,0x40,0xE0,0x80 },\n  { 0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\n  /* Fill */\n  { 0x00,0x00,0x00,0x00,0x07,0x00,0x0F,0x02,0x1F,0x05,0x7F,0x08,0xFE,0x31,0xFD,0x63 },\n  { 0xFA,0x77,0xFD,0x6E,0xFF,0x64,0xFF,0x62,0xF7,0x21,0x73,0x20,0x70,0x20,0x50,0x00 },\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xC0,0x00,0xE0,0x80,0xF0,0xC0,0x78,0xA0 },\n  { 0xF8,0x10,0xF8,0x20,0xF0,0x40,0xE0,0x80,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00 },\n  /* Eraser */\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0F,0x03 },\n  { 0x1F,0x04,0x3F,0x08,0x7F,0x11,0xFF,0x22,0xFF,0x7D,0xFF,0x46,0xFF,0x7C,0x7E,0x00 },\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0xE0 },\n  { 0xF0,0x60,0xF0,0xA0,0xF0,0x40,0xE0,0x80,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00 },\n  /* Cross */\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x04,0x0E,0x04 },\n  { 0x0E,0x04,0xFF,0x04,0xFB,0x7B,0xFF,0x04,0x0E,0x04,0x0E,0x04,0x0E,0x04,0x0E,0x00 },\n  { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\n  { 0x00,0x00,0xE0,0x00,0xE0,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },\n};\n\nunsigned char data_buffer[NB_DATA_TILES][0x10];\n\nconst UBYTE colors[] = { WHITE, DKGREY, LTGREY, BLACK };\nconst UBYTE modes[] = { SOLID, OR, XOR, AND };\n\nUBYTE current_tool;\nUBYTE current_color;\nUBYTE current_mode;\nUBYTE current_cursor;\nUBYTE menu_cursor_pos;\n\nUBYTE cursor_x;\nUBYTE cursor_y;\n\nvoid set_cursor()\n{\n    UBYTE x, y, i;\n\n    i = 0;\n    for(x = 0; x < cursors[current_cursor].w; x++)\n\tfor(y = 0; y < cursors[current_cursor].h; y++) {\n\t    set_sprite_data(i,\n\t\t\t    1,\n\t\t\t    cursors_data[cursors[current_cursor].data_idx+i]);\n\t    set_sprite_tile(i, i);\n\t    set_sprite_prop(i, 0x10);\n\t    i++;\n\t}\n    /* Hide unused sprites */\n    for(; i < 4; i++) {\n\tmove_sprite(i, 0, 0);\n    }\n}\n\nvoid move_cursor()\n{\n  UBYTE x, y;\n\n  for(x = 0; x < cursors[current_cursor].w; x++)\n    for(y = 0; y < cursors[current_cursor].h; y++)\n      move_sprite((x<<1)+y,\n\t\t  cursor_x+8 - cursors[current_cursor].hot_x + (x<<3),\n\t\t  cursor_y+16 - cursors[current_cursor].hot_y + (y<<3));\n}\n\nvoid move_menu_cursor()\n{\n  move_sprite(0,\n\t      ((icons[menu_cursor_pos].x+icons[menu_cursor_pos].w)<<3) + 4,\n\t      ((icons[menu_cursor_pos].y+icons[menu_cursor_pos].h)<<3) + 12);\n}\n\nvoid set_icon(UBYTE icon, UBYTE selected)\n{\n    UBYTE x, y;\n\n    for(x = 0; x < icons[icon].w; x++)\n\tfor(y = 0; y < icons[icon].h; y++) {\n\t    UWORD index = icons[icon].data_idx+((UWORD)x<<1)+y;\n\t    switch_data(icons[icon].x + x,\n\t\t\ticons[icon].y + y,\n\t\t\tselected ? selected_data[index] : data[index],\n\t\t\tdata_buffer[index]);\n\t}\n}\n\nvoid change_icon(UBYTE icon, UBYTE selected)\n{\n  UBYTE x, y;\n\n  for(x = 0; x < icons[icon].w; x++)\n    for(y = 0; y < icons[icon].h; y++)\n      switch_data(icons[icon].x + x,\n\t\t  icons[icon].y + y,\n\t\t  (selected ?\n\t\t   selected_data[icons[icon].data_idx+((UWORD)x<<1)+y] :\n\t\t   data[icons[icon].data_idx+((UWORD)x<<1)+y]),\n\t\t  NULL);\n}\n\nvoid reset_icon(UBYTE icon)\n{\n  UBYTE x, y;\n\n  for(x = 0; x < icons[icon].w; x++)\n    for(y = 0; y < icons[icon].h; y++)\n      switch_data(icons[icon].x + x,\n\t\t  icons[icon].y + y,\n\t\t  data_buffer[icons[icon].data_idx+(x<<1)+y],\n\t\t  NULL);\n}\n\nvoid splash()\n{\n  UBYTE x, y;\n\n  cursor_x = 40;\n  cursor_y = 50;\n  current_cursor = PEN;\n  set_cursor();\n  move_cursor();\n  SHOW_SPRITES;\n\n  for(; cursor_x < 120; cursor_x++) {\n    wait_vbl_done();\n    move_cursor();\n    plot(cursor_x, cursor_y, BLACK, SOLID);\n  }\n  for(; cursor_y < 94; cursor_y++) {\n    wait_vbl_done();\n    move_cursor();\n    plot(cursor_x, cursor_y, BLACK, SOLID);\n  }\n  for(; cursor_x > 40; cursor_x--) {\n    wait_vbl_done();\n    move_cursor();\n    plot(cursor_x, cursor_y, BLACK, SOLID);\n  }\n  for(; cursor_y > 50; cursor_y--) {\n    wait_vbl_done();\n    move_cursor();\n    plot(cursor_x, cursor_y, BLACK, SOLID);\n  }\n  cursor_x = 160/2;\n  cursor_y = 144/2;\n  current_cursor = FILL;\n  set_cursor();\n  move_cursor();\n\n  for(y = 51; y < 94; y++)\n    for(x = 41; x < 120; x++)\n      plot(x, y, LTGREY, SOLID);\n\n  // HIDE_SPRITES;\n}\n\nvoid menu()\n{\n  UBYTE i, key;\n  UBYTE slowdown;\n  UBYTE cursor;\n\n  slowdown = 50;\n\n  for(i = 0; i < NB_TOOLS; i++)\n    set_icon(i,\n\t     i == FIRST_TOOL + current_tool ||\n\t     i == FIRST_COLOR + current_color ||\n\t     i == FIRST_MODE + current_mode);\n\n  cursor = current_cursor;\n  current_cursor = ARROW;\n  set_cursor();\n  move_menu_cursor();\n  SHOW_SPRITES;\n  waitpadup();\n  do {\n    wait_vbl_done();\n    key = joypad();\n    if(key & (J_UP|J_DOWN|J_LEFT|J_RIGHT)) {\n      if(key & J_UP)\n\tmenu_cursor_pos = icons[menu_cursor_pos].up;\n      if(key & J_DOWN)\n\tmenu_cursor_pos = icons[menu_cursor_pos].down;\n      if(key & J_LEFT)\n\tmenu_cursor_pos = icons[menu_cursor_pos].left;\n      if(key & J_RIGHT)\n\tmenu_cursor_pos = icons[menu_cursor_pos].right;\n      move_menu_cursor();\n      while(slowdown && key == joypad()) {\n\twait_vbl_done();\n\tslowdown--;\n      }\n      slowdown = 10;\n    } else\n      slowdown = 50;\n    if(key & J_A) {\n      if( /* menu_cursor_pos >= FIRST_TOOL && */ menu_cursor_pos <= LAST_TOOL) {\n\tif(menu_cursor_pos != /* FIRST_TOOL + */ current_tool) {\n\t  change_icon(/* FIRST_TOOL + */ current_tool, UNSELECTED);\n\t  current_tool = menu_cursor_pos /* - FIRST_TOOL */;\n\t  change_icon(/* FIRST_TOOL + */ current_tool, SELECTED);\n\t  cursor = icons[/* FIRST_TOOL + */ current_tool].cursor;\n\t}\n      } else if(menu_cursor_pos >= FIRST_COLOR && menu_cursor_pos <= LAST_COLOR) {\n\tif(menu_cursor_pos != FIRST_COLOR + current_color) {\n\t  change_icon(FIRST_COLOR + current_color, UNSELECTED);\n\t  current_color = menu_cursor_pos - FIRST_COLOR;\n\t  change_icon(FIRST_COLOR + current_color, SELECTED);\n\t}\n      } else if(menu_cursor_pos >= FIRST_MODE && menu_cursor_pos <= LAST_MODE) {\n\tif(menu_cursor_pos != FIRST_MODE + current_mode) {\n\t  change_icon(FIRST_MODE + current_mode, UNSELECTED);\n\t  current_mode = menu_cursor_pos - FIRST_MODE;\n\t  change_icon(FIRST_MODE + current_mode, SELECTED);\n\t}\n      }\n    }\n  } while(key != J_SELECT);\n  waitpadup();\n  for(i = 0; i < NB_TOOLS; i++)\n    reset_icon(i);\n  HIDE_SPRITES;\n  current_cursor = cursor;\n}\n\nvoid run()\n{\n  UBYTE key;\n  UBYTE slowdown;\n  UBYTE drawn, erased;\n\n  slowdown = 10;\n  drawn = erased = 0;\n\n  set_cursor();\n  move_cursor();\n  SHOW_SPRITES;\n\n  while(1) {\n    wait_vbl_done();\n    key = joypad();\n    if(key & (J_UP|J_DOWN|J_LEFT|J_RIGHT)) {\n      if(key & J_UP && cursor_y > 0)\n\tcursor_y--;\n      if(key & J_DOWN && cursor_y < 143)\n\tcursor_y++;\n      if(key & J_LEFT && cursor_x > 0)\n\tcursor_x--;\n      if(key & J_RIGHT && cursor_x < 159)\n\tcursor_x++;\n      move_cursor();\n      while(slowdown && key == joypad()) {\n\twait_vbl_done();\n\tslowdown--;\n      }\n      slowdown = 1;\n      drawn = erased = 0;\n    } else\n      slowdown = 10;\n    if(key & J_SELECT) {\n      HIDE_SPRITES;\n      menu();\n      set_cursor();\n      move_cursor();\n      SHOW_SPRITES;\n    }\n    if((key & (J_A|J_B)) == J_A) {\n      if(!drawn) {\n\tdrawn++;\n\tplot(cursor_x, cursor_y, colors[current_color], modes[current_mode]);\n      }\n    } else\n      drawn = 0;\n    if((key & (J_A|J_B)) == J_B) {\n      if(!erased) {\n\terased++;\n\tplot(cursor_x, cursor_y, WHITE, SOLID);\n      }\n    } else\n      erased = 0;\n  }\n}\n\nvoid main()\n{\n  /* Initialize sprite palette */\n  OBP1_REG = 0xE0U;\n\n  splash();\n\n  current_tool = 0;\n  current_color = BLACK;\n  current_mode = SOLID;\n  current_cursor = PEN;\n  menu_cursor_pos = 0;\n  cursor_x = 160/2;\n  cursor_y = 144/2;\n\n  run();\n}\n"
  },
  {
    "path": "examples/space/Make.bat",
    "content": "echo off\nset BIN=..\\..\\bin\nset OBJ=obj\n\nif \"%1\"==\"clean\" (\n\tif exist %OBJ% rd /s/q %OBJ%\n\tif exist space.gb del space.gb\n\tgoto end\n)\n\nif not exist %OBJ% mkdir %OBJ%\ncall %BIN%\\gbdk-n-assemble.bat %OBJ%\\space.rel space.s \ncall %BIN%\\gbdk-n-link.bat %OBJ%\\space.rel -o %OBJ%\\space.ihx\ncall %BIN%\\gbdk-n-make-rom.bat %OBJ%\\space.ihx space.gb\n\n:end\n"
  },
  {
    "path": "examples/space/Makefile",
    "content": "BIN=../../bin\nOBJ=./obj\n\nbuild:\n\tmkdir -p $(OBJ)\n\t$(BIN)/gbdk-n-assemble.sh $(OBJ)/space.rel space.s\n\t$(BIN)/gbdk-n-link.sh $(OBJ)/space.rel -o $(OBJ)/space.ihx\n\t$(BIN)/gbdk-n-make-rom.sh $(OBJ)/space.ihx space.gb\n\nclean:\n\trm -rf $(OBJ)\n\trm -f space.gb\n"
  },
  {
    "path": "examples/space/space.s",
    "content": "\t;; Little demo illustrating how to use the graphical possibilities\n\t;;  of the GB (background, window and animated sprite)\n\t;; I have used fixed-point values for both the position and\n\t;;  speed of objects to get smooth movements\n\t;; \n\t;; OBJ data\t\t: 0x8000 -> 0x8FFF (unsigned)\n\t;; Window data\t\t: 0x8800 -> 0x97FF (signed)\n\t;; Background data\t: 0x8800 -> 0x97FF (signed)\n\t;; \n\t;; Tiled 0xFC -> 0xFF are standard tiles (all black -> all white)\n\t;; \n\t;; Keys:\n\t;; Arrow keys\t\t: Change the speed (and direction) of the sprite\n\t;; Arrow keys + A\t: Change the speed (and direction) of the window\n\t;; Arrow keys + B\t: Change the speed (and direction) of the background\n\t;; START\t\t: Open/close the door\n\t;; SELECT\t\t: Basic fading effect\n\t;; \n\t;; Note that the window is kept in the lower right part of the screen\n\t;; since it can't be made transparent\n\n\t.include\t\"../../libc/global.s\"\n\n\t.globl\t.init_vram\n\t.globl\t.copy_vram\n\t.globl\t.init_wtt\n\t.globl\t.init_btt\n\t.globl\t.set_xy_wtt\n\t.globl\t.mv_sprite\n\t.globl\t.set_sprite_prop\n\t.globl\t.set_sprite_tile\n\t.globl\t.jpad\n\n\t.NBDFRAMES\t= .endfilm-.film\t; Nb frames for the door\n\t.NBSFRAMES\t= 0x07\t\t\t; Nb frames for the sprite\n\t.WINSZX\t\t= 0x80\t\t\t; Size of the picture in the window\n\t.WINSZY\t\t= 0x50\n\t.MINWINX\t= .MAXWNDPOSX-.WINSZX+1 ; Bounds of the window origin\n\t.MINWINY\t= .MAXWNDPOSY-.WINSZY+1\n\t.MAXWINX\t= .MAXWNDPOSX\n\t.MAXWINY\t= .MAXWNDPOSY\n\t.FADESTEP\t= 0x10\t\t\t; Nb steps for the fading effect\n\t.STARTFADE\t= 0x06*.FADESTEP\t; Initial value for the fading effect\n\n\t.CLOSED\t\t= 0x00\n\t.OPENING\t= 0x01\n\t.OPENED\t\t= 0x02\n\t.CLOSING\t= 0x03\n\n\t.module\tSpace\n\n\t.area\t_BSS\n\n.time:\t\t\t\t; Global \"time\" value (counter)\n\t.ds\t0x01\n\n.doorstate:\t\t\t; State of the door (OPENED, CLOSED...)\n\t.ds\t0x01\n.doorpos:\t\t\t; Current position in the door animation\n\t.ds\t0x01\n\n.color:\t\t\t\t; Current color for fading effect\n\t.ds\t0x01\n\n.sframe:\t\t\t; Current frame of the sprite\n\t.ds\t0x01\n\n.bposx:\t\t\t\t; Background position (fixed point)\n\t.ds\t0x02\n.bposy:\n\t.ds\t0x02\n.bspx:\t\t\t\t; Background speed (fixed point)\n\t.ds\t0x02\n.bspy:\n\t.ds\t0x02\n\n.wposx:\t\t\t\t; Window position (fixed point)\n\t.ds\t0x02\n.wposy:\n\t.ds\t0x02\n.wspx:\t\t\t\t; Window speed (fixed point)\n\t.ds\t0x02\n.wspy:\n\t.ds\t0x02\n\n.sposx:\t\t\t\t; Sprite position (fixed point)\n\t.ds\t0x02\n.sposy:\n\t.ds\t0x02\n.sspx:\t\t\t\t; Sprite speed (fixed point)\n\t.ds\t0x02\n.sspy:\n\t.ds\t0x02\n\n\t.area\t_CODE\n\n_main::\n\tDI\t\t\t; Disable interrupts\n\t;; Turn the screen off\n\tCALL\t.display_off\n\n\tXOR\tA\n\tLD\t(.time),A\n\tLD\t(.color),A\n\n\tLD\tA,#0b11100100\n\tLDH\t(.BGP),A\n\tLDH\t(.OBP0),A\n\n\t; Initialize tiles\n\tLD\tHL,#0x8000\n\tLD\tDE,#0x1000\n\tLD\tB,#0x00\n\tCALL\t.init_vram\t; Init the tile set at 0x8000 with 0x00\n\tLD\tB,#0xFF\n\tCALL\t.init_btt\t; Init the tiles tables with 0xFF\n\tCALL\t.init_wtt\n\n\tLD\tBC,#.tp0\t; Move tiles (standard tiles)\n\tLD\tHL,#0x9000-(.endtp0-.tp0)\n\tLD\tDE,#.endtp0-.tp0\n\tCALL\t.copy_vram\n\n\tLD\tBC,#.tp1\t; Move tiles (earth)\n\tLD\tHL,#0x8000\n\tLD\tDE,#.endtp1-.tp1\n\tCALL\t.copy_vram\n\n\tLD\tBC,#.tp2\t; Move tiles (door)\n\tLD\tHL,#0x8800\n\tLD\tDE,#.endtp2-.tp2\n\tCALL\t.copy_vram\n\n\tLD\tBC,#.tp3\t; Move tiles (background)\n\tLD\tHL,#0x9000\n\tLD\tDE,#.endtp3-.tp3\n\tCALL\t.copy_vram\n\n\t;; Draw the background\n\tLD\tBC,#.bkg_tiles\n\tLD\tHL,#0x9800\n\tLD\tDE,#0x0400\t; One whole GB Screen\n\tCALL\t.copy_vram\n\n\t;; Draw the frame in the window\n\tLD\tBC,#.frame_tiles\n\tLD\tDE,#0x0000/8\t; Place image at (0x00,0x00)\n\tLD\tHL,#0x8050/8\t; Image size is 0x80 x 0x50\n\tCALL\t.set_xy_wtt\n\n\t;; Draw the door in the window\n\tLD\tBC,#.door1_tiles\n\tLD\tDE,#0x1010/8\t; Place image at (0x10,0x10)\n\tLD\tHL,#0x6030/8\t; Image size is 0x60 x 0x30\n\tCALL\t.set_xy_wtt\n\tLD\tA,#.CLOSED\n\tLD\t(.doorstate),A\n\n\t; Initialize background\n\tXOR\tA\n\tLD\t(.bposx),A\n\tLDH\t(.SCX),A\n\tLD\t(.bposx+1),A\n\tLD\t(.bposy),A\n\tLDH\t(.SCY),A\n\tLD\t(.bposy+1),A\n\tLD\tA,#-0x01\n\tLD\t(.bspx),A\n\tXOR\tA\n\tLD\t(.bspx+1),A\n\tXOR\tA\n\tLD\t(.bspy),A\n\tLD\tA,#0x80\n\tLD\t(.bspy+1),A\n\n\t; Initialize window\n\tLD\tA,#.MAXWNDPOSX\n\tLD\t(.wposx),A\n\tLDH\t(.WX),A\n\tXOR\tA\n\tLD\t(.wposx+1),A\n\tLD\tA,#.MAXWNDPOSY\n\tLD\t(.wposy),A\n\tLDH\t(.WY),A\n\tXOR\tA\n\tLD\t(.wposy+1),A\n\tLD\tA,#-0x01\n\tLD\t(.wspx),A\n\tLD\tA,#0x80\n\tLD\t(.wspx+1),A\n\tLD\tA,#-0x01\n\tLD\t(.wspy),A\n\tLD\tA,#0xC0\n\tLD\t(.wspy+1),A\n\n\t; Initialize sprite\n\tXOR\tA\n\tLD\t(.sframe),A\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tD,#0x00\t\t; Default sprite properties\n\tCALL\t.set_sprite_prop\n\tLD\tC,#0x01\t\t; Sprite 0x01\n\tLD\tD,#0x00\t\t; Default sprite properties\n\tCALL\t.set_sprite_prop\n\n\tLD\tA,#0x10\n\tLD\t(.sposx),A\n\tXOR\tA\n\tLD\t(.sposx+1),A\n\tLD\tA,#0x10\n\tLD\t(.sposy),A\n\tXOR\tA\n\tLD\t(.sposy+1),A\n\tXOR\tA\n\tLD\t(.sspx),A\n\tLD\tA,#0x40\n\tLD\t(.sspx+1),A\n\tXOR\tA\n\tLD\t(.sspy),A\n\tLD\tA,#0x40\n\tLD\t(.sspy+1),A\n\tCALL\t.tile_sprite\t; Set sprite tiles\n\tCALL\t.place_sprite\t; Place sprites\n\n\tLD\tA,#0b11100111\t; LCD\t\t= On\n\t\t\t\t; WindowBank\t= 0x9C00\n\t\t\t\t; Window\t= On\n\t\t\t\t; BG Chr\t= 0x8800\n\t\t\t\t; BG Bank\t= 0x9800\n\t\t\t\t; OBJ\t\t= 8x16\n\t\t\t\t; OBJ\t\t= On\n\t\t\t\t; BG\t\t= On\n\tLDH\t(.LCDC),A\n\tEI\t\t\t; Enable interrupts\n1$:\n\tLD\tA,(.time)\n\tINC\tA\n\tLD\t(.time),A\n\n\tLD\tB,#0x04\t\t; Skip four VBLs (slow down animation)\n2$:\n\tCALL\t.wait_vbl_done\n\tDEC\tB\n\tJR\tNZ,2$\n\n\tCALL\t.fade\n\tCALL\t.door\n\tCALL\t.scroll\n\tCALL\t.animate_sprite\n\n\tCALL\t.jpad\n\tLD\tD,A\n\n\tAND\t#.B\t\t; Is B pressed ?\n\tJP\tNZ,10$\n\n\tLD\tA,D\n\tAND\t#.A\t\t; Is A pressed ?\n\tJP\tNZ,20$\n\n\tLD\tA,D\n\tAND\t#.SELECT\t; Is SELECT pressed ?\n\tJR\tZ,3$\n\tLD\tA,#.STARTFADE\n\tLD\t(.color),A\n3$:\n\tLD\tA,D\n\tAND\t#.START\t\t; Is START pressed ?\n\tJR\tZ,5$\n\tLD\tA,(.doorstate)\n\tCP\t#.CLOSED\n\tJR\tNZ,4$\n\tLD\tA,#.OPENING\n\tLD\t(.doorstate),A\n\tXOR\tA\n\tLD\t(.doorpos),A\n\tJR\t5$\n4$:\n\tCP\t#.OPENED\n\tJR\tNZ,5$\n\tLD\tA,#.CLOSING\n\tLD\t(.doorstate),A\n\tLD\tA,#.NBDFRAMES\n\tLD\t(.doorpos),A\n5$:\n\tLD\tA,D\n\tAND\t#.UP\t\t; Is UP pressed ?\n\tJR\tZ,6$\n\tLD\tBC,#0x0010\n\tLD\tA,(.sspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.sspy+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.sspy+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.sspy),A\t; Store new speed\n\tJR\t7$\n6$:\n\tLD\tA,D\n\tAND\t#.DOWN\t\t; Is DOWN pressed ?\n\tJR\tZ,7$\n\tLD\tBC,#0x0010\n\tLD\tA,(.sspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.sspy+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.sspy),A\n\tLD\tA,L\n\tLD\t(.sspy+1),A\n7$:\n\tLD\tA,D\n\tAND\t#.LEFT\t\t; Is LEFT pressed ?\n\tJR\tZ,8$\n\tLD\tBC,#0x0010\n\tLD\tA,(.sspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.sspx+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.sspx+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.sspx),A\t; Store new speed\n\tJP\t1$\n8$:\n\tLD\tA,D\n\tAND\t#.RIGHT\t\t; Is RIGHT pressed ?\n\tJP\tZ,1$\n\tLD\tBC,#0x0010\n\tLD\tA,(.sspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.sspx+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.sspx),A\n\tLD\tA,L\n\tLD\t(.sspx+1),A\n\tJP\t1$\n\n10$:\n\tLD\tA,D\n\tAND\t#.UP\t\t; Is UP pressed ?\n\tJP\tZ,11$\n\tLD\tBC,#0x0010\n\tLD\tA,(.bspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.bspy+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.bspy+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.bspy),A\t; Store new speed\n\tJR\t12$\n11$:\n\tLD\tA,D\n\tAND\t#.DOWN\t\t; Is DOWN pressed ?\n\tJP\tZ,12$\n\tLD\tBC,#0x0010\n\tLD\tA,(.bspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.bspy+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.bspy),A\n\tLD\tA,L\n\tLD\t(.bspy+1),A\n12$:\n\tLD\tA,D\n\tAND\t#.LEFT\t\t; Is LEFT pressed ?\n\tJP\tZ,13$\n\tLD\tBC,#0x0010\n\tLD\tA,(.bspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.bspx+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.bspx+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.bspx),A\t; Store new speed\n\tJP\t1$\n13$:\n\tLD\tA,D\n\tAND\t#.RIGHT\t\t; Is RIGHT pressed ?\n\tJP\tZ,1$\n\tLD\tBC,#0x0010\n\tLD\tA,(.bspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.bspx+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.bspx),A\n\tLD\tA,L\n\tLD\t(.bspx+1),A\n\tJP\t1$\n\n20$:\n\tLD\tA,D\n\tAND\t#.UP\t\t; Is UP pressed ?\n\tJP\tZ,21$\n\tLD\tBC,#0x0010\n\tLD\tA,(.wspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.wspy+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.wspy+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.wspy),A\t; Store new speed\n\tJR\t22$\n21$:\n\tLD\tA,D\n\tAND\t#.DOWN\t\t; Is DOWN pressed ?\n\tJP\tZ,22$\n\tLD\tBC,#0x0010\n\tLD\tA,(.wspy)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.wspy+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.wspy),A\n\tLD\tA,L\n\tLD\t(.wspy+1),A\n22$:\n\tLD\tA,D\n\tAND\t#.LEFT\t\t; Is LEFT pressed ?\n\tJP\tZ,23$\n\tLD\tBC,#0x0010\n\tLD\tA,(.wspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.wspx+1)\n\tLD\tL,A\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.wspx+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.wspx),A\t; Store new speed\n\tJP\t1$\n23$:\n\tLD\tA,D\n\tAND\t#.RIGHT\t\t; Is RIGHT pressed ?\n\tJP\tZ,1$\n\tLD\tBC,#0x0010\n\tLD\tA,(.wspx)\t; Load speed into HL\n\tLD\tH,A\n\tLD\tA,(.wspx+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,H\t\t; Store new speed\n\tLD\t(.wspx),A\n\tLD\tA,L\n\tLD\t(.wspx+1),A\n\tJP\t1$\n\n\tRET\n\n\t;; Fade the screen (off and on)\n.fade:\n\n\tLD\tA,(.color)\t; Load color into A\n\tCP\t#0x00\n\tRET\tZ\n\tCP\t#.STARTFADE\n\tJR\tNZ,1$\n\tLD\tA,#0b11111001\n\tJR\t6$\n1$:\n\tCP\t#.STARTFADE-.FADESTEP\n\tJR\tNZ,2$\n\tLD\tA,#0b11111110\n\tJR\t6$\n2$:\n\tCP\t#.STARTFADE-0x02*.FADESTEP\n\tJR\tNZ,3$\n\tLD\tA,#0b11111111\n\tJR\t6$\n3$:\n\tCP\t#.STARTFADE-0x03*.FADESTEP\n\tJR\tNZ,4$\n\tLD\tA,#0b11111110\n\tJR\t6$\n4$:\n\tCP\t#.STARTFADE-0x04*.FADESTEP\n\tJR\tNZ,5$\n\tLD\tA,#0b11111001\n\tJR\t6$\n5$:\n\tCP\t#.STARTFADE-0x05*.FADESTEP\n\tJR\tNZ,7$\n\tLD\tA,#0b11100100\n6$:\n\tLDH\t(.BGP),A\n7$:\n\tLD\tA,(.color)\n\tDEC\tA\n\tLD\t(.color),A\n\tRET\n\n\t;; Scroll the background, the window and the sprite\n.scroll:\n\n\t;; Update background\n\tLD\tA,(.bposx)\t; Load background position into HL\n\tLD\tH,A\n\tLD\tA,(.bposx+1)\n\tLD\tL,A\n\tLD\tA,(.bspx)\t; Load background speed into BC\n\tLD\tB,A\n\tLD\tA,(.bspx+1)\n\tLD\tC,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new background position\n\tLD\t(.bposx+1),A\n\tLD\tA,H\n\tLD\t(.bposx),A\n\tLDH\t(.SCX),A\t; Update position\n\n\tLD\tA,(.bposy)\t; Load background position into HL\n\tLD\tH,A\n\tLD\tA,(.bposy+1)\n\tLD\tL,A\n\tLD\tA,(.bspy)\t; Load background speed into BC\n\tLD\tB,A\n\tLD\tA,(.bspy+1)\n\tLD\tC,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new background position\n\tLD\t(.bposy+1),A\n\tLD\tA,H\n\tLD\t(.bposy),A\n\tLDH\t(.SCY),A\t; Update position\n\n\t;; Update window\n\tLD\tA,(.wspx)\t; Load window speed into BC\n\tLD\tB,A\n\tLD\tA,(.wspx+1)\n\tLD\tC,A\n\tLD\tA,(.wposx)\t; Load window position into HL\n\tLD\tH,A\n\tLD\tA,(.wposx+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new window position\n\tLD\t(.wposx+1),A\n\tLD\tA,H\n\tLD\t(.wposx),A\n\n\t;; X position\n\tLD\tA,(.wposx)\t; Check window position\n\tLD\tH,#0x00\t\t; We must use 16 bit registers since the\n\tLD\tL,A\t\t;  window is not less than 0x80 pixels\n\tLD\tBC,#.MAXWINX\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\tA,H\n\tSBC\tB\n\tAND\t#0x80\n\tJR\tNZ,1$\t\t; Maximum value ?\n\tLD\tA,#.MAXWINX\n\tLD\t(.wposx),A\t; Correct window position\n\tLD\tA,(.wspx+1)\t; Load window speed into BC\n\tLD\tC,A\n\tLD\tA,(.wspx)\n\tLD\tB,A\n\tAND\t#0x80\t\t; Speed is already negative ?\n\tJR\tNZ,3$\n\tJR\t2$\n1$:\n\tLD\tA,(.wposx)\t; Check window position\n\tLD\tH,#0x00\t\t; We must use 16 bit registers since the\n\tLD\tL,A\t\t;  window is not less than 0x80 pixels\n\tLD\tBC,#.MINWINX+1\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\tA,H\n\tSBC\tB\n\tAND\t#0x80\n\tJR\tZ,3$\t\t; Minimum value ?\n\tLD\tA,#.MINWINX\n\tLD\t(.wposx),A\t; Correct window position\n\tLD\tA,(.wspx+1)\t; Load window speed into BC\n\tLD\tC,A\n\tLD\tA,(.wspx)\n\tLD\tB,A\n\tAND\t#0x80\t\t; Speed is already positive ?\n\tJR\tZ,3$\n2$:\n\tLD\tHL,#0x00\t; Invert speed\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.wspx+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.wspx),A\t; Store new speed\n3$:\n\tLD\tA,(.wposx)\n\tLDH\t(.WX),A\t\t; Update position\n\n\tLD\tA,(.wspy)\t; Load window speed into BC\n\tLD\tB,A\n\tLD\tA,(.wspy+1)\n\tLD\tC,A\n\tLD\tA,(.wposy)\t; Load window position into HL\n\tLD\tH,A\n\tLD\tA,(.wposy+1)\n\tLD\tL,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new window position\n\tLD\t(.wposy+1),A\n\tLD\tA,H\n\tLD\t(.wposy),A\n\n\t;; Y position\n\tLD\tA,(.wposy)\t; Check window position\n\tLD\tH,#0x00\t\t; We must use 16 bit registers since the\n\tLD\tL,A\t\t;  window is not less than 0x80 pixels\n\tLD\tBC,#.MAXWINY\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\tA,H\n\tSBC\tB\n\tAND\t#0x80\n\tJR\tNZ,4$\t\t; Maximum value ?\n\tLD\tA,#.MAXWINY\n\tLD\t(.wposy),A\t; Correct window position\n\tLD\tA,(.wspy+1)\t; Load window speed into BC\n\tLD\tC,A\n\tLD\tA,(.wspy)\n\tLD\tB,A\n\tAND\t#0x80\t\t; Speed is already negative ?\n\tJR\tNZ,6$\n\tJR\t5$\n4$:\n\tLD\tA,(.wposy)\t; Check window position\n\tLD\tH,#0x00\t\t; We must use 16 bit registers since the\n\tLD\tL,A\t\t;  window is not less than 0x80 pixels\n\tLD\tBC,#.MINWINY+1\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\tA,H\n\tSBC\tB\n\tAND\t#0x80\n\tJR\tZ,6$\t\t; Minimum value ?\n\tLD\tA,#.MINWINY\n\tLD\t(.wposy),A\t; Correct window position\n\tLD\tA,(.wspy+1)\t; Load window speed into BC\n\tLD\tC,A\n\tLD\tA,(.wspy)\n\tLD\tB,A\n\tAND\t#0x80\t\t; Speed is already positive ?\n\tJR\tZ,6$\n5$:\n\tLD\tHL,#0x00\t; Invert speed\n\tLD\tA,L\t\t; Substract BC from HL\n\tSUB\tC\n\tLD\t(.wspy+1),A\n\tLD\tA,H\n\tSBC\tB\n\tLD\t(.wspy),A\t; Store new speed\n6$:\n\tLD\tA,(.wposy)\n\tLDH\t(.WY),A\t\t; Update position\n\n\t;; Update sprite\n\tLD\tA,(.sposx)\t; Load sprite position into HL\n\tLD\tH,A\n\tLD\tA,(.sposx+1)\n\tLD\tL,A\n\tLD\tA,(.sspx)\t; Load sprite speed into BC\n\tLD\tB,A\n\tLD\tA,(.sspx+1)\n\tLD\tC,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new sprite position\n\tLD\t(.sposx+1),A\n\tLD\tA,H\n\tLD\t(.sposx),A\n\n\tLD\tA,(.sposy)\t; Load sprite position into HL\n\tLD\tH,A\n\tLD\tA,(.sposy+1)\n\tLD\tL,A\n\tLD\tA,(.sspy)\t; Load sprite speed into BC\n\tLD\tB,A\n\tLD\tA,(.sspy+1)\n\tLD\tC,A\n\tADD\tHL,BC\t\t; Add them\n\tLD\tA,L\t\t; Store new sprite position\n\tLD\t(.sposy+1),A\n\tLD\tA,H\n\tLD\t(.sposy),A\n\tCALL\t.place_sprite\t; Update position\n\n\tRET\n\n\t;; Open and close the door\n.door:\n\tLD\tA,(.doorstate)\n\tCP\t#.OPENING\n\tJP\tZ,.open_door\n\tCP\t#.CLOSING\n\tJP\tZ,.close_door\n\tRET\n\n.open_door:\n\tLD\tA,(.doorpos)\n\tLD\tHL,#.film+0x02\n\tLD\tB,#0x00\n\tLD\tC,A\n\tADD\tHL,BC\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tLD\tDE,#0x1010/8\t; Place image at (0x10,0x10)\n\tLD\tHL,#0x6030/8\t; Image size is 0x60 x 0x30\n\tCALL\t.set_xy_wtt\n\n\tLD\tA,(.doorpos)\n\tADD\tA,#0x02\n\tLD\t(.doorpos),A\n\tCP\t#.NBDFRAMES\n\tRET\tNZ\n\tLD\tA,#.OPENED\n\tLD\t(.doorstate),A\n\tRET\n\n.close_door:\n\tLD\tA,(.doorpos)\n\tLD\tHL,#.film-0x02\n\tLD\tB,#0x00\n\tLD\tC,A\n\tADD\tHL,BC\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tLD\tDE,#0x1010/8\t; Place image at (0x10,0x10)\n\tLD\tHL,#0x6030/8\t; Image size is 0x60 x 0x30\n\tCALL\t.set_xy_wtt\n\n\tLD\tA,(.doorpos)\n\tSUB\tA,#0x02\n\tLD\t(.doorpos),A\n\tRET\tNZ\n\tLD\tA,#.CLOSED\n\tLD\t(.doorstate),A\n\tRET\n\n\t;; Animate sprite\n.animate_sprite:\n\tLD\tA,(.time)\n\tAND\t#0x07\n\tRET\tNZ\n\n\tLD\tA,(.sframe)\n\tINC\tA\n\tCP\t#.NBSFRAMES\n\tJR\tNZ,1$\n\tXOR\tA\n1$:\n\tLD\t(.sframe),A\n\n\tCALL\t.tile_sprite\n\tRET\n\n\t;; Set sprite tiles\n.tile_sprite:\n\tLD\tA,(.sframe)\n\tLD\tHL,#.earth_tiles\n\tRLCA\n\tLD\tB,#0x00\n\tLD\tC,A\n\tADD\tHL,BC\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tA,(HL+)\n\tLD\tD,A\n\tPUSH\tHL\n\tCALL\t.set_sprite_tile\n\tPOP\tHL\n\n\tLD\tC,#0x01\t\t; Sprite 0x01\n\tLD\tA,(HL+)\n\tLD\tD,A\n\tCALL\t.set_sprite_tile\n\n\tRET\n\n\t;; Place sprite\n.place_sprite:\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tA,(.sposx)\n\tLD\tD,A\n\tLD\tA,(.sposy)\n\tLD\tE,A\n\tPUSH\tDE\t\t; Store position\n\tCALL\t.mv_sprite\n\n\tLD\tC,#0x01\t\t; Sprite 0x01\n\tPOP\tDE\t\t; Restore position\n\tLD\tA,#0x08\n\tADD\tA,D\n\tLD\tD,A\n\tCALL\t.mv_sprite\n\n\tRET\n\n\t.area\t_LIT\n\n.tp0:\n\n.std_data:\n\n\t; Basic tiles (0xFC to 0xFF)\n\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\n.endtp0:\n\n.tp1:\n\n.earth_data:\n\n\t; Tile 0x00\n\t.byte\t0x07,0x07,0x18,0x1F,0x32,0x2D,0x71,0x4E,0x70,0x4F,0xF8,0x87,0xF8,0x87,0xF8,0x87\n\t.byte\t0xFC,0x83,0xFE,0x81,0x7F,0x40,0x7F,0x40,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0xF0,0x30,0x78,0x88,0x3C,0xC4,0x5C,0xA4,0x9E,0x62,0x3E,0xC2,0x3E,0xC2\n\t.byte\t0x5E,0xA2,0x7E,0x82,0x0C,0xF4,0x0C,0xF4,0x98,0x68,0xB0,0x70,0xC0,0xC0,0x00,0x00\n\t.byte\t0x07,0x07,0x1F,0x18,0x2F,0x30,0x4F,0x70,0x6F,0x50,0x9F,0xE0,0x9F,0xE0,0xBF,0xC0\n\t.byte\t0xFF,0x80,0xB7,0xC8,0x63,0x5C,0x43,0x7C,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0xB0,0x70,0x18,0xE8,0x0C,0xF4,0x0C,0xF4,0x82,0x7E,0x82,0x7E,0x86,0x7A\n\t.byte\t0xC6,0x3A,0xE6,0x1A,0xF4,0x0C,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\n\t; Tile 0x08\n\t.byte\t0x07,0x07,0x1E,0x19,0x20,0x3F,0x40,0x7F,0x42,0x7D,0x81,0xFE,0x81,0xFE,0x83,0xFC\n\t.byte\t0xD7,0xA8,0xBB,0xC4,0x6E,0x51,0x7C,0x43,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0x70,0xB0,0xE8,0x18,0xF4,0x0C,0xF4,0x0C,0xFE,0x02,0xFE,0x02,0xFE,0x02\n\t.byte\t0xFE,0x02,0x7E,0x82,0x3C,0xC4,0x3C,0xC4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\t.byte\t0x07,0x07,0x1B,0x1C,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xE0,0x9F,0x90,0xEF,0x89,0xF6\n\t.byte\t0x8D,0xF2,0x9F,0xE0,0x5E,0x61,0x6F,0x50,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0xB0,0x70,0x28,0xD8,0x04,0xFC,0x2C,0xD4,0x1E,0xE2,0x1E,0xE2,0x3E,0xC2\n\t.byte\t0x7E,0x82,0xB6,0x4A,0xE4,0x1C,0xC4,0x3C,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\n\t; Tile 0x10\n\t.byte\t0x07,0x07,0x18,0x1F,0x20,0x3F,0x40,0x7F,0x40,0x7F,0xEE,0x91,0xF1,0x8E,0xE0,0x9F\n\t.byte\t0xE0,0x9F,0xF1,0x8E,0x71,0x4E,0x72,0x4D,0x3F,0x20,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0xF0,0x30,0x08,0xF8,0x04,0xFC,0x04,0xFC,0x02,0xFE,0x02,0xFE,0x92,0x6E\n\t.byte\t0xD6,0x2A,0xFE,0x02,0xEC,0x14,0xFC,0x04,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\t.byte\t0x07,0x07,0x1D,0x1A,0x36,0x29,0x5C,0x63,0x6C,0x53,0xCE,0xB1,0x9F,0xE0,0x9E,0xE1\n\t.byte\t0xAE,0xD1,0xBF,0xC0,0x47,0x78,0x47,0x78,0x2F,0x30,0x1F,0x18,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0x70,0xB0,0x08,0xF8,0x04,0xFC,0x04,0xFC,0xE2,0x1E,0x32,0xCE,0x0E,0xF2\n\t.byte\t0x0E,0xF2,0x1E,0xE2,0x1C,0xE4,0x2C,0xD4,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\n\t; Tile 0x18\n\t.byte\t0x07,0x07,0x1E,0x19,0x33,0x2C,0x49,0x76,0x42,0x7D,0xC4,0xBB,0xC1,0xBE,0xC1,0xBE\n\t.byte\t0xE2,0x9D,0xF3,0x8C,0x78,0x47,0x78,0x47,0x3C,0x23,0x1C,0x1B,0x07,0x07,0x00,0x00\n\t.byte\t0xC0,0xC0,0x70,0xB0,0x68,0x98,0xC4,0x3C,0xC4,0x3C,0xEE,0x12,0xF2,0x0E,0xE2,0x1E\n\t.byte\t0xE2,0x1E,0xF2,0x0E,0x7C,0x84,0x7C,0x84,0xF8,0x08,0xF0,0x30,0xC0,0xC0,0x00,0x00\n\n.endtp1:\n\n.tp2:\n\n.frame_data:\n\n\t; Tile 0x00\n\t.byte\t0xFF,0x00,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F\n\t.byte\t0xFF,0x00,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0x7F,0x80\n\t.byte\t0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0x7F\n\t.byte\t0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF\n\t.byte\t0xFF,0x00,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F\n\t.byte\t0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x00\n\t.byte\t0xFF,0x70,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0xFF,0x70,0xFF,0x00,0xFF,0x00,0xFF,0x01\n\t.byte\t0xFF,0x00,0xFE,0x01,0xFC,0x03,0xF8,0x07,0xF0,0x0F,0xE0,0x1F,0xC0,0x3F,0xFF,0xFF\n\n\t; Tile 0x08\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF\n\t.byte\t0x00,0xFF,0x01,0xFE,0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xE0,0x3F,0xC0,0xFF,0xFF\n\t.byte\t0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF\n\t.byte\t0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFE,0x0F,0xE0,0x1F,0xC0,0x3F,0x80,0xFF\n\t.byte\t0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF\n\t.byte\t0xFF,0x01,0xFF,0x01,0xFD,0x03,0xF9,0x07,0xF1,0x0F,0xE1,0x1F,0xC1,0x3F,0x81,0x7F\n\t.byte\t0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F\n\t.byte\t0x01,0xFF,0x01,0xFF,0x03,0xFD,0x07,0xF9,0x0F,0xF1,0x1F,0xE1,0x3F,0xC1,0x7F,0x81\n\n\t; Tile 0x10\n\t.byte\t0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01\n\t.byte\t0x01,0xFF,0x01,0xFE,0x03,0xFC,0x77,0xF8,0xFF,0x98,0xEF,0xB8,0xCF,0xF8,0x7F,0xF0\n\t.byte\t0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x0E,0xFF,0x13,0xFD,0x17,0xF9,0x1F,0xFF,0x0E\n\t.byte\t0x80,0x7F,0x81,0x7E,0x83,0x7C,0x87,0x78,0x8F,0x70,0x9F,0x60,0xBF,0x40,0xFF,0x7F\n\t.byte\t0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0x01,0xFF,0xFF,0xFF\n\n.door1_data:\n\n\t; Tile 0x15\n\t.byte\t0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF\n\t.byte\t0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF\n\n.door2_data:\n\n\t; Tile 0x18\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF\n\t.byte\t0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF\n\t.byte\t0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\n.door3_data:\n\n\t; Tile 0x1C\n\t.byte\t0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF\n\t.byte\t0x00,0xFF,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\n.door4_data:\n\n\t; Tile 0x20\n\t.byte\t0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\n.endtp2:\n\n.tp3:\n\n.bkg_data:\n\n\t; Tile 0x00\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFE,0xFF\n\n\t; Tile 0x08\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7D,0xFE,0x7C,0x39\n\t.byte\t0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFD\n\t.byte\t0xBB,0x01,0xC7,0x83,0xC7,0x83,0xC7,0x83,0xBB,0x01,0x7C,0x39,0x7D,0xFE,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB,0xAF,0x77,0x27,0x8F,0xDF,0x8F,0x27,0x8F\n\n\t; Tile 0x10\n\t.byte\t0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFB,0xFF,0xF7,0xEF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xBF,0xFF,0xDF,0xEF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFE,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xAF,0x77,0xFF,0xFB,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF\n\n\t; Tile 0x18\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x7D,0xFE,0x7C,0x39\n\t.byte\t0xFF,0xFF,0xF7,0xFF,0xEF,0xFF,0xFF,0xDF,0xFF,0xBF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFD\n\n\t; Tile 0x20\n\t.byte\t0xFF,0xFF,0xDF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFB,0xFE,0xFD,0xFD,0xFE,0xFE,0xFF\n\t.byte\t0xAB,0x11,0xC7,0x83,0x83,0xC7,0xC7,0x83,0xAB,0x11,0x7C,0x39,0x7D,0xFE,0xFE,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFB,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x7F\n\t.byte\t0xFB,0xFF,0xFF,0xFD,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xFD,0xFB,0xFF,0xFF,0xFF\n\t.byte\t0xEF,0xFF,0xFF,0xDF,0x3F,0xBF,0x3F,0x7F,0x3F,0xBF,0xFF,0xDF,0xEF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFD,0xFE,0xFE,0xFD\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF\n\n\t; Tile 0x28\n\t.byte\t0xF7,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\t.byte\t0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF\n\n.endtp3:\n\n\t; Image size: 0x40 x 0x40\n\t; Number of tiles (total - unique): 0x40 - 0x2D\n\n.bkg_tiles:\n\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\t.byte\t0x00,0x01,0x02,0x03,0xFC,0xFC,0x04,0xFC\n\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\t.byte\t0xFC,0x05,0x06,0xFC,0x07,0x08,0x09,0x0A\n\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0x02,0x0B,0x0C,0x0D,0xFC\n\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\t.byte\t0x0E,0x0F,0x10,0xFC,0x11,0x12,0x13,0x14\n\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\t.byte\t0x15,0x16,0x17,0xFC,0x18,0x19,0x1A,0xFC\n\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\t.byte\t0x1B,0x1C,0x1D,0xFC,0xFC,0x1E,0x1F,0x20\n\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\t.byte\t0x21,0x22,0xFC,0x23,0x24,0x25,0xFC,0x26\n\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\t.byte\t0x27,0x13,0x28,0x29,0x2A,0x2B,0x2C,0x11\n\n\t; Image size: 0x10 x 0x70\n\t; Number of tiles (total - unique): 0x1C - 0x1C\n\n.earth_tiles:\n\n\t.byte\t0x00,0x02\n\t.byte\t0x04,0x06\n\t.byte\t0x08,0x0A\n\t.byte\t0x0C,0x0E\n\t.byte\t0x10,0x12\n\t.byte\t0x14,0x16\n\t.byte\t0x18,0x1A\n\n\t; Image size: 0x80 x 0x50\n\t; Number of tiles (total - unique): 0xA0 - 0x15\n\n.frame_tiles:\n\n\t.byte\t0x80,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x84\n\t.byte\t0x85,0x86,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x8B,0x8C\n\t.byte\t0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F\n\t.byte\t0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90\n\t.byte\t0x8E,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x8D\n\t.byte\t0x85,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x82,0x8C\n\t.byte\t0xFD,0x8D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E,0x8F\n\t.byte\t0x82,0x8C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x90\n\t.byte\t0x8E,0x91,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0xFD,0x82,0x83,0x81,0x92,0x8D\n\t.byte\t0x93,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x88,0x89,0x8A,0x87,0x94\n\n\t; Image size: 0x60 x 0x30\n\t; Number of tiles (total - unique): 0x48 - 0x03\n\n.door1_tiles:\n\n\t.byte\t0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95\n\t.byte\t0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96\n\t.byte\t0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97\n\t.byte\t0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95\n\t.byte\t0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96\n\t.byte\t0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97\n\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\n\t; Image size: 0x60 x 0x30\n\t; Number of tiles (total - unique): 0x48 - 0x04\n\n.door2_tiles:\n\n\t.byte\t0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98\n\t.byte\t0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99\n\t.byte\t0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A\n\t.byte\t0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98\n\t.byte\t0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99\n\t.byte\t0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B,0x9B\n\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\n\t; Image size: 0x60 x 0x30\n\t; Number of tiles (total - unique): 0x48 - 0x04\n\n.door3_tiles:\n\n\t.byte\t0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C\n\t.byte\t0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D\n\t.byte\t0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E,0x9E\n\t.byte\t0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C,0x9C\n\t.byte\t0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D,0x9D\n\t.byte\t0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F\n\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\n\t; Image size: 0x60 x 0x30\n\t; Number of tiles (total - unique): 0x48 - 0x01\n\n.door4_tiles:\n\n\t.byte\t0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95\n\t.byte\t0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96\n\t.byte\t0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97,0x97\n\t.byte\t0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95,0x95\n\t.byte\t0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96\n\t.byte\t0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0\n\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\t.byte\t0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC\n\n.film:\n\t.word\t.door1_tiles+0x0C*0\n\t.word\t.door2_tiles+0x0C*0\n\t.word\t.door3_tiles+0x0C*0\n\t.word\t.door4_tiles+0x0C*0\n\t.word\t.door1_tiles+0x0C*1\n\t.word\t.door2_tiles+0x0C*1\n\t.word\t.door3_tiles+0x0C*1\n\t.word\t.door4_tiles+0x0C*1\n\t.word\t.door1_tiles+0x0C*2\n\t.word\t.door2_tiles+0x0C*2\n\t.word\t.door3_tiles+0x0C*2\n\t.word\t.door4_tiles+0x0C*2\n\t.word\t.door1_tiles+0x0C*3\n\t.word\t.door2_tiles+0x0C*3\n\t.word\t.door3_tiles+0x0C*3\n\t.word\t.door4_tiles+0x0C*3\n\t.word\t.door1_tiles+0x0C*4\n\t.word\t.door2_tiles+0x0C*4\n\t.word\t.door3_tiles+0x0C*4\n\t.word\t.door4_tiles+0x0C*4\n\t.word\t.door1_tiles+0x0C*5\n\t.word\t.door2_tiles+0x0C*5\n\t.word\t.door3_tiles+0x0C*5\n\t.word\t.door4_tiles+0x0C*5\n.endfilm:\n\t.word\t.door1_tiles+0x0C*6\n"
  },
  {
    "path": "examples/thumby/Make.bat",
    "content": "echo off\nset BIN=..\\..\\bin\nset OBJ=obj\n\nif \"%1\"==\"clean\" (\n\tif exist %OBJ% rd /s/q %OBJ%\n\tif exist thumby.gb del thumby.gb\n\tgoto end\n)\n\nif not exist %OBJ% mkdir %OBJ%\ncall %BIN%\\gbdk-n-compile.bat thumby.c -o %OBJ%\\thumby.rel\ncall %BIN%\\gbdk-n-link.bat %OBJ%\\thumby.rel -o %OBJ%\\thumby.ihx\ncall %BIN%\\gbdk-n-make-rom.bat %OBJ%\\thumby.ihx thumby.gb\n\n:end\n"
  },
  {
    "path": "examples/thumby/Makefile",
    "content": "BIN=../../bin\nOBJ=./obj\n\nbuild:\n\tmkdir -p $(OBJ)\n\t$(BIN)/gbdk-n-compile.sh thumby.c -o $(OBJ)/thumby.rel\n\t$(BIN)/gbdk-n-link.sh $(OBJ)/thumby.rel -o $(OBJ)/thumby.ihx\n\t$(BIN)/gbdk-n-make-rom.sh $(OBJ)/thumby.ihx thumby.gb\n\nclean:\n\trm -rf $(OBJ)\n\trm -f thumby.gb\n"
  },
  {
    "path": "examples/thumby/thumby.c",
    "content": "#include <gb/gb.h>\n\n/*\n * Game Boy Development Kit Demonstration program\n * Creates a rectangle on screen\n * which can be moved around with the game pad\n *\n */\n\nunsigned char backgroundcharacters[] = {\n\t0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n\t0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xF0,\n\n\t0x80,0xFF,0x7F,0xE0,0x9F,0xE0,0xFF,0xF0,\n\t0xFF,0xF9,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,\n\n\t0xFF,0xFF,0xFF,0xCF,0xFF,0x87,0xFF,0xCF,\n\t0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,\n\n\t0x1F,0xFF,0xEF,0x7F,0x9F,0x7F,0xFF,0xFF,\n\t0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF\n}; \n\nunsigned char spritetiles[] = {\n\t255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0\n};\n\nunsigned char bgmap[] = {\n\t0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,\n\t1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3\n}; \n\nvoid main()\n{\n\tUBYTE counter,x,y;\n\tx=40;\n\ty=17;\n\n\tdisable_interrupts();\n\tDISPLAY_OFF;\n\n\t// load background\n\tset_bkg_data(0,4,backgroundcharacters);\n\tfor(counter=0;counter<=16;counter+=2)\n\t\tset_bkg_tiles( 0, counter, 20, 2, bgmap);\n\n\t// load sprite\n\tSPRITES_8x8;\n\tset_sprite_data(0, 1, spritetiles);\n\tset_sprite_tile(0,0);\n\tmove_sprite(0,x,y);\n\n\tSHOW_BKG;\n\tSHOW_SPRITES; \n\tDISPLAY_ON;\n\tenable_interrupts();\n\n\twhile(1) {\n\t/* Skip four VBLs (slow down animation) */\n\t\tfor(counter = 0; counter < 4; counter++){\n\t\t\twait_vbl_done();\n\t\t}\n\t\tcounter = joypad();\n\n\t\tif(counter & J_UP)\n\t\t\ty--;\n\t\tif(counter & J_DOWN)\n\t\t\ty++;\n\t\tif(counter & J_LEFT)\n\t\t\tx--;\n\t\tif(counter & J_RIGHT)\n\t\t\tx++;\n\n\t\tmove_sprite(0,x,y);\n\t}\n}\n"
  },
  {
    "path": "include/asm/gbz80/provides.h",
    "content": "#define USE_C_MEMCPY\t1\n#define USE_C_STRCPY\t1\n#define USE_C_STRCMP\t1\n\n"
  },
  {
    "path": "include/asm/gbz80/stdarg.h",
    "content": "#ifndef ASM_GBZ80_STDARG_INCLUDE\n#define ASM_GBZ80_STDARG_INCLUDE\n\n/* sdcc pushes right to left with the real sizes, not cast up\n   to an int.\n   so printf(int, char, long)\n   results in push long, push char, push int\n   On the z80 the stack grows down, so the things seem to be in\n   the correct order.\n */\n\ntypedef unsigned char * va_list;\n#define va_start(list, last)\tlist = (unsigned char *)&last + sizeof(last)\n#define va_arg(list, type)\t*((type *)((list += sizeof(type)) - sizeof(type)))\n\n#define va_end(list)\n\n#endif\n"
  },
  {
    "path": "include/asm/gbz80/types.h",
    "content": "/** @file asm/gbz80/types.h\n    Types definitions for the gb.\n*/\n#ifndef ASM_GBZ80_TYPES_INCLUDE\n#define ASM_GBZ80_TYPES_INCLUDE\n\n#if SDCC_PORT!=gbz80\n#error gbz80 only.\n#endif\n\n#define NONBANKED\t__nonbanked\n#define BANKED\t\t__banked\n\n/** Signed eight bit.\n */\ntypedef signed char   \tINT8;\n/** Unsigned eight bit.\n */\ntypedef unsigned char \tUINT8;\n/** Signed sixteen bit.\n */\ntypedef int           \tINT16;\n/** Unsigned sixteen bit.\n */\ntypedef unsigned int  \tUINT16;\n/** Signed 32 bit.\n */\ntypedef long          \tINT32;\n/** Unsigned 32 bit.\n */\ntypedef unsigned long \tUINT32;\n\n#ifndef __SIZE_T_DEFINED\n#define __SIZE_T_DEFINED\ntypedef unsigned int  \tsize_t;\n#endif\n\n/** Returned from clock\n    @see clock\n*/\ntypedef UINT16\t\tclock_t;\n\n#endif\n"
  },
  {
    "path": "include/asm/types.h",
    "content": "/** @file asm/types.h\n    Shared types definitions.\n*/\n#ifndef ASM_TYPES_INCLUDE\n#define ASM_TYPES_INCLUDE\n\n#if SDCC_PORT == gbz80\n#include <asm/gbz80/types.h>\n#elif SDCC_PORT == z80\n#include <asm/z80/types.h>\n#else\n#error Unrecognised port\n#endif\n\n#ifndef NONBANKED\n#define NONBANKED\n#endif\n\n#ifndef BANKED\n#define BANKED\n#endif\n\n/** TRUE or FALSE.\n */\ntypedef INT8\t\tBOOLEAN;\n\n#if BYTE_IS_UNSIGNED\n\ntypedef UINT8\t\tBYTE;\ntypedef UINT16\t\tWORD;\ntypedef UINT32\t\tDWORD;\n\n#else\n\n/** Signed 8 bit.\n */\ntypedef INT8         \tBYTE;\n/** Unsigned 8 bit.\n */\ntypedef UINT8        \tUBYTE;\n/** Signed 16 bit */\ntypedef INT16      \tWORD;\n/** Unsigned 16 bit */\ntypedef UINT16       \tUWORD;\n/** Signed 32 bit */\ntypedef INT32       \tLWORD;\n/** Unsigned 32 bit */\ntypedef UINT32      \tULWORD;\n/** Signed 32 bit */\ntypedef INT32\t   \tDWORD;\n/** Unsigned 32 bit */\ntypedef UINT32\t   \tUDWORD;\n\n/** Useful definition for fixed point values */\ntypedef union _fixed {\n  struct {\n    UBYTE l;\n    UBYTE h;\n  } b;\n  UWORD w;\n} fixed;\n\n#endif\n\n#endif\n"
  },
  {
    "path": "include/asm/z80/provides.h",
    "content": "#undef USE_C_MEMCPY\n#undef USE_C_STRCPY\n#undef USE_C_STRCMP\n"
  },
  {
    "path": "include/asm/z80/stdarg.h",
    "content": "#ifndef ASM_Z80_STDARG_INCLUDE\n#define ASM_Z80_STDARG_INCLUDE\n\n/* sdcc pushes right to left with the real sizes, not cast up\n   to an int.\n   so printf(int, char, long)\n   results in push long, push char, push int\n   On the z80 the stack grows down, so the things seem to be in\n   the correct order.\n */\n\ntypedef char * va_list;\n#define va_start(list, last)\tlist = (char *)&last + sizeof(last)\n#ifdef STDIO_INCLUDE\n#define va_arg(list, type)\t*(type *)list; list + sizeof(type)\n#else\n#define va_arg(list, type)\t(list + sizeof(type), *(type *)(list - sizeof(type)))\n#endif\n\n#endif\n"
  },
  {
    "path": "include/asm/z80/types.h",
    "content": "#ifndef ASM_Z80_TYPES_INCLUDE\n#define ASM_Z80_TYPES_INCLUDE\n\n#if SDCC_PORT!=z80\n#error z80 only.\n#endif\n\ntypedef char          \tINT8;\ntypedef unsigned char \tUINT8;\ntypedef int           \tINT16;\ntypedef unsigned int  \tUINT16;\ntypedef long          \tINT32;\ntypedef unsigned long \tUINT32;\n\ntypedef int\t      \tsize_t;\ntypedef UINT16\t\tclock_t;\n\n#endif\n"
  },
  {
    "path": "include/gb/cgb.h",
    "content": "/** @file gb/cgb.h\n    Support for Color GameBoy.\n*/\n\n#ifndef _CGB_H\n#define _CGB_H\n\n/** Macro to create a palette entry out of the color components.\n */\n#define RGB(r, g, b) \\\n  ((((UINT16)(b) & 0x1f) << 10) | (((UINT16)(g) & 0x1f) << 5) | (((UINT16)(r) & 0x1f) << 0))\n\n/** Common colors based on the EGA default palette.\n */\n#define RGB_RED        RGB(31,  0,  0)\n#define RGB_DARKRED    RGB(15,  0,  0)\n#define RGB_GREEN      RGB( 0, 31,  0)\n#define RGB_DARKGREEN  RGB( 0, 15,  0)\n#define RGB_BLUE       RGB( 0,  0, 31)\n#define RGB_DARKBLUE   RGB( 0,  0, 15)\n#define RGB_YELLOW     RGB(31, 31,  0)\n#define RGB_DARKYELLOW RGB(21, 21,  0)\n#define RGB_CYAN       RGB( 0, 31, 31)\n#define RGB_AQUA       RGB(28,  5, 22)\n#define RGB_PINK       RGB(11,  0, 31)\n#define RGB_PURPLE     RGB(21,  0, 21)\n#define RGB_BLACK      RGB( 0,  0,  0)\n#define RGB_DARKGRAY   RGB(10, 10, 10)\n#define RGB_LIGHTGRAY  RGB(21, 21, 21)\n#define RGB_WHITE      RGB(31, 31, 31)\n\n#define RGB_LIGHTFLESH RGB(30, 20, 15)\n#define RGB_BROWN      RGB(10, 10,  0)\n#define RGB_ORANGE     RGB(30, 20,  0)\n#define RGB_TEAL       RGB(15, 15,  0)\n\n/** Set bkg palette(s).\n */\nvoid\nset_bkg_palette(UINT8 first_palette,\n                UINT8 nb_palettes,\n                UINT16 *rgb_data) NONBANKED;\n\n/** Set sprite palette(s).\n */\nvoid\nset_sprite_palette(UINT8 first_palette,\n                   UINT8 nb_palettes,\n                   UINT16 *rgb_data) NONBANKED;\n\n/** Set a bkg palette entry.\n */\nvoid\nset_bkg_palette_entry(UINT8 palette,\n                      UINT8 entry,\n                      UINT16 rgb_data);\n\n/** Set a sprite palette entry.\n */\nvoid\nset_sprite_palette_entry(UINT8 palette,\n                         UINT8 entry,\n                         UINT16 rgb_data);\n\n/** Set CPU speed to slow operation.\n    Make sure interrupts are disabled before call.\n\n    @see cpu_fast\n */\nvoid cpu_slow(void);\n\n/** Set CPU speed to fast operation.\n    Make sure interrupts are disabled before call.\n\n    @see cpu_slow\n*/\nvoid cpu_fast(void);\n\n/** Set defaults compatible with normal GameBoy.\n */\nvoid cgb_compatibility(void);\n\n#endif /* _CGB_H */\n"
  },
  {
    "path": "include/gb/console.h",
    "content": "/** @file gb/console.h\n    Console functions that work like Turbo C's.\n    Note that the font is 8x8, making the screen 20x18 characters.\n*/\n#ifndef _CONSOLE_H\n#define _CONSOLE_H\n\n#include <types.h>\n\n/** Move the cursor to an absolute position.\n */\nvoid\ngotoxy(UINT8 x,\n\t   UINT8 y);\n\n/** Get the current X position of the cursor.\n */\nUINT8\nposx(void);\n\n/** Get the current Y position of the cursor.\n */\nUINT8\nposy(void);\n\n/** Writes out a single character at the current cursor\n    position.\n    Does not update the cursor or interpret the character.\n*/\nvoid\nsetchar(char c);\n\n#endif /* _CONSOLE_H */\n"
  },
  {
    "path": "include/gb/drawing.h",
    "content": "/** @file gb/drawing.h\n    All Points Addressable (APA) mode drawing library.\n\n    Drawing routines originally by Pascal Felber\n    Legendary overhall by Jon Fuge <jonny@q-continuum.demon.co.uk>\n    Commenting by Michael Hope\n\n    Note that the standard text printf() and putchar() cannot be used\n    in APA mode - use gprintf() and wrtchr() instead.\n*/\n#ifndef __DRAWING_H\n#define __DRAWING_H\n\n/** Size of the screen in pixels */\n#define GRAPHICS_WIDTH\t160\n#define GRAPHICS_HEIGHT 144\n\n/** Possible drawing modes */\n#if ORIGINAL\n\t#define\tSOLID\t0x10\t\t/* Overwrites the existing pixels */\n\t#define\tOR\t0x20\t\t/* Performs a logical OR */\n\t#define\tXOR\t0x40\t\t/* Performs a logical XOR */\n\t#define\tAND\t0x80\t\t/* Performs a logical AND */\n#else\n\t#define\tSOLID\t0x00\t\t/* Overwrites the existing pixels */\n\t#define\tOR\t0x01\t\t/* Performs a logical OR */\n\t#define\tXOR\t0x02\t\t/* Performs a logical XOR */\n\t#define\tAND\t0x03\t\t/* Performs a logical AND */\n#endif\n\n/** Possible drawing colours */\n#define\tWHITE\t0\n#define\tLTGREY\t1\n#define\tDKGREY\t2\n#define\tBLACK\t3\n\n/** Possible fill styles for box() and circle() */\n#define\tM_NOFILL\t0\n#define\tM_FILL\t\t1\n\n/** Possible values for signed_value in gprintln() and gprintn() */\n#define SIGNED   1\n#define UNSIGNED 0\n\n#include <types.h>\n\n/** Print the string 'str' with no interpretation */\nvoid\n\tgprint(char *str) NONBANKED;\n\n/** Print the long number 'number' in radix 'radix'.  signed_value should\n   be set to SIGNED or UNSIGNED depending on whether the number is signed\n   or not */\nvoid\n\tgprintln(INT16 number, INT8 radix, INT8 signed_value);\n\n/** Print the number 'number' as in 'gprintln' */\nvoid\t\n\tgprintn(INT8 number, INT8 radix, INT8 signed_value);\n\n/** Print the formatted string 'fmt' with arguments '...' */\nINT8\t\n\tgprintf(char *fmt,...) NONBANKED;\n\n/** Old style plot - try plot_point() */\nvoid\n\tplot(UINT8 x, UINT8 y, UINT8 colour, UINT8 mode);\n\n/** Plot a point in the current drawing mode and colour at (x,y) */\nvoid\t\n\tplot_point(UINT8 x, UINT8 y);\n\n/** I (MLH) have no idea what switch_data does... */\nvoid\n\tswitch_data(UINT8 x, UINT8 y, unsigned char *src, unsigned char *dst) NONBANKED;\n\n/** Ditto */\nvoid\t\n\tdraw_image(unsigned char *data) NONBANKED;\n\n/** Draw a line in the current drawing mode and colour from (x1,y1) to (x2,y2) */\nvoid\t\n\tline(UINT8 x1, UINT8 y1, UINT8 x2, UINT8 y2);\n\n/** Draw a box (rectangle) with corners (x1,y1) and (x2,y2) using fill mode\n   'style' (one of NOFILL or FILL */\nvoid\t\n\tbox(UINT8 x1, UINT8 y1, UINT8 x2, UINT8 y2, UINT8 style);\n\n/** Draw a circle with centre at (x,y) and radius 'radius'.  'style' sets\n   the fill mode */\nvoid\t\n\tcircle(UINT8 x, UINT8 y, UINT8 radius, UINT8 style);\n\n/** Returns the current colour of the pixel at (x,y) */\nUINT8\t\n\tgetpix(UINT8 x, UINT8 y);\n\n/** Prints the character 'chr' in the default font at the current position */\nvoid\t\n\twrtchr(char chr);\n\n/** Sets the current text position to (x,y).  Note that x and y have units\n   of cells (8 pixels) */\nvoid\n\tgotogxy(UINT8 x, UINT8 y);\n\n/** Set the current foreground colour (for pixels), background colour, and\n   draw mode */\nvoid\tcolor(UINT8 forecolor, UINT8 backcolor, UINT8 mode);\n\n#endif /* __DRAWING_H */\n"
  },
  {
    "path": "include/gb/font.h",
    "content": "/** @file gb/font.h\n    Multiple font support for the GameBoy\n    Michael Hope, 1999\n    michaelh@earthling.net\n*/\n#ifndef __FONT_H\n#define __FONT_H\n\n#include <gb/gb.h>\n\n/** Various flags in the font header.\n */\n#define\tFONT_256ENCODING\t0\n#define\tFONT_128ENCODING\t1\n#define\tFONT_NOENCODING\t\t2\n\n#define\tFONT_COMPRESSED\t\t4\n\n/* See gb.h/M_NO_SCROLL and gb.h/M_NO_INTERP */\n\n/** font_t is a handle to a font loaded by font_load() */\ntypedef UINT16 font_t;\n\n/** The default fonts */\nextern UINT8 font_spect[], font_italic[], font_ibm[], font_min[];\n\n/** Backwards compatible font */\nextern UINT8 font_ibm_fixed[];\n\n/** Init the font system.\n    Should be called first.\n */\nvoid\tfont_init(void) NONBANKED;\n\n/** Load the font 'font'.\n    Sets the current font to the newly loaded font.\n */\nfont_t\tfont_load( void *font ) NONBANKED;\n\n/** Set the current font to 'font_handle', which was returned \n    from an earlier font_load().  \n    @return\t\tThe previously used font handle.\n*/\nfont_t\tfont_set( font_t font_handle ) NONBANKED;\n\n/* Use mode() and color() to set the font modes and colours */\n\n/** Internal representation of a font.  \n    What a font_t really is */\ntypedef struct sfont_handle mfont_handle;\ntypedef struct sfont_handle *pmfont_handle;\n\nstruct sfont_handle {\n    UINT8 first_tile;\t\t/* First tile used */\n    void *font;\t\t\t/* Pointer to the base of the font */\n};\n\n#endif /* __FONT_H */\n"
  },
  {
    "path": "include/gb/gb.h",
    "content": "/** @file gb/gb.h\n    Gameboy specific functions.\n*/\n#ifndef _GB_H\n#define _GB_H\n\n#include <types.h>\n#include <gb/hardware.h>\n#include <gb/sgb.h>\n#include <gb/cgb.h>\n\n/** Joypad bits.\n    A logical OR of these is used in the wait_pad and joypad\n    functions.  For example, to see if the B button is pressed\n    try\n\n    UINT8 keys;\n    keys = joypad();\n    if (keys & J_B) {\n    \t...\n    }\n\n    @see joypad\n */\n#define\tJ_START      0x80U\n#define\tJ_SELECT     0x40U\n#define\tJ_B          0x20U\n#define\tJ_A          0x10U\n#define\tJ_DOWN       0x08U\n#define\tJ_UP         0x04U\n#define\tJ_LEFT       0x02U\n#define\tJ_RIGHT      0x01U\n\n/** Screen modes.\n    Normally used by internal functions only.\n */\n#define\tM_DRAWING    0x01U\n#define\tM_TEXT_OUT   0x02U\n#define\tM_TEXT_INOUT 0x03U\n/** Set this in addition to the others to disable scrolling \n    If scrolling is disabled, the cursor returns to (0,0) */\n#define M_NO_SCROLL  0x04U\n/** Set this to disable \\n interpretation */\n#define M_NO_INTERP  0x08U\n\n/** If this is set, sprite colours come from OBJ1PAL.  Else\n    they come from OBJ0PAL.\n*/\n#define S_PALETTE    0x10U\n/** If set the sprite will be flipped horizontally.\n */\n#define S_FLIPX      0x20U\n/** If set the sprite will be flipped vertically.\n */\n#define S_FLIPY      0x40U\n/** If this bit is clear, then the sprite will be displayed\n    ontop of the background and window.\n*/\n#define S_PRIORITY   0x80U\n\n/* Interrupt flags */\n/** Vertical blank interrupt.\n    Occurs at the start of the vertical blank.  During this\n    period the video ram may be freely accessed.\n */\n#define VBL_IFLAG    0x01U\n/** Interrupt when triggered by the STAT register.\n    See the Pan doc.\n*/\n#define LCD_IFLAG    0x02U\n/** Interrupt when the timer TIMA overflows.\n */\n#define TIM_IFLAG    0x04U\n/** Occurs when the serial transfer has completed.\n */\n#define SIO_IFLAG    0x08U\n/** Occurs on a transition of the keypad.\n */\n#define JOY_IFLAG    0x10U\n\n/* Limits */\n/** Width of the visible screen in pixels.\n */\n#define SCREENWIDTH  0xA0U\n/** Height of the visible screen in pixels.\n */\n#define SCREENHEIGHT 0x90U\n#define MINWNDPOSX   0x07U\n#define MINWNDPOSY   0x00U\n#define MAXWNDPOSX   0xA6U\n#define MAXWNDPOSY   0x8FU\n\n/* ************************************************************ */\n\n/** Interrupt handlers\n */\ntypedef void (*int_handler)(void) NONBANKED;\n\n/** The remove functions will remove any interrupt\n   handler.  A handler of NULL will cause bad things\n   to happen.\n*/\nvoid\nremove_VBL(int_handler h) NONBANKED;\n\nvoid\nremove_LCD(int_handler h) NONBANKED;\n\nvoid\nremove_TIM(int_handler h) NONBANKED;\n\nvoid\nremove_SIO(int_handler h) NONBANKED;\n\nvoid\nremove_JOY(int_handler h) NONBANKED;\n\n/** Adds a V-blank interrupt handler.\n    The handler 'h' will be called whenever a V-blank\n    interrupt occurs.  Up to 4 handlers may be added,\n    with the last added being called last.  If the remove_VBL\n    function is to be called, only three may be added.\n    @see remove_VBL\n*/\nvoid\nadd_VBL(int_handler h) NONBANKED;\n\n/** Adds a LCD interrupt handler.\n    Called when the LCD interrupt occurs, which is normally\n    when LY_REG == LYC_REG.\n\n    From pan/k0Pa:\n    There are various reasons for this interrupt to occur\n    as described by the STAT register ($FF40). One very\n    popular reason is to indicate to the user when the\n    video hardware is about to redraw a given LCD line.\n    This can be useful for dynamically controlling the SCX/\n    SCY registers ($FF43/$FF42) to perform special video\n    effects.\n\n    @see add_VBL\n*/\nvoid\nadd_LCD(int_handler h) NONBANKED;\n\n/** Adds a timer interrupt handler.\n\n    From pan/k0Pa:\n    This interrupt occurs when the TIMA register ($FF05)\n    changes from $FF to $00.\n\n    @see add_VBL\n*/    \nvoid\nadd_TIM(int_handler h) NONBANKED;\n\n/** Adds a serial transmit complete interrupt handler.\n\n    From pan/k0Pa:\n    This interrupt occurs when a serial transfer has\n    completed on the game link port.\n    \n    @see send_byte, receive_byte, add_VBL\n*/\nvoid\nadd_SIO(int_handler h) NONBANKED;\n\n/** Adds a pad tranisition interrupt handler.\n    \n    From pan/k0Pa:\n    This interrupt occurs on a transition of any of the\n    keypad input lines from high to low. Due to the fact\n    that keypad \"bounce\" is virtually always present,\n    software should expect this interrupt to occur one\n    or more times for every button press and one or more\n    times for every button release.\n\n    @see joypad\n*/\nvoid\nadd_JOY(int_handler h) NONBANKED;\n\n/* ************************************************************ */\n\n/** Set the current mode - one of M_* defined above */\nvoid\n\tmode(UINT8 m) NONBANKED;\n\n/** Returns the current mode */\nUINT8\n\tget_mode(void) NONBANKED;\n\n/** GB type (GB, PGB, CGB) */\nextern UINT8 _cpu;\n\n/** Original GB or Super GB */\n#define DMG_TYPE 0x01 \n/** Pocket GB or Super GB 2 */\n#define MGB_TYPE 0xFF\n/** Color GB */\n#define CGB_TYPE 0x11 \n\n/** Time in VBL periods (60Hz) */\nextern UINT16 sys_time;\t\n\n/* ************************************************************ */\n\n/** Send byte in _io_out to the serial port */\nvoid\nsend_byte(void);\n\n/** Receive byte from the serial port in _io_in */\nvoid\nreceive_byte(void);\n\n/** An OR of IO_* */\nextern UINT8 _io_status;\n/** Byte just read. */\nextern UINT8 _io_in;\n/** Write the byte to send here before calling send_byte()\n    @see send_byte\n*/\nextern UINT8 _io_out;\n\n/* Status codes */\n/** IO is completed */\n#define IO_IDLE\t\t0x00U\t\t\n/** Sending data */\n#define IO_SENDING\t0x01U\t\t\n/** Receiving data */\n#define IO_RECEIVING\t0x02U\t\t\n/** Error */\n#define IO_ERROR\t0x04U\t\t\n\n/* ************************************************************ */\n\n/* Multiple banks */\n\n/** Switches the upper 16k bank of the 32k rom to bank rombank \n    using the MBC1 controller. \n    By default the upper 16k bank is 1. Make sure the rom you compile \n    has more than just bank 0 and bank 1, a 32k rom. This is done by \n    feeding lcc.exe the following switches:\n\n    -Wl-yt# where # is the type of cartridge. 1 for ROM+MBC1.\n\n    -Wl-yo# where # is the number of rom banks. 2,4,8,16,32.\n*/\n#define SWITCH_ROM_MBC1(b) \\\n  *(unsigned char *)0x2000 = (b)\n\n#define SWITCH_RAM_MBC1(b) \\\n  *(unsigned char *)0x4000 = (b)\n\n#define ENABLE_RAM_MBC1 \\\n  *(unsigned char *)0x0000 = 0x0A\n\n#define DISABLE_RAM_MBC1 \\\n  *(unsigned char *)0x0000 = 0x00\n\n#define SWITCH_16_8_MODE_MBC1 \\\n  *(unsigned char *)0x6000 = 0x00\n\n#define SWITCH_4_32_MODE_MBC1 \\\n  *(unsigned char *)0x6000 = 0x01\n\n/* Note the order used here.  Writing the other way around\n * on a MBC1 always selects bank 0 (d'oh)\n */\n/** MBC5 */\n#define SWITCH_ROM_MBC5(b) \\\n  *(unsigned char *)0x3000 = (UINT16)(b)>>8; \\\n  *(unsigned char *)0x2000 = (UINT8)(b)\n\n#define SWITCH_RAM_MBC5(b) \\\n  *(unsigned char *)0x4000 = (b)\n\n#define ENABLE_RAM_MBC5 \\\n  *(unsigned char *)0x0000 = 0x0A\n\n#define DISABLE_RAM_MBC5 \\\n  *(unsigned char *)0x0000 = 0x00\n\n/* ************************************************************ */\n\n/** Delays the given number of milliseconds.\n    Uses no timers or interrupts, and can be called with \n    interrupts disabled (why nobody knows :)\n */\nvoid\ndelay(UINT16 d) NONBANKED;\n\n/* ************************************************************ */\n\n/** Reads and returns the current state of the joypad.\n    Follows Nintendo's guidelines for reading the pad.\n    Return value is an OR of J_*\n    @see J_START\n*/\nUINT8\njoypad(void) NONBANKED;\n\n/** Waits until all the keys given in mask are pressed.\n    Normally only used for checking one key, but it will\n    support many, even J_LEFT at the same time as J_RIGHT :)\n    @see joypad, J_START\n*/\nUINT8\nwaitpad(UINT8 mask) NONBANKED;\n\n/** Waits for the pad and all buttons to be released.\n*/\nvoid\nwaitpadup(void) NONBANKED;\n\n/* ************************************************************ */\n\n/** Enables unmasked interrupts\n    @see disable_interrupts\n*/\nvoid\nenable_interrupts(void) NONBANKED;\n\n/** Disables interrupts.\n    This function may be called as many times as you like;\n    however the first call to enable_interrupts will re-enable\n    them.\n    @see enable_interrupts\n*/\nvoid\ndisable_interrupts(void) NONBANKED;\n\n/** Clears any pending interrupts and sets the interrupt mask\n    register IO to flags.\n    @see VBL_IFLAG\n    @param flags\tA logical OR of *_IFLAGS\n*/\nvoid\nset_interrupts(UINT8 flags) NONBANKED;\n\n/** Performs a warm reset by reloading the CPU value\n    then jumping to the start of crt0 (0x0150)\n*/\nvoid\nreset(void) NONBANKED;\n\n/** Waits for the vertical blank interrupt (VBL) to finish.  \n    This can be used to sync animation with the screen \n    re-draw.  If VBL interrupt is disabled, this function will\n    never return.  If the screen is off this function returns\n    immediatly.\n*/\nvoid\nwait_vbl_done(void) NONBANKED;\n\n/** Turns the display off.\n    Waits until the VBL interrupt before turning the display\n    off.\n    @see DISPLAY_ON\n*/\nvoid\ndisplay_off(void) NONBANKED;\n\n/* ************************************************************ */\n\n/** Copies data from somewhere in the lower address space\n    to part of hi-ram.\n    @param dst\t\tOffset in high ram (0xFF00 and above)\n    \t\t\tto copy to.\n    @param src\t\tArea to copy from\n    @param n\t\tNumber of bytes to copy.\n*/\nvoid\nhiramcpy(UINT8 dst,\n\t const void *src,\n\t UINT8 n) NONBANKED;\n\n/* ************************************************************ */\n\n/** Turns the display back on.\n    @see display_off, DISPLAY_OFF\n*/\n#define DISPLAY_ON \\\n  LCDC_REG|=0x80U\n\n/** Turns the display off immediatly.\n    @see display_off, DISPLAY_ON\n*/\n#define DISPLAY_OFF \\\n  display_off();\n\n/** Turns on the background layer.\n    Sets bit 0 of the LCDC register to 1.\n*/\n#define SHOW_BKG \\\n  LCDC_REG|=0x01U\n\n/** Turns off the background layer.\n    Sets bit 0 of the LCDC register to 0.\n*/\n#define HIDE_BKG \\\n  LCDC_REG&=0xFEU\n\n/** Turns on the window layer\n    Sets bit 5 of the LCDC register to 1.\n*/\n#define SHOW_WIN \\\n  LCDC_REG|=0x20U\n\n/** Turns off the window layer.\n    Clears bit 5 of the LCDC register to 0.\n*/\n#define HIDE_WIN \\\n  LCDC_REG&=0xDFU\n\n/** Turns on the sprites layer.\n    Sets bit 1 of the LCDC register to 1.\n*/\n#define SHOW_SPRITES \\\n  LCDC_REG|=0x02U\n\n/** Turns off the sprites layer.\n    Clears bit 1 of the LCDC register to 0.\n*/\n#define HIDE_SPRITES \\\n  LCDC_REG&=0xFDU\n\n/** Sets sprite size to 8x16 pixels, two tiles one above the other.\n    Sets bit 2 of the LCDC register to 1.\n*/\n#define SPRITES_8x16 \\\n  LCDC_REG|=0x04U\n\n/** Sets sprite size to 8x8 pixels, one tile.\n    Clears bit 2 of the LCDC register to 0.\n*/\n#define SPRITES_8x8 \\\n  LCDC_REG&=0xFBU\n\n/* ************************************************************ */\n\n/** Sets the tile patterns in the Background Tile Pattern table.\n    Starting with the tile pattern x and carrying on for n number of\n    tile patterns.Taking the values starting from the pointer\n    data. Note that patterns 128-255 overlap with patterns 128-255\n    of the sprite Tile Pattern table.  \n\n    GBC: Depending on the VBK_REG this determines which bank of\n    Background tile patterns are written to. VBK_REG=0 indicates the\n    first bank, and VBK_REG=1 indicates the second.\n\n    @param first_tile\tRange 0 - 255\n    @param nb_tiles\tRange 0 - 255\n*/\nvoid\nset_bkg_data(UINT8 first_tile,\n\t     UINT8 nb_tiles,\n\t     unsigned char *data) NONBANKED;\n\n/** Sets the tiles in the background tile table.\n    Starting at position x,y in tiles and writing across for w tiles\n    and down for h tiles. Taking the values starting from the pointer\n    data.\n\n    For the GBC, also see the pan/k00Pa section on VBK_REG.\n\n    @param x\t\tRange 0 - 31\n    @param y\t\tRange 0 - 31\n    @param w\t\tRange 0 - 31\n    @param h\t\tRange 0 - 31\n    @param data\t\tPointer to an unsigned char. Usually the \n    \t\t\tfirst element in an array.\n*/\nvoid\nset_bkg_tiles(UINT8 x,\n\t      UINT8 y,\n\t      UINT8 w,\n\t      UINT8 h,\n\t      unsigned char *tiles) NONBANKED;\n\nvoid\nget_bkg_tiles(UINT8 x,\n\t      UINT8 y,\n\t      UINT8 w,\n\t      UINT8 h,\n\t      unsigned char *tiles) NONBANKED;\n\n/** Moves the background layer to the position specified in x and y in pixels.\n    Where 0,0 is the top left corner of the GB screen. You'll notice the screen\n    wraps around in all 4 directions, and is always under the window layer.\n*/\nvoid\nmove_bkg(UINT8 x,\n\t UINT8 y) NONBANKED;\n\n/** Moves the background relative to it's current position.\n\n    @see move_bkg\n*/\nvoid\nscroll_bkg(INT8 x,\n\t   INT8 y) NONBANKED;\n\n/* ************************************************************ */\n\n/** Sets the window tile data.\n    This is the same as set_bkg_data, as both the window layer and background\n    layer share the same Tile Patterns.\n    @see set_bkg_data\n*/\nvoid\nset_win_data(UINT8 first_tile,\n\t     UINT8 nb_tiles,\n\t     unsigned char *data) NONBANKED;\n\n/** Sets the tiles in the win tile table. \n    Starting at position x,y in\n    tiles and writing across for w tiles and down for h tiles. Taking the\n    values starting from the pointer data. Note that patterns 128-255 overlap\n    with patterns 128-255 of the sprite Tile Pattern table.\n\t\n    GBC only.\n    Depending on the VBK_REG this determines if you're setting the tile numbers\n    VBK_REG=0; or the attributes for those tiles VBK_REG=1;. The bits in the\n    attributes are defined as:\n    Bit 7 - \tPriority flag. When this is set, it puts the tile above the sprites\n    \t\twith colour 0 being transparent. 0: below sprites, 1: above sprites\n\t\tNote SHOW_BKG needs to be set for these priorities to take place.\n    Bit 6 - \tVertical flip. Dictates which way up the tile is drawn vertically.\n    \t\t0: normal, 1: upside down.\n    Bit 5 - \tHorizontal flip. Dictates which way up the tile is drawn\n    \t\thorizontally. 0: normal, 1:back to front.\n    Bit 4 - \tNot used.\n    Bit 3 - \tCharacter Bank specification. Dictates from which bank of\n    \t\tBackground Tile Patterns the tile is taken. 0: Bank 0, 1: Bank 1\n    Bit 2 - \tSee bit 0.\n    Bit 1 - \tSee bit 0. \n    Bit 0 - \tBits 0-2 indicate which of the 7 BKG colour palettes the tile is\n\t\tassigned.\n\n    @param x\t\tRange 0 - 31\n    @param y\t\tRange 0 - 31\n    @param w\t\tRange 0 - 31\n    @param h\t\tRange 0 - 31\n*/\nvoid\nset_win_tiles(UINT8 x,\n\t      UINT8 y,\n\t      UINT8 w,\n\t      UINT8 h,\n\t      unsigned char *tiles) NONBANKED;\n\nvoid\nget_win_tiles(UINT8 x,\n\t      UINT8 y,\n\t      UINT8 w,\n\t      UINT8 h,\n\t      unsigned char *tiles) NONBANKED;\n\n/** Moves the window layer to the position specified in x and y in pixels.\n    Where 7,0 is the top left corner of the GB screen. The window is locked to\n    the bottom right corner, and is always over the background layer.\n    @see SHOW_WIN, HIDE_WIN\n*/\nvoid\nmove_win(UINT8 x,\n\t UINT8 y) NONBANKED;\n\n/** Move the window relative to its current position.\n    @see move_win\n*/\nvoid\nscroll_win(INT8 x,\n\t   INT8 y) NONBANKED;\n\n/* ************************************************************ */\n\n/** Sets the tile patterns in the Sprite Tile Pattern table.\n    Starting with the tile pattern x and carrying on for n number of\n    tile patterns.Taking the values starting from the pointer\n    data. Note that patterns 128-255 overlap with patterns 128-255 of\n    the Background Tile Pattern table.\n    \n    GBC only.\n    Depending on the VBK_REG this determines which bank of Background tile\n    patterns are written to. VBK_REG=0 indicates the first bank, and VBK_REG=1\n    indicates the second.\n*/\nvoid\nset_sprite_data(UINT8 first_tile,\n\t\tUINT8 nb_tiles,\n\t\tunsigned char *data) NONBANKED;\n\nvoid\nget_sprite_data(UINT8 first_tile,\n\t\tUINT8 nb_tiles,\n\t\tunsigned char *data) NONBANKED;\n\n/** Sets sprite n to display tile number t, from the sprite tile data. \n    If the GB is in 8x16 sprite mode then it will display the next\n    tile, t+1, below the first tile.\n    @param nb\t\tSprite number, range 0 - 39\n*/\nvoid\nset_sprite_tile(UINT8 nb,\n\t\tUINT8 tile) NONBANKED;\n\nUINT8\nget_sprite_tile(UINT8 nb) NONBANKED;\n\n/** Sets the property of sprite n to those defined in p.\n    Where the bits in p represent:\n    Bit 7 - \tPriority flag. When this is set the sprites appear behind the\n\t\tbackground and window layer. 0: infront, 1: behind.\n    Bit 6 - \tGBC only. Vertical flip. Dictates which way up the sprite is drawn\n\t\tvertically. 0: normal, 1:upside down.\n    Bit 5 - \tGBC only. Horizontal flip. Dictates which way up the sprite is\n    drawn horizontally. 0: normal, 1:back to front.\n    Bit 4 - \tDMG only. Assigns either one of the two b/w palettes to the sprite.\n\t\t0: OBJ palette 0, 1: OBJ palette 1.\n    Bit 3 -\tGBC only. Dictates from which bank of Sprite Tile Patterns the tile\n\t\tis taken. 0: Bank 0, 1: Bank 1\n    Bit 2 -\tSee bit 0.\n    Bit 1 -\tSee bit 0. \n    Bit 0 - \tGBC only. Bits 0-2 indicate which of the 7 OBJ colour palettes the\n\t\tsprite is assigned.\n    \n    @param nb\t\tSprite number, range 0 - 39\n*/\nvoid\nset_sprite_prop(UINT8 nb,\n\t\tUINT8 prop) NONBANKED;\n\nUINT8\nget_sprite_prop(UINT8 nb) NONBANKED;\n\n/** Moves the given sprite to the given position on the\n    screen.\n    Dont forget that the top left visible pixel on the screen\n    is at (8,16).  To put sprite 0 at the top left, use\n    move_sprite(0, 8, 16);\n*/\nvoid\nmove_sprite(UINT8 nb,\n\t    UINT8 x,\n\t    UINT8 y) NONBANKED;\n\n/** Moves the given sprite relative to its current position.\n */\nvoid\nscroll_sprite(INT8 nb,\n\t      INT8 x,\n\t      INT8 y) NONBANKED;\n\n/* ************************************************************ */\n\nvoid\nset_data(unsigned char *vram_addr,\n\t unsigned char *data,\n\t UINT16 len) NONBANKED;\n\nvoid\nget_data(unsigned char *data,\n\t unsigned char *vram_addr,\n\t UINT16 len) NONBANKED;\n\nvoid\nset_tiles(UINT8 x,\n\t  UINT8 y,\n\t  UINT8 w,\n\t  UINT8 h,\n\t  unsigned char *vram_addr,\n\t  unsigned char *tiles) NONBANKED;\n\nvoid\nget_tiles(UINT8 x,\n\t  UINT8 y,\n\t  UINT8 w,\n\t  UINT8 h,\n\t  unsigned char *tiles,\n\t  unsigned char *vram_addr) NONBANKED;\n\n#endif /* _GB_H */\n"
  },
  {
    "path": "include/gb/hardware.h",
    "content": "/** @file gb/hardware.h\n    Defines that let the GB's hardware registers be accessed\n    from C.  See the Pan doc for what to set them to.\n*/\n#ifndef _HARDWARE_H\n#define _HARDWARE_H\n\n#include <types.h>\n\n#if USE_SFR_FOR_REG\n#error SFR is unteseted and disabled in 2.96\n\n#define __REG\textern volatile sfr UINT8\n\n__REG P1_REG\t\t; /* Joystick: 1.1.P15.P14.P13.P12.P11.P10 */\n__REG SB_REG\t\t; /* Serial IO data buffer */\n__REG SC_REG\t\t; /* Serial IO control register */\n__REG DIV_REG\t\t; /* Divider register */\n__REG TIMA_REG\t\t; /* Timer counter */\n__REG TMA_REG\t\t; /* Timer modulo */\n__REG TAC_REG\t\t; /* Timer control */\n__REG IF_REG\t\t; /* Interrupt flags: 0.0.0.JOY.SIO.TIM.LCD.VBL */\n__REG NR10_REG\t\t; /* Sound register */\n__REG NR11_REG\t\t; /* Sound register */\n__REG NR12_REG\t\t; /* Sound register */\n__REG NR13_REG\t\t; /* Sound register */\n__REG NR14_REG\t\t; /* Sound register */\n__REG NR21_REG\t\t; /* Sound register */\n__REG NR22_REG\t\t; /* Sound register */\n__REG NR23_REG\t\t; /* Sound register */\n__REG NR24_REG\t\t; /* Sound register */\n__REG NR30_REG\t\t; /* Sound register */\n__REG NR31_REG\t\t; /* Sound register */\n__REG NR32_REG\t\t; /* Sound register */\n__REG NR33_REG\t\t; /* Sound register */\n__REG NR34_REG\t\t; /* Sound register */\n__REG NR41_REG\t\t; /* Sound register */\n__REG NR42_REG\t\t; /* Sound register */\n__REG NR43_REG\t\t; /* Sound register */\n__REG NR44_REG\t\t; /* Sound register */\n__REG NR50_REG\t\t; /* Sound register */\n__REG NR51_REG\t\t; /* Sound register */\n__REG NR52_REG\t\t; /* Sound register */\n__REG LCDC_REG\t\t; /* LCD control */\n__REG STAT_REG\t\t; /* LCD status */\n__REG SCY_REG\t\t; /* Scroll Y */\n__REG SCX_REG\t\t; /* Scroll X */\n__REG LY_REG\t\t; /* LCDC Y-coordinate */\n__REG LYC_REG\t\t; /* LY compare */\n__REG DMA_REG\t\t; /* DMA transfer */\n__REG BGP_REG\t\t; /* BG palette data */\n__REG OBP0_REG\t\t; /* OBJ palette 0 data */\n__REG OBP1_REG\t\t; /* OBJ palette 1 data */\n__REG WY_REG\t\t; /* Window Y coordinate */\n__REG WX_REG\t\t; /* Window X coordinate */\n__REG KEY1_REG\t\t; /* CPU speed */\n__REG VBK_REG\t\t; /* VRAM bank */\n__REG HDMA1_REG\t\t; /* DMA control 1 */\n__REG HDMA2_REG\t\t; /* DMA control 2 */\n__REG HDMA3_REG\t\t; /* DMA control 3 */\n__REG HDMA4_REG\t\t; /* DMA control 4 */\n__REG HDMA5_REG\t\t; /* DMA control 5 */\n__REG RP_REG\t\t; /* IR port */\n__REG BCPS_REG\t\t; /* BG color palette specification */\n__REG BCPD_REG\t\t; /* BG color palette data */\n__REG OCPS_REG\t\t; /* OBJ color palette specification */\n__REG OCPD_REG\t\t; /* OBJ color palette data */\n__REG SVBK_REG\t\t; /* WRAM bank */\n__REG IE_REG\t\t; /* Interrupt enable */\n\n#else\n\n#define __REG\tvolatile UINT8 *\n\n#define P1_REG\t\t(*(__REG)0xFF00)\t/* Joystick: 1.1.P15.P14.P13.P12.P11.P10 */\n#define SB_REG\t\t(*(__REG)0xFF01)\t/* Serial IO data buffer */\n#define SC_REG\t\t(*(__REG)0xFF02)\t/* Serial IO control register */\n#define DIV_REG\t\t(*(__REG)0xFF04)\t/* Divider register */\n#define TIMA_REG\t(*(__REG)0xFF05)\t/* Timer counter */\n#define TMA_REG\t\t(*(__REG)0xFF06)\t/* Timer modulo */\n#define TAC_REG\t\t(*(__REG)0xFF07)\t/* Timer control */\n#define IF_REG\t\t(*(__REG)0xFF0F)\t/* Interrupt flags: 0.0.0.JOY.SIO.TIM.LCD.VBL */\n#define NR10_REG\t(*(__REG)0xFF10)\t/* Sound register */\n#define NR11_REG\t(*(__REG)0xFF11)\t/* Sound register */\n#define NR12_REG\t(*(__REG)0xFF12)\t/* Sound register */\n#define NR13_REG\t(*(__REG)0xFF13)\t/* Sound register */\n#define NR14_REG\t(*(__REG)0xFF14)\t/* Sound register */\n#define NR21_REG\t(*(__REG)0xFF16)\t/* Sound register */\n#define NR22_REG\t(*(__REG)0xFF17)\t/* Sound register */\n#define NR23_REG\t(*(__REG)0xFF18)\t/* Sound register */\n#define NR24_REG\t(*(__REG)0xFF19)\t/* Sound register */\n#define NR30_REG\t(*(__REG)0xFF1A)\t/* Sound register */\n#define NR31_REG\t(*(__REG)0xFF1B)\t/* Sound register */\n#define NR32_REG\t(*(__REG)0xFF1C)\t/* Sound register */\n#define NR33_REG\t(*(__REG)0xFF1D)\t/* Sound register */\n#define NR34_REG\t(*(__REG)0xFF1E)\t/* Sound register */\n#define NR41_REG\t(*(__REG)0xFF20)\t/* Sound register */\n#define NR42_REG\t(*(__REG)0xFF21)\t/* Sound register */\n#define NR43_REG\t(*(__REG)0xFF22)\t/* Sound register */\n#define NR44_REG\t(*(__REG)0xFF23)\t/* Sound register */\n#define NR50_REG\t(*(__REG)0xFF24)\t/* Sound register */\n#define NR51_REG\t(*(__REG)0xFF25)\t/* Sound register */\n#define NR52_REG\t(*(__REG)0xFF26)\t/* Sound register */\n#define LCDC_REG\t(*(__REG)0xFF40)\t/* LCD control */\n#define STAT_REG\t(*(__REG)0xFF41)\t/* LCD status */\n#define SCY_REG\t\t(*(__REG)0xFF42)\t/* Scroll Y */\n#define SCX_REG\t\t(*(__REG)0xFF43)\t/* Scroll X */\n#define LY_REG\t\t(*(__REG)0xFF44)\t/* LCDC Y-coordinate */\n#define LYC_REG\t\t(*(__REG)0xFF45)\t/* LY compare */\n#define DMA_REG\t\t(*(__REG)0xFF46)\t/* DMA transfer */\n#define BGP_REG\t\t(*(__REG)0xFF47)\t/* BG palette data */\n#define OBP0_REG\t(*(__REG)0xFF48)\t/* OBJ palette 0 data */\n#define OBP1_REG\t(*(__REG)0xFF49)\t/* OBJ palette 1 data */\n#define WY_REG\t\t(*(__REG)0xFF4A)\t/* Window Y coordinate */\n#define WX_REG\t\t(*(__REG)0xFF4B)\t/* Window X coordinate */\n#define KEY1_REG\t(*(__REG)0xFF4D)\t/* CPU speed */\n#define VBK_REG\t\t(*(__REG)0xFF4F)\t/* VRAM bank */\n#define HDMA1_REG\t(*(__REG)0xFF51)\t/* DMA control 1 */\n#define HDMA2_REG\t(*(__REG)0xFF52)\t/* DMA control 2 */\n#define HDMA3_REG\t(*(__REG)0xFF53)\t/* DMA control 3 */\n#define HDMA4_REG\t(*(__REG)0xFF54)\t/* DMA control 4 */\n#define HDMA5_REG\t(*(__REG)0xFF55)\t/* DMA control 5 */\n#define RP_REG\t\t(*(__REG)0xFF56)\t/* IR port */\n#define BCPS_REG\t(*(__REG)0xFF68)\t/* BG color palette specification */\n#define BCPD_REG\t(*(__REG)0xFF69)\t/* BG color palette data */\n#define OCPS_REG\t(*(__REG)0xFF6A)\t/* OBJ color palette specification */\n#define OCPD_REG\t(*(__REG)0xFF6B)\t/* OBJ color palette data */\n#define SVBK_REG\t(*(__REG)0xFF70)\t/* WRAM bank */\n#define IE_REG\t\t(*(__REG)0xFFFF)\t/* Interrupt enable */\n\n#endif\n\n#endif /* _HARDWARE_H */\n"
  },
  {
    "path": "include/gb/malloc.h",
    "content": "/** @file gb/malloc.h\n\n    Header for a simple implementation of malloc().  This library\n    may currently be broken.\n*/\n#ifndef __SYS_MALLOC_H\n#define __SYS_MALLOC_H\n\n#include <types.h>\n\n/* The various constants */\n/** The malloc hunk flags\n    Note:  Cound have used a negative size a'la TI\n*/\n#define MALLOC_FREE\t1\n#define MALLOC_USED\t2\n\n/** Magic number of a header.  Gives us some chance of \n    surviving if the list is corrupted*/\n#define MALLOC_MAGIC\t123\n\n/* malloc hunk header definition */\ntypedef struct smalloc_hunk\tmmalloc_hunk;\ntypedef struct smalloc_hunk *\tpmmalloc_hunk;\n\nstruct smalloc_hunk {\n    UBYTE \t\tmagic;\t\t/* Magic number - indicates valid hunk header */\n    pmmalloc_hunk\tnext;\t\t/* Pointer to the next hunk */\n    UWORD \t\tsize;\t\t/* Size in bytes of this region */\n    int \t\tstatus;\t\t/* One of MALLOC_FREE or MALLOC_USED */\n};\n\n/** Start of free memory, as defined by the linker */\nextern UBYTE malloc_heap_start;\n\n/** First hunk */\nextern pmmalloc_hunk malloc_first;\n\n/** Garbage collect (join free hunks) */\nvoid malloc_gc(void) NONBANKED;\n/** debug message logger */\nvoid debug( char *routine, char *msg ) NONBANKED;\n\n#endif\t/* __SYS_MALLOC_H */\n"
  },
  {
    "path": "include/gb/rand.h",
    "content": "/** @file rand.h\n    Random generator using the linear congruential method\n\n    @author\tLuc Van den Borre\n*/\n#ifndef RAND_INCLUDE\n#define RAND_INCLUDE\n\n#include <types.h>\n\n/** Initalise the random number generator.\n    seed needs to be different each time, else the same sequence will be \n    generated.  A good source is the DIV register.\n*/\nvoid\ninitrand(UINT16 seed) NONBANKED; /* Non-banked as called from asm in arand.s */\n\n/** Returns a random value.\n */\nINT8\n_rand(void);\n\n/** Returns a random word.\n */\nUINT16\n_randw(void);\n\n/** Random generator using the linear lagged additive method\n    Note that 'initarand()' calls 'initrand()' with the same seed value, and\n    uses 'rand()' to initialize the random generator.\n\n    @author\tLuc Van den Borre\n*/\nvoid\ninitarand(UINT16 seed);\n\n/** Generates a random number using the linear lagged additive method.\n */\nINT8\narand(void);\n\n#endif\n"
  },
  {
    "path": "include/gb/sample.h",
    "content": "/** @file gb/sample.h\n    Playback raw sound sample with length len from start at 8192Hz rate.\n    len defines the length of the sample in samples/32 or bytes/16.\n    The format of the data is unsigned 4-bit samples,\n    2 samples per byte, upper 4-bits played before lower 4 bits.\n\n    Adaption for GBDK by Lars Malmborg.\n    Original code by Jeff Frohwein.\n*/\n#ifndef _SAMPLE_H\n#define _SAMPLE_H\n\n/** Play the given, appropriatly formatted sample.\n */\nvoid\nplay_sample(UINT8 *start, UINT16 len) NONBANKED;\n\n#endif /* _SAMPLE_H */\n"
  },
  {
    "path": "include/gb/sgb.h",
    "content": "/** @file gb/sgb.h\n    Super Gameboy definitions.\n*/\n#ifndef _SGB_H\n#define _SGB_H\n\n/** Return a non-null value if running on Super GameBoy */\nUINT8\nsgb_check(void);\n\n#endif /* _SGB_H */\n"
  },
  {
    "path": "libc/arand.s",
    "content": ";/***************************************************************************\n; *                                                                         *\n; * Module  : arand.s                                                       *\n; *                                                                         *\n; * Purpose : A random number generator using the lagged additive method    *\n; *                                                                         *\n; * Version : 1, January 11 1998                                            *\n; *                                                                         *\n; * Author  : Luc Van den Borre ( Homepage : NOC.BASE.ORG )                 *\n; *                                                                         *\n; **************************************************************************/\n\n\t;; BANKED: checked\n\t.include\t\"global.s\"\n\n\t.globl\t.initrand\n\t.globl\t_rand\n\n\t.area\t_BSS\n.randarr:\n\t.ds\t55\n.raxj:\n\t.ds\t0x01\n.raxk:\n\t.ds\t0x01\n\n\t.area\t_CODE\n\n\t;; arand() operates on an array of 55 arbitrary values (here : bytes).\n\t;; It adds two values of the array together, replaces one of the values\n\t;; with the result, and returns the result.\n\t;; At start, the indices into the array refer to the 55th and 24th element.\n\t;; After each call, each index is decreased, and looped around if necessary.\n\t;; This kind of works, but the values produces are less good than those by\n\t;; rand(), mainly because it operates on bytes instead of words.\n\t;; Ref : D. E. Knuth, \"The Art of Computer Programming\" , Volume 2\n\t;;\n\t;; Exit conditions\n\t;;   DE = Random number (byte!)\n\t;;\n\t;; Registers used:\n\t;;   all\n\t;;\n_arand::\t\t\t; Banked\n\tPUSH\tBC\n\tLD\tD,#0\n\tLD\tHL,#.randarr-1\n\tLD\tA,(.raxj)\n\tLD\tE,A\n\tDEC\tA\t\t; Decrease the pointer\n\tJR\tNZ,1$\n\tLD\tA,#55\n1$:\n\tLD\t(.raxj),A\n\tADD\tHL,DE\n\tLD\tB,(HL)\n\n\tLD\tHL,#.randarr-1\t; Ooh...\n\tLD\tA,(.raxk)\n\tLD\tE,A\n\tDEC\tA\t\t; Decrease the pointer\n\tJR\tNZ,2$\n\tLD\tA,#55\n2$:\n\tLD\t(.raxk),A\n\tADD\tHL,DE\n\tLD\tA,(HL)\n\n\tADD\tA,B\n\tLD\t(HL),A\t\t; Store new value\n\n\tPOP\tBC\n\n\tLD\tD,#0\n\tLD\tE,A\n\n\tRET\n\n\t;; _initarand calls the _rand function to fill the array with random values\n\t;; Note that this also sets the seed value of the _rand function first,\n\t;; like _initrand\n\t;;\n\t;; Exit conditions\n\t;;   None\n\t;;\n\t;; Registers used:\n\t;;   all\n\t;;\n_initarand::\t\t\t; Banked\n\tLDA\tHL,.BANKOV(SP)\n\tCALL\t.initrand\n\n\tPUSH\tBC\n\tLD\tA,#55\n\tLD\tHL,#.randarr\n1$:\n\tDEC\tA\n\tLD\t(.raxj),A\n\tLD\tB,H\n\tLD\tC,L\n\tCALL\t_rand\n\tLD\tH,B\n\tLD\tL,C\n\n\tLD\t(HL),D\n\tINC\tHL\n\tLD\t(HL),E\n\tINC\tHL\n\t\n\tLD\tA,(.raxj)\n\tCP\t#0\n\tJR\tNZ,1$\n\n\tLD\tA,#24\t\t; Now the array has been filled,set the pointers\n\tLD\t(.raxj),A\n\tLD\tA,#55\n\tLD\t(.raxk),A\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/cgb.s",
    "content": "\t.include \"global.s\"\n\n\t.title\t\"CGB support\"\n\t.module\tCGB\n\n\t;; BANKED: checked, imperfect\n\t.area\t_BASE\n\n_set_bkg_palette::\t\t; Non-banked\n\tPUSH\tBC\n\tPUSH\tDE\n\n\tLDA\tHL,9(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = rgb_data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tD,(HL)\t\t; D = nb_palettes\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = first_palette\n\n\tLD\tA,D\t\t; A = nb_palettes\n\tADD\tE\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tLD\tD,A\n\n        LD      A,E\t\t; E = first_palette\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tLD\tE,A\t\t; A = first BCPS data\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\tA,E\n\tLDH\t(.BCPS),A\n\tLD\tA,(BC)\n\tLDH\t(.BCPD),A\n\tINC\tBC\t\t; next rgb_data\n\tINC\tE\t\t; next BCPS\n\tLD\tA,E\n\tCP\tA,D\n\tJR\tNZ,1$\n\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n_set_sprite_palette::\t\t; Non-banked\n\tPUSH\tBC\n\tPUSH\tDE\n\n\tLDA\tHL,9(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = rgb_data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tD,(HL)\t\t; D = nb_palettes\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = first_palette\n\n\tLD\tA,D\t\t; A = nb_palettes\n\tADD\tE\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tLD\tD,A\n\n        LD      A,E\t\t; E = first_palette\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tLD\tE,A\t\t; A = first BCPS data\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\tA,E\n\tLDH\t(.OCPS),A\n\tLD\tA,(BC)\n\tLDH\t(.OCPD),A\n\tINC\tBC\t\t; next rgb_data\n\tINC\tE\t\t; next BCPS\n\tLD\tA,E\n\tCP\tA,D\n\tJR\tNZ,1$\n\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n\t.area\t_CODE\n_set_bkg_palette_entry::\t; Banked\n\tPUSH\tBC\n\tPUSH\tDE\n\n\tLDA\tHL,.BANKOV+4+3(SP); Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = rgb_data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tD,(HL)\t\t; D = pal_entry\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = first_palette\n\n        LD      A,E\t\t; E = first_palette\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tADD\tD\t\t; A += 2 * pal_entry\n\tADD\tD\n\tLD\tE,A\t\t; A = first BCPS data\n\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\tA,E\n\tLDH\t(.BCPS),A\n\tLD\tA,C\n\tLDH\t(.BCPD),A\n\tINC\tE\t\t; next BCPS\n\n\tLD\tA,E\n\tLDH\t(.BCPS),A\n\tLD\tA,B\n\tLDH\t(.BCPD),A\n\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n_set_sprite_palette_entry::\n\tPUSH\tBC\n\tPUSH\tDE\n\n\tLDA\tHL,.BANKOV+4+3(SP); Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = rgb_data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tD,(HL)\t\t; D = pal_entry\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = first_palette\n\n        LD      A,E\t\t; E = first_palette\n\tADD\tA\t\t; A *= 8\n\tADD\tA\n\tADD\tA\n\tADD\tD\t\t; A += 2 * pal_entry\n\tADD\tD\n\tLD\tE,A\t\t; A = first BCPS data\n\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\tA,E\n\tLDH\t(.OCPS),A\n\tLD\tA,C\n\tLDH\t(.OCPD),A\n\tINC\tE\t\t; next BCPS\n\n\tLD\tA,E\n\tLDH\t(.OCPS),A\n\tLD\tA,B\n\tLDH\t(.OCPD),A\n\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n\t.area\t_CODE\n_cpu_slow::\t\t\t; Banked\n\tLDH\tA,(.KEY1)\n\tAND\t#0x80\t\t; Is GBC in double speed mode?\n\tRET\tZ\t\t; No, already in single speed\n\nshift_speed:\n\tLDH\tA,(.IE)\n\tPUSH\tAF\n\n\tXOR\tA\t\t; A = 0\n\tLDH\t(.IE),A\t\t; Disable interrupts\n\tLDH\t(.IF),A\n\n\tLD\tA,#0x30\n\tLDH\t(.P1),A\n\n\tLD\tA,#0x01\n\tLDH\t(.KEY1),A\n\n\tSTOP\n\n\tPOP\tAF\n\tLDH\t(.IE),A\n\n\tRET\n\n_cpu_fast::\t\t\t; Banked\n\tLDH\tA,(.KEY1)\n\tAND\t#0x80\t\t; Is GBC in double speed mode?\n\tRET\tNZ\t\t; Yes, exit\n        JR\tshift_speed\n\n\n_cgb_compatibility::\t\t; Banked\n\n\tLD\tA,#0x80\n\tLDH\t(.BCPS),A\t; Set default bkg palette\n\tLD\tA,#0xff\t\t; White\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x7f\n\tLDH\t(.BCPD),A\n\tLD\tA,#0xb5\t\t; Light gray\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x56\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x4a\t\t; Dark gray\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x29\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x00\t\t; Black\n\tLDH\t(.BCPD),A\n\tLD\tA,#0x00\n\tLDH\t(.BCPD),A\n\n\tLD\tA,#0x80\n\tLDH\t(.OCPS),A\t; Set default sprite palette\n\tLD\tA,#0xff\t\t; White\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x7f\n\tLDH\t(.OCPD),A\n\tLD\tA,#0xb5\t\t; Light gray\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x56\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x4a\t\t; Dark gray\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x29\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x00\t\t; Black\n\tLDH\t(.OCPD),A\n\tLD\tA,#0x00\n\tLDH\t(.OCPD),A\n\n\tRET\n"
  },
  {
    "path": "libc/cpy_data.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED: checked\n\t.area\t_BASE\n\t;; Copy part (size = DE) of the VRAM from (BC) to (HL)\n.copy_vram::\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\tA,(BC)\n\tLD\t(HL+),A\n\tINC\tBC\n\tDEC\tDE\n\tLD\tA,D\n\tOR\tE\n\tJR\tNZ,1$\n\tRET\n\n_set_data::\n_get_data::\n\tPUSH\tBC\n\n\tLDA\tHL,9(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; DE = len\n\tDEC\tHL\n\tLD\tE,(HL)\n\tDEC\tHL\n\tLD\tB,(HL)\t\t; BC = src\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; HL = dst\n\tLD\tL,(HL)\n\tLD\tH,A\n\n\tCALL\t.copy_vram\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/crt0.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; ****************************************\n\t;; Beginning of module\n\t;; BANKED: checked\n\t.title\t\"Runtime\"\n\t.module\tRuntime\n\t.area\t_HEADER (ABS)\n\n\t;; Standard header for the GB\n\t.org\t0x00\n\tRET\t\t\t; Empty function (default for interrupts)\n\n\t.org\t0x10\n\t.byte\t0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01\n\t.byte\t0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80\n\n\t;; Interrupt vectors\n\t.org\t0x40\t\t; VBL\n.int_VBL:\n\tPUSH\tHL\n\tLD\tHL,#.int_0x40\n\tJP\t.int\n\n\t.org\t0x48\t\t; LCD\n.int_LCD:\n\tPUSH\tHL\n\tLD\tHL,#.int_0x48\n\tJP\t.int\n\n\t.org\t0x50\t\t; TIM\n.int_TIM:\n\tPUSH\tHL\n\tLD\tHL,#.int_0x50\n\tJP\t.int\n\n\t.org\t0x58\t\t; SIO\n.int_SIO:\n\tPUSH\tHL\n\tLD\tHL,#.int_0x58\n\tJP\t.int\n\n\t.org\t0x60\t\t; JOY\n.int_JOY:\n\tPUSH\tHL\n\tLD\tHL,#.int_0x60\n\tJP\t.int\n\n.int:\n\tPUSH\tAF\n\tPUSH\tBC\n\tPUSH\tDE\n1$:\n\tLD\tA,(HL+)\n\tOR\t(HL)\n\tJR\tZ,2$\n\tPUSH\tHL\n\tLD\tA,(HL-)\n\tLD\tL,(HL)\n\tLD\tH,A\n\tCALL\t3$\n\tPOP\tHL\n\tINC\tHL\n\tJR\t1$\n2$:\n\tPOP\tDE\n\tPOP\tBC\n\tPOP\tAF\n\tPOP\tHL\n\tRETI\n\n3$:\n\tJP\t(HL)\n\n\t;; GameBoy Header\n\n\t;; DO NOT CHANGE...\n\t.org\t0x100\n.header:\n\tNOP\n\tJP\t0x150\n\t.byte\t0xCE,0xED,0x66,0x66\n\t.byte\t0xCC,0x0D,0x00,0x0B\n\t.byte\t0x03,0x73,0x00,0x83\n\t.byte\t0x00,0x0C,0x00,0x0D\n\t.byte\t0x00,0x08,0x11,0x1F\n\t.byte\t0x88,0x89,0x00,0x0E\n\t.byte\t0xDC,0xCC,0x6E,0xE6\n\t.byte\t0xDD,0xDD,0xD9,0x99\n\t.byte\t0xBB,0xBB,0x67,0x63\n\t.byte\t0x6E,0x0E,0xEC,0xCC\n\t.byte\t0xDD,0xDC,0x99,0x9F\n\t.byte\t0xBB,0xB9,0x33,0x3E\n\n\t;; Title of the game\n\t.org\t0x134\n\t.asciz\t\"Title\"\n\n\t.org\t0x144\n\t.byte\t0,0,0\n\n\t;; Cartridge type is ROM only\n\t.org\t0x147\n\t.byte\t0\n\n\t;; ROM size is 32kB\n\t.org\t0x148\n\t.byte\t0\n\n\t;; RAM size is 0kB\n\t.org\t0x149\n\t.byte\t0\n\n\t;; Maker ID\n\t.org\t0x14A\n\t.byte\t0x00,0x00\n\n\t;; Version number\n\t.org\t0x14C\n\t.byte\t0x01\n\n\t;; Complement check\n\t.org\t0x14D\n\t.byte\t0x00\n\n\t;; Checksum\n\t.org\t0x14E\n\t.byte\t0x00,0x00\n\n\t;; ****************************************\n\t.org\t0x150\n.code_start:\n\t;; Beginning of the code\n\tDI\t\t\t; Disable interrupts\n\tLD\tD,A\t\t; Store CPU type in D\n\tXOR\tA\n\t;; Initialize the stack\n\tLD\tSP,#.STACK\n\t;; Clear from 0xC000 to 0xDFFF\n\tLD\tHL,#0xDFFF\n\tLD\tC,#0x20\n\tLD\tB,#0x00\n1$:\n\tLD\t(HL-),A\n\tDEC\tB\n\tJR\tNZ,1$\n\tDEC\tC\n\tJR\tNZ,1$\n\t;; Clear from 0xFE00 to 0xFEFF\n\tLD\tHL,#0xFEFF\n\tLD\tB,#0x00\n2$:\n\tLD\t(HL-),A\n\tDEC\tB\n\tJR\tNZ,2$\n\t;; Clear from 0xFF80 to 0xFFFF\n\tLD\tHL,#0xFFFF\n\tLD\tB,#0x80\n3$:\n\tLD\t(HL-),A\n\tDEC\tB\n\tJR\tNZ,3$\n; \tLD\t(.mode),A\t; Clearing (.mode) is performed when clearing RAM\n\t;; Store CPU type\n\tLD\tA,D\n\tLD\t(__cpu),A\n\n\t;; Turn the screen off\n\tCALL\t.display_off\n\n\t;; Initialize the display\n\tXOR\tA\n\tLDH\t(.SCY),A\n\tLDH\t(.SCX),A\n\tLDH\t(.STAT),A\n\tLDH\t(.WY),A\n\tLD\tA,#0x07\n\tLDH\t(.WX),A\n\n\t;; Copy refresh_OAM routine to HIRAM\n\tLD\tBC,#.refresh_OAM\n\tLD\tHL,#.start_refresh_OAM\n\tLD\tB,#.end_refresh_OAM-.start_refresh_OAM\n4$:\n\tLD\tA,(HL+)\n\tLDH\t(C),A\n\tINC\tC\n\tDEC\tB\n\tJR\tNZ,4$\n\n\t;; Install interrupt routines\n\tLD\tBC,#.vbl\n\tCALL\t.add_VBL\n\tLD\tBC,#.serial_IO\n\tCALL\t.add_SIO\n\n\t;; Standard color palettes\n\tLD\tA,#0b11100100\t; Grey 3 = 11 (Black)\n\t\t\t\t; Grey 2 = 10 (Dark grey)\n\t\t\t\t; Grey 1 = 01 (Light grey)\n\t\t\t\t; Grey 0 = 00 (Transparent)\n\tLDH\t(.BGP),A\n\tLDH\t(.OBP0),A\n\tLD\tA,#0b00011011\n\tLDH\t(.OBP1),A\n\n\t;; Turn the screen on\n\tLD\tA,#0b11000000\t; LCD\t\t= On\n\t\t\t\t; WindowBank\t= 0x9C00\n\t\t\t\t; Window\t= Off\n\t\t\t\t; BG Chr\t= 0x8800\n\t\t\t\t; BG Bank\t= 0x9800\n\t\t\t\t; OBJ\t\t= 8x8\n\t\t\t\t; OBJ\t\t= Off\n\t\t\t\t; BG\t\t= Off\n\tLDH\t(.LCDC),A\n\tXOR\tA\n\tLDH\t(.IF),A\n\tLD\tA,#0b00001001\t; Pin P10-P13\t=   Off\n\t\t\t\t; Serial I/O\t=   On\n\t\t\t\t; Timer Ovfl\t=   Off\n\t\t\t\t; LCDC\t\t=   Off\n\t\t\t\t; V-Blank\t=   On\n\tLDH\t(.IE),A\n\n\tXOR\tA\n\tLDH\t(.NR52),A\t; Turn sound off\n\tLDH\t(.SC),A\t\t; Use external clock\n\tLD\tA,#.DT_IDLE\n\tLDH\t(.SB),A\t\t; Send IDLE byte\n\tLD\tA,#0x80\n\tLDH\t(.SC),A\t\t; Use external clock\n\n\tXOR\tA\t\t; Erase the malloc list\n;\tLD\t(_malloc_heap_start+0),A\n;\tLD\t(_malloc_heap_start+1),A\n;\tLD\t(.sys_time+0),A\t; Zero the system clock\n;\tLD\t(.sys_time+1),A\t\n\n\tcall\tgsinit\n\n;\tCALL\t.init\t\t\n\n\tEI\t\t\t; Enable interrupts\n\n\t;; Call the main function\n\tCALL\tbanked_call\n\t.dw\t_main\n\t.if __RGBDS__\n\t.dw\tBANK(_main)\n\t.else\n\t.dw\t1\n\t.endif\n_exit::\t\n99$:\n\tHALT\n\tJR\t99$\t\t; Wait forever\n\n\t.org\t.MODE_TABLE\n\t;; Jump table for modes\n\tRET\n\n\t;; ****************************************\n\n\t;; Ordering of segments for the linker\n\t;; Code that really needs to be in bank 0\n\t.area\t_HOME\n\t;; Similar to _HOME\n\t.area\t_BASE\n\t;; Code\n\t.area\t_CODE\n\t;; Constant data\n\t.area\t_LIT\n\t;; Constant data used to init _DATA\n\t.area\t_GSINIT\n\t.area\t_GSINITTAIL\n\t.area\t_GSFINAL\n\t;; Initialised in ram data\n\t.area\t_DATA\n\t;; Uninitialised ram data\n\t.area\t_BSS\n\t;; For malloc\n\t.area\t_HEAP\n\n\t.area\t_BSS\n__cpu::\n\t.ds\t0x01\t\t; GB type (GB, PGB, CGB)\n.mode::\n\t.ds\t0x01\t\t; Current mode\n__io_out::\n\t.ds\t0x01\t\t; Byte to send\n__io_in::\n\t.ds\t0x01\t\t; Received byte\n__io_status::\n\t.ds\t0x01\t\t; Status of serial IO\n.vbl_done::\n\t.ds\t0x01\t\t; Is VBL interrupt finished?\n__current_bank::\n\t.ds\t0x01\t\t; Current MBC1 style bank.\n.sys_time::\n_sys_time::\n\t.ds\t0x02\t\t; System time in VBL units\n.int_0x40::\n\t.blkw\t0x08\n.int_0x48::\n\t.blkw\t0x08\n.int_0x50::\n\t.blkw\t0x08\n.int_0x58::\n\t.blkw\t0x08\n.int_0x60::\n\t.blkw\t0x08\n\n\t;; Runtime library\n\t.area\t_GSINIT\ngsinit::\n\t.area\t_GSINITTAIL\n\tret\n\t\n\t.area\t_HOME\n\t;; Call the initialization function for the mode specified in HL\n.set_mode::\n\tLD\tA,L\n\tLD\t(.mode),A\n\n\t;; AND to get rid of the extra flags\n\tAND\t#0x03\n\tLD\tL,A\n\tLD\tBC,#.MODE_TABLE\n\tSLA\tL\t\t; Multiply mode by 4\n\tSLA\tL\n\tADD\tHL,BC\n\tJP\t(HL)\t\t; Jump to initialization routine\n\n\t;; Add interrupt routine in BC to the interrupt list\n.remove_VBL::\n\tLD\tHL,#.int_0x40\n\tJP\t.remove_int\n.remove_LCD::\n\tLD\tHL,#.int_0x48\n\tJP\t.remove_int\n.remove_TIM::\n\tLD\tHL,#.int_0x50\n\tJP\t.remove_int\n.remove_SIO::\n\tLD\tHL,#.int_0x58\n\tJP\t.remove_int\n.remove_JOY::\n\tLD\tHL,#.int_0x60\n\tJP\t.remove_int\n.add_VBL::\n\tLD\tHL,#.int_0x40\n\tJP\t.add_int\n.add_LCD::\n\tLD\tHL,#.int_0x48\n\tJP\t.add_int\n.add_TIM::\n\tLD\tHL,#.int_0x50\n\tJP\t.add_int\n.add_SIO::\n\tLD\tHL,#.int_0x58\n\tJP\t.add_int\n.add_JOY::\n\tLD\tHL,#.int_0x60\n\tJP\t.add_int\n\n\t;; Remove interrupt BC from interrupt list HL if it exists\n\t;; Abort if a 0000 is found (end of list)\n\t;; Will only remove last int on list\n.remove_int::\n1$:\n\tLD\tA,(HL+)\n\tLD\tE,A\n\tLD\tD,(HL)\n\tOR\tD\n\tRET\tZ\t\t; No interrupt found\n\n\tLD\tA,E\n\tCP\tC\n\tJR\tNZ,1$\n\tLD\tA,D\n\tCP\tB\n\tJR\tNZ,1$\n\n\tXOR\tA\n\tLD\t(HL-),A\n\tLD\t(HL),A\n\tINC\tA\t\t; Clear Z flag\n\n\t;; Now do a memcpy from here until the end of the list\n\tLD\tD,H\n\tLD\tE,L\n\tDEC\tDE\n\n\tINC\tHL\n2$:\n\tLD\tA,(HL+)\n\tLD\t(DE),A\n\tLD\tB,A\n\tINC\tDE\n\tLD\tA,(HL+)\n\tLD\t(DE),A\n\tINC\tDE\n\tOR\tB\n\tRET\tZ\n\tJR\t2$\n\t\n\t;; Add interrupt routine in BC to the interrupt list in HL\n.add_int::\n1$:\n\tLD\tA,(HL+)\n\tOR\t(HL)\n\tJR\tZ,2$\n\tINC\tHL\n\tJR\t1$\n2$:\n\tLD\t(HL),B\n\tDEC\tHL\n\tLD\t(HL),C\n\tRET\n\n\t\n\t;; VBlank interrupt\n.vbl:\n\tLD\tHL,#.sys_time\n\tINC\t(HL)\n\tJR\tNZ,2$\n\tINC\tHL\n\tINC\t(HL)\n2$:\t\n\tCALL\t.refresh_OAM\n\n\tLD\tA,#0x01\n\tLD\t(.vbl_done),A\n\tRET\n\n\t;; Wait for VBL interrupt to be finished\n.wait_vbl_done::\n_wait_vbl_done::\n\t;; Check if the screen is on\n\tLDH\tA,(.LCDC)\n\tADD\tA\n\tRET\tNC\t\t; Return if screen is off\n\tXOR\tA\n\tDI\n\tLD\t(.vbl_done),A\t; Clear any previous sets of vbl_done\n\tEI\n1$:\n\tHALT\t\t\t; Wait for any interrupt\n\tNOP\t\t\t; HALT sometimes skips the next instruction\n\tLD\tA,(.vbl_done)\t; Was it a VBlank interrupt?\n\t;; Warning: we may lose a VBlank interrupt, if it occurs now\n\tOR\tA\n\tJR\tZ,1$\t\t; No: back to sleep!\n\n\tXOR\tA\n\tLD\t(.vbl_done),A\n\tRET\n\n.display_off::\n_display_off::\n\t;; Check if the screen is on\n\tLDH\tA,(.LCDC)\n\tADD\tA\n\tRET\tNC\t\t; Return if screen is off\n1$:\t\t\t\t; We wait for the *NEXT* VBL \n\tLDH\tA,(.LY)\n\tCP\t#0x92\t\t; Smaller than or equal to 0x91?\n\tJR\tNC,1$\t\t; Loop until smaller than or equal to 0x91\n2$:\n\tLDH\tA,(.LY)\n\tCP\t#0x91\t\t; Bigger than 0x90?\n\tJR\tC,2$\t\t; Loop until bigger than 0x90\n\n\tLDH\tA,(.LCDC)\n\tAND\t#0b01111111\n\tLDH\t(.LCDC),A\t; Turn off screen\n\tRET\n\n\t;; Copy OAM data to OAM RAM\n.start_refresh_OAM:\n\tLD\tA,#>.OAM\n\tLDH\t(.DMA),A\t; Put A into DMA registers\n\tLD\tA,#0x28\t\t; We need to wait 160 ns\n1$:\n\tDEC\tA\n\tJR\tNZ,1$\n\tRET\n.end_refresh_OAM:\n\n\t;; Serial interrupt\n.serial_IO::\n\tLD\tA,(__io_status) ; Get status\n\n\tCP\t#.IO_RECEIVING\n\tJR\tNZ,10$\n\n\t;; Receiving data\n\tLDH\tA,(.SB)\t\t; Get data byte\n\tLD\t(__io_in),A\t; Store it\n\tLD\tA,#.IO_IDLE\n\tJR\t11$\n\n10$:\n\n\tCP\t#.IO_SENDING\n\tJR\tNZ,99$\n\n\t;; Sending data\n\tLDH\tA,(.SB)\t\t; Get data byte\n\tCP\t#.DT_RECEIVING\n\tJR\tZ,11$\n\tLD\tA,#.IO_ERROR\n\tJR\t12$\n11$:\n\tLD\tA,#.IO_IDLE\n12$:\n\tLD\t(__io_status),A ; Store status\n\n\tXOR\tA\n\tLDH\t(.SC),A\t\t; Use external clock\n\tLD\tA,#.DT_IDLE\n\tLDH\t(.SB),A\t\t; Reply with IDLE byte\n99$:\n\tLD\tA,#0x80\n\tLDH\t(.SC),A\t\t; Enable transfer with external clock\n\tRET\n\n_mode::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tLD\tL,(HL)\n\tLD\tH,#0x00\n\tCALL\t.set_mode\n\tRET\n\n_get_mode::\n\tLD\tHL,#.mode\n\tLD\tE,(HL)\n\tRET\n\t\n_enable_interrupts::\n\tEI\n\tRET\n\n_disable_interrupts::\n\tDI\n\tRET\n\n.reset::\n_reset::\n\tLD\tA,(__cpu)\n\tJP\t.code_start\n\n_set_interrupts::\n\tDI\n\tLDA\tHL,2(SP)\t; Skip return address\n\tXOR\tA\n\tLDH\t(.IF),A\t\t; Clear pending interrupts\n\tLD\tA,(HL)\n\tLDH\t(.IE),A\n\tEI\t\t\t; Enable interrupts\n\tRET\n\n_remove_VBL::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.remove_VBL\n\tPOP\tBC\n\tRET\n\n_remove_LCD::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.remove_LCD\n\tPOP\tBC\n\tRET\n\n_remove_TIM::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.remove_TIM\n\tPOP\tBC\n\tRET\n\n_remove_SIO::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.remove_SIO\n\tPOP\tBC\n\tRET\n\n_remove_JOY::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.remove_JOY\n\tPOP\tBC\n\tRET\n\t\n_add_VBL::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.add_VBL\n\tPOP\tBC\n\tRET\n\n_add_LCD::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.add_LCD\n\tPOP\tBC\n\tRET\n\n_add_TIM::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.add_TIM\n\tPOP\tBC\n\tRET\n\n_add_SIO::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.add_SIO\n\tPOP\tBC\n\tRET\n\n_add_JOY::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tCALL\t.add_JOY\n\tPOP\tBC\n\tRET\n\n_clock::\n\tld\thl,#.sys_time\n\tdi\n\tld\ta,(hl+)\n\tei\n\t;; Interrupts are disabled for the next instruction...\n\tld\td,(hl)\n\tld\te,a\n\tret\n\n__printTStates::\n\tret\n\n\t;; Performs a long call.\n\t;; Basically:\n\t;;   call banked_call\n\t;;   .dw low\n\t;;   .dw bank\n\t;;   remainder of the code\n\t;; Total m-cycles:\n\t;;\t3+4+4 + 2+2+2+2+2+2 + 4+4+ 3+4+1+1+1\n\t;;      = 41 for the call\n\t;;\t3+3+4+4+1\n\t;;\t= 15 for the ret\nbanked_call::\n\tpop\thl\t\t; Get the return address\n\tld\ta,(__current_bank)\n\tpush\taf\t\t; Push the current bank onto the stack\n\tld\te,(hl)\t\t; Fetch the call address\n\tinc\thl\n\tld\td,(hl)\n\tinc\thl\n\tld\ta,(hl+)\t\t; ...and page\n\tinc\thl\t\t; Yes this should be here\n\tpush\thl\t\t; Push the real return address\n\tld\t(__current_bank),a\n\tld\t(.MBC1_ROM_PAGE),a\t; Perform the switch\n\tld\thl,#banked_ret\t; Push the fake return address\n\tpush\thl\n\tld\tl,e\n\tld\th,d\n\tjp\t(hl)\n\nbanked_ret::\n\tpop\thl\t\t; Get the return address\n\tpop\taf\t\t; Pop the old bank\n\tld\t(.MBC1_ROM_PAGE),a\n\tld\t(__current_bank),a\n\tjp\t(hl)\n\t\t\n\t.area\t_HEAP\n_malloc_heap_start::\n"
  },
  {
    "path": "libc/delay.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Delay DE milliseconds\n\t;; \n\t;; Entry conditions\n\t;;   DE = number of milliseconds to delay (1 to 65536, 0 = 65536)\n\t;; \n\t;; Register used: AF, DE\n\t.CPMS\t= 4194/4\t; 4.194304 MHz\n.delay::\t\t\t; 6 cycles for the CALL\n\tPUSH\tBC\t\t; 4 cycles\n\tCALL\t.dly\t\t; 12 cycles to return from .dly (6+1+5)\n\tLD\tB,#.CPMS/20-2 ; 2 cycles\n\t\t\t\t; =========\n\t\t\t\t; 24 cycles\n.ldlp:\n\tJR\t1$\t\t; 3 cycles\n1$:\tJR\t2$\t\t; 3 cycles\n2$:\tJR\t3$\t\t; 3 cycles\n3$:\tJR\t4$\t\t; 3 cycles\n4$:\tJR\t5$\t\t; 3 cycles\n5$:\tDEC\tB\t\t; 1 cycles\n\tJP\tNZ,.ldlp\t; 3 cycles (if TRUE: 4 cycles)\n\tNOP\t\t\t; 1 cycles\n\t\t\t\t; =========\n\t\t\t\t; 20 cycles\n\t;; Exit in 16 cycles\n\tPOP\tBC\t\t; 3 cycles\n\tJR\t6$\t\t; 3 cycles\n6$:\tJR\t7$\t\t; 3 cycles\n7$:\tJR\t8$\t\t; 3 cycles\n8$:\tRET\t\t\t; 4 cycles\n\t\t\t\t; =========\n\t\t\t\t; 16 cycles\n\n\t;; Delay all but last millisecond\n.dly:\n\tDEC\tDE\t\t; 2 cycles\n\tLD\tA,E\t\t; 1 cycles\n\tOR\tD\t\t; 1 cycles\n\tRET\tZ\t\t; 2 cycles (upon return: 5 cycles)\n\tLD\tB,#.CPMS/20-1   ; 2 cycles\n\t\t\t\t; =========\n\t\t\t\t; 8 cycles\n.dlp:\n\tJR\t1$\t\t; 3 cycles\n1$:\tJR\t2$\t\t; 3 cycles\n2$:\tJR\t3$\t\t; 3 cycles\n3$:\tJR\t4$\t\t; 3 cycles\n4$:\tJR\t5$\t\t; 3 cycles\n5$:\tDEC\tB\t\t; 1 cycles\n\tJP\tNZ,.dlp\t\t; 3 cycles (if TRUE: 4 cycles)\n\tNOP\t\t\t; 1 cycles\n\t\t\t\t; =========\n\t\t\t\t; 20 cycles\n\t;; Exit in 15 cycles\n\tJR\t6$\t\t; 3 cycles\n6$:\tJR\t7$\t\t; 3 cycles\n7$:\tJR\t8$\t\t; 3 cycles\n8$:\tJR\t.dly\t\t; 3 cycles\n\t\t\t\t; =========\n\t\t\t\t; 12 cycles\n\n_delay::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tLD\tE,(HL)\t\t; DE = delay\n\tINC\tHL\n\tLD\tD,(HL)\n\tCALL\t.delay\n\tRET\n"
  },
  {
    "path": "libc/digits.c",
    "content": "#pragma bank=BASE\n\nconst char * const digits = \"0123456789ABCDEF\";\n"
  },
  {
    "path": "libc/drawing.s",
    "content": ";; Optimised Drawing library \n;; By Jon Fuge (jonny@q-continuum.demon.co.uk) based on original file\n;; Updates\n;;   990223 Michael\tRemoved mod_col, splitting it up into \n;;\t\t\tfg_colour, bg_colour, and draw_mode\n;; Note: some optimisations are available with unneded PUSH DE/POP DE's\n\n\t;; BANKED: checked\n\t.include        \"global.s\"\n\n\t.globl  .init_vram\n\t.globl  .copy_vram\n\n\t.M_SOLID\t=\t0x00\n\t.M_OR\t=\t0x01\n\t.M_XOR\t=\t0x02\n\t.M_AND\t=\t0x03\n\n\t.if\t0\n\t.M_SOLID\t=\t0x10\n\t.M_OR\t=\t0x20\n\t.M_XOR\t=\t0x40\n\t.M_AND\t=\t0x80\n\t.endif\n\n\t;;  Format of mod_col\n\t;; 7 6 5 4 3 2 1 0\n\t;;   mode  fg  bg\n\n\t.area   _HEADER (ABS)\n\n\t.org    .MODE_TABLE+4*.G_MODE\n\tJP      .gmode\n\n\t.module Drawing1\n\n\t;; Data\n\t.area\t_BSS\n\t;; Foreground drawing colour\n.fg_colour::\t\n\t.ds\t1\n\t;; Background drawing colour\n.bg_colour::\t\n\t.ds\t1\n\t;; Drawing mode (.SOILD etc)\n.draw_mode:\n\t.ds\t1\n\t;; Fill style\n.style:\t\n\t.ds\t0x01\n\t;; Various varibles\n.x_s:\t\n\t.ds\t2\n.y_s:\t\n\t.ds\t2\n.delta_x:\t\n\t.ds\t1\n.delta_y:\t\n\t.ds\t1\n.l_inc:\t\n\t.ds\t1\n.l_d:\t\n\t.ds\t2\n.dinc1:\t\n\t.ds\t2\n.dinc2:\t\n\t.ds\t2\n.tx:\t\n\t.ds\t1\n.ty:\t\n\t.ds\t1\n\t\n\t.area   _BASE\n\t;; Enter graphic mode\n.gmode::\n\tDI\t\t\t; Disable interrupts\n\n\t;; Turn the screen off\n\tLDH\tA,(.LCDC)\n\tBIT\t7,A\n\tJR\tZ,1$\n\n\t;; Turn the screen off\n\tCALL\t.display_off\n1$:\n\tLD\tHL,#0x8000+0x10*0x10\n\tLD\tDE,#0x1800-0x18*0x10\n\tLD\tB,#0x00\n\tCALL\t.init_vram\t; Init the charset at 0x8000\n\n\t;; Install interrupt routines\n\tLD\tBC,#.vbl\n\tCALL\t.add_VBL\n\tLD\tBC,#.lcd\n\tCALL\t.add_LCD\n\n\tLD\tA,#72\t\t; Set line at which LCD interrupt occurs\n\tLDH\t(.LYC),A\n\n\tLD\tA,#0b01000100\t; Set LCD interrupt to occur when LY = LCY\n\tLDH\t(.STAT),A\n\n\tLDH\tA,(.IE)\n\tOR\t#0b00000010\t; Enable LCD interrupt\n\tLDH\t(.IE),A\n\n\t;; (9*20) = 180 tiles are used in the upper part of the screen\n\t;; (9*20) = 180 tiles are used in the lower part of the screen\n\t;; => We have 24 tiles free\n\t;; We keep 16 at 0x8000->0x80FF, and 8 at 0x9780->97FF\n\n\tLD\tHL,#0x9800\n\tLD\tA,#0x10\t\t; Keep 16 tiles free\n\tLD\tBC,#12\t\t; 12 unused columns\n\tLD\tE,#18\t\t; 18 lines\n2$:\n\tLD\tD,#20\t\t; 20 used columns\n3$:\n\tLD\t(HL+),A\n\tINC\tA\n\tDEC\tD\n\tJR\tNZ,3$\n\tADD\tHL,BC\n\tDEC\tE\n\tJR\tNZ,2$\n\n\t;; Turn the screen on\n\tLDH\tA,(.LCDC)\n\tOR\t#0b10010001\t; LCD\t\t= On\n\t\t\t\t; BG Chr\t= 0x8000\n\t\t\t\t; BG\t\t= On\n\tAND\t#0b11110111\t; BG Bank\t= 0x9800\n\tLDH\t(.LCDC),A\n\n\tLD\tA,#.G_MODE\n\tLD\t(.mode),A\n\n\t;; Setup the default colours and draw modes\n\tLD\tA,#.M_SOLID\n\tLD\t(.draw_mode),A\n\tLD\tA,#0x03\t\t; Black\n\tLD\t(.fg_colour),A\n\tLD\tA,#0x00\t\t; White\n\tLD\t(.bg_colour),A\n\t\n\tEI\t\t\t; Enable interrupts\n\n\tRET\n\n.vbl::\n\tLDH\tA,(.LCDC)\n\tOR\t#0b00010000\t; Set BG Chr to 0x8000\n\tLDH\t(.LCDC),A\n\n\tLD\tA,#72\t\t; Set line at which LCD interrupt occurs\n\tLDH\t(.LYC),A\n\n\tRET\n\n\t;; Is the STAT check required, as we are already in the HBL?\n.lcd::\n1$:\n\tLDH\tA,(.STAT)\n\tBIT\t1,A\n\tJR\tNZ,1$\n\n\tLDH\tA,(.LCDC)\n\tAND\t#0b11101111\t; Set BG Chr to 0x8800\n\tLDH\t(.LCDC),A\n\n\tRET\n\n\t;; Draw a full-screen image at (BC)\n.draw_image::\n\tLD      HL,#0x8000+0x10*0x10\n\tLD      DE,#0x1680\n\tCALL    .copy_vram      ; Move the charset\n\tRET\n\n\t;; Replace tile data at (B,C) with data at DE and store old value at HL\n.switch_data::\n\tPUSH    DE              ; Save src\n\tPUSH    HL              ; Save dst\n\tLD      L,B\n\tSLA     L\n\tSLA     L\n\tSLA     L\n\tLD      H,#0x00\n\tADD     HL,HL\n\tLD      D,H\n\tLD      E,L\n\n\tLD      HL,#.y_table\n\tSLA     C\n\tSLA     C\n\tSLA     C\n\tLD      B,#0x00\n\tADD     HL,BC\n\tADD     HL,BC\n\tLD      B,(HL)\n\tINC     HL\n\tLD      H,(HL)\n\tLD      L,B\n\tADD     HL,DE\n\n\tLD      B,H             ; BC = src\n\tLD      C,L\n\tPOP     HL              ; HL = dst\n\tPUSH    BC              ; Save dst\n\tLD      A,H\n\tOR      L\n\tJR      Z,1$\n\tLD      DE,#0x10\n\tCALL    .copy_vram\n1$:\n\tPOP     HL              ; HL = dst\n\tPOP     BC              ; BC = src\n\tLD      DE,#0x10\n\tCALL    .copy_vram\n\n\tRET\n\n\t.area\t_CODE\n\t;; Advance the cursor\n.adv_gcurs::\n\tPUSH\tHL\n\tLD\tHL,#.tx\t; X coordinate\n\tLD\tA,#.MAXCURSPOSX\n\tCP\t(HL)\n\tJR\tZ,1$\n\tINC\t(HL)\n\tJR\t99$\n1$:\n\tLD\t(HL),#0x00\n\tLD\tHL,#.ty\t; Y coordinate\n\tLD\tA,#.MAXCURSPOSY\n\tCP\t(HL)\n\tJR\tZ,2$\n\tINC\t(HL)\n\tJR\t99$\n2$:\n\tLD\t(HL),#0x00\n99$:\n\tPOP\tHL\n\tRET\n\n\t;; Draw a circle from (B,C) with radius D\n.circle::\n\tLD\tA,B\t;Store center values\n\tLD\t(.x_s),A\n\tLD\tA,C\n\tLD\t(.y_s),A\n\n\tXOR\tA\n\tLD\t(.x_s+1),A \n\tLD\tA,D\n\tLD\t(.y_s+1),A \n\tCPL\n\tLD\tL,A\n\tLD\tH,#0xFF\n\tINC\tHL\n\tLD\tBC,#0\n\tADD\tHL,BC\n\tLD\tA,L\n\tLD\t(.l_d+1),A\n\tLD\tA,H\n\tLD\t(.l_d),A\n\ncloop$:\n\tLD\tA,(.x_s+1)\n\tLD\tB,A\n\tLD\tA,(.y_s+1)\n\tSUB\tB\n\tRET\tC\n\n\tLD\tA,(.style)\n\tOR\tA\n\tCALL\tZ,.circplot\n\n\tLD\tA,(.l_d)\n\tBIT\t7,A\n\tJR\tZ,ycirc$\n\n\tLD\tA,(.style)\n\tOR\tA\n\tCALL\tNZ,.horlin\n\tLD\tA,(.x_s+1)\n\tINC\tA\n\tLD\t(.x_s+1),A\n\tLD\tA,(.l_d)\n\tLD\tB,A\n\tLD\tA,(.l_d+1)\n\tLD\tC,A\n\tLD\tH,#0\n\tLD\tA,(.x_s+1)\n\tLD\tL,A\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,BC\n\tLD\tBC,#6\n\tADD\tHL,BC\n\tLD\tA,H\n\tLD\t(.l_d),A\n\tLD\tA,L\n\tLD\t(.l_d+1),A\n\tJR\tcloop$\nycirc$:\t\n\tLD\tA,(.style)\n\tOR\tA\n\tCALL\tNZ,.verlin\n\tLD\tA,(.x_s+1)\n\tINC\tA\n\tLD\t(.x_s+1),A\n\tLD\tB,#0\n\tLD\tA,(.x_s+1)\n\tLD\tC,A\n\tLD\tH,#0xFF\n\tLD\tA,(.y_s+1)\n\tCPL\n\tLD\tL,A\n\tINC\tHL\n\tADD\tHL,BC\n\tLD\tA,(.l_d)\n\tLD\tB,A\n\tLD\tA,(.l_d+1)\n\tLD\tC,A\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,BC\n\tLD\tBC,#10\n\tADD\tHL,BC\n\tLD\tA,H\n\tLD\t(.l_d),A\n\tLD\tA,L\n\tLD\t(.l_d+1),A\n\tLD\tA,(.y_s+1)\n\tDEC\tA\n\tLD\t(.y_s+1),A\n\tJP\tcloop$\n\n.horlin::\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s+1)\n\tLD\tE,A\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tD\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tLD\tA,D\n\tOR\tA\n\tRET\tZ\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tD\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.verlin::\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s+1)\n\tLD\tE,A\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tD\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tD\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tLD\tA,D\n\tSUB\tE\n\tRET\tZ\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tD\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tD\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tE\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tD\n\tLD\tH,A\n\tLD\tA,B\n\tADD\tD\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tE\n\tLD\tC,A\n\tLD\tD,H\n\tLD\tE,C\n\tCALL\t.line\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.circplot::\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s+1)\n\tLD\tE,A\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tADD\tD\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tE\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tD\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tD\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tE\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tD\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\t\n\tLD\tA,D\n\tOR\tA\n\tRET\tZ\n\tSUB\tE\n\tRET\tZ\n\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tD\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tE\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tSUB\tE\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tD\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tADD\tD\n\tLD\tB,A\n\tLD\tA,C\n\tADD\tE\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,B\n\tADD\tE\n\tLD\tB,A\n\tLD\tA,C\n\tSUB\tD\n\tLD\tC,A\n\tCALL\t.plot\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n\t;; Draw a box between (B,C) and (D,E)\n.box::\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.x_s+1)\n\tLD\tC,A\n\tSUB\tB\n\tJR\tNC,ychk$\n\tLD\tA,C\n\tLD\t(.x_s),A\n\tLD\tA,B\n\tLD\t(.x_s+1),A\nychk$:\n\tLD\tA,(.y_s)\n\tLD\tB,A\n\tLD\tA,(.y_s+1)\n\tLD\tC,A\n\tSUB\tB\n\tJR\tNC,dbox$\n\tLD\tA,C\n\tLD\t(.y_s),A\n\tLD\tA,B\n\tLD\t(.y_s+1),A\ndbox$:\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tD,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tA,(.y_s+1)\n\tLD\tE,A\n\tCALL\t.line\n\tLD\tA,(.x_s+1)\n\tLD\tB,A\n\tLD\tD,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tA,(.y_s+1)\n\tLD\tE,A\n\tCALL\t.line\n\tLD\tA,(.x_s)\n\tINC\tA\n\tLD\t(.x_s),A\n\tLD\tA,(.x_s+1)\n\tDEC\tA\n\tLD\t(.x_s+1),A\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tE,A\n\tCALL\t.line\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s+1)\n\tLD\tC,A\n\tLD\tE,A\n\tCALL\t.line\n\tLD\tA,(.style)\n\tOR\tA\n\tRET\tZ\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.x_s+1)\n\tSUB\tB\n\tRET\tC\n\tLD\tA,(.y_s)\n\tINC\tA\n\tLD\t(.y_s),A\n\tLD\tA,(.y_s+1)\n\tDEC\tA\n\tLD\t(.y_s+1),A\n\tLD\tA,(.y_s)\n\tLD\tB,A\n\tLD\tA,(.y_s+1)\n\tSUB\tB\n\tRET\tC\n\n\t.if\t0\n\tLD\tA,(.mod_col)\t;Swap fore + back colours.\n\tLD\tD,A\n\tAND\t#0xF0\n\tLD\tC,A\t\t;Preserve Style\n\tLD\tA,D\n\tAND\t#0x0C\n\tRRCA\n\tRRCA\n\tOR\tC\t\t;Foreground->background + style\n\tLD\tC,A\n\tLD\tA,D\n\tAND\t#0x03\n\tRLCA\n\tRLCA\n\tOR\tC\n\tLD\t(.mod_col),A\n\t.else\n\tLD\tA,(.fg_colour)\n\tLD\tC,A\n\tLD\tA,(.bg_colour)\n\tLD\t(.fg_colour),A\n\tLD\tA,C\n\tLD\t(.bg_colour),A\n\t.endif \nfilllp$:\n\tLD\tA,(.x_s)\n\tLD\tB,A\n\tLD\tA,(.x_s+1)\n\tLD\tD,A\n\tLD\tA,(.y_s)\n\tLD\tC,A\n\tLD\tE,A\n\tCALL\t.line\n\tLD\tA,(.y_s+1)\n\tLD\tB,A\n\tLD\tA,(.y_s)\n\tCP\tB\n\tJR\tZ,swap$\n\tINC\tA\n\tLD\t(.y_s),A\n\tJR\tfilllp$\nswap$:\t\n\t.if\t0\n\tLD\tA,(.mod_col)\t;Swap fore + back colours.\n\tLD\tD,A\n\tAND\t#0xF0\n\tLD\tC,A\t\t;Preserve Style\n\tLD\tA,D\n\tAND\t#0x0C\n\tRRCA\n\tRRCA\n\tOR\tC\t\t;Foreground->background + style\n\tLD\tC,A\n\tLD\tA,D\n\tAND\t#0x03\n\tRLCA\n\tRLCA\n\tOR\tC\n\tLD\t(.mod_col),A\n\t.else\n\tLD\tA,(.fg_colour)\n\tLD\tC,A\n\tLD\tA,(.bg_colour)\n\tLD\t(.fg_colour),A\n\tLD\tA,C\n\tLD\t(.bg_colour),A\n\t.endif\n\tRET\n\n\t;; Draw a line between (B,C) and (D,E)\n.line::\n\tLD\tA,C\t;Calculate Delta Y\n\tSUB\tE\n\tJR\tNC,s1$\n\tCPL\n\tINC\tA\ns1$:\tLD\t(.delta_y),A\n\tLD\tH,A\n\n\tLD\tA,B\t;Calculate Delta X\n\tSUB\tD\n\tJR\tNC,s2$\n\tCPL\n\tINC\tA\ns2$:\tLD\t(.delta_x),A\n\n\tSUB\tH\n\tJP\tC,y1\n\n\t;; Use Delta X\n\n\tLD\tA,B\n\tSUB\tD\n\tJP\tNC,x2$\n\n\tLD\tA,C\n\tSUB\tE\n\tJR\tZ,x3$\n\tLD\tA,#0x00\n\tJR\tNC,x3$\n\tLD\tA,#0xFF\n\tJR\tx3$\n\nx2$:\n\tLD\tA,E\n\tSUB\tC\n\tJR\tZ,x2a$\n\tLD\tA,#0x00\n\tJR\tNC,x2a$\n\tLD\tA,#0xFF\n\nx2a$:\n\tLD\tB,D\n\tLD\tC,E\t;BC holds start X,Y\nx3$:\n\tLD\t(.l_inc),A\t;Store Y increment\n\tLD\tHL,#.y_table\n\tLD\tD,#0x00\n\tLD\tE,C\n\tADD\tHL,DE\n\tADD\tHL,DE\n\tLD\tA,(HL+)\n\tLD\tH,(HL)\n\tLD\tL,A\n\n\tLD\tA,B\n\tAND\t#0xf8\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\n\tLD\tA,(.delta_y)\n\tOR\tA\n\tJP\tZ,.xonly\n\n\t;;\tGot to do it the hard way.\n\n\t;\tCalculate (2*deltay) -> dinc1\n\n\tPUSH\tHL\n\tLD\tH,#0x00\n\tLD\tL,A\n\tADD\tHL,HL\n\tLD\tA,H\n\tLD\t(.dinc1),A\n\tLD\tA,L\n\tLD\t(.dinc1+1),A\n\n\t;\tCalculate (2*deltay)-deltax -> d\n\n\n\tLD\tD,H\n\tLD\tE,L\n\tLD\tA,(.delta_x)\n\tCPL\n\tLD\tL,A\n\tLD\tH,#0xFF\n\tINC\tHL\ndx1$:\n\tADD\tHL,DE\n\tLD\tA,H\n\tLD\t(.l_d),A\n\tLD\tA,L\n\tLD\t(.l_d+1),A\n\n\t;\tCalculate (deltay-deltax)*2 -> dinc2\n\n\tLD\tA,(.delta_x)\n\tCPL\n\tLD\tL,A\n\tLD\tH,#0xFF\n\tINC\tHL\n\tLD\tA,(.delta_y)\n\tLD\tD,#0x00\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,HL\n\n\tLD\tA,H\n\tLD\t(.dinc2),A\n\tLD\tA,L\n\tLD\t(.dinc2+1),A\n\n\tPOP\tHL\n\n\t.if\t0\n\tLD\tA,(.mod_col)\n\tLD\tD,A\n\t.endif\n\t\n\tLD\tA,(.delta_x)\n\tLD\tE,A\n\n\tLD\tA,B\n\tAND\t#7\n\tADD\t#0x10\t; Table of bits is located at 0x0010\n\tLD\tC,A\n\tLD\tB,#0x00\n\tLD\tA,(BC)\t; Get start bit\n\tLD\tB,A\n\tLD\tC,A\n\nxloop$:\n\tRRC\tC\n\tLD\tA,(.l_d)\n\tBIT\t7,A\n\tJR\tZ,ychg$\n\tPUSH\tDE\n\tBIT\t7,C\n\tJR\tZ,nbit$\n\tLD\tA,B\n\tCPL\n\tLD\tC,A\n\tCALL\t.wrbyte\n\tDEC\tHL\n\tLD\tC,#0x80\n\tLD\tB,C\nnbit$:\n\tLD\tA,(.l_d+1)\n\tLD\tD,A\n\tLD\tA,(.dinc1+1)\n\tADD\tD\n\tLD\t(.l_d+1),A\n\tLD\tA,(.l_d)\n\tLD\tD,A\n\tLD\tA,(.dinc1)\n\tADC\tD\n\tLD\t(.l_d),A\n\tPOP\tDE\n\tJR\tnchg$\nychg$:\n\tPUSH\tDE\n\tPUSH\tBC\n\tLD\tA,B\n\tCPL\n\tLD\tC,A\n\tCALL\t.wrbyte\n\tLD\tA,(.l_inc)\n\tOR\tA\n\tJR\tZ,ydown$\n\tINC\tHL\n\tLD\tA,L\n\tAND\t#0x0F\n\tJR\tNZ,bound$\n\tLD\tDE,#0x0130\n\tADD\tHL,DE\t;Correct screen address\n\tJR\tbound$\nydown$:\n\tDEC\tHL\n\tDEC\tHL\n\tDEC\tHL\n\tLD\tA,L\n\tAND\t#0x0F\n\tXOR\t#0x0E\n\tJR\tNZ,bound$\n\tLD\tDE,#0xFED0\n\tADD\tHL,DE\t;Correct screen address\nbound$:\n\tLD\tA,(.l_d+1)\n\tLD\tD,A\n\tLD\tA,(.dinc2+1)\n\tADD\tD\n\tLD\t(.l_d+1),A\n\tLD\tA,(.l_d)\n\tLD\tD,A\n\tLD\tA,(.dinc2)\n\tADC\tD\n\tLD\t(.l_d),A\n\tPOP\tBC\n\tLD\tB,C\n\tPOP\tDE\nnchg$:\n\tBIT\t7,C\n\tJR\tZ,nadj$\n\tPUSH\tDE\n\tLD\tDE,#0x0010\n\tADD\tHL,DE\t;Correct screen address\n\tPOP\tDE\n\tLD\tB,C\nnadj$:\n\tLD\tA,B\n\tOR\tC\n\tLD\tB,A\n\tDEC\tE\n\tJP\tNZ,xloop$\n\tLD\tA,B\n\tCPL\n\tLD\tC,A\n\tJP\t.wrbyte\n\n.xonly::\n\t;; Draw accelerated horizontal line\n\t.if\t0\n\t;; xxx needed?\n\tLD\tA,(.mod_col)\t\n\tLD\tD,A\n\t.endif\n\n\tLD\tA,(.delta_x)\n\tLD\tE,A\n\tINC\tE\n\n\tLD\tA,B\t;check X\n\tAND\t#7\t;just look at bottom 3 bits\n\tJR\tZ,2$\n\tPUSH\tHL\n\tADD\t#0x10\t;Table of bits is located at 0x0010\n\tLD\tL,A\n\tLD\tH,#0x00\n\tLD\tC,(HL)\n\tPOP\tHL\n\tXOR\tA\t;Clear A\n1$:\tRRCA\t\t;Shift data right 1\n\tOR\tC\n\tDEC\tE\n\tJR\tZ,3$\n\tBIT\t0,A\n\tJR\tZ,1$\n\tJR\t3$\n2$:\n\tLD\tA,E\n\tDEC\tA\n\tAND\t#0xF8\n\tJR\tZ,4$\n\tJR\t8$\n3$:\n\tLD\tB,A\n\tCPL\n\tLD\tC,A\n\tPUSH\tDE\n\tCALL\t.wrbyte\n\tLD\tDE,#0x0F\n\tADD\tHL,DE\t;Correct screen address\n\tPOP\tDE\n\n8$:\tLD\tA,E\n\tOR\tA\n\tRET\tZ\n\tAND\t#0xF8\n\tJR\tZ,4$\n\n\tXOR\tA\n\tLD\tC,A\n\tCPL\n\tLD\tB,A\n\n\tPUSH\tDE\n\tCALL\t.wrbyte\n\tLD\tDE,#0x0F\n\tADD\tHL,DE\t;Correct screen address\n\tPOP\tDE\n\tLD\tA,E\n\tSUB\t#8\n\tRET\tZ\n\tLD\tE,A\n\tJR\t8$\n\n4$:\tLD\tA,#0x80\n5$:\tDEC\tE\n\tJR\tZ,6$\n\tSRA\tA\n\tJR\t5$\n6$:\tLD\tB,A\n\tCPL\n\tLD\tC,A\n\tJP\t.wrbyte\n\n\t;; Use Delta Y\ny1:\n\tLD\tA,C\n\tSUB\tE\n\tJP\tNC,y2$\n\n\tLD\tA,B\n\tSUB\tD\n\tJR\tZ,y3$\n\tLD\tA,#0x00\n\tJR\tNC,y3$\n\tLD\tA,#0xFF\n\tJR\ty3$\n\ny2$:\n\tLD\tA,C\n\tSUB\tE\n\tJR\tZ,y2a$\n\tLD\tA,#0x00\n\tJR\tNC,y2a$\n\tLD\tA,#0xFF\n\ny2a$:\n\tLD\tB,D\n\tLD\tC,E\t;BC holds start X,Y\n\ny3$:\n\tLD\t(.l_inc),A\t;Store X increment\n\tLD\tHL,#.y_table\n\tLD\tD,#0x00\n\tLD\tE,C\n\tADD\tHL,DE\n\tADD\tHL,DE\n\tLD\tA,(HL+)\n\tLD\tH,(HL)\n\tLD\tL,A\n\n\tLD\tA,B\n\tAND\t#0xf8\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\n\t.if\t0\n\t;; Trashed by later instructions\n\tLD\tA,(.mod_col)\n\tLD\tD,A\n\t.endif\n\t\n\tLD\tA,(.delta_y)\n\tLD\tE,A\n\tINC\tE\n\n\tLD\tA,(.delta_x)\n\tOR\tA\n\tJP\tZ,.yonly\n\n\t;;\tGot to do it the hard way.\n\n\t;\tCalculate (2*deltax) -> dinc1\n\n\tPUSH\tHL\n\tLD\tH,#0x00\n\tLD\tL,A\n\tADD\tHL,HL\n\tLD\tA,H\n\tLD\t(.dinc1),A\n\tLD\tA,L\n\tLD\t(.dinc1+1),A\n\n\t;\tCalculate (2*deltax)-deltay -> d\n\n\n\tLD\tD,H\n\tLD\tE,L\n\tLD\tA,(.delta_y)\n\tCPL\n\tLD\tL,A\n\tLD\tH,#0xFF\n\tINC\tHL\ndy1$:\n\tADD\tHL,DE\n\tLD\tA,H\n\tLD\t(.l_d),A\n\tLD\tA,L\n\tLD\t(.l_d+1),A\n\n\t;\tCalculate (deltax-deltay)*2 -> dinc2\n\n\tLD\tA,(.delta_y)\n\tCPL\n\tLD\tL,A\n\tLD\tH,#0xFF\n\tINC\tHL\n\tLD\tA,(.delta_x)\n\tLD\tD,#0x00\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,HL\n\n\tLD\tA,H\n\tLD\t(.dinc2),A\n\tLD\tA,L\n\tLD\t(.dinc2+1),A\n\n\tPOP\tHL\n\n\t.if\t0\n\t;; xxx Not used?\n\tLD\tA,(.mod_col)\n\tLD\tD,A\n\t.endif\n\n\tLD\tA,(.delta_y)\n\tLD\tE,A\n\n\tLD\tA,B\n\tAND\t#7\n\tADD\t#0x10\t; Table of bits is located at 0x0010\n\tLD\tC,A\n\tLD\tB,#0x00\n\tLD\tA,(BC)\t; Get start bit\n\tLD\tB,A\n\tLD\tC,A\n\nyloop$:\n\tPUSH\tDE\n\tPUSH\tBC\n\tLD\tA,B\n\tCPL\n\tLD\tC,A\n\tCALL\t.wrbyte\n\tINC\tHL\n\tLD\tA,L\n\tAND\t#0x0F\n\tJR\tNZ,nybound$\n\tLD\tDE,#0x0130\n\tADD\tHL,DE\t;Correct screen address\nnybound$:\n\tPOP\tBC\n\tLD\tA,(.l_d)\n\tBIT\t7,A\n\tJR\tZ,xchg$\n\tLD\tA,(.l_d+1)\n\tLD\tD,A\n\tLD\tA,(.dinc1+1)\n\tADD\tD\n\tLD\t(.l_d+1),A\n\tLD\tA,(.l_d)\n\tLD\tD,A\n\tLD\tA,(.dinc1)\n\tADC\tD\n\tLD\t(.l_d),A\n\tJR\tnchgy$\nxchg$:\n\tLD\tA,(.l_inc)\n\tOR\tA\n\tJR\tNZ,yright$\n\tRLC\tB\n\tBIT\t0,B\n\tJR\tZ,boundy$\n\tLD\tDE,#0xFFF0\n\tADD\tHL,DE\t;Correct screen address\n\tJR\tboundy$\nyright$:\n\tRRC\tB\n\tBIT\t7,B\n\tJR\tZ,boundy$\n\tLD\tDE,#0x0010\n\tADD\tHL,DE\t;Correct screen address\nboundy$:\n\tLD\tA,(.l_d+1)\n\tLD\tD,A\n\tLD\tA,(.dinc2+1)\n\tADD\tD\n\tLD\t(.l_d+1),A\n\tLD\tA,(.l_d)\n\tLD\tD,A\n\tLD\tA,(.dinc2)\n\tADC\tD\n\tLD\t(.l_d),A\nnchgy$:\n\tPOP\tDE\n\tDEC\tE\n\tJR\tNZ,yloop$\n\tLD\tA,B\n\tCPL\n\tLD\tC,A\n\tJP\t.wrbyte\n\n.yonly::\n\t;; Draw accelerated vertical line\n\tLD\tA,B\t;check X\n\tAND\t#7\t;just look at bottom 3 bits\n\tPUSH\tHL\n\tADD\t#0x10\t;Table of bits is located at 0x0010\n\tLD\tL,A\n\tLD\tH,#0x00\n\tLD\tA,(HL)\t;Get mask bit\n\tPOP\tHL\n\tLD\tB,A\n\tCPL\n\tLD\tC,A\n\n1$:\tPUSH\tDE\n\tCALL\t.wrbyte\n\tINC\tHL\t;Correct screen address\n\tLD\tA,L\n\tAND\t#0x0F\n\tJR\tNZ,2$\n\tLD\tDE,#0x0130\n\tADD\tHL,DE\n2$:\tPOP\tDE\n\tDEC\tE\n\tRET\tZ\n\tJR\t1$\n\n\t;; Draw a point at (B,C) with mode and color D\n.plot::\n\n\tLD\tHL,#.y_table\n\tLD\tD,#0x00\n\tLD\tE,C\n\tADD\tHL,DE\n\tADD\tHL,DE\n\tLD\tA,(HL+)\n\tLD\tH,(HL)\n\tLD\tL,A\n\n\tLD\tA,B\n\tAND\t#0xf8\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\n\tLD\tA,B\n\n\tAND     #7\n\tADD     #0x10\t\t; Table of bits is located at 0x0010\n\tLD      C,A\n\tLD      B,#0x00\n\tLD      A,(BC)\n\tLD      B,A\n\tCPL\n\tLD      C,A\n\n.wrbyte::\n\t.if\t0\n\tLD\tA,(.mod_col)\t; Restore color and mode\n\tLD\tD,A\n\n\tBIT\t5,D\n\tJR\tNZ,10$\n\tBIT\t6,D\n\tJR\tNZ,20$\n\tBIT\t7,D\n\tJR\tNZ,30$\n\t.else\n\tLD\tA,(.fg_colour)\n\tLD\tD,A\n\tLD\tA,(.draw_mode)\n\tCP\t#.M_OR\n\tJR\tZ,10$\n\tCP\t#.M_XOR\n\tJR\tZ,20$\n\tCP\t#.M_AND\n\tJR\tZ,30$\t\t\n\t.endif\n\n\t; Fall through to SOLID by default\n1$:\n\t;; Solid\n\tLD\tE,B\n\t.if\t0\n\tBIT\t2,D\n\t.else\n\tBIT\t0,D\n\t.endif\n\tJR\tNZ,2$\n\tPUSH\tBC\n\tLD\tB,#0x00\n2$:\n\t.if\t0\n\tBIT\t3,D\n\t.else\n\tBIT\t1,D\n\t.endif\n\tJR\tNZ,3$\n\tLD\tE,#0x00\n3$:\n\tLDH\tA,(.STAT)\n\tBIT\t1,A\n\tJR\tNZ,3$\n\n\tLD\tA,(HL)\n\tAND\tC\n\tOR\tB\n\tLD\t(HL+),A\n\n\tLD\tA,(HL)\n\tAND\tC\n\tOR\tE\n\tLD\t(HL),A\n\tLD\tA,B\n\tOR\tA\n\tRET\tNZ\n\tPOP\tBC\n\tRET\n\n10$:\n\t;; Or\n\tLD      C,B\n\t.if\t0\n\tBIT     2,D\n\t.else\n\tBIT\t0,D\n\t.endif\n\tJR      NZ,11$\n\tLD      B,#0x00\n11$:\n\t.if\t0\n\tBIT     3,D\n\t.else\n\tBIT\t1,D\n\t.endif\n\tJR      NZ,12$\n\tLD      C,#0x00\n12$:\n\tLDH     A,(.STAT)\n\tBIT     1,A\n\tJR      NZ,12$\n\n\tLD      A,(HL)\n\tOR      B\n\tLD      (HL+),A\n\n\tLD      A,(HL)\n\tOR      C\n\tLD      (HL),A\n\tRET\n\n20$:\n\t;; Xor\n\tLD      C,B\n\t.if\t0\n\tBIT     2,D\n\t.else\n\tBIT\t0,D\n\t.endif\n\tJR      NZ,21$\n\tLD      B,#0x00\n21$:\n\t.if\t0\n\tBIT     3,D\n\t.else\n\tBIT\t1,D\n\t.endif\n\tJR      NZ,22$\n\tLD      C,#0x00\n22$:\n\tLDH     A,(.STAT)\n\tBIT     1,A\n\tJR      NZ,22$\n\n\tLD      A,(HL)\n\tXOR     B\n\tLD      (HL+),A\n\n\tLD      A,(HL)\n\tXOR     C\n\tLD      (HL),A\n\tRET\n\n30$:\n\t;; And\n\tLD      B,C\n\t.if\t0\n\tBIT     2,D\n\t.else\n\tBIT\t0,D\n\t.endif\n\tJR      Z,31$\n\tLD      B,#0xFF\n31$:\n\t.if\t0\n\tBIT     3,D\n\t.else\n\tBIT\t1,D\n\t.endif\n\tJR      Z,32$\n\tLD      C,#0xFF\n32$:\n\tLDH     A,(.STAT)\n\tBIT     1,A\n\tJR      NZ,32$\n\n\tLD      A,(HL)\n\tAND     B\n\tLD      (HL+),A\n\n\tLD      A,(HL)\n\tAND     C\n\tLD      (HL),A\n\tRET\n\n\t;; Get color of pixel at point (B,C) returns in A\n.getpix::\n\tLD\tHL,#.y_table\n\tLD\tD,#0x00\n\tLD\tE,C\n\tADD\tHL,DE\n\tADD\tHL,DE\n\tLD\tA,(HL+)\n\tLD\tH,(HL)\n\tLD\tL,A\n\n\tLD\tA,B\n\tAND\t#0xf8\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\n\tLD\tA,B\n\n\tAND     #7\n\tADD     #0x10\t\t; Table of bits is located at 0x0010\n\tLD      C,A\n\tLD      B,#0x00\n\tLD      A,(BC)\n\tLD      C,A\n\ngp$:\n\tLDH\tA,(.STAT)\n\tBIT\t1,A\n\tJR\tNZ,gp$\n\n\tLD\tA,(HL+)\n\tLD\tD,A\n\tLD\tA,(HL+)\n\tLD\tE,A\n\tLD\tB,#0\n\tLD\tA,D\n\tAND\tC\n\tJR\tZ,npix$\n\tSET\t0,B\nnpix$:\tLD\tA,E\n\tAND\tC\n\tJR\tZ,end$\n\tSET\t1,B\nend$:\tLD\tE,B\n\tRET\n\n\t;; Write character C\n.wrtchr::\n\tLD\tHL,#.y_table\n\tLD\tD,#0x00\n\tLD\tA,(.ty)\n\tRLCA\n\tRLCA\n\tRLCA\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\tLD\tB,(HL)\n\tINC\tHL\n\tLD\tH,(HL)\n\tLD\tL,B\n\n\tLD\tA,(.tx)\n\tRLCA\n\tRLCA\n\tRLCA\n\tLD\tE,A\n\tADD\tHL,DE\n\tADD\tHL,DE\n\n\tLD\tA,C\n\tLD\tB,H\n\tLD\tC,L\n\n\tLD\tH,D\n\tLD\tL,A\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\n\t.if\t0\n\tLD\tDE,#.tp1\n\t.else\n\t.globl\t_font_ibm_fixed_tiles\n\n\tLD\tDE,#_font_ibm_fixed_tiles\n\t.endif\n\t\n\tADD\tHL,DE\n\n\tLD\tD,H\n\tLD\tE,L\n\tLD\tH,B\n\tLD\tL,C\n\n\t.if\t0\n\tLD\tA,(.mod_col)\n\tLD\tC,A\n\t.else\n\tLD\tA,(.fg_colour)\n\tLD\tC,A\n\t.endif\nchrloop$:\n\tLD\tA,(DE)\n\tINC\tDE\n\tPUSH\tDE\n\n\t.if\t1\n\tPUSH\tHL\n\tLD\tHL,#.bg_colour\n\tLD\tL,(HL)\n\t.endif\n\n\tLD\tB,A\n\tXOR\tA\n\t.if\t0\n\tBIT\t0,C\n\t.else\n\tBIT\t0,L\n\t.endif\n\tJR\tZ,a0$\n\tCPL\na0$:\tOR\tB\n\t.if\t0\n\tBIT\t2,C\n\t.else\n\tBIT\t0,C\n\t.endif\n\tJR\tNZ,a1$\n\tXOR\tB\na1$:\tLD\tD,A\n\tXOR\tA\n\t.if\t0\n\tBIT\t1,C\n\t.else\n\tBIT\t1,L\n\t.endif\n\tJR\tZ,b0$\n\tCPL\nb0$:\tOR\tB\n\t.if\t0\n\tBIT\t3,C\n\t.else\n\tBIT\t1,C\n\t.endif\n\tJR\tNZ,b1$\n\tXOR\tB\nb1$:\t\n\tLD\tE,A\n\t.if\t1\n\tPOP\tHL\n\t.endif\nchrwait$:\n\tLDH\tA,(.STAT)\n\tBIT\t1,A\n\tJR\tNZ,chrwait$\n\n\tLD\tA,D\n\tLD\t(HL+),A\n\tLD\tA,E\n\tLD\t(HL+),A\n\tPOP\tDE\n\tLD\tA,L\n\tAND\t#0x0F\n\tJR\tNZ,chrloop$\n\tRET\n\n\t.area\t_CODE\n_gotogxy::\t\t\t; Banked\n\tLDA\tHL,.BANKOV(SP)\t; Skip return address\n\tLD\tA,(HL+)\t\t; A = x\n\tLD\t(.tx),A\n\tLD\tA,(HL+)\t\t; A = y\n\tLD\t(.ty),A\n\n\tRET\n\n_wrtchr::\t\t\t; Banked\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL)\n\tLD\tC,A\t; C = Char to print\n\n\tCALL\t.wrtchr\n\tCALL\t.adv_gcurs\n\n\tPOP\tBC\n\tRET\n\n_getpix::\t\t\t; Banked\n\tPUSH    BC\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x\n\tLD\tB,A\n\tLD\tA,(HL+)\t; C = y\n\tLD\tC,A\n\n\tCALL\t.getpix\n\n\tPOP\tBC\n\tRET\n\n_color::\t\t\t; Banked\n\tLDA\tHL,.BANKOV(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; A = Foreground\n\tLD\t(.fg_colour),a\n\tLD\tA,(HL+)\n\tLD\t(.bg_colour),a\n\tLD\tA,(HL)\n\tLD\t(.draw_mode),a\n\tRET\n\n_circle::\t\t\t; Banked\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x\n\tLD\tB,A\n\tLD\tA,(HL+)\t; C = y\n\tLD\tC,A\n\tLD\tA,(HL+)\t; D = Radius\n\tLD\tD,A\n\tLD\tA,(HL)\n\tLD\t(.style),A\n\n\tCALL\t.circle\n\n\tPOP\tBC\n\tRET\n\n_box::\t\t\t\t; Banked\n\tPUSH    BC\n\n\tLD      A,(.mode)\n\tCP      #.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x1\n\tLD\t(.x_s),A\n\tLD\tA,(HL+)\t; C = y1\n\tLD\t(.y_s),A\n\tLD\tA,(HL+)\t; D = x2\n\tLD\t(.x_s+1),A\n\tLD\tA,(HL+)\t; E = y2\n\tLD\t(.y_s+1),A\n\tLD\tA,(HL)\n\tLD\t(.style),A\n\tCALL\t.box\n\tPOP\tBC\n\tRET\n\n_line::\t\t\t\t; Banked\n\tPUSH    BC\n\n\tLD      A,(.mode)\n\tCP      #.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x1\n\tLD\tB,A\n\tLD\tA,(HL+)\t; C = y1\n\tLD\tC,A\n\tLD\tA,(HL+)\t; D = x2\n\tLD\tD,A\n\tLD\tA,(HL+)\t; E = y2\n\tLD\tE,A\n\n\tCALL\t.line\n\n\tPOP     BC\n\tRET\n\n_plot_point::\t\t\t; Banked\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x\n\tLD\tB,A\n\tLD\tA,(HL+)\t; C = y\n\tLD\tC,A\n\n\tCALL\t.plot\n\n\tPOP\tBC\n\tRET\n\n\t;; Old, compatible version of plot()\n_plot::\t\t\t\t; Banked\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,.BANKOV+2(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t\t; B = x\n\tLD\tB,A\n\tLD\tA,(HL+)\t\t; C = y\n\tLD\tC,A\n\tLD\tA,(HL+)\t\t; colour\n\tLD\t(.fg_colour),A\n\tLD\tA,(HL+)\t\t; mode\n\tLD\t(.draw_mode),A\n\t\n\tCALL\t.plot\n\n\tPOP\tBC\n\tRET\n\n\t.area\t_BASE\n_switch_data::\t\t\t; Non Banked as pointer\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; B = x\n\tLD\tB,A\n\tLD\tA,(HL+)\t; C = y\n\tLD\tC,A\n\tLD\tA,(HL+)\t; DE = src\n\tLD\tE,A\n\tLD\tA,(HL+)\n\tLD\tD,A\n\tLD\tA,(HL+)\t; HL = dst\n\tLD\tH,(HL)\n\tLD\tL,A\n\n\tCALL    .switch_data\n\n\tPOP     BC\n\tRET\n\n\n_draw_image::\t\t\t; Non banked as pointer\n\tPUSH    BC\n\n\tLD\tA,(.mode)\n\tCP\t#.G_MODE\n\tCALL\tNZ,.gmode\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tA,(HL+)\t; HL = data\n\tLD\tC,A\n\tLD\tB,(HL)\n\n\tCALL\t.draw_image\n\n\tPOP\tBC\n\tRET\n\n\t.area\t_BASE\n.y_table::\n\t.word   0x8100,0x8102,0x8104,0x8106,0x8108,0x810A,0x810C,0x810E\n\t.word   0x8240,0x8242,0x8244,0x8246,0x8248,0x824A,0x824C,0x824E\n\t.word   0x8380,0x8382,0x8384,0x8386,0x8388,0x838A,0x838C,0x838E\n\t.word   0x84C0,0x84C2,0x84C4,0x84C6,0x84C8,0x84CA,0x84CC,0x84CE\n\t.word   0x8600,0x8602,0x8604,0x8606,0x8608,0x860A,0x860C,0x860E\n\t.word   0x8740,0x8742,0x8744,0x8746,0x8748,0x874A,0x874C,0x874E\n\t.word   0x8880,0x8882,0x8884,0x8886,0x8888,0x888A,0x888C,0x888E\n\t.word   0x89C0,0x89C2,0x89C4,0x89C6,0x89C8,0x89CA,0x89CC,0x89CE\n\t.word   0x8B00,0x8B02,0x8B04,0x8B06,0x8B08,0x8B0A,0x8B0C,0x8B0E\n\t.word   0x8C40,0x8C42,0x8C44,0x8C46,0x8C48,0x8C4A,0x8C4C,0x8C4E\n\t.word   0x8D80,0x8D82,0x8D84,0x8D86,0x8D88,0x8D8A,0x8D8C,0x8D8E\n\t.word   0x8EC0,0x8EC2,0x8EC4,0x8EC6,0x8EC8,0x8ECA,0x8ECC,0x8ECE\n\t.word   0x9000,0x9002,0x9004,0x9006,0x9008,0x900A,0x900C,0x900E\n\t.word   0x9140,0x9142,0x9144,0x9146,0x9148,0x914A,0x914C,0x914E\n\t.word   0x9280,0x9282,0x9284,0x9286,0x9288,0x928A,0x928C,0x928E\n\t.word   0x93C0,0x93C2,0x93C4,0x93C6,0x93C8,0x93CA,0x93CC,0x93CE\n\t.word   0x9500,0x9502,0x9504,0x9506,0x9508,0x950A,0x950C,0x950E\n\t.word   0x9640,0x9642,0x9644,0x9646,0x9648,0x964A,0x964C,0x964E\n"
  },
  {
    "path": "libc/f_ibm_sh.s",
    "content": "; ibm_fixed.ms - fixed width IBM font\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t; 898 bytes giving ' '-'0'-'@'-'A'-'Z'-'???'-'a'-'z'-127\n_font_ibm::\n\t.byte\t1+4\t\t; 128 character encoding\n\t.byte\t128-32\t\t; Tiles required\n\n\t.byte\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t\t; All map to space\n\t.byte\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n\t.byte\t0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\t; 0x20\n\t.byte\t16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31\n\t.byte\t32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 0x40\n\t.byte\t48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63\n\t.byte\t64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 ; 0x60\n\t.byte\t80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95\n\t\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x00\n\t.byte\t0x66,0x66,0x44,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x24,0x7E,0x24,0x24,0x7E,0x24,0x00\n\t.byte\t0x14,0x3E,0x55,0x3C,0x1E,0x55,0x3E,0x14\n\t.byte\t0x62,0x66,0x0C,0x18,0x30,0x66,0x46,0x00\n\t.byte\t0x78,0xCC,0x61,0xCE,0xCC,0xCC,0x78,0x00\n\t.byte\t0x18,0x18,0x10,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x04,0x08,0x18,0x18,0x18,0x18,0x08,0x04\n\t.byte\t0x20,0x10,0x18,0x18,0x18,0x18,0x10,0x20\n\t.byte\t0x00,0x54,0x38,0xFE,0x38,0x54,0x00,0x00\n\t.byte\t0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20\n\t.byte\t0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00\n\t.byte\t0x03,0x06,0x0C,0x18,0x30,0x60,0xC0,0x00\n\t.byte\t0x3C,0x66,0x6E,0x76,0x66,0x66,0x3C,0x00\n\t.byte\t0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x00\n\t.byte\t0x3C,0x66,0x0E,0x1C,0x38,0x70,0x7E,0x00\n\t.byte\t0x7E,0x0C,0x18,0x3C,0x06,0x46,0x3C,0x00\n\t.byte\t0x0C,0x1C,0x2C,0x4C,0x7E,0x0C,0x0C,0x00\n\t.byte\t0x7E,0x60,0x7C,0x06,0x06,0x46,0x3C,0x00\n\t.byte\t0x1C,0x20,0x60,0x7C,0x66,0x66,0x3C,0x00\n\t.byte\t0x7E,0x06,0x0E,0x1C,0x18,0x18,0x18,0x00\n\t.byte\t0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00\n\t.byte\t0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00\n\t.byte\t0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00\n\t.byte\t0x00,0x18,0x18,0x00,0x18,0x18,0x10,0x00\n\t.byte\t0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00\n\t.byte\t0x00,0x00,0x3C,0x00,0x00,0x3C,0x00,0x00\n\t.byte\t0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00\n\t.byte\t0x3C,0x46,0x06,0x0C,0x18,0x18,0x00,0x18\n\t.byte\t0x3C,0x66,0x6E,0x6A,0x6E,0x60,0x3C,0x00\n\t.byte\t0x3C,0x66,0x66,0x7E,0x66,0x66,0x66,0x00\n\t.byte\t0x7C,0x66,0x66,0x7C,0x66,0x66,0x7C,0x00\n\t.byte\t0x3C,0x62,0x60,0x60,0x60,0x62,0x3C,0x00\n\t.byte\t0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00\n\t.byte\t0x7E,0x60,0x60,0x7C,0x60,0x60,0x7E,0x00\n\t.byte\t0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x00\n\t.byte\t0x3C,0x62,0x60,0x6E,0x66,0x66,0x3E,0x00\n\t.byte\t0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00\n\t.byte\t0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00\n\t.byte\t0x06,0x06,0x06,0x06,0x06,0x46,0x3C,0x00\n\t.byte\t0x66,0x6C,0x78,0x70,0x78,0x6C,0x66,0x00\n\t.byte\t0x60,0x60,0x60,0x60,0x60,0x60,0x7C,0x00\n\t.byte\t0xFC,0xD6,0xD6,0xD6,0xD6,0xC6,0xC6,0x00\n\t.byte\t0x62,0x72,0x7A,0x5E,0x4E,0x46,0x42,0x00\n\t.byte\t0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00\n\t.byte\t0x7C,0x66,0x66,0x7C,0x60,0x60,0x60,0x00\n\t.byte\t0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x06\n\t.byte\t0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x00\n\t.byte\t0x3C,0x62,0x70,0x3C,0x0E,0x46,0x3C,0x00\n\t.byte\t0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00\n\t.byte\t0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00\n\t.byte\t0x66,0x66,0x66,0x66,0x66,0x64,0x78,0x00\n\t.byte\t0xC6,0xC6,0xC6,0xD6,0xD6,0xD6,0xFC,0x00\n\t.byte\t0x66,0x66,0x66,0x3C,0x66,0x66,0x66,0x00\n\t.byte\t0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00\n\t.byte\t0x7E,0x0E,0x1C,0x38,0x70,0x60,0x7E,0x00\n\t.byte\t0x1E,0x18,0x18,0x18,0x18,0x18,0x1E,0x00\n\t.byte\t0x40,0x60,0x30,0x18,0x0C,0x06,0x02,0x00\n\t.byte\t0x78,0x18,0x18,0x18,0x18,0x18,0x78,0x00\n\t.byte\t0x10,0x38,0x6C,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00\n\t.byte\t0x00,0xC0,0xC0,0x60,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x3C,0x46,0x3E,0x66,0x66,0x3E,0x00\n\t.byte\t0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00\n\t.byte\t0x00,0x3C,0x62,0x60,0x60,0x62,0x3C,0x00\n\t.byte\t0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00\n\t.byte\t0x00,0x3C,0x66,0x7E,0x60,0x62,0x3C,0x00\n\t.byte\t0x1E,0x30,0x7C,0x30,0x30,0x30,0x30,0x00\n\t.byte\t0x00,0x3E,0x66,0x66,0x66,0x3E,0x46,0x3C\n\t.byte\t0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00\n\t.byte\t0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00\n\t.byte\t0x00,0x08,0x18,0x18,0x18,0x18,0x58,0x30\n\t.byte\t0x60,0x64,0x68,0x70,0x78,0x6C,0x66,0x00\n\t.byte\t0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x00\n\t.byte\t0x00,0xFC,0xD6,0xD6,0xD6,0xD6,0xC6,0x00\n\t.byte\t0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x00\n\t.byte\t0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00\n\t.byte\t0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60\n\t.byte\t0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06\n\t.byte\t0x00,0x6C,0x70,0x60,0x60,0x60,0x60,0x00\n\t.byte\t0x00,0x3C,0x72,0x38,0x1C,0x4E,0x3C,0x00\n\t.byte\t0x18,0x3C,0x18,0x18,0x18,0x18,0x0C,0x00\n\t.byte\t0x00,0x66,0x66,0x66,0x66,0x66,0x3E,0x00\n\t.byte\t0x00,0x66,0x66,0x66,0x66,0x64,0x78,0x00\n\t.byte\t0x00,0xC6,0xC6,0xD6,0xD6,0xD6,0xFC,0x00\n\t.byte\t0x00,0x66,0x66,0x3C,0x66,0x66,0x66,0x00\n\t.byte\t0x00,0x66,0x66,0x66,0x26,0x1E,0x46,0x3C\n\t.byte\t0x00,0x7E,0x0E,0x1C,0x38,0x70,0x7E,0x00\n\t.byte\t0x0E,0x18,0x18,0x30,0x18,0x18,0x0E,0x00\n\t.byte\t0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18\n\t.byte\t0x70,0x18,0x18,0x0C,0x18,0x18,0x70,0x00\n\t.byte\t0x00,0x60,0xF2,0x9E,0x0C,0x00,0x00,0x00\n\t.byte\t0x10,0x10,0x28,0x28,0x44,0x44,0x82,0xFE\n"
  },
  {
    "path": "libc/f_italic.s",
    "content": "; font: italic\n\t;; BANKED:\tchecked,imperfect\n\t.area\t_BASE\n_font_italic::\n\t.db\t1+4\t; 128 char encoding, compressed\n\t.db\t93\t; Number of tiles\n\n; Encoding table\n\n\t.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07\n\t.db 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F\n\t.db 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17\n\t.db 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F\n\t.db 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27\n\t.db 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F\n\t.db 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37\n\t.db 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x00\n\t.db 0x00,0x3F,0x40,0x41,0x42,0x43,0x44,0x45\n\t.db 0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D\n\t.db 0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55\n\t.db 0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x00\n; Tile data\n; Default character (space)\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\n; Character: ! (21)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00100000\t;   o     \n\n; Character: \" (22)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: # (23)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\n; Character: $ (24)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00001010\t;     o o \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00001000\t;     o   \n\n; Character: % (25)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100100\t;  oo  o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100110\t;   o  oo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00000000\t;         \n\n; Character: & (26)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00101010\t;   o o o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00111010\t;   ooo o \n\t.db\t0b00000000\t;         \n\n; Character: ' (27)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ( (28)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000000\t;         \n\n; Character: ) (29)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00000000\t;         \n\n; Character: * (2A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\n; Character: + (2B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000000\t;         \n\n; Character: , (2C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\n; Character: - (2D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: . (2E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: / (2F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00000000\t;         \n\n; Character: 0 (30)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100110\t;   o  oo \n\t.db\t0b01001010\t;  o  o o \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b10100100\t; o o  o  \n\t.db\t0b11001000\t; oo  o   \n\t.db\t0b01110000\t;  ooo    \n\n; Character: 1 (31)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b11111000\t; ooooo   \n\n; Character: 2 (32)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b10000000\t; o       \n\t.db\t0b11111100\t; oooooo  \n\n; Character: 3 (33)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00000010\t;       o \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000010\t;       o \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: 4 (34)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\n; Character: 5 (35)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: 6 (36)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: 7 (37)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\n; Character: 8 (38)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: 9 (39)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b11110000\t; oooo    \n\n; Character: : (3A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\n; Character: ; (3B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\n; Character: < (3C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000000\t;         \n\n; Character: = (3D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: > (3E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\n; Character: ? (3F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00000010\t;       o \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00110000\t;   oo    \n\n; Character: @ (40)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01001010\t;  o  o o \n\t.db\t0b01010110\t;  o o oo \n\t.db\t0b01011110\t;  o oooo \n\t.db\t0b01000000\t;  o      \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: A (41)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001000\t; o   o   \n\n; Character: B (42)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b11111000\t; ooooo   \n\n; Character: C (43)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10000000\t; o       \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: D (44)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b11110000\t; oooo    \n\n; Character: E (45)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10000000\t; o       \n\t.db\t0b11111000\t; ooooo   \n\n; Character: F (46)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10000000\t; o       \n\t.db\t0b10000000\t; o       \n\n; Character: G (47)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10001110\t; o   ooo \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: H (48)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001000\t; o   o   \n\n; Character: I (49)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b11111000\t; ooooo   \n\n; Character: J (4A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000100\t;      o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b01110000\t;  ooo    \n\n; Character: K (4B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10000100\t; o    o  \n\n; Character: L (4C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10000000\t; o       \n\t.db\t0b11111100\t; oooooo  \n\n; Character: M (4D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00101010\t;   o o o \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001000\t; o   o   \n\n; Character: N (4E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00110010\t;   oo  o \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b10011000\t; o  oo   \n\t.db\t0b10001000\t; o   o   \n\n; Character: O (4F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b01110000\t;  ooo    \n\n; Character: P (50)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01000000\t;  o      \n\t.db\t0b10000000\t; o       \n\t.db\t0b10000000\t; o       \n\n; Character: Q (51)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10010100\t; o  o o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b01110100\t;  ooo o  \n\n; Character: R (52)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b10000100\t; o    o  \n\n; Character: S (53)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b10000100\t; o    o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: T (54)\n\t.db\t0b00000000\t;         \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\n; Character: U (55)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b01110000\t;  ooo    \n\n; Character: V (56)\n\t.db\t0b00000000\t;         \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10010000\t; o  o    \n\t.db\t0b11100000\t; ooo     \n\n; Character: W (57)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b10101000\t; o o o   \n\t.db\t0b10101000\t; o o o   \n\t.db\t0b01010000\t;  o o    \n\n; Character: X (58)\n\t.db\t0b00000000\t;         \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b10000100\t; o    o  \n\n; Character: Y (59)\n\t.db\t0b00000000\t;         \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\n; Character: Z (5A)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b11111100\t; oooooo  \n\n; Character: [ (5B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00000000\t;         \n\n; Character: \\ (5C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01000000\t;  o      \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000000\t;         \n\n; Character: ] (5D)\n\t.db\t0b00000000\t;         \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00000000\t;         \n\n; Character: ^ (5E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\n; Character: a (61)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00000010\t;       o \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00111100\t;   oooo  \n\n; Character: b (62)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: c (63)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\t.db\t0b00111100\t;   oooo  \n\n; Character: d (64)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b00111000\t;   ooo   \n\n; Character: e (65)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01000000\t;  o      \n\t.db\t0b00111000\t;   ooo   \n\n; Character: f (66)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\n; Character: g (67)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000100\t;      o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: h (68)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\n; Character: i (69)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01110000\t;  ooo    \n\n; Character: j (6A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00000100\t;      o  \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b00110000\t;   oo    \n\n; Character: k (6B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\n; Character: l (6C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00011000\t;    oo   \n\n; Character: m (6D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b00101010\t;   o o o \n\t.db\t0b00101010\t;   o o o \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\n; Character: n (6E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\n; Character: o (6F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00111000\t;   ooo   \n\n; Character: p (70)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00010010\t;    o  o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000000\t;  o      \n\t.db\t0b01000000\t;  o      \n\n; Character: q (71)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001100\t;     oo  \n\n; Character: r (72)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00100000\t;   o     \n\n; Character: s (73)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000100\t;      o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: t (74)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\n; Character: u (75)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00111000\t;   ooo   \n\n; Character: v (76)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01001000\t;  o  o   \n\t.db\t0b00110000\t;   oo    \n\n; Character: w (77)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00101010\t;   o o o \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b00101000\t;   o o   \n\n; Character: x (78)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01000100\t;  o   o  \n\n; Character: y (79)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00100010\t;   o   o \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00000100\t;      o  \n\t.db\t0b01111000\t;  oooo   \n\n; Character: z (7A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000100\t;      o  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01111100\t;  ooooo  \n\n; Character: { (7B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00000000\t;         \n\n; Character: | (7C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000000\t;         \n\n; Character: } (7D)\n\t.db\t0b00000000\t;         \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00000000\t;         \n\n; Character: ~ (7E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010100\t;    o o  \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n"
  },
  {
    "path": "libc/f_min.s",
    "content": "; font_min.s\n\t\n;\tText font\n;\tMichael Hope, 1998\n;\tmichaelh@earthling.net\n;\tDistrubuted under the Artistic License - see www.opensource.org\n;\n\t;; BANKED:\tchecked, imperfect\n\t.module \tfont_min\n\t.area\t_BASE\n_font_min::\n\t.byte\t1+4\t\t; 128 character encoding\n\t.byte\t37\t\t; Tiles required\n\n\t.byte\t00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00\t\t; All map to space\n\t.byte\t00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00\t\t; All map to space\n\t.byte\t00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00\t\t; All map to space\n\t.byte\t01,02,03,04,05,06,07,08,09,10,00,00,00,00,00,00\n\t.byte\t00,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25\n\t.byte\t26,27,28,29,30,21,32,33,34,35,36,00,00,00,00,00\n\t.byte\t00,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25\n\t.byte\t26,27,28,29,30,21,32,33,34,35,36,00,00,00,00,00\n\n\t.db\t0\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: 0\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000110 \n        .db    0b01001010 \n        .db    0b01010010 \n        .db    0b01100010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 1\n        .db    0b00000000 \n        .db    0b00011000 \n        .db    0b00101000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00000000 \n; Character: 2\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00000010 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: 3\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00001100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 4\n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00011000 \n        .db    0b00101000 \n        .db    0b01001000 \n        .db    0b01111110 \n        .db    0b00001000 \n        .db    0b00000000 \n; Character: 5\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 6\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 7\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b00000010 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: 8\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 9\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111110 \n        .db    0b00000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: A\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111110 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: B\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b00000000 \n; Character: C\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: D\n        .db    0b00000000 \n        .db    0b01111000 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000100 \n        .db    0b01111000 \n        .db    0b00000000 \n; Character: E\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: F\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b00000000 \n; Character: G\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000000 \n        .db    0b01001110 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: H\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111110 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: I\n        .db    0b00000000 \n        .db    0b00111110 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00000000 \n; Character: J\n        .db    0b00000000 \n        .db    0b00000010 \n        .db    0b00000010 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: K\n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01001000 \n        .db    0b01110000 \n        .db    0b01001000 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: L\n        .db    0b00000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: M\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01100110 \n        .db    0b01011010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: N\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01100010 \n        .db    0b01010010 \n        .db    0b01001010 \n        .db    0b01000110 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: O\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: P\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b00000000 \n; Character: Q\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01010010 \n        .db    0b01001010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: R\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: S\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b00111100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: T\n        .db    0b00000000 \n        .db    0b11111110 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: U\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: V\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00100100 \n        .db    0b00011000 \n        .db    0b00000000 \n; Character: W\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01011010 \n        .db    0b00100100 \n        .db    0b00000000 \n; Character: X\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b00100100 \n        .db    0b00011000 \n        .db    0b00011000 \n        .db    0b00100100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: Y\n        .db    0b00000000 \n        .db    0b10000010 \n        .db    0b01000100 \n        .db    0b00101000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: Z\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00100000 \n        .db    0b01111110 \n        .db    0b00000000 \n"
  },
  {
    "path": "libc/f_spect.s",
    "content": "; font_spect.ms\n;\tText font\n;\tMichael Hope, 1998\n;\tmichaelh@earthling.net\n;\tDistrubuted under the Artistic License - see www.opensource.org\n;\n\t;; BANKED:\tchecked, imperfect\n\t.module \tfont_spect\n\t.area\t_BASE\n_font_spect::\n\t.byte\t1+4\t\t; 128 character encoding\n\t.byte\t128-32\t\t; Tiles required\n\n\t.byte\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t\t; All map to space\n\t.byte\t0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n\t.byte\t0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\t; 0x20\n\t.byte\t16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31\n\t.byte\t32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 ; 0x40\n\t.byte\t48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63\n\t.byte\t64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 ; 0x60\n\t.byte\t80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95\n\n\t.db\t0\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: !\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: \"\n        .db    0b00000000 \n        .db    0b00100100 \n        .db    0b00100100 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: #\n        .db    0b00000000 \n        .db    0b00100100 \n        .db    0b01111110 \n        .db    0b00100100 \n        .db    0b00100100 \n        .db    0b01111110 \n        .db    0b00100100 \n        .db    0b00000000 \n; Character: $\n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00101000 \n        .db    0b00111110 \n        .db    0b00001010 \n        .db    0b00111110 \n        .db    0b00001000 \n; Character: %\n        .db    0b00000000 \n        .db    0b01100010 \n        .db    0b01100100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00100110 \n        .db    0b01000110 \n        .db    0b00000000 \n; Character: &\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00101000 \n        .db    0b00010000 \n        .db    0b00101010 \n        .db    0b01000100 \n        .db    0b00111010 \n        .db    0b00000000 \n; Character: '\n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: (\n        .db    0b00000000 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00000100 \n        .db    0b00000000 \n; Character: )\n        .db    0b00000000 \n        .db    0b00100000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00100000 \n        .db    0b00000000 \n; Character: *\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010100 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00001000 \n        .db    0b00010100 \n        .db    0b00000000 \n; Character: +\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00000000 \n; Character: ,\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00010000 \n; Character: -\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111110 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: .\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00011000 \n        .db    0b00011000 \n        .db    0b00000000 \n; Character: /\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000010 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00100000 \n        .db    0b00000000 \n; Character: 0\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000110 \n        .db    0b01001010 \n        .db    0b01010010 \n        .db    0b01100010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 1\n        .db    0b00000000 \n        .db    0b00011000 \n        .db    0b00101000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00000000 \n; Character: 2\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00000010 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: 3\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00001100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 4\n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00011000 \n        .db    0b00101000 \n        .db    0b01001000 \n        .db    0b01111110 \n        .db    0b00001000 \n        .db    0b00000000 \n; Character: 5\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 6\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 7\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b00000010 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: 8\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: 9\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111110 \n        .db    0b00000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: :\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: ;\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00100000 \n; Character: <\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00001000 \n        .db    0b00000100 \n        .db    0b00000000 \n; Character: =\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111110 \n        .db    0b00000000 \n        .db    0b00111110 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: >\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00001000 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: ?\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00000000 \n; Character: @\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01001010 \n        .db    0b01010110 \n        .db    0b01011110 \n        .db    0b01000000 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: A\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111110 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: B\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b00000000 \n; Character: C\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: D\n        .db    0b00000000 \n        .db    0b01111000 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000100 \n        .db    0b01111000 \n        .db    0b00000000 \n; Character: E\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: F\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b01000000 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b00000000 \n; Character: G\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000000 \n        .db    0b01001110 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: H\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111110 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: I\n        .db    0b00000000 \n        .db    0b00111110 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00111110 \n        .db    0b00000000 \n; Character: J\n        .db    0b00000000 \n        .db    0b00000010 \n        .db    0b00000010 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: K\n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01001000 \n        .db    0b01110000 \n        .db    0b01001000 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: L\n        .db    0b00000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: M\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01100110 \n        .db    0b01011010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: N\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01100010 \n        .db    0b01010010 \n        .db    0b01001010 \n        .db    0b01000110 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: O\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: P\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b00000000 \n; Character: Q\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01010010 \n        .db    0b01001010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: R\n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01111100 \n        .db    0b01000100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: S\n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000000 \n        .db    0b00111100 \n        .db    0b00000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: T\n        .db    0b00000000 \n        .db    0b11111110 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: U\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: V\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b00100100 \n        .db    0b00011000 \n        .db    0b00000000 \n; Character: W\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01000010 \n        .db    0b01011010 \n        .db    0b00100100 \n        .db    0b00000000 \n; Character: X\n        .db    0b00000000 \n        .db    0b01000010 \n        .db    0b00100100 \n        .db    0b00011000 \n        .db    0b00011000 \n        .db    0b00100100 \n        .db    0b01000010 \n        .db    0b00000000 \n; Character: Y\n        .db    0b00000000 \n        .db    0b10000010 \n        .db    0b01000100 \n        .db    0b00101000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: Z\n        .db    0b00000000 \n        .db    0b01111110 \n        .db    0b00000100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00100000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: [\n        .db    0b00000000 \n        .db    0b00001110 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001110 \n        .db    0b00000000 \n; Character: \\\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000000 \n        .db    0b00100000 \n        .db    0b00010000 \n        .db    0b00001000 \n        .db    0b00000100 \n        .db    0b00000000 \n; Character: ]\n        .db    0b00000000 \n        .db    0b01110000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b01110000 \n        .db    0b00000000 \n; Character: ^\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00111000 \n        .db    0b01010100 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: _\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b11111111 \n; Character: Pound\n        .db    0b00000000 \n        .db    0b00011100 \n        .db    0b00100010 \n        .db    0b01111000 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b01111110 \n        .db    0b00000000 \n; Character: a\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111000 \n        .db    0b00000100 \n        .db    0b00111100 \n        .db    0b01000100 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: b\n        .db    0b00000000 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00111100 \n        .db    0b00100010 \n        .db    0b00100010 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: c\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00011100 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00011100 \n        .db    0b00000000 \n; Character: d\n        .db    0b00000000 \n        .db    0b00000100 \n        .db    0b00000100 \n        .db    0b00111100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: e\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111000 \n        .db    0b01000100 \n        .db    0b01111000 \n        .db    0b01000000 \n        .db    0b00111100 \n        .db    0b00000000 \n; Character: f\n        .db    0b00000000 \n        .db    0b00001100 \n        .db    0b00010000 \n        .db    0b00011000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: g\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111100 \n        .db    0b00000100 \n        .db    0b00111000 \n; Character: h\n        .db    0b00000000 \n        .db    0b01000000 \n        .db    0b01000000 \n        .db    0b01111000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00000000 \n; Character: i\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00000000 \n        .db    0b00110000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00111000 \n        .db    0b00000000 \n; Character: j\n        .db    0b00000000 \n        .db    0b00000100 \n        .db    0b00000000 \n        .db    0b00000100 \n        .db    0b00000100 \n        .db    0b00000100 \n        .db    0b00100100 \n        .db    0b00011000 \n; Character: k\n        .db    0b00000000 \n        .db    0b00100000 \n        .db    0b00101000 \n        .db    0b00110000 \n        .db    0b00110000 \n        .db    0b00101000 \n        .db    0b00100100 \n        .db    0b00000000 \n; Character: l\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00001100 \n        .db    0b00000000 \n; Character: m\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01101000 \n        .db    0b01010100 \n        .db    0b01010100 \n        .db    0b01010100 \n        .db    0b01010100 \n        .db    0b00000000 \n; Character: n\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01111000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00000000 \n; Character: o\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111000 \n        .db    0b00000000 \n; Character: p\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01111000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01111000 \n        .db    0b01000000 \n        .db    0b01000000 \n; Character: q\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111100 \n        .db    0b00000100 \n        .db    0b00000110 \n; Character: r\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00011100 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00100000 \n        .db    0b00000000 \n; Character: s\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00111000 \n        .db    0b01000000 \n        .db    0b00111000 \n        .db    0b00000100 \n        .db    0b01111000 \n        .db    0b00000000 \n; Character: t\n        .db    0b00000000 \n        .db    0b00010000 \n        .db    0b00111000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b00001100 \n        .db    0b00000000 \n; Character: u\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111000 \n        .db    0b00000000 \n; Character: v\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00101000 \n        .db    0b00101000 \n        .db    0b00010000 \n        .db    0b00000000 \n; Character: w\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01010100 \n        .db    0b01010100 \n        .db    0b01010100 \n        .db    0b00101000 \n        .db    0b00000000 \n; Character: x\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b00101000 \n        .db    0b00010000 \n        .db    0b00101000 \n        .db    0b01000100 \n        .db    0b00000000 \n; Character: y\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b01000100 \n        .db    0b00111100 \n        .db    0b00000100 \n        .db    0b00111000 \n; Character: z\n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b01111100 \n        .db    0b00001000 \n        .db    0b00010000 \n        .db    0b00100000 \n        .db    0b01111100 \n        .db    0b00000000 \n; Character: {\n        .db    0b00000000 \n        .db    0b00001110 \n        .db    0b00001000 \n        .db    0b00110000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001110 \n        .db    0b00000000 \n; Character: |\n        .db    0b00000000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00001000 \n        .db    0b00000000 \n; Character: }\n        .db    0b00000000 \n        .db    0b01110000 \n        .db    0b00010000 \n        .db    0b00001100 \n        .db    0b00010000 \n        .db    0b00010000 \n        .db    0b01110000 \n        .db    0b00000000 \n; Character: ~\n        .db    0b00000000 \n        .db    0b00010100 \n        .db    0b00101000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n        .db    0b00000000 \n; Character: Copyright\n        .db    0b00111100 \n        .db    0b01000010 \n        .db    0b10011001 \n        .db    0b10100001 \n        .db    0b10100001 \n        .db    0b10011001 \n        .db    0b01000010 \n        .db    0b00111100 \n"
  },
  {
    "path": "libc/font.s",
    "content": "; font.ms\n;\n;\tMichael Hope, 1999\n;\tmichaelh@earthling.net\n;\tDistrubuted under the Artistic License - see www.opensource.org\n;\n\t.include        \"global.s\"\n\n\t.globl\t.cr_curs\n\t.globl\t.adv_curs\n\t.globl\t.cury, .curx\n\t.globl\t.display_off\n\n\t; Structure offsets\n\tsfont_handle_sizeof\t=\t3\n\tsfont_handle_font\t=\t1\n\tsfont_handle_first_tile\t=\t0\n\n\t; Encoding types - lower 2 bits of font\n\tFONT_256ENCODING\t=\t0\n\tFONT_128ENCODING\t=\t1\n\tFONT_NOENCODING\t\t=\t2\n\n\t; Other bits\n\tFONT_BCOMPRESSED\t=\t2\n\t\n\t.CR     \t\t= \t0x0A          ; Unix\n\t.SPACE\t\t\t=\t0x00\n\n\t; Maximum number of fonts\n\t.MAX_FONTS\t\t= \t6\n\n\t.area\t_HEADER (ABS)\n\n\t.org\t.MODE_TABLE+4*.T_MODE\n\tJP\t.tmode\n\n\t.module font.ms\n\n\t; Globals from drawing.s\n\t; FIXME: Hmmm... check the linkage of these\n\t.globl\t.fg_colour\n\t.globl\t.bg_colour\n\n\t.area\t_BSS\n\t; The current font\nfont_current::\n\t.ds\tsfont_handle_sizeof\n\t; Cached copy of the first free tile\nfont_first_free_tile::\n\t.ds\t1\n\t; Table containing descriptors for all of the fonts\nfont_table::\n\t.ds\tsfont_handle_sizeof*.MAX_FONTS\n\t\n\t.area   _BASE\n\t; Copy uncompressed 16 byte tiles from (BC) to (HL), length = DE*2\n\t; Note: HL must be aligned on a UWORD boundry\nfont_copy_uncompressed::\n\tld\ta,d\n\tor\te\n\tret\tz\n\n\tld\ta,h\n\tcp\t#0x98\n\tjr\tc,4$\n\tsub\t#0x98-0x88\n\tld\th,a\n4$:\n\txor\ta\n\tcp\te\t\t; Special for when e=0 you will get another loop\n\tjr\tnz,1$\n\tdec\td\n1$:\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\tld\ta,(bc)\n\tld\t(hl+),a\n\tinc\tbc\n\t\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\tld\ta,(bc)\n\tld\t(hl),a\n\tinc\tbc\n\n\tinc\tl\n\tjr\tnz,2$\n\tinc\th\n\tld\ta,h\t\t; Special wrap-around\n\tcp\t#0x98\n\tjr\tnz,2$\n\tld\th,#0x88\n2$:\n\tdec\te\n\tjr\tnz,1$\n\tdec\td\n\tbit\t7,d\t\t; -1?\n\tjr\tz,1$\n\tret\n\n\t; Copy a set of compressed (8 bytes/cell) tiles to VRAM\n\t; Sets the foreground and background colours based on the current\n\t; font colours\n\t; Entry:\n\t;\tFrom (BC) to (HL), length (DE) where DE = #cells * 8\n\t;\tUses the current fg_colour and bg_colour fields\nfont_copy_compressed::\n\tld\ta,d\n\tor\te\n\tret\tz\t\t; Do nothing\n\n\tld\ta,h\n\tcp\t#0x98\t\t; Take care of the 97FF -> 8800 wrap around\n\tjr\tc,font_copy_compressed_loop\n\tsub\t#0x98-0x88\n\tld\th,a\nfont_copy_compressed_loop:\n\tpush\tde\n\tld\ta,(bc)\n\tld\te,a\n\tinc\tbc\n\tpush\tbc\n\n\tld\tbc,#0\n\t\t\t\t; Do the background colour first\n\tld\ta,(.bg_colour)\n\tbit\t0,a\n\tjr\tz,font_copy_compressed_bg_grey1\n\tld\tb,#0xFF\nfont_copy_compressed_bg_grey1:\n\tbit\t1,a\n\tjr\tz,font_copy_compressed_bg_grey2\n\tld\tc,#0xFF\nfont_copy_compressed_bg_grey2:\n\t; BC contains the background colour\n\t; Compute what xoring we need to do to get the correct fg colour\n\tld\td,a\n\tld\ta,(.fg_colour)\n\txor\td\n\tld\td,a\n\n\tbit\t0,d\n\tjr\tz,font_copy_compressed_grey1\n\tld\ta,e\n\txor\tb\n\tld\tb,a\nfont_copy_compressed_grey1:\n\tbit\t1,d\n\tjr\tz,font_copy_compressed_grey2\n\tld\ta,e\n\txor\tc\n\tld\tc,a\nfont_copy_compressed_grey2:\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\tld\t(hl),b\n\tinc\thl\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\tld\t(hl),c\n\tinc\thl\n\tld\ta,h\t\t; Take care of the 97FFF -> 8800 wrap around\n\tcp\t#0x98\n\tjr\tnz,1$\n\tld\th,#0x88\n1$:\n\tpop\tbc\n\tpop\tde\n\tdec\tde\n\tld\ta,d\n\tor\te\n\tjr\tnz,font_copy_compressed_loop\n\tret\n\t\n; Load the font HL\nfont_load::\n\tcall\t.display_off\n\tpush\thl\n\n\t; Find the first free font entry\n\tld\thl,#font_table+sfont_handle_font\n\tld\tb,#.MAX_FONTS\nfont_load_find_slot:\n\tld\ta,(hl)\t\t; Check to see if this entry is free\n\tinc\thl\t\t; Free is 0000 for the font pointer\n\tor\t(hl)\n\tcp\t#0\n\tjr\tz,font_load_found\n\n\tinc\thl\n\tinc\thl\n\tdec\tb\n\tjr\tnz,font_load_find_slot\n\tpop\thl\n\tld\thl,#0\n\tjr\tfont_load_exit\t; Couldn't find a free space\nfont_load_found:\n\t\t\t\t; HL points to the end of the free font table entry\n\tpop\tde\n\tld\t(hl),d\t\t; Copy across the font struct pointer\n\tdec\thl\n\tld\t(hl),e\n\n\tld\ta,(font_first_free_tile)\n\tdec\thl\n\tld\t(hl),a\t\t\n\n\tpush\thl\n\tcall\tfont_set\t; Set this new font to be the default\n\t\n\t; Only copy the tiles in if were in text mode\n\tld\ta,(.mode)\n\tand\t#.T_MODE\n\t\n\tcall\tnz,font_copy_current\n\n\t\t\t\t; Increase the 'first free tile' counter\n\tld\thl,#font_current+sfont_handle_font\n\tld\ta,(hl+)\n\tld\th,(hl)\n\tld\tl,a\n\n\tinc\thl\t\t; Number of tiles used\n\tld\ta,(font_first_free_tile)\n\tadd\ta,(hl)\n\tld\t(font_first_free_tile),a\n\n\tpop\thl\t\t; Return font setup in HL\nfont_load_exit:\n\t;; Turn the screen on\n\tLDH     A,(.LCDC)\n\tOR      #0b10000001     ; LCD           = On\n\t\t\t\t; BG            = On\n\tAND     #0b11100111     ; BG Chr        = 0x8800\n\t\t\t\t; BG Bank       = 0x9800\n\tLDH     (.LCDC),A\n\n\tRET\n\n\t; Copy the tiles from the current font into VRAM\nfont_copy_current::\t\n\t\t\t\t; Find the current font data\n\tld\thl,#font_current+sfont_handle_font\n\tld\ta,(hl+)\n\tld\th,(hl)\n\tld\tl,a\n\n\tinc\thl\t\t; Points to the 'tiles required' entry\n\tld\te,(hl)\n\tld\td,#0\n\trl\te\t\t; Multiple DE by 8\n\trl\td\n\trl\te\n\trl\td\n\trl\te\n\trl\td\t\t; DE has the length of the tile data\n\tdec\thl\n\n\tld\ta,(hl)\t\t; Get the flags\n\tpush\taf\t\t\n\tand\t#3\t\t\t; Only lower 2 bits set encoding table size\n\n\tld\tbc,#128\n\tcp\t#FONT_128ENCODING\t; 0 for 256 char encoding table, 1 for 128 char\n\tjr\tz,font_copy_current_copy\n\n\tld\tbc,#0\n\tcp\t#FONT_NOENCODING\n\tjr\tz,font_copy_current_copy\n\n\tld\tbc,#256\t\t\t; Must be 256 element encoding\nfont_copy_current_copy:\n\tinc\thl\n\tinc\thl\t\t; Points to the start of the encoding table\n\tadd\thl,bc\t\t\n\tld\tc,l\n\tld\tb,h\t\t; BC points to the start of the tile data\t\t\n\n\t; Find the offset in VRAM for this font\n\tld\ta,(font_current+sfont_handle_first_tile)\t; First tile used for this font\n\tld\tl,a\t\t\n\tld\th,#0\n\tadd\thl,hl\n\tadd\thl,hl\n\tadd\thl,hl\n\tadd\thl,hl\n\n\tld\ta,#0x90\t\t; Tile 0 is at 9000h\n\tadd\ta,h\n\tld\th,a\n\t\t\t\t; Is this font compressed?\n\tpop\taf\t\t; Recover flags\n\tbit\tFONT_BCOMPRESSED,a\n\t\t\t\t; Do the jump in a mildly different way\n\tjp\tz,font_copy_uncompressed\n\tjp\tfont_copy_compressed\n\n\t; Set the current font to HL\nfont_set::\n\tld\ta,(hl+)\n\tld\t(font_current),a\n\tld\ta,(hl+)\n\tld\t(font_current+1),a\n\tld\ta,(hl+)\n\tld\t(font_current+2),a\n\tret\n\t\n\t;; Print a character with interpretation\n.put_char::\n\t; See if it's a special char\n\tcp\t#.CR\n\tjr\tnz,1$\n\n\t; Now see if were checking special chars\n\tpush\taf\n\tld\ta,(.mode)\n\tand\t#.M_NO_INTERP\n\tjr\tnz,2$\n\tcall\t.cr_curs\n\tpop\taf\n\tret\n2$:\n\tpop\taf\n1$:\n\tCALL    .set_char\n\tCALL    .adv_curs\n\tRET\n\n\t;; Print a character without interpretation\n.out_char::\n\tCALL\t.set_char\n\tCALL\t.adv_curs\n\tRET\n\n\t;; Delete a character\n.del_char::\n\tCALL\t.rew_curs\n\tLD\tA,#.SPACE\n\tCALL\t.set_char\n\tRET\n\n\t;; Print the character in A\n.set_char:\n\tpush\taf\n\tld\ta,(font_current+2)\n\t; Must be non-zero if the font system is setup (cant have a font in page zero)\n\tor\ta\n\tjr\tnz,3$\n\n\t; Font system is not yet setup - init it and copy in the ibm font\n\t; Kind of a compatibility mode\n\tcall\t_font_init\n\t\n\t; Need all of the tiles\n\txor\ta\n\tld\t(font_first_free_tile),a\n\n\t.globl\t_font_load_ibm_fixed\n\tcall\tbanked_call\n\t.dw\t_font_load_ibm_fixed\n\t.if __RGBDS__\n\t.dw\tBANK(_font_load_ibm_fixed);\n\t.else\n\t.dw\t0\n\t.endif\n3$:\n\tpop\taf\n\tpush\tbc\n\tpush\tde\n\tpush\thl\n\t\t\t\t; Compute which tile maps to this character\n\tld\te,a\n\tld\thl,#font_current+sfont_handle_font\n\tld\ta,(hl+)\n\tld\th,(hl)\n\tld\tl,a\n\tld\ta,(hl+)\n\tand\t#3\n\tcp\t#FONT_NOENCODING\n\tjr\tz,set_char_no_encoding\n\tinc\thl\n\t\t\t\t; Now at the base of the encoding table\n\t\t\t\t; E is set above\n\tld\td,#0\n\tadd\thl,de\n\tld\te,(hl)\t\t; That's the tile!\nset_char_no_encoding:\n\tld\ta,(font_current+0)\n\tadd\ta,e\n\tld\te,a\n\n\tLD      A,(.cury)       ; Y coordinate\n\tLD      L,A\n\tLD      H,#0x00\n\tADD     HL,HL\n\tADD     HL,HL\n\tADD     HL,HL\n\tADD     HL,HL\n\tADD     HL,HL\n\tLD      A,(.curx)       ; X coordinate\n\tLD      C,A\n\tLD      B,#0x00\n\tADD     HL,BC\n\tLD      BC,#0x9800\n\tADD     HL,BC\n\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\n\tLD      (HL),E\n\tPOP     HL\n\tPOP     DE\n\tPOP     BC\n\tRET\n\n\t.area\t_CODE\n_putchar::\t\t\t; Banked\n\tPUSH\tBC\n\tLDA     HL,.BANKOV+2(SP); Skip return address\n\tLD      A,(HL)          ; A = c\n\tCALL    .put_char\n\tPOP\tBC\n\tRET\n\n_setchar::\t\t\t; Banked\n\tPUSH\tBC\n\tLDA     HL,.BANKOV+2(SP); Skip return address\n\tLD      A,(HL)          ; A = c\n\tCALL    .set_char\n\tPOP\tBC\n\tRET\n\n\t.area\t_BASE\n_font_load::\n\tpush\tbc\n\tLDA     HL,4(SP)        ; Skip return address and bc\n\tLD      A,(HL)          ; A = c\n\tinc\thl\n\tld\th,(hl)\n\tld\tl,a\n\tcall    font_load\n\tpush\thl\n\tpop\tde\t\t; Return in DE\n\tpop\tbc\n\tRET\n\n_font_set::\n\tpush\tbc\n\tLDA     HL,4(SP)        ; Skip return address\n\tLD      A,(HL)          ; A = c\n\tinc\thl\n\tld\th,(hl)\n\tld\tl,a\n\tcall\tfont_set\n\tpop\tbc\n\tld\tde,#0\t\t; Always good...\n\tRET\n\n_font_init::\n\tpush\tbc\n\t.globl\t.tmode\n\n\tcall\t.tmode\n\n\tld\ta,#1\t\t; We use the first tile as a space _always_\n\tld\t(font_first_free_tile),a\n\n\t; Clear the font table\n\txor\ta\n\tld\thl,#font_table\n\tld\tb,#sfont_handle_sizeof*.MAX_FONTS\n1$:\n\tld\t(hl+),a\n\tdec\tb\n\tjr\tnz,1$\n\tld\ta,#3\n\tld\t(.fg_colour),a\n\tld\ta,#0\n\tld\t(.bg_colour),a\n\n\tcall\t.cls\n\tpop\tbc\n\tret\n\t\n_cls::\n.cls::\t\n\tPUSH\tDE\n\tPUSH\tHL\n\tLD\tHL,#0x9800\n\tLD\tE,#0x20\t\t; E = height\n1$:\n\tLD\tD,#0x20\t\t; D = width\n2$:\n        ldh     a,(.STAT)\n        bit     1,a\n        jr      nz,#.-4\n\n\tLD\t(HL),#.SPACE\t; Always clear\n\tINC\tHL\n\tDEC\tD\n\tJR\tNZ,2$\n\tDEC\tE\n\tJR\tNZ,1$\n\tPOP\tHL\n\tPOP\tDE\n\tRET\n\n\t.area\t_CODE\n\t; Support routines\n_gotoxy::\t\t\t; Banked\n\tlda\thl,.BANKOV(sp)\n\tld\ta,(hl+)\n\tld\t(.curx),a\n\tld\ta,(hl)\n\tld\t(.cury),a\n\tret\n\n_posx::\n\tLD\tA,(.mode)\t; Banked\n\tAND\t#.T_MODE\n\tJR\tNZ,1$\n\tPUSH\tBC\n\tCALL\t.tmode\n\tPOP\tBC\n1$:\n\tLD\tA,(.curx)\n\tLD\tE,A\n\tRET\n\n_posy::\t\t\t\t; Banked\n\tLD\tA,(.mode)\n\tAND\t#.T_MODE\n\tJR\tNZ,1$\n\tPUSH\tBC\n\tCALL\t.tmode\n\tPOP\tBC\n1$:\n\tLD\tA,(.cury)\n\tLD\tE,A\n\tRET\n\n\t.area\t_BASE\n\t;; Rewind the cursor\n.rew_curs:\n\tPUSH\tHL\n\tLD\tHL,#.curx\t; X coordinate\n\tXOR\tA\n\tCP\t(HL)\n\tJR\tZ,1$\n\tDEC\t(HL)\n\tJR\t99$\n1$:\n\tLD\t(HL),#.MAXCURSPOSX\n\tLD\tHL,#.cury\t; Y coordinate\n\tXOR\tA\n\tCP\t(HL)\n\tJR\tZ,99$\n\tDEC\t(HL)\n99$:\n\tPOP\tHL\n\tRET\n\n.cr_curs::\n\tPUSH\tHL\n\tXOR\tA\n\tLD\t(.curx),A\n\tLD\tHL,#.cury\t; Y coordinate\n\tLD\tA,#.MAXCURSPOSY\n\tCP\t(HL)\n\tJR\tZ,2$\n\tINC\t(HL)\n\tJR\t99$\n2$:\n\tCALL\t.scroll\n99$:\n\tPOP\tHL\n\tRET\n\n.adv_curs::\n\tPUSH\tHL\n\tLD\tHL,#.curx\t; X coordinate\n\tLD\tA,#.MAXCURSPOSX\n\tCP\t(HL)\n\tJR\tZ,1$\n\tINC\t(HL)\n\tJR\t99$\n1$:\n\tLD\t(HL),#0x00\n\tLD\tHL,#.cury\t; Y coordinate\n\tLD\tA,#.MAXCURSPOSY\n\tCP\t(HL)\n\tJR\tZ,2$\n\tINC\t(HL)\n\tJR\t99$\n2$:\n\t;; See if scrolling is disabled\n\tLD\tA,(.mode)\n\tAND\t#.M_NO_SCROLL\n\tJR\tZ,3$\n\t;; Nope - reset the cursor to (0,0)\n\tXOR\tA\n\tLD\t(.cury),A\n\tLD\t(.curx),A\n\tJR\t99$\n3$:\t\n\tCALL\t.scroll\n99$:\n\tPOP\tHL\n\tRET\n\n\t;; Scroll the whole screen\n.scroll:\n\tPUSH\tBC\n\tPUSH\tDE\n\tPUSH\tHL\n\tLD\tHL,#0x9800\n\tLD\tBC,#0x9800+0x20 ; BC = next line\n\tLD\tE,#0x20-0x01\t; E = height - 1\n1$:\n\tLD\tD,#0x20\t\t; D = width\n2$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,2$\n\n\tLD\tA,(BC)\n\tLD\t(HL+),A\n\tINC\tBC\n\tDEC\tD\n\tJR\tNZ,2$\n\tDEC\tE\n\tJR\tNZ,1$\n\n\tLD\tD,#0x20\n3$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,3$\n\n\tLD\tA,#.SPACE\n\tLD\t(HL+),A\n\tDEC\tD\n\tJR\tNZ,3$\n\tPOP\tHL\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n\t.area\t_BSS\n.curx::\t\t\t\t; Cursor position\n\t.ds\t0x01\n.cury::\n\t.ds\t0x01\n\n\t.area\t_BASE\n\n\t.globl\t.vbl\n\t.globl\t.lcd\n\t.globl\t.int_0x40\n\t.globl\t.int_0x48\n\t.globl\t.remove_int\n\n\t;; Enter text mode\n.tmode::\n\tDI\t\t\t; Disable interrupts\n\n\t;; Turn the screen off\n\tLDH\tA,(.LCDC)\n\tBIT\t7,A\n\tJR\tZ,1$\n\n\t;; Turn the screen off\n\tCALL\t.display_off\n\n\t;; Remove any interrupts setup by the drawing routine\n\tLD\tBC,#.vbl\n\tLD\tHL,#.int_0x40\n\tCALL\t.remove_int\n\tLD\tBC,#.lcd\n\tLD\tHL,#.int_0x48\n\tCALL\t.remove_int\n1$:\n\n\tCALL\t.tmode_out\n\n\t;; Turn the screen on\n\tLDH\tA,(.LCDC)\n\tOR\t#0b10000001\t; LCD\t\t= On\n\t\t\t\t; BG\t\t= On\n\tAND\t#0b11100111\t; BG Chr\t= 0x8800\n\t\t\t\t; BG Bank\t= 0x9800\n\tLDH\t(.LCDC),A\n\n\tEI\t\t\t; Enable interrupts\n\n\tRET\n\n\t;; Text mode (out only)\n.tmode_out::\n\tXOR\tA\n\tLD\t(.curx),A\n\tLD\t(.cury),A\n\n\t;; Clear screen\n\tCALL\t.cls\n\n\tLD\tA,#.T_MODE\n\tLD\t(.mode),A\n\n\tRET\n"
  },
  {
    "path": "libc/get_bk_t.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.get_xy_btt\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_get_bkg_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tLDA\tHL,9(SP)\n\tLD\tB,(HL)\t\t; BC = tiles\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; A = h\n\tLD\tH,(HL)\t\t; H = w\n\tLD\tL,A\t\t; L = h\n\n\tCALL\t.get_xy_btt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/get_data.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.copy_vram\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_get_bkg_data::\n_get_win_data::\n\tLDH\tA,(.LCDC)\n\tBIT\t4,A\n\tJP\tNZ,_get_sprite_data\n\n\tPUSH\tBC\n\n\tLDA\tHL,7(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = nb_tiles\n\tDEC\tHL\n\tLD\tL,(HL)\t\t; L = first_tile\n\tPUSH\tHL\n\n\tXOR\tA\n\tOR\tE\t\t; Is nb_tiles == 0?\n\tJR\tNZ,1$\n\tLD\tDE,#0x1000\t; DE = nb_tiles = 256\n\tJR\t2$\n1$:\n\tLD\tH,#0x00\t\t; HL = nb_tiles\n\tLD\tL,E\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tLD\tD,H\t\t; DE = nb_tiles\n\tLD\tE,L\n2$:\n\tPOP\tHL\t\t; HL = first_tile\n\tLD\tA,L\n\tRLCA\t\t\t; Sign extend (patterns have signed numbers)\n\tSBC\tA\n\tLD\tH,A\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\n\tPUSH\tBC\n\tLD\tBC,#0x9000\n\tADD\tHL,BC\n\tPOP\tBC\n\n3$:\t\t\t\t; Special version of '.copy_vram'\n\tBIT\t3,H\t\t; Bigger than 0x9800\n\tJR\tZ,4$\n\tBIT\t4,H\n\tJR\tZ,4$\n\tRES\t4,H\t\t; Switch to 0x8800\n4$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,4$\n\n\tLD\tA,(HL+)\n\tLD\t(BC),A\n\tINC\tBC\n\tDEC\tDE\n\tLD\tA,D\n\tOR\tE\n\tJR\tNZ,3$\n\n\tPOP\tBC\n\tRET\n\n_get_sprite_data::\n\tPUSH\tBC\n\n\tLDA\tHL,7(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = nb_tiles\n\tDEC\tHL\n\tLD\tL,(HL)\t\t; L = first_tile\n\tPUSH\tHL\n\n\tXOR\tA\n\tOR\tE\t\t; Is nb_tiles == 0?\n\tJR\tNZ,1$\n\tLD\tDE,#0x1000\t; DE = nb_tiles = 256\n\tJR\t2$\n1$:\n\tLD\tH,#0x00\t\t; HL = nb_tiles\n\tLD\tL,E\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tLD\tD,H\t\t; DE = nb_tiles\n\tLD\tE,L\n2$:\n\tPOP\tHL\t\t; HL = first_tile\n\tLD\tL,A\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\n\tPUSH\tBC\n\tLD\tBC,#0x8000\n\tADD\tHL,BC\n\tLD\tB,H\n\tLD\tC,L\n\tPOP\tHL\n\n\tCALL\t.copy_vram\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/get_prop.s",
    "content": "\t.include\t\"global.s\"\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Get properties of sprite number C\n.get_sprite_prop::\n\tLD\tHL,#.OAM+3\t; Calculate origin of sprite info\n\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,(HL)\t\t; Get sprite properties\n\tLD\tE,A\n\tRET\n\n_get_sprite_prop::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\n\tCALL\t.get_sprite_prop\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/get_spr.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Get tile of sprite number C\n.get_sprite_tile::\n\tLD\tHL,#.OAM+2\t; Calculate origin of sprite info\n\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,(HL)\t\t; Get sprite number\n\tLD\tE,A\n\tRET\n\n_get_sprite_tile::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\n\tCALL\t.get_sprite_tile\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/get_wi_t.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.get_xy_wtt\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n_get_win_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tLDA\tHL,9(SP)\n\tLD\tB,(HL)\t\t; BC = tiles\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; A = h\n\tLD\tH,(HL)\t\t; H = w\n\tLD\tL,A\t\t; L = h\n\n\tCALL\t.get_xy_wtt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/get_xy_t.s",
    "content": "\t.include        \"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n\t;; Store window tile table into (BC) at xy = DE of size WH = HL\n\t;; WH >= (1,1)\n.get_xy_wtt::\n\tPUSH\tHL\t\t; Store WH\n\tPUSH\tHL\t\t; Store WH\n\tLDH\tA,(.LCDC)\n\tBIT\t6,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.get_xy_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n\tJR\t.get_xy_tt\n\t;; Store background tile table into (BC) at XY = DE of size WH = HL\n\t;; WH >= (1,1)\n.get_xy_btt::\n\tPUSH\tHL\t\t; Store WH\n\tLDH\tA,(.LCDC)\n\tBIT\t3,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.get_xy_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n;\tJR\t.get_xy_tt\n\n.get_xy_tt::\n\tPUSH\tBC\t\t; Store source\n\tXOR\tA\n\tOR\tE\n\tJR\tZ,2$\n\n\tLD\tBC,#0x20\t; One line is 20 tiles\n1$:\n\tADD\tHL,BC\t\t; Y coordinate\n\tDEC\tE\n\tJR\tNZ,1$\n2$:\n\tLD\tB,#0x00\t\t; X coordinate\n\tLD\tC,D\n\tADD\tHL,BC\n\n\tPOP\tBC\t\t; BC = source\n\tPOP\tDE\t\t; DE = WH\n\tPUSH\tHL\t\t; Store origin\n\tPUSH\tDE\t\t; Store WH\n3$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,3$\n\n\tLD\tA,(HL+)\t\t; Copy W tiles\n\tLD\t(BC),A\n\tINC\tBC\n\tDEC\tD\n\tJR\tNZ,3$\n\tPOP\tHL\t\t; HL = WH\n\tLD\tD,H\t\t; Restore D = W\n\tPOP\tHL\t\t; HL = origin\n\tDEC\tE\n\tJR\tZ,4$\n\n\tPUSH\tBC\t\t; Next line\n\tLD\tBC,#0x20\t; One line is 20 tiles\n\tADD\tHL,BC\n\tPOP\tBC\n\n\tPUSH\tHL\t\t; Store current origin\n\tPUSH\tDE\t\t; Store WH\n\tJR\t3$\n4$:\n\tRET\n\n_get_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,11(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; DE = src\n\tDEC\tHL\n\tLD\tE,(HL)\n\tDEC\tHL\n\tLD\tB,(HL)\t\t; BC = dst\n\tDEC\tHL\n\tLD\tC,(HL)\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tPUSH\tDE\t\t; Store address on stack for set_xy_tt\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tINC\tHL\n\tLD\tA,(HL+)\t\t; A = w\n\tLD\tL,(HL)\t\t; L = h\n\tLD\tH,A\t\t; H = w\n\n\tCALL\t.get_xy_tt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/global.s",
    "content": "\t.NEAR_CALLS = 1         ; <near_calls> - tag so that sed can change this\n        \n\t;; Changed by astorgb.pl to 1\n\t__RGBDS__\t= 0\n\n\t\n\t;;  Screen dimensions \n\t.MAXCURSPOSX\t= 0x13\t; In tiles\n\t.MAXCURSPOSY\t= 0x11\n\n\t.START\t\t= 0x80\n\t.SELECT\t\t= 0x40\n\t.B\t\t= 0x20\n\t.A\t\t= 0x10\n\t.DOWN\t\t= 0x08\n\t.UP\t\t= 0x04\n\t.LEFT\t\t= 0x02\n\t.RIGHT\t\t= 0x01\n\n\t.SCREENWIDTH\t= 0xA0\n\t.SCREENHEIGHT\t= 0x90\n\t.MINWNDPOSX\t= 0x07\n\t.MINWNDPOSY\t= 0x00\n\t.MAXWNDPOSX\t= 0xA6\n\t.MAXWNDPOSY\t= 0x8F\n\n\t.VBL_IFLAG\t= 0x01\n\t.LCD_IFLAG\t= 0x02\n\t.TIM_IFLAG\t= 0x04\n\t.SIO_IFLAG\t= 0x08\n\t.JOY_IFLAG\t= 0x10\n \n\t.P1\t\t= 0x00\t; Joystick: 1.1.P15.P14.P13.P12.P11.P10\n\t.SB\t\t= 0x01\t; Serial IO data buffer\n\t.SC\t\t= 0x02\t; Serial IO control register\n\t.DIV\t\t= 0x04\t; Divider register\n\t.TIMA\t\t= 0x05\t; Timer counter\n\t.TMA\t\t= 0x06\t; Timer modulo\n\t.TAC\t\t= 0x07\t; Timer control\n\t.IF\t\t= 0x0F\t; Interrupt flags: 0.0.0.JST.SIO.TIM.LCD.VBL\n\t.NR10\t\t= 0x10\t; Sound register\n\t.NR11\t\t= 0x11\t; Sound register\n\t.NR12\t\t= 0x12\t; Sound register\n\t.NR13\t\t= 0x13\t; Sound register\n\t.NR14\t\t= 0x14\t; Sound register\n\t.NR21\t\t= 0x16\t; Sound register\n\t.NR22\t\t= 0x17\t; Sound register\n\t.NR23\t\t= 0x18\t; Sound register\n\t.NR24\t\t= 0x19\t; Sound register\n\t.NR30\t\t= 0x1A\t; Sound register\n\t.NR31\t\t= 0x1B\t; Sound register\n\t.NR32\t\t= 0x1C\t; Sound register\n\t.NR33\t\t= 0x1D\t; Sound register\n\t.NR34\t\t= 0x1E\t; Sound register\n\t.NR41\t\t= 0x20\t; Sound register\n\t.NR42\t\t= 0x21\t; Sound register\n\t.NR43\t\t= 0x22\t; Sound register\n\t.NR44\t\t= 0x23\t; Sound register\n\t.NR50\t\t= 0x24\t; Sound register\n\t.NR51\t\t= 0x25\t; Sound register\n\t.NR52\t\t= 0x26\t; Sound register\n\t.LCDC\t\t= 0x40\t; LCD control\n\t.STAT\t\t= 0x41\t; LCD status\n\t.SCY\t\t= 0x42\t; Scroll Y\n\t.SCX\t\t= 0x43\t; Scroll X\n\t.LY\t\t= 0x44\t; LCDC Y-coordinate\n\t.LYC\t\t= 0x45\t; LY compare\n\t.DMA\t\t= 0x46\t; DMA transfer\n\t.BGP\t\t= 0x47\t; BG palette data\n\t.OBP0\t\t= 0x48\t; OBJ palette 0 data\n\t.OBP1\t\t= 0x49\t; OBJ palette 1 data\n\t.WY\t\t= 0x4A\t; Window Y coordinate\n\t.WX\t\t= 0x4B\t; Window X coordinate\n\t.KEY1\t\t= 0x4D\t; CPU speed\n\t.VBK\t\t= 0x4F\t; VRAM bank\n\t.HDMA1\t\t= 0x51\t; DMA control 1\n\t.HDMA2\t\t= 0x52\t; DMA control 2\n\t.HDMA3\t\t= 0x53\t; DMA control 3\n\t.HDMA4\t\t= 0x54\t; DMA control 4\n\t.HDMA5\t\t= 0x55\t; DMA control 5\n\t.RP\t\t= 0x56\t; IR port\n\t.BCPS\t\t= 0x68\t; BG color palette specification\n\t.BCPD\t\t= 0x69\t; BG color palette data\n\t.OCPS\t\t= 0x6A\t; OBJ color palette specification\n\t.OCPD\t\t= 0x6B\t; OBJ color palette data\n\t.SVBK\t\t= 0x70\t; WRAM bank\n\t.IE\t\t= 0xFF\t; Interrupt enable\n\n\t.G_MODE\t\t= 0x01\t; Graphic mode\n\t.T_MODE\t\t= 0x02\t; Text mode (bit 2)\n\t.T_MODE_OUT\t= 0x02\t; Text mode output only\n\t.T_MODE_INOUT\t= 0x03\t; Text mode with input\n\t.M_NO_SCROLL\t= 0x04\t; Disables scrolling of the screen in text mode\n\t.M_NO_INTERP\t= 0x08\t; Disables special character interpretation\n\n\t.MBC1_ROM_PAGE\t= 0x2000 ; Address to write to for MBC1 switching\n\t\n\t;; Status codes for IO\n\t.IO_IDLE\t= 0x00\n\t.IO_SENDING\t= 0x01\n\t.IO_RECEIVING\t= 0x02\n\t.IO_ERROR\t= 0x04\n\n\t;; Type of IO data\n\t.DT_IDLE\t= 0x66\n\t.DT_RECEIVING\t= 0x55\n\n\t;; Table of routines for modes\n\t.MODE_TABLE\t= 0x01E0\n\n\t;; C related\n\t;; Overheap of a banked call.  Used for parameters\n\t;;  = ret + real ret + bank\n\n\t.if .NEAR_CALLS\n\t.BANKOV\t\t= 2\n\n\t.else\n\t.BANKOV\t\t= 6\n\n\t.endif\n\t\n\t.globl\tbanked_call\n\t.globl\tbanked_ret\n\t\n\t;; Global variables\n\t.globl\t.mode\n\n\t.globl\t__cpu\n\n\t.globl\t__io_out\n\t.globl\t__io_in\n\t.globl\t__io_status\n\n\t;; Global routines\n\t.globl\t.set_mode\n\n\t.globl\t.reset\n\n\t.globl\t.display_off\n\n\t.globl\t.wait_vbl_done\n\n\t;; Interrupt routines \n\t.globl\t.add_VBL\n\t.globl\t.add_LCD\n\t.globl\t.add_TIM\n\t.globl\t.add_SIO\n\t.globl\t.add_JOY\n\n\t;; Symbols defined at link time\n\t.STACK = 0xE000\n\t.OAM = 0xC000\n\t.refresh_OAM = 0xFF80\n\n\t;; Initialization routine   \n\t.init = 0x000\n\n\t;; Main user routine\t\n\t.globl\t_main\n"
  },
  {
    "path": "libc/gprint.c",
    "content": "#include <gb/drawing.h>\n\nvoid gprint(char *str) NONBANKED\n{\n    while(*str)\n\twrtchr(*str++);\n}\n"
  },
  {
    "path": "libc/gprintf.c",
    "content": "#include <stdarg.h>\n#include <gb/drawing.h>\n\nINT8 gprintf(char *fmt, ...) NONBANKED\n{\n  va_list ap;\n  INT8 nb = 0;\n\n  va_start(ap, fmt);\n  for(; *fmt; fmt++)\n    if(*fmt == '%') {\n      switch(*++fmt) {\n      case 'c': {\n\t/* char */\n\t  char c = va_arg(ap, char);\n\t  wrtchr(c);\n\t  break;\n      }\n      case 'd': {\n\t/* decimal int */\n\t  INT8 b = va_arg(ap, INT8);\n\t  gprintn(b, 10, SIGNED);\n\t  break;\n      }\n      case 'u': {\n\t  /* unsigned int */\n\t  INT8 b = (INT8)va_arg(ap, int);\n\t  gprintn(b, 10, UNSIGNED);\n\t  break;\n      }\n      case 'o': {\n\t  /* octal int */\n\t  INT8 b = va_arg(ap, INT8);\n\t  gprintn(b, 8, UNSIGNED);\n\t  break;\n      }\n      case 'x': {\n\t  /* hexadecimal int */\n\t  INT8 b = va_arg(ap, INT8);\n\t  gprintn(b, 16, UNSIGNED);\n\t  break;\n      }\n      case 's': {\n\t  /* string */\n\t  char *s = va_arg(ap, char *);\n\t  gprint(s);\n\t  break;\n      }\n#if 0\n      case 'l':\n\t/* long */\n\tswitch(*++fmt) {\n\tcase 'd':\n\t  /* decimal long */\n\t  gprintln(va_arg(ap, INT16), 10, SIGNED);\n\t  break;\n\tcase 'u':\n\t  /* unsigned long */\n\t  gprintln(va_arg(ap, INT16), 10, UNSIGNED);\n\t  break;\n\tcase 'o':\n\t  /* octal long */\n\t  gprintln(va_arg(ap, INT16), 8, UNSIGNED);\n\t  break;\n\tcase 'x':\n\t  /* hexadecimal long */\n\t  gprintln(va_arg(ap, INT16), 16, UNSIGNED);\n\t  break;\n\t}\n\tbreak;\n#endif\n      case '%':\n\t/* % */\n\twrtchr(*fmt);\n\tbreak;\n      default:\n\treturn -1;\n      }\n      nb++;\n    } else\n      wrtchr(*fmt);\n  va_end(ap);\n\n  return nb;\n}\n"
  },
  {
    "path": "libc/gprintln.c",
    "content": "#include <gb/drawing.h>\n\n/* Print a long number in any radix */\n\nextern char *digits;\n\nvoid gprintln(INT16 number, INT8 radix, INT8 signed_value)\n{\n  UINT16 l;\n\n  if(number < 0 && signed_value) {\n    wrtchr('-');\n    number = -number;\n  }\n  if((l = (UINT16)number / (UINT16)radix) != 0)\n    gprintln(l, radix, UNSIGNED);\n  wrtchr(digits[(UINT16)number % (UINT16)radix]);\n}\n"
  },
  {
    "path": "libc/gprintn.c",
    "content": "#include <gb/drawing.h>\n\n/* Print a number in any radix */\n\nextern char *digits;\n\nvoid gprintn(BYTE number, BYTE radix, BYTE signed_value)\n{\n  UBYTE i;\n\n  if(number < 0 && signed_value) {\n    wrtchr('-');\n    number = -number;\n  }\n  if((i = (UBYTE)number / (UBYTE)radix) != 0)\n    gprintn(i, radix, UNSIGNED);\n  wrtchr(digits[(UBYTE)number % (UBYTE)radix]);\n}\n"
  },
  {
    "path": "libc/hiramcpy.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n\t;; Copy memory zone to HIRAM\n\t;; \n\t;; Entry conditions\n\t;;   C = destination\n\t;;   B = length\n\t;;   HL = source\n\t;; \n\t;; Register used: AF, BC, HL\n.hiramcpy::\n1$:\n\tLD\tA,(HL+)\n\tLDH\t(C),A\n\tINC\tC\n\tDEC\tB\n\tJR\tNZ,1$\n\tRET\n\n_hiramcpy::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = dst\n\tLDA\tHL,7(SP)\n\tLD\tB,(HL)\t\t; B = n\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; HL = src\n\tLD\tL,(HL)\n\tLD\tH,A\n\tCALL\t.hiramcpy\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/ibmfixed.s",
    "content": "; font: font\n\t;; BANKED: checked\n\t.area\t_BASE\n\n\t.globl\tfont_load\n\t;; Perform tricks with banking to shift this font out of\n\t;; bank 0.  Doesnt currently work as the encoding table\n\t;; must always be visible.\n_font_load_ibm_fixed::\t\t; Banked\n\tld\thl,#_font_ibm_fixed\n\tcall\tfont_load\n\tret\n\n_font_ibm_fixed::\n\t.db\t0+4\t; 256 char encoding, compressed\n\t.db\t255\t; Number of tiles\n\n; Encoding table\n\n\t; Hack\n\t.db 0x00\n\t.db 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08\n\t.db 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10\n\t.db 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18\n\t.db 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20\n\t.db 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28\n\t.db 0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30\n\t.db 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38\n\t.db 0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40\n\t.db 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48\n\t.db 0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50\n\t.db 0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58\n\t.db 0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60\n\t.db 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68\n\t.db 0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70\n\t.db 0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78\n\t.db 0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80\n\t.db 0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88\n\t.db 0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90\n\t.db 0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98\n\t.db 0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA0\n\t.db 0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8\n\t.db 0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0\n\t.db 0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8\n\t.db 0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xC0\n\t.db 0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8\n\t.db 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0\n\t.db 0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8\n\t.db 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0\n\t.db 0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8\n\t.db 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0\n\t.db 0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8\n\t.db 0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF\n\t; Tile data\n\t;; Hook for the graphics routines\n_font_ibm_fixed_tiles::\t\n; Default character (space)\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\t.db\t0b00000000\n\n; Character: ? (01)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b10000001\t; o      o\n\t.db\t0b11100111\t; ooo  ooo\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (02)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b11100111\t; ooo  ooo\n\t.db\t0b10000001\t; o      o\n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (03)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00010100\t;    o o  \n\t.db\t0b11110010\t; oooo  o \n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b11110010\t; oooo  o \n\t.db\t0b00010100\t;    o o  \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (04)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b01001111\t;  o  oooo\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b01001111\t;  o  oooo\n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (05)\n\t.db\t0b11111111\t; oooooooo\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b11111111\t; oooooooo\n\n; Character: ? (06)\n\t.db\t0b11111000\t; ooooo   \n\t.db\t0b10001000\t; o   o   \n\t.db\t0b10001111\t; o   oooo\n\t.db\t0b10001001\t; o   o  o\n\t.db\t0b11111001\t; ooooo  o\n\t.db\t0b01000001\t;  o     o\n\t.db\t0b01000001\t;  o     o\n\t.db\t0b01111111\t;  ooooooo\n\n; Character: ? (07)\n\t.db\t0b11111111\t; oooooooo\n\t.db\t0b10001001\t; o   o  o\n\t.db\t0b10001001\t; o   o  o\n\t.db\t0b10001001\t; o   o  o\n\t.db\t0b11111001\t; ooooo  o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b10000001\t; o      o\n\t.db\t0b11111111\t; oooooooo\n\n; Character: ? (08)\n\t.db\t0b00000001\t;        o\n\t.db\t0b00000011\t;       oo\n\t.db\t0b00000110\t;      oo \n\t.db\t0b10001100\t; o   oo  \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00100000\t;   o     \n\t.db\t0b00000000\t;         \n\n; Character: ? (09)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b11000011\t; oo    oo\n\t.db\t0b11010011\t; oo o  oo\n\t.db\t0b11010011\t; oo o  oo\n\t.db\t0b11011011\t; oo oo oo\n\t.db\t0b11000011\t; oo    oo\n\t.db\t0b11000011\t; oo    oo\n\t.db\t0b01111110\t;  oooooo \n\n; Character: ? (0A)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00101100\t;   o oo  \n\t.db\t0b00101100\t;   o oo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (0B)\n\t.db\t0b00010000\t;    o    \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00010010\t;    o  o \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b11110000\t; oooo    \n\t.db\t0b01100000\t;  oo     \n\n; Character: ? (0C)\n\t.db\t0b11110000\t; oooo    \n\t.db\t0b11000000\t; oo      \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011110\t; oo oooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (0D)\n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b11001000\t; oo  o   \n\t.db\t0b11011110\t; oo oooo \n\t.db\t0b11011011\t; oo oo oo\n\t.db\t0b11011011\t; oo oo oo\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00011011\t;    oo oo\n\n; Character: ? (0E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b11111111\t; oooooooo\n\t.db\t0b11111111\t; oooooooo\n\t.db\t0b11111111\t; oooooooo\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (0F)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\n; Character: ? (10)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b00000000\t;         \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (11)\n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (12)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000000\t; oo      \n\t.db\t0b11000000\t; oo      \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (13)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (14)\n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (15)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000000\t; oo      \n\t.db\t0b11000000\t; oo      \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (16)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000000\t; oo      \n\t.db\t0b11000000\t; oo      \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (17)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (18)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (19)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (1A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (1B)\n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111101\t;  ooooo o\n\t.db\t0b01100100\t;  oo  o  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000011\t;       oo\n\t.db\t0b00001011\t;     o oo\n\t.db\t0b00000110\t;      oo \n\n; Character: ? (1C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\n; Character: ? (1D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\n; Character: ? (1E)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00011111\t;    ooooo\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (1F)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character:   (20)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ! (21)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: \" (22)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: # (23)\n\t.db\t0b00000000\t;         \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\n; Character: $ (24)\n\t.db\t0b00010100\t;    o o  \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01010101\t;  o o o o\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b01010101\t;  o o o o\n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00010100\t;    o o  \n\n; Character: % (25)\n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00000000\t;         \n\n; Character: & (26)\n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b11001100\t; oo  oo  \n\t.db\t0b01100001\t;  oo    o\n\t.db\t0b11001110\t; oo  ooo \n\t.db\t0b11001100\t; oo  oo  \n\t.db\t0b11001100\t; oo  oo  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\n; Character: ' (27)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ( (28)\n\t.db\t0b00000100\t;      o  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000100\t;      o  \n\n; Character: ) (29)\n\t.db\t0b00100000\t;   o     \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00100000\t;   o     \n\n; Character: * (2A)\n\t.db\t0b00000000\t;         \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: + (2B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: , (2C)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00100000\t;   o     \n\n; Character: - (2D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: . (2E)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: / (2F)\n\t.db\t0b00000011\t;       oo\n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b11000000\t; oo      \n\t.db\t0b00000000\t;         \n\n; Character: 0 (30)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: 1 (31)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: 2 (32)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: 3 (33)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: 4 (34)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00101100\t;   o oo  \n\t.db\t0b01001100\t;  o  oo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: 5 (35)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: 6 (36)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00100000\t;   o     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: 7 (37)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: 8 (38)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: 9 (39)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00000000\t;         \n\n; Character: : (3A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ; (3B)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\n; Character: < (3C)\n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: = (3D)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: > (3E)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00000000\t;         \n\n; Character: ? (3F)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\n; Character: @ (40)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01101010\t;  oo o o \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: A (41)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: B (42)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: C (43)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: D (44)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: E (45)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: F (46)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00000000\t;         \n\n; Character: G (47)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: H (48)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: I (49)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: J (4A)\n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: K (4B)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: L (4C)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: M (4D)\n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b00000000\t;         \n\n; Character: N (4E)\n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01110010\t;  ooo  o \n\t.db\t0b01111010\t;  oooo o \n\t.db\t0b01011110\t;  o oooo \n\t.db\t0b01001110\t;  o  ooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00000000\t;         \n\n; Character: O (4F)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: P (50)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00000000\t;         \n\n; Character: Q (51)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\n; Character: R (52)\n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: S (53)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: T (54)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: U (55)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: V (56)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100100\t;  oo  o  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\n; Character: W (57)\n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b00000000\t;         \n\n; Character: X (58)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: Y (59)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: Z (5A)\n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: [ (5B)\n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00000000\t;         \n\n; Character: \\ (5C)\n\t.db\t0b01000000\t;  o      \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000010\t;       o \n\t.db\t0b00000000\t;         \n\n; Character: ] (5D)\n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\n; Character: ^ (5E)\n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: _ (5F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ` (60)\n\t.db\t0b00000000\t;         \n\t.db\t0b11000000\t; oo      \n\t.db\t0b11000000\t; oo      \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: a (61)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: b (62)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\n; Character: c (63)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: d (64)\n\t.db\t0b00000110\t;      oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: e (65)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: f (66)\n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\n; Character: g (67)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\n; Character: h (68)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: i (69)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: j (6A)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00110000\t;   oo    \n\n; Character: k (6B)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100100\t;  oo  o  \n\t.db\t0b01101000\t;  oo o   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: l (6C)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: m (6D)\n\t.db\t0b00000000\t;         \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b00000000\t;         \n\n; Character: n (6E)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: o (6F)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: p (70)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\n; Character: q (71)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000110\t;      oo \n\n; Character: r (72)\n\t.db\t0b00000000\t;         \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00000000\t;         \n\n; Character: s (73)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01110010\t;  ooo  o \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b01001110\t;  o  ooo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: t (74)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: u (75)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: v (76)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100100\t;  oo  o  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\n; Character: w (77)\n\t.db\t0b00000000\t;         \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b00000000\t;         \n\n; Character: x (78)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: y (79)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00100110\t;   o  oo \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\n; Character: z (7A)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: { (7B)\n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00000000\t;         \n\n; Character: | (7C)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\n; Character: } (7D)\n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00000000\t;         \n\n; Character: ~ (7E)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b11110010\t; oooo  o \n\t.db\t0b10011110\t; o  oooo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (7F)\n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b00101000\t;   o o   \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b01000100\t;  o   o  \n\t.db\t0b10000010\t; o     o \n\t.db\t0b11111110\t; ooooooo \n\n; Character: ? (80)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00110000\t;   oo    \n\n; Character: ? (81)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (82)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (83)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (84)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (85)\n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (86)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (87)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (88)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (89)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (8A)\n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (8B)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (8C)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (8D)\n\t.db\t0b00010000\t;    o    \n\t.db\t0b00001000\t;     o   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (8E)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (8F)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (90)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (91)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b01111111\t;  ooooooo\n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (92)\n\t.db\t0b00111111\t;   oooooo\n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011110\t; oo oooo \n\t.db\t0b11111000\t; ooooo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011111\t; oo ooooo\n\t.db\t0b00000000\t;         \n\n; Character: ? (93)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (94)\n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (95)\n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (96)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (97)\n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (98)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (99)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (9A)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (9B)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (9C)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00111010\t;   ooo o \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (9D)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (9E)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b11101100\t; ooo oo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (9F)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (A0)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (A1)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (A2)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (A3)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (A4)\n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (A5)\n\t.db\t0b00011010\t;    oo o \n\t.db\t0b00101100\t;   o oo  \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01110010\t;  ooo  o \n\t.db\t0b01011010\t;  o oo o \n\t.db\t0b01001110\t;  o  ooo \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (A6)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000110\t;  o   oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\n; Character: ? (A7)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\n; Character: ? (A8)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (A9)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\n; Character: ? (AA)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (AB)\n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b11100100\t; ooo  o  \n\t.db\t0b01101000\t;  oo o   \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00101011\t;   o o oo\n\t.db\t0b01000011\t;  o    oo\n\t.db\t0b10000110\t; o    oo \n\t.db\t0b00001111\t;     oooo\n\n; Character: ? (AC)\n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b11100100\t; ooo  o  \n\t.db\t0b01101000\t;  oo o   \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00101110\t;   o ooo \n\t.db\t0b01010110\t;  o o oo \n\t.db\t0b10011111\t; o  ooooo\n\t.db\t0b00000110\t;      oo \n\n; Character: ? (AD)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (AE)\n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00000000\t;         \n\n; Character: ? (AF)\n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (B0)\n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (B1)\n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (B2)\n\t.db\t0b00000010\t;       o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000000\t;  o      \n\n; Character: ? (B3)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000010\t;       o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000000\t;  o      \n\n; Character: ? (B4)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b11011011\t; oo oo oo\n\t.db\t0b11011110\t; oo oooo \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01111111\t;  ooooooo\n\t.db\t0b00000000\t;         \n\n; Character: ? (B5)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11111100\t; oooooo  \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011110\t; oo oooo \n\n; Character: ? (B6)\n\t.db\t0b00100000\t;   o     \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\n; Character: ? (B7)\n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\n; Character: ? (B8)\n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b01011000\t;  o oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (B9)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (BA)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (BB)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (BC)\n\t.db\t0b01111010\t;  oooo o \n\t.db\t0b11001010\t; oo  o o \n\t.db\t0b11001010\t; oo  o o \n\t.db\t0b11001010\t; oo  o o \n\t.db\t0b01111010\t;  oooo o \n\t.db\t0b00001010\t;     o o \n\t.db\t0b00001010\t;     o o \n\t.db\t0b00001010\t;     o o \n\n; Character: ? (BD)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b10011001\t; o  oo  o\n\t.db\t0b10110101\t; o oo o o\n\t.db\t0b10110001\t; o oo   o\n\t.db\t0b10011101\t; o  ooo o\n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (BE)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01000010\t;  o    o \n\t.db\t0b10111001\t; o ooo  o\n\t.db\t0b10110101\t; o oo o o\n\t.db\t0b10111001\t; o ooo  o\n\t.db\t0b10110101\t; o oo o o\n\t.db\t0b01000010\t;  o    o \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (BF)\n\t.db\t0b11110001\t; oooo   o\n\t.db\t0b01011011\t;  o oo oo\n\t.db\t0b01010101\t;  o o o o\n\t.db\t0b01010001\t;  o o   o\n\t.db\t0b01010001\t;  o o   o\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C0)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b11100110\t; ooo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b11110110\t; oooo oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00011100\t;    ooo  \n\n; Character: ? (C1)\n\t.db\t0b11110110\t; oooo oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b11110110\t; oooo oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00011100\t;    ooo  \n\n; Character: ? (C2)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C3)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C4)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C5)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C6)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C7)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C8)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (C9)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CA)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CB)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CC)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CD)\n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CE)\n\t.db\t0b00000000\t;         \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01101110\t;  oo ooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (CF)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D0)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D1)\n\t.db\t0b00000000\t;         \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D2)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D3)\n\t.db\t0b00000000\t;         \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D4)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110100\t;   oo o  \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\n; Character: ? (D5)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D6)\n\t.db\t0b00000000\t;         \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D7)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b11101100\t; ooo oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (D8)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (D9)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (DA)\n\t.db\t0b00000000\t;         \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (DB)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000110\t;      oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (DC)\n\t.db\t0b00000000\t;         \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (DD)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00110010\t;   oo  o \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01001100\t;  o  oo  \n\t.db\t0b00111000\t;   ooo   \n\n; Character: ? (DE)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b11000110\t; oo   oo \n\t.db\t0b10000010\t; o     o \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (DF)\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b11110111\t; oooo ooo\n\t.db\t0b10011001\t; o  oo  o\n\t.db\t0b10011001\t; o  oo  o\n\t.db\t0b11101111\t; ooo oooo\n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (E0)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b11011100\t; oo ooo  \n\t.db\t0b11001000\t; oo  o   \n\t.db\t0b11011100\t; oo ooo  \n\t.db\t0b01110110\t;  ooo oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (E1)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b01100000\t;  oo     \n\n; Character: ? (E2)\n\t.db\t0b00000000\t;         \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100010\t;  oo   o \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b11111000\t; ooooo   \n\n; Character: ? (E3)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01001000\t;  o  o   \n\n; Character: ? (E4)\n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (E5)\n\t.db\t0b00000000\t;         \n\t.db\t0b00011110\t;    oooo \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (E6)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01111111\t;  ooooooo\n\t.db\t0b11000000\t; oo      \n\n; Character: ? (E7)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00010000\t;    o    \n\n; Character: ? (E8)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111100\t;   oooo  \n\n; Character: ? (E9)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b00000000\t;         \n\n; Character: ? (EA)\n\t.db\t0b00000000\t;         \n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00100100\t;   o  o  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (EB)\n\t.db\t0b00011100\t;    ooo  \n\t.db\t0b00110110\t;   oo oo \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b11011100\t; oo ooo  \n\t.db\t0b11001100\t; oo  oo  \n\t.db\t0b11101100\t; ooo oo  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (EC)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b01010100\t;  o o o  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01100000\t;  oo     \n\n; Character: ? (ED)\n\t.db\t0b00000000\t;         \n\t.db\t0b00010000\t;    o    \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b11010110\t; oo o oo \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00010000\t;    o    \n\n; Character: ? (EE)\n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b01100000\t;  oo     \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00111110\t;   ooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (EF)\n\t.db\t0b00111100\t;   oooo  \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b01100110\t;  oo  oo \n\t.db\t0b00000000\t;         \n\n; Character: ? (F0)\n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (F1)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (F2)\n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (F3)\n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\n; Character: ? (F4)\n\t.db\t0b00000000\t;         \n\t.db\t0b00001110\t;     ooo \n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00011011\t;    oo oo\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\n; Character: ? (F5)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00000000\t;         \n\n; Character: ? (F6)\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b01111110\t;  oooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\n; Character: ? (F7)\n\t.db\t0b00000000\t;         \n\t.db\t0b00110010\t;   oo  o \n\t.db\t0b01001100\t;  o  oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00110010\t;   oo  o \n\t.db\t0b01001100\t;  o  oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (F8)\n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (F9)\n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (FA)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (FB)\n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00001111\t;     oooo\n\t.db\t0b00011000\t;    oo   \n\t.db\t0b11011000\t; oo oo   \n\t.db\t0b01110000\t;  ooo    \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b00000000\t;         \n\n; Character: ? (FC)\n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (FD)\n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b01101100\t;  oo oo  \n\t.db\t0b00011000\t;    oo   \n\t.db\t0b00110000\t;   oo    \n\t.db\t0b01111100\t;  ooooo  \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (FE)\n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b00111000\t;   ooo   \n\t.db\t0b00001100\t;     oo  \n\t.db\t0b01111000\t;  oooo   \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n; Character: ? (FF)\n\t.db\t0b00000000\t;         \n\t.db\t0b11111110\t; ooooooo \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\t.db\t0b00000000\t;         \n\n"
  },
  {
    "path": "libc/init_tt.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED: checked\n\t.area\t_BASE\n\n\t;; Initialize part (size = DE) of the VRAM at (HL) with B\n.init_vram::\n1$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,1$\n\n\tLD\t(HL),B\n\tINC\tHL\n\tDEC\tDE\n\tLD\tA,D\n\tOR\tE\n\tJR\tNZ,1$\n\tRET\n\t;; Initialize window tile table with B\n.init_wtt::\n\tLDH\tA,(.LCDC)\n\tBIT\t6,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.init_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n\tJR\t.init_tt\n\t;; Initialize background tile table with B\n.init_btt::\n\tLDH\tA,(.LCDC)\n\tBIT\t3,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.init_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n;\tJR\t.init_tt\n.init_tt::\n\tLD\tDE,#0x0400\t; One whole GB Screen\n\tJP\t.init_vram\n"
  },
  {
    "path": "libc/input.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; Note that while gets uses a pointer, the pointer had better\n\t;; be in non-banked RAM else bad things will happen.\n\t;; BANKED:\tchecked, imperfect\n\t\n\t.globl\t.copy_vram\n\t.globl\t.set_xy_wtt\n\t.globl\t.mv_sprite\n\t.globl\t.set_sprite_prop\n\t.globl\t.set_sprite_tile\n\t.globl\t.jpad\n\t.globl\t.padup\n\n\t.MINMSPOSX\t= 0x02\t; In tiles\n\t.MINMSPOSY\t= 0x0A\n\t.MAXMSPOSX\t= 0x11\n\t.MAXMSPOSY\t= 0x0F\n\t.INIMSPOSX\t= .MINMSPOSX\n\t.INIMSPOSY\t= .MINMSPOSY\n\n\t.KBDWINPOSY\t= 0x08\t; In tiles\n\t.KBDSIZE\t= 0x1006\n\n\t.MSOFFSETX\t= 0x0C\t; In pixels\n\t.MSOFFSETY\t= 0x14\n\n\t.MINACCEL\t= 0x0800\n\t.MAXACCEL\t= 0x0100\n\n\t.CR\t= 0x0A\t\t; Unix\n;\t.CR\t= 0x0D\t\t; Dos\n\n\t.globl\t.tmode_out\t; From 'output.s'\n\t.globl\t.put_char\n\t.globl\t.del_char\n\t.globl\t.cury\n\n\t.area\t_HEADER (ABS)\n\n\t.org\t.MODE_TABLE+4*.T_MODE_INOUT\n\tJP\t.tmode_inout\n\n\t.module Terminal\n\n\t.area\t_BSS\n\n.msx:\t\t\t\t; Mouse position\n\t.ds\t0x01\n.msy:\n\t.ds\t0x01\n.msacc:\t\t\t\t; Mouse acceleration\n\t.ds\t0x02\n.msstate:\t\t\t; Mouse state\n\t.ds\t0x01\n.mschanged:\t\t\t; Did the mouse move?\n\t.ds\t0x01\n.string_len:\t\t\t; Used length of input buffer\n\t.ds\t0x01\n\n\t.area\t_BASE\n\n\t;; Enter text mode with input\n.tmode_inout::\n\tDI\t\t\t; Disable interrupts\n\n\t;; Turn the screen off\n\tLDH\tA,(.LCDC)\n\tBIT\t7,A\n\tJR\tZ,1$\n\n\t;; Turn the screen off\n\tCALL\t.display_off\n1$:\n\n\tLD\tA,(.mode)\n\tAND\t#.T_MODE\n\tCALL\tZ,.tmode_out\n\n\tLD\tBC,#.tp1\t; Move pointer\n\tLD\tHL,#0x8000\n\tLD\tDE,#.endtp1-.tp1\n\tCALL\t.copy_vram\n\n\tLD\tA,#<.MINACCEL\t; Acceleration\n\tLD\t(.msacc),A\n\tLD\tA,#>.MINACCEL\n\tLD\t(.msacc+1),A\n\n\t;; Initialize window\n\tLD\tBC,#.frame_tiles\n\tLD\tDE,#0x0000\t; Place image at (0x00,0x00) tiles\n\tLD\tHL,#0x140A\t; Image size is 0x14 x 0x0A tiles\n\tCALL\t.set_xy_wtt\n\tLD\tBC,#.kbdtable\n\tLD\tDE,#0x0202\t; Place image at (0x02,0x02) tiles\n\tLD\tHL,#.KBDSIZE\t; Image size is 0x10 x 0x06 tiles\n\tCALL\t.set_xy_wtt\n\tXOR\tA\n\tLD\tA,#.MINWNDPOSX\n\tLDH\t(.WX),A\n\tLD\tA,#.MAXWNDPOSY\t; Hide window\n\tLDH\t(.WY),A\n\n\t;; Initialize sprite\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tD,#0x00\t\t; Default sprite properties\n\tCALL\t.set_sprite_prop\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tD,#0x00\t\t; Tile 0x00\n\tCALL\t.set_sprite_tile\n\tLD\tA,#0b00101100\n\tLDH\t(.OBP0),A\n\n\t;; Turn the screen on\n\tLD\tA,#0b11000001\t; LCD\t\t= On\n\t\t\t\t; WindowBank\t= 0x9C00\n\t\t\t\t; Window\t= Off\n\t\t\t\t; BG Chr\t= 0x8800\n\t\t\t\t; BG Bank\t= 0x9800\n\t\t\t\t; OBJ\t\t= 8x8\n\t\t\t\t; OBJ\t\t= Off\n\t\t\t\t; BG\t\t= On\n\tLDH\t(.LCDC),A\n\n\tLD\tA,#.T_MODE_INOUT\n\tLD\t(.mode),A\n\n\tEI\t\t\t; Enable interrupts\n\n\tRET\n\n\t.area\t_CODE\n\t;; Prompt the user for a char and return it in A\n.get_char:\n\tPUSH\tBC\n\tPUSH\tDE\n\tPUSH\tHL\n\tCALL\t.show_kbd\n\tCALL\t.show_mouse\n1$:\n\tCALL\t.track_mouse\n\tCALL\t.update_mouse\n\tCALL\t.jpad\n\tLD\tD,A\n\tAND\t#.A\t\t; Is A pressed ?\n\tJP\tZ,1$\n\n\tLD\tA,(.msy)\t; Look for char under the mouse\n\tSUB\t#.MINMSPOSY\n\tJR\tZ,12$\n\tLD\tE,A\n\tXOR\tA\n11$:\n\tADD\t#.MAXMSPOSX-.MINMSPOSX+1\n\tDEC\tE\n\tJR\tNZ,11$\n12$:\n\tLD\tE,A\n\tLD\tA,(.msx)\n\tSUB\t#.MINMSPOSX\n\tADD\tE\n\tLD\tHL,#.kbdtable\n\tLD\tB,#0x00\n\tLD\tC,A\n\tADD\tHL,BC\n\tLD\tB,(HL)\n\n\tCALL\t.hide_mouse\n\tCALL\t.hide_kbd\n\tLD\tA,B\n\n\tPOP\tHL\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n\t;; Prompt the user for a string and store it in (HL)\n.get_string:\n\tPUSH\tBC\n\tPUSH\tDE\n\tPUSH\tHL\n\tCALL\t.show_kbd\n\tCALL\t.show_bkg\n\tCALL\t.show_mouse\n\tXOR\tA\n\tLD\t(.string_len),A\n1$:\n\tCALL\t.track_mouse\n\tCALL\t.update_mouse\n\tCALL\t.jpad\n\tLD\tD,A\n\tAND\t#.A\t\t; Is A pressed ?\n\tJP\tNZ,10$\n\tLD\tA,D\n\tAND\t#.B\t\t; Is B pressed ?\n\tJP\tNZ,20$\n\tLD\tA,D\n\tAND\t#.SELECT\t; Is SELECT pressed ?\n\tJP\tNZ,30$\n\tLD\tA,D\n\tAND\t#.START\t\t; Is START pressed ?\n\tJR\tZ,1$\n\tCALL\t.padup\t\t; Wait for button to be depressed\n\n\tLD\tA,#.CR\n\tCALL\t.put_char\n\tLD\t(HL),#0x00\n\tCALL\t.hide_mouse\n\tCALL\t.hide_bkg\n\tCALL\t.hide_kbd\n\tPOP\tHL\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n10$:\n\t;; Insert a character at cursor position\n\tLD\tA,(.string_len) ; Check buffer length\n;\tCP\t#.BUFLEN-1\t; Keep 1 char for EOS\n;\tJR\tZ,13$\n\tINC\tA\n\tLD\t(.string_len),A ; Update it\n\tLD\tA,(.msy)\t; Look for char under the mouse\n\tSUB\t#.MINMSPOSY\n\tJR\tZ,12$\n\tLD\tE,A\n\tXOR\tA\n11$:\n\tADD\t#.MAXMSPOSX-.MINMSPOSX+1\n\tDEC\tE\n\tJR\tNZ,11$\n12$:\n\tLD\tE,A\n\tLD\tA,(.msx)\n\tSUB\t#.MINMSPOSX\n\tADD\tE\n\tPUSH\tHL\n\tLD\tHL,#.kbdtable\n\tLD\tB,#0x00\n\tLD\tC,A\n\tADD\tHL,BC\n\tLD\tA,(HL)\n\tPOP\tHL\n\tLD\t(HL+),A\t\t; Add it into input buffer\n\tCALL\t.put_char\t; Print it\n\tCALL\t.show_bkg\t; Ensure the text is not hidden\n13$:\n\tCALL\t.padup\t\t; Wait for button to be depressed\n\tJP\t1$\n\n20$:\n\t;; Delete a character at cursor position\n\tLD\tA,(.string_len) ; Is there any char in the buffer ?\n\tOR\tA\n\tJR\tZ,21$\n\tDEC\tA\t\t; Yes\n\tLD\t(.string_len),A ; Update buffer length\n\tDEC\tHL\n\tCALL\t.del_char\n21$:\n\tCALL\t.padup\t\t; Wait for button to be depressed\n\tJP\t1$\n\n30$:\n\tCALL\t.hide_mouse\n\tCALL\t.hide_bkg\n\tCALL\t.hide_kbd\n\tCALL\t.padup\t\t; Wait for button to be depressed\n\tCALL\t.show_kbd\n\tCALL\t.show_bkg\n\tCALL\t.show_mouse\n\tJP\t1$\n\n.show_kbd:\n\tPUSH\tBC\n\tPUSH\tDE\n\tLDH\tA,(.LCDC)\n\tOR\t#0b00100000\t; Window = On\n\tLDH\t(.LCDC),A\n\tLD\tA,#.MAXWNDPOSY\t; Show window\n1$:\n\tBIT\t0,A\t\t; Wait for VBL every 2 pixels (slow down)\n\tJR\tNZ,2$\n\tLD\tB,A\n\tCALL\t.wait_vbl_done\n\tLD\tA,B\n2$:\n\tLDH\t(.WY),A\n\tCP\t#.KBDWINPOSY*0x08\n\tJR\tZ,99$\n\tDEC\tA\n\tJR\t1$\n99$:\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.hide_kbd:\n\tPUSH\tBC\n\tPUSH\tDE\n\tLD\tA,#.KBDWINPOSY*0x08+1\n1$:\t\t\t\t; Hide window\n\tBIT\t0,A\t\t; Wait for VBL every 2 pixels (slow down)\n\tJR\tZ,2$\n\tLD\tB,A\n\tCALL\t.wait_vbl_done\n\tLD\tA,B\n2$:\n\tLDH\t(.WY),A\n\tCP\t#.MAXWNDPOSY\n\tJR\tZ,3$\n\tINC\tA\n\tJR\t1$\n3$:\n\tLDH\tA,(.LCDC)\n\tAND\t#0b11011111\t; Window = Off\n\tLDH\t(.LCDC),A\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.show_bkg:\n\tPUSH\tBC\n\tPUSH\tDE\n\tLDH\tA,(.SCY)\n\tLD\tD,A\n\tLD\tA,(.cury)\n\tSUB\t#.KBDWINPOSY-1\n\tJR\tC,99$\n\tJR\tZ,99$\n\tSLA\tA\t\t; A = A * 8\n\tSLA\tA\n\tSLA\tA\n\tSUB\tD\n\tJR\tC,99$\n\tJR\tZ,99$\n\tLD\tC,A\n\tLDH\tA,(.SCY)\n1$:\n\tBIT\t0,A\t\t; Wait for VBL every 2 pixels (slow down)\n\tJR\tZ,2$\n\tLD\tB,A\n\tCALL\t.wait_vbl_done\n\tLD\tA,B\n2$:\n\tINC\tA\n\tLDH\t(.SCY),A\n\tDEC\tC\n\tJR\tZ,99$\n\tJR\t1$\n99$:\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.hide_bkg:\n\tLDH\tA,(.SCY)\n\tOR\tA\n\tRET\tZ\n\tPUSH\tBC\n\tPUSH\tDE\n1$:\n\tBIT\t0,A\t\t; Wait for VBL every 2 pixels (slow down)\n\tJR\tZ,2$\n\tLD\tB,A\n\tCALL\t.wait_vbl_done\n\tLD\tA,B\n2$:\n\tDEC\tA\n\tLDH\t(.SCY),A\n\tJR\tZ,99$\n\tJR\t1$\n99$:\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.show_mouse:\n\tLD\tA,#.INIMSPOSX\n\tLD\t(.msx),A\n\tLD\tA,#.INIMSPOSY\n\tLD\t(.msy),A\n\tCALL\t.set_mouse\n\tLDH\tA,(.LCDC)\n\tOR\t#0b00000010\t; OBJ = On\n\tLDH\t(.LCDC),A\n\tRET\n\n.hide_mouse:\n\tLDH\tA,(.LCDC)\n\tAND\t#0b11111101\t; OBJ = Off\n\tLDH\t(.LCDC),A\n\tRET\n\n.track_mouse:\n\tPUSH\tBC\n\tPUSH\tDE\n\tPUSH\tHL\n\tXOR\tA\n\tLD\t(.mschanged),A\t; Default to no change\n\tCALL\t.jpad\n\tLD\tD,A\n\n\tLD\tHL,#.msstate\n\tAND\t#.UP+.DOWN+.LEFT+.RIGHT\n\tJR\tNZ,1$\n\tLD\t(HL),#0x00\t; Reset state\n\tJP\t99$\n1$:\n\tLD\tA,(HL)\n\tLD\t(HL),#0x01\t; Set state\n\tOR\tA\t\t; Was it 0 ?\n\tLD\tHL,#.msacc\t; Acceleration\n\tJR\tNZ,2$\n\t\t\t\t; Yes\n\tLD\t(HL),#<.MINACCEL\n\tINC\tHL\n\tLD\t(HL),#>.MINACCEL\n\tJR\t4$\t\t; Update position\n2$:\n\tLD\tC,(HL)\n\tINC\tHL\n\tLD\tB,(HL)\n\tDEC\tBC\n\tLD\tA,B\n\tOR\tC\n\tJR\tZ,3$\n\tLD\t(HL),B\n\tDEC\tHL\n\tLD\t(HL),C\n\tJP\t99$\n3$:\t\t\t\t; Set new acceleration to maximum\n\tLD\t(HL),#>.MAXACCEL\n\tDEC\tHL\n\tLD\t(HL),#<.MAXACCEL\n4$:\t\t\t\t; Update position\n\tLD\tA,#0x01\n\tLD\t(.mschanged),A\n\tLD\tA,D\n\tAND\t#.UP\t\t; Is UP pressed ?\n\tJR\tZ,6$\n\tLD\tA,(.msy)\n\tCP\t#.MINMSPOSY\n\tJR\tZ,5$\n\tDEC\tA\n\tLD\t(.msy),A\n\tJR\t6$\n5$:\n\tLD\tA,#.MAXMSPOSY\n\tLD\t(.msy),A\n6$:\n\tLD\tA,D\n\tAND\t#.DOWN\t\t; Is DOWN pressed ?\n\tJR\tZ,8$\n\tLD\tA,(.msy)\n\tCP\t#.MAXMSPOSY\n\tJR\tZ,7$\n\tINC\tA\n\tLD\t(.msy),A\n\tJR\t8$\n7$:\n\tLD\tA,#.MINMSPOSY\n\tLD\t(.msy),A\n8$:\n\tLD\tA,D\n\tAND\t#.LEFT\t\t; Is LEFT pressed ?\n\tJR\tZ,10$\n\tLD\tA,(.msx)\n\tCP\t#.MINMSPOSX\n\tJR\tZ,9$\n\tDEC\tA\n\tLD\t(.msx),A\n\tJR\t10$\n9$:\n\tLD\tA,#.MAXMSPOSX\n\tLD\t(.msx),A\n10$:\n\tLD\tA,D\n\tAND\t#.RIGHT\t\t; Is RIGHT pressed ?\n\tJR\tZ,99$\n\tLD\tA,(.msx)\n\tCP\t#.MAXMSPOSX\n\tJR\tZ,11$\n\tINC\tA\n\tLD\t(.msx),A\n\tJR\t99$\n11$:\n\tLD\tA,#.MINMSPOSX\n\tLD\t(.msx),A\n99$:\n\tPOP\tHL\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n.update_mouse:\n\tLD\tA,(.mschanged)\t; Did it change ?\n\tOR\tA\n\tRET\tZ\t\t; No\n.set_mouse:\n\tPUSH\tBC\n\tPUSH\tDE\n\tPUSH\tHL\n\tLD\tC,#0x00\t\t; Sprite 0x00\n\tLD\tA,(.msx)\n\tSLA\tA\t\t; A = A * 8\n\tSLA\tA\n\tSLA\tA\n\tADD\t#.MSOFFSETX\n\tLD\tD,A\n\tLD\tA,(.msy)\n\tSLA\tA\t\t; A = A * 8\n\tSLA\tA\n\tSLA\tA\n\tADD\t#.MSOFFSETY\n\tLD\tE,A\n\tCALL\t.mv_sprite\n\tPOP\tHL\n\tPOP\tDE\n\tPOP\tBC\n\tRET\n\n_getchar::\t\t\t; Banked\n\tLD\tA,(.mode)\n\tCP\t#.T_MODE_INOUT\n\tJR\tZ,1$\n\tPUSH\tBC\n\tCALL\t.tmode_inout\n\tPOP\tBC\n1$:\n\tCALL\t.get_char\n\tLD\tE,A\n\tRET\n\n_gets::\t\t\t\t; Banked\n\tLD\tA,(.mode)\n\tCP\t#.T_MODE_INOUT\n\tJR\tZ,1$\n\tPUSH\tBC\n\tCALL\t.tmode_inout\n\tPOP\tBC\n1$:\n\tLDA\tHL,.BANKOV(SP)\t; Skip return address\n\tLD\tA,(HL+)\n\tLD\tH,(HL)\t\t; HL = s\n\tLD\tL,A\n\tPUSH\tHL\n\tCALL\t.get_string\n\tPOP\tDE\n\tRET\n\n\t;; PENDING: this is unfortunate.  Refed from .tmode_inout\n\t.area\t_BASE\n.tp1:\n\n.pointers:\n\n\t; Tile 0x00\n\t.byte\t0xFF,0xFF,0xFE,0x82,0xFC,0x84,0xFC,0x84,0xFE,0x82,0xFF,0xB1,0xCF,0xC9,0x87,0x87\n\n.endtp1:\n\n.frame_tiles:\n\t.byte\t0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1D\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F\n\t.byte\t0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1F\n\n.kbdtable:\n\t;; This is unfortunate.  astorgb and rgbasm cant interpert:\n\t;;\t.ascii\t\" !\\\"#$%&'()*+,-./\"\n\t;; so we have to use the hex form here.\n\t.db\t0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27\n\t.db\t0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F\n\t.ascii\t\"0123456789:\"\n\t;; astorgb recognises the embedded ; as a comment :)\n\t.db\t0x3B\t\t\n\t.ascii\t\"<=>?\"\n\t.ascii\t\"@ABCDEFGHIJKLMNO\"\n\t.ascii\t\"PQRSTUVWXYZ[\\\\]^_\"\n\t.ascii\t\"`abcdefghijklmno\"\n\t.ascii\t\"pqrstuvwxyz\\{\\|\\}~ \"\n"
  },
  {
    "path": "libc/mv_bkg.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_move_bkg::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tLD\tA,(HL+)\n\tLDH\t(.SCX),A\n\tLD\tA,(HL+)\n\tLDH\t(.SCY),A\n2$:\n\tRET\n"
  },
  {
    "path": "libc/mv_spr.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n\t;; Move sprite number C at XY = DE\n.mv_sprite::\n\tLD\tHL,#.OAM\t; Calculate origin of sprite info\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,E\t\t; Set Y\n\tLD\t(HL+),A\n\n\tLD\tA,D\t\t; Set X\n\tLD\t(HL+),A\n\tRET\n\n_move_sprite::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\tINC\tHL\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\n\tCALL\t.mv_sprite\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/mv_win.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_move_win::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tLD\tA,(HL+)\n\tLDH\t(.WX),A\n\tLD\tA,(HL+)\n\tLDH\t(.WY),A\n\tRET\n"
  },
  {
    "path": "libc/pad.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n\t;; Wait until all buttons have been released\n.padup::\n_waitpadup::\n\tPUSH\tAF\t\t; Save modified registers\n\tPUSH\tBC\n1$:\n\tLD\tB,#0xFF\n2$:\n\tCALL\t.jpad\n\tOR\tA\t\t; Have all buttons been released?\n\tJR\tNZ,1$\t\t; Not yet\n\n\tDEC\tB\n\tJR\tNZ,2$\n\tPOP\tBC\t\t; Restore registers\n\tPOP\tAF\n\tRET\n\n\t;; Get Keypad Button Status\n\t;; The following bits are set if pressed:\n\t;;   0x80 - Start   0x08 - Down\n\t;;   0x40 - Select  0x04 - Up\n\t;;   0x20 - B\t    0x02 - Left\n\t;;   0x10 - A\t    0x01 - Right\n.jpad::\n\tPUSH\tBC\t\t; Save modified registers\n\tLD\tA,#0x20\n\tLDH\t(.P1),A\t\t; Turn on P15\n\n\tLDH\tA,(.P1)\t\t; Delay\n\tLDH\tA,(.P1)\n\tCPL\n\tAND\t#0x0F\n\tSWAP\tA\n\tLD\tB,A\n\tLD\tA,#0x10\n\tLDH\t(.P1),A\t\t; Turn on P14\n\tLDH\tA,(.P1)\t\t; Delay\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tCPL\n\tAND\t#0x0F\n\tOR\tB\n\tSWAP\tA\n\tLD\tB,A\n\tLD\tA,#0x30\n\tLDH\t(.P1),A\t\t; Turn off P14 and P15 (reset joypad)\n\tLD\tA,B\n\tPOP\tBC\t\t; Restore registers\n\tRET\n\n\t;; Wait for the key in B to be pressed\n.wait_pad::\n1$:\n\tCALL\t.jpad\t\t; Read pad\n\tAND\tB\t\t; Compare with mask?\n\tJR\tZ,1$\t\t; Loop if no intersection\n\tRET\n\n_joypad::\n\tCALL\t.jpad\n\tLD\tE,A\t\t; Return result in DE\n\tRET\n\n_waitpad::\n\tPUSH\tBC\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\n\tCALL\t.wait_pad\n\tLD\tE,A\t\t; Return result in DE\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/rand.s",
    "content": ";/***************************************************************************\n; *                                                                         *\n; * Module  : rand.s                                                        *\n; *                                                                         *\n; * Purpose : A rand() generator using the linear congruential method       *\n; *                                                                         *\n; * Version : 1.01, January 7 1998                                          *\n; *             Added _initrand to set seed without recompiling             *\n; *           1, January 6 1998                                             *\n; *                                                                         *\n; * Author  : Luc Van den Borre ( Homepage : NOC.BASE.ORG )                 *\n; *                                                                         *\n; **************************************************************************/\n\n\t;; BANKED:\tchecked\n\t\n\t;; Why use an algorithm for generating random numbers?\n\t;;\n\t;; - Given a certain seed value, the same sequence of random numbers is generated\n\t;;   every time. This is a good thing when debugging (reproducible). On the other\n\t;;   hand, you've got 2^16 seed values, each of which will produce a sequence of\n\t;;   numbers that stays different for any of the other sequences for 'an appreciable\n\t;;   time.' (I can't say how long exactly.)\n\t;;\n\t;; - The linear congruential method is one of the 'best' random number generators\n\t;;   around. However, this implementation uses a 16 bit accumulator, while at least\n\t;;   32 bits are needed for a generator that passes all the statistical tests.\n\t;;   Still, I'm relatively confident that this is random enough for even the most\n\t;;   demanding game.\n\t;;\n\t;;   Compare this to getting random values from one of the hardware registers\n\t;;   (not reproducible, might not have all values). An array might be the best bet\n\t;;   if you don't need a lot of values (or have lots of memory spare),\n\t;;   or if you want values to be within a certain range.\n\t;;   And both would be faster than this. Also, this definitely isn't the fastest\n\t;;   algorithm I know, and certainly for games less strict algorithms might be\n\t;;   appropriate (shift and xor ?).\n\t;;   It's your choice - but if you're doing Monte Carlo physics simulations on the\n\t;;   GameBoy, this is a safe bet!\n\n\t.include\t\"global.s\"\n\n\t.area\t_BSS\n.randhi::\t\t\t; Storage for last random number (or seed)\n\t.ds\t0x01\n.randlo::\n\t.ds\t0x01\n\n\t.area\t_CODE\n\n\t;; Random number generator using the linear congruential method\n\t;;  X(n+1) = (a*X(n)+c) mod m\n\t;; with a = 17, m = 16 and c = $5c93 (arbitrarily)\n\t;; The seed value is also chosen arbitrarily as $a27e\n\t;; Ref : D. E. Knuth, \"The Art of Computer Programming\" , Volume 2\n\t;;\n\t;; Exit conditions\n\t;;   DE = Random number [0,2^16-1]\n\t;;\n\t;; Registers used:\n\t;;   A, HL (need not be saved) and DE (return register)\n\t;;\n\n__rand::\t\t\t; Banked\n__randw::\t\t\t; Banked\n\tLD\tA,(.randlo)\n\tLD\tL,A\n\tLD\tE,A\t\t; Save randlo\n\tLD\tA,(.randhi)\n\tLD\tD,A\t\t; Save randhi\n\n\tSLA\tL\t\t; * 16\n\tRLA\n\tSLA\tL\n\tRLA\n\tSLA\tL\n\tRLA\n\tSLA\tL\n\tRLA\n\tLD\tH,A\t\t; Save randhi*16\n\n\tLD\tA,E\t\t; Old randlo\n\tADD\tA,L\t\t; Add randlo*16\n\tLD\tL,A\t\t; Save randlo*17\n\n\tLD\tA,H\t\t; randhi*16\n\tADC\tA,D\t\t; Add old randhi\n\tLD\tH,A\t\t; Save randhi*17\n\n\tLD\tA,L\t\t; randlo*17\n\tADD\tA,#0x93\n\tLD\t(.randlo),A\n\tLD\tD,A\t\t; Return register\n\tLD\tA,H\t\t; randhi*17\n\tADC\tA,#0x5c\n\tLD\t(.randhi),A\n\tLD\tE,A\t\t; Return register\n\n\t;; Note D is the low byte,E the high byte. This is intentional because\n\t;; the high byte can be slightly 'more random' than the low byte, and I presume\n\t;; most will cast the return value to a UBYTE. As if someone will use this, tha!\n\tRET\n\n\t;; This sets the seed value. Call it whenever you like\n\t;;\n\t;; Exit conditions\n\t;;   None\n\t;;\n\t;; Registers used:\n\t;;   A, HL (need not be saved) and DE (return register)\n\t;;\n\t.area\t_BASE\n_initrand::\t\t\t; Non banked\n\tLDA\tHL,2(SP)\n.initrand::\n\tLD\tA,(HL+)\n\tLD\t(.randlo),A\n\tLD\tA,(HL)\n\tLD\t(.randhi),A\n\tRET\n"
  },
  {
    "path": "libc/sample.s",
    "content": "\t.include \"global.s\"\n\n\t;; BANKED:\tchecked\n\t.title \"Sound sample player\"\n\t.module Sample\n\n\t.area\t_BASE\n\t.AUD3WAVERAM = 0xff30\n\n_play_sample::\n  push bc\n  lda hl,4(sp)\n  ld a,(hl+)\n  ld d,(hl)\n  ld e,a\n\n  lda hl,6(sp)\n  ld a,(hl+)\n  ld b,(hl)\n  ld c,a\n\n  ld h,d\n  ld l,e\n\n  call .play_sample\n  pop bc\n  ret\n\n; Playback raw sound sample with length BC from HL at 8192Hz rate.\n; BC defines the length of the sample in samples/32 or bytes/16.\n; The format of the data is unsigned 4-bit samples,\n; 2 samples per byte, upper 4-bits played before lower 4 bits.\n;\n; Adaption for GBDK by Lars Malmborg.\n; Original code by Jeff Frohwein.\n\n.play_sample::\n  ld  a,#0x84\n  ldh (.NR52),a       ;enable sound 3\n\n  ld a,#0\n  ldh (.NR30),a\n  ldh (.NR51),a\n\n  ld a,#0x77\n  ldh (.NR50),a       ;select speakers\n  ld a,#0xff\n  ldh (.NR51),a       ;enable sound 3\n\n  ld a,#0x80\n  ldh (.NR31),a       ;sound length\n  ld a,#0x20\n  ldh (.NR32),a       ;sound level high\n\n  ld a,#0x00\n  ldh (.NR33),a       ;sound freq low\n\n.samp2:\n  ld de,#.AUD3WAVERAM ;12\n  push bc             ;16\n  ld b,#16            ;16\n\n  xor a\n  ldh (.NR30),a\n.samp3:\n  ld a,(hl+)          ;8\n  ld (de),a           ;8\n  inc de              ;8\n  dec b               ;4\n  jr nz,.samp3        ;12\n\n  ld a,#0x80\n  ldh (.NR30),a\n\n  ld a,#0x87          ; (256hz)\n  ldh (.NR34),a\n\n  ld bc,#558          ;delay routine\n.samp4:\n  dec bc              ;8\n  ld a,b              ;4\n  or c                ;4\n  jr nz,.samp4        ;12\n\n  ld a,#0             ;more delay\n  ld a,#0\n  ld a,#0\n\n  pop bc              ;12\n  dec bc              ;8\n  ld a,b              ;4\n  or c                ;4\n  jr nz,.samp2        ;12\n\n  ld a,#0xbb\n  ldh (.NR51),a       ;disable sound 3\n  ret\n"
  },
  {
    "path": "libc/scroll_b.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n_scroll_bkg::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tXOR\tA\n\tCP\t(HL)\t\t; Is x != 0\n\tJR\tZ,1$\n\n\tLDH\tA,(.SCX)\t; Yes\n\tADD\t(HL)\n\tLDH\t(.SCX),A\n1$:\n\tINC\tHL\n\tXOR\tA\n\tCP\t(HL)\t\t; Is y != 0\n\tJR\tZ,2$\n\n\tLDH\tA,(.SCY)\t; Yes\n\tADD\t(HL)\n\tLDH\t(.SCY),A\n2$:\n\tRET\n"
  },
  {
    "path": "libc/scroll_s.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Move sprite number C at XY = DE\n.scroll_sprite::\n\tLD\tHL,#.OAM\t; Calculate origin of sprite info\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,(HL)\n\tADD\tE\t\t; Set Y\n\tLD\t(HL+),A\n\n\tLD\tA,(HL)\n\tADD\tD\t\t; Set X\n\tLD\t(HL+),A\n\tRET\n\n_scroll_sprite::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\tINC\tHL\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\n\tCALL\t.scroll_sprite\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/scroll_w.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n_scroll_win::\n\tLDA\tHL,2(SP)\t; Skip return address\n\tXOR\tA\n\tCP\t(HL)\t\t; Is x != 0\n\tJR\tZ,1$\n\n\tLDH\tA,(.WX)\t\t; Yes\n\tADD\t(HL)\n\tLDH\t(.WX),A\n1$:\n\tINC\tHL\n\tXOR\tA\n\tCP\t(HL)\t\t; Is y != 0\n\tJR\tZ,2$\n\n\tLDH\tA,(.WY)\t\t; Yes\n\tADD\t(HL)\n\tLDH\t(.WY),A\n2$:\n\tRET\n"
  },
  {
    "path": "libc/serial.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked\n\t.area\t_CODE\n\n\t;; Send byte in __io_out to the serial port\n.send_byte:\n_send_byte::\t\t\t; Banked\n\tLD\tA,#.IO_SENDING\n\tLD\t(__io_status),A ; Store status\n\tLD\tA,#0x01\n\tLDH\t(.SC),A\t\t; Use internal clock\n\tLD\tA,(__io_out)\n\tLDH\t(.SB),A\t\t; Send data byte\n\tLD\tA,#0x81\n\tLDH\t(.SC),A\t\t; Use internal clock\n\tRET\n\n\t;; Receive byte from the serial port in __io_in\n.receive_byte:\n_receive_byte::\t\t\t; Banked\n\tLD\tA,#.IO_RECEIVING\n\tLD\t(__io_status),A ; Store status\n\tXOR\tA\n\tLDH\t(.SC),A\t\t; Use external clock\n\tLD\tA,#.DT_RECEIVING\n\tLDH\t(.SB),A\t\t; Send RECEIVING byte\n\tLD\tA,#0x80\n\tLDH\t(.SC),A\t\t; Use external clock\n\tRET\n"
  },
  {
    "path": "libc/set_bk_t.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.set_xy_btt\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_set_bkg_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tLDA\tHL,9(SP)\n\tLD\tB,(HL)\t\t; BC = tiles\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; A = h\n\tLD\tH,(HL)\t\t; H = w\n\tLD\tL,A\t\t; L = h\n\n\tCALL\t.set_xy_btt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/set_data.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.copy_vram\n\n\t;; BANKED:\tchecked\n\t.area\t_BASE\n\n_set_bkg_data::\n_set_win_data::\n\tLDH\tA,(.LCDC)\n\tBIT\t4,A\n\tJP\tNZ,_set_sprite_data\n\n\tPUSH\tBC\n\n\tLDA\tHL,7(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = nb_tiles\n\tDEC\tHL\n\tLD\tL,(HL)\t\t; L = first_tile\n\tPUSH\tHL\n\n\tXOR\tA\n\tOR\tE\t\t; Is nb_tiles == 0?\n\tJR\tNZ,1$\n\tLD\tDE,#0x1000\t; DE = nb_tiles = 256\n\tJR\t2$\n1$:\n\tLD\tH,#0x00\t\t; HL = nb_tiles\n\tLD\tL,E\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tLD\tD,H\t\t; DE = nb_tiles\n\tLD\tE,L\n2$:\n\tPOP\tHL\t\t; HL = first_tile\n\tLD\tA,L\n\tRLCA\t\t\t; Sign extend (patterns have signed numbers)\n\tSBC\tA\n\tLD\tH,A\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\n\tPUSH\tBC\n\tLD\tBC,#0x9000\n\tADD\tHL,BC\n\tPOP\tBC\n\n3$:\t\t\t\t; Special version of '.copy_vram'\n\tBIT\t3,H\t\t; Bigger than 0x9800\n\tJR\tZ,4$\n\tBIT\t4,H\n\tJR\tZ,4$\n\tRES\t4,H\t\t; Switch to 0x8800\n4$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,4$\n\n\tLD\tA,(BC)\n\tLD\t(HL+),A\n\tINC\tBC\n\tDEC\tDE\n\tLD\tA,D\n\tOR\tE\n\tJR\tNZ,3$\n\n\tPOP\tBC\n\tRET\n\n_set_sprite_data::\n\tPUSH\tBC\n\n\tLDA\tHL,7(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = data\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tE,(HL)\t\t; E = nb_tiles\n\tDEC\tHL\n\tLD\tL,(HL)\t\t; L = first_tile\n\tPUSH\tHL\n\n\tXOR\tA\n\tOR\tE\t\t; Is nb_tiles == 0?\n\tJR\tNZ,1$\n\tLD\tDE,#0x1000\t; DE = nb_tiles = 256\n\tJR\t2$\n1$:\n\tLD\tH,#0x00\t\t; HL = nb_tiles\n\tLD\tL,E\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tLD\tD,H\t\t; DE = nb_tiles\n\tLD\tE,L\n2$:\n\tPOP\tHL\t\t; HL = first_tile\n\tLD\tH,#0x00\n\tADD\tHL,HL\t\t; HL *= 16\n\tADD\tHL,HL\n\tADD\tHL,HL\n\tADD\tHL,HL\n\n\tPUSH\tBC\n\tLD\tBC,#0x8000\n\tADD\tHL,BC\n\tPOP\tBC\n\n\tCALL\t.copy_vram\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/set_prop.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Set properties of sprite number C to D\n.set_sprite_prop::\n\tLD\tHL,#.OAM+3\t; Calculate origin of sprite info\n\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,D\t\t; Set sprite properties\n\tLD\t(HL),A\n\tRET\n\n_set_sprite_prop::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\tINC\tHL\n\tLD\tD,(HL)\t\t; D = prop\n\n\tCALL\t.set_sprite_prop\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/set_spr.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Set sprite number C to tile D\n.set_sprite_tile::\n\tLD\tHL,#.OAM+2\t; Calculate origin of sprite info\n\n\tSLA\tC\t\t; Multiply C by 4\n\tSLA\tC\n\tLD\tB,#0x00\n\tADD\tHL,BC\n\n\tLD\tA,D\t\t; Set sprite number\n\tLD\t(HL),A\n\tRET\n\n_set_sprite_tile::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tC,(HL)\t\t; C = nb\n\tINC\tHL\n\tLD\tD,(HL)\t\t; D = tile\n\n\tCALL\t.set_sprite_tile\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/set_wi_t.s",
    "content": "\t.include\t\"global.s\"\n\n\t.globl\t.set_xy_wtt\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n_set_win_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tLDA\tHL,9(SP)\n\tLD\tB,(HL)\t\t; BC = tiles\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tA,(HL-)\t\t; A = h\n\tLD\tH,(HL)\t\t; H = w\n\tLD\tL,A\t\t; L = h\n\n\tCALL\t.set_xy_wtt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/set_xy_t.s",
    "content": "\t.include\t\"global.s\"\n\n\t;; BANKED:\tchecked, imperfect\n\t.area\t_BASE\n\n\t;; Set window tile table from BC at XY = DE of size WH = HL\n\t;; wh >= (1,1)\n.set_xy_wtt::\n\tPUSH\tHL\t\t; Store WH\n\tLDH\tA,(.LCDC)\n\tBIT\t6,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.set_xy_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n\tJR\t.set_xy_tt\n\t;; Set background tile table from (BC) at XY = DE of size WH = HL\n\t;; WH >= (1,1)\n.set_xy_btt::\n\tPUSH\tHL\t\t; Store WH\n\tLDH\tA,(.LCDC)\n\tBIT\t3,A\n\tJR\tNZ,1$\n\tLD\tHL,#0x9800\t; HL = origin\n\tJR\t.set_xy_tt\n1$:\n\tLD\tHL,#0x9C00\t; HL = origin\n;\tJR\t.set_xy_tt\n\n.set_xy_tt::\n\tPUSH\tBC\t\t; Store source\n\tXOR\tA\n\tOR\tE\n\tJR\tZ,2$\n\n\tLD\tBC,#0x20\t; One line is 20 tiles\n1$:\n\tADD\tHL,BC\t\t; Y coordinate\n\tDEC\tE\n\tJR\tNZ,1$\n2$:\n\tLD\tB,#0x00\t\t; X coordinate\n\tLD\tC,D\n\tADD\tHL,BC\n\n\tPOP\tBC\t\t; BC = source\n\tPOP\tDE\t\t; DE = WH\n\tPUSH\tHL\t\t; Store origin\n\tPUSH\tDE\t\t; Store WH\n3$:\n\tLDH\tA,(.STAT)\n\tAND\t#0x02\n\tJR\tNZ,3$\n\n\tLD\tA,(BC)\t\t; Copy W tiles\n\tLD\t(HL+),A\n\tINC\tBC\n\tDEC\tD\n\tJR\tNZ,3$\n\tPOP\tHL\t\t; HL = WH\n\tLD\tD,H\t\t; Restore D = W\n\tPOP\tHL\t\t; HL = origin\n\tDEC\tE\n\tJR\tZ,4$\n\n\tPUSH\tBC\t\t; Next line\n\tLD\tBC,#0x20\t; One line is 20 tiles\n\tADD\tHL,BC\n\tPOP\tBC\n\n\tPUSH\tHL\t\t; Store current origin\n\tPUSH\tDE\t\t; Store WH\n\tJR\t3$\n4$:\n\tRET\n\n_set_tiles::\n\tPUSH\tBC\n\n\tLDA\tHL,11(SP)\t; Skip return address and registers\n\tLD\tB,(HL)\t\t; BC = src\n\tDEC\tHL\n\tLD\tC,(HL)\n\tDEC\tHL\n\tLD\tD,(HL)\t\t; DE = dst\n\tDEC\tHL\n\tLD\tE,(HL)\n\tLDA\tHL,4(SP)\t; Skip return address and registers\n\tPUSH\tDE\t\t; Store address on stack for set_xy_tt\n\tLD\tD,(HL)\t\t; D = x\n\tINC\tHL\n\tLD\tE,(HL)\t\t; E = y\n\tINC\tHL\n\tLD\tA,(HL+)\t\t; A = w\n\tLD\tL,(HL)\t\t; L = h\n\tLD\tH,A\t\t; H = w\n\n\tCALL\t.set_xy_tt\n\n\tPOP\tBC\n\tRET\n"
  },
  {
    "path": "libc/sfr.s",
    "content": "\t.area\t_SFR (ABS)\n\n\t.org\t0xFF00\n_P1_REG::\t; Joystick: 1.1.P15.P14.P13.P12.P11.P10 */ \n\t.ds\t1\n\t.org\t0xFF01\n_SB_REG::\t; Serial IO data buffer */\n\t.ds\t1\n\t.org\t0xFF02\n_SC_REG::\t; Serial IO control register */\n\t.ds\t1\n\t.org\t0xFF04\n_DIV_REG::\t; Divider register */\n\t.ds\t1\n\t.org\t0xFF05\n_TIMA_REG::\t; Timer counter */\n\t.ds\t1\n\t.org\t0xFF06\n_TMA_REG::\t; Timer modulo */\n\t.ds\t1\n\t.org\t0xFF07\n_TAC_REG::\t; Timer control */\n\t.ds\t1\n\t.org\t0xFF0F\n_IF_REG::\t; Interrupt flags: 0.0.0.JOY.SIO.TIM.LCD.VBL */ \n\t.ds\t1\n\t.org\t0xFF10\n_NR10_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF11\n_NR11_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF12\n_NR12_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF13\n_NR13_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF14\n_NR14_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF16\n_NR21_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF17\n_NR22_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF18\n_NR23_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF19\n_NR24_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF1A\n_NR30_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF1B\n_NR31_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF1C\n_NR32_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF1D\n_NR33_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF1E\n_NR34_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF20\n_NR41_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF21\n_NR42_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF22\n_NR43_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF23\n_NR44_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF24\n_NR50_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF25\n_NR51_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF26\n_NR52_REG::\t; Sound register */\n\t.ds\t1\n\t.org\t0xFF40\n_LCDC_REG::\t; LCD control */\n\t.ds\t1\n\t.org\t0xFF41\n_STAT_REG::\t; LCD status */\n\t.ds\t1\n\t.org\t0xFF42\n_SCY_REG::\t; Scroll Y */\n\t.ds\t1\n\t.org\t0xFF43\n_SCX_REG::\t; Scroll X */\n\t.ds\t1\n\t.org\t0xFF44\n_LY_REG::\t; LCDC Y-coordinate */\n\t.ds\t1\n\t.org\t0xFF45\n_LYC_REG::\t; LY compare */\n\t.ds\t1\n\t.org\t0xFF46\n_DMA_REG::\t; DMA transfer */\n\t.ds\t1\n\t.org\t0xFF47\n_BGP_REG::\t; BG palette data */\n\t.ds\t1\n\t.org\t0xFF48\n_OBP0_REG::\t; OBJ palette 0 data */\n\t.ds\t1\n\t.org\t0xFF49\n_OBP1_REG::\t; OBJ palette 1 data */\n\t.ds\t1\n\t.org\t0xFF4A\n_WY_REG::\t; Window Y coordinate */\n\t.ds\t1\n\t.org\t0xFF4B\n_WX_REG::\t; Window X coordinate */\n\t.ds\t1\n\t.org\t0xFF4D\n_KEY1_REG::\t; CPU speed */\n\t.ds\t1\n\t.org\t0xFF4F\n_VBK_REG::\t; VRAM bank */\n\t.ds\t1\n\t.org\t0xFF51\n_HDMA1_REG::\t; DMA control 1 */\n\t.ds\t1\n\t.org\t0xFF52\n_HDMA2_REG::\t; DMA control 2 */\n\t.ds\t1\n\t.org\t0xFF53\n_HDMA3_REG::\t; DMA control 3 */\n\t.ds\t1\n\t.org\t0xFF54\n_HDMA4_REG::\t; DMA control 4 */\n\t.ds\t1\n\t.org\t0xFF55\n_HDMA5_REG::\t; DMA control 5 */\n\t.ds\t1\n\t.org\t0xFF56\n_RP_REG::\t; IR port */\n\t.ds\t1\n\t.org\t0xFF68\n_BCPS_REG::\t; BG color palette specification */ \n\t.ds\t1\n\t.org\t0xFF69\n_BCPD_REG::\t; BG color palette data */\n\t.ds\t1\n\t.org\t0xFF6A\n_OCPS_REG::\t; OBJ color palette specification */ \n\t.ds\t1\n\t.org\t0xFF6B\n_OCPD_REG::\t; OBJ color palette data \n\t.ds\t1\n\t.org\t0xFF70\n_SVBK_REG::\t; WRAM bank */\n\t.ds\t1\n\t.org\t0xFFFF\n_IE_REG::\t; Interrupt enable */ \n\t.ds\t1"
  },
  {
    "path": "libc/sgb.s",
    "content": "\t.include        \"global.s\"\n\n\t.PAL_01\t\t= 0x00\n\t.PAL_23\t\t= 0x01\n\t.PAL_03\t\t= 0x02\n\t.PAL_12\t\t= 0x03\n\t.ATTR_BLK\t= 0x04\n\t.ATTR_LIN\t= 0x05\n\t.ATTR_DIV\t= 0x06\n\t.ATTR_CHR\t= 0x07\n\t.SOUND\t\t= 0x08\n\t.SOU_TRN\t= 0x09\n\t.PAL_SET\t= 0x0A\n\t.PAL_TRN\t= 0x0B\n\t.ATRC_EN\t= 0x0C\n\t.TEST_EN\t= 0x0D\n\t.ICON_EN\t= 0x0E\n\t.DATA_SND\t= 0x0F\n\t.DATA_TRN\t= 0x10\n\t.MLT_REQ\t= 0x11\n\t.JUMP\t\t= 0x12\n\t.CHR_TRN\t= 0x13\n\t.PCT_TRN\t= 0x14\n\t.ATTR_TRN\t= 0x15\n\t.ATTR_SET\t= 0x16\n\t.MASK_EN\t= 0x17\n\t.OBJ_TRN\t= 0x18\n\n\t.area   _CODE\n\n\t;; Check if running on SGB\n\t;;   Set A to 0xFF when running on SGB\n\t;;   Clear A when running on DMG\n.sgb_check::\n_sgb_check::\t\t\t; Banked\n\tLD\tHL,#.MLT_REQ_2\n\tCALL\t.sgb_transfer\n\tCALL\t.wait4\n\tLDH\tA,(.P1)\n\tAND\t#0x03\n\tCP\t#0x03\n\tJR\tNZ,.sgb_mode\n\n\tLD\tA,#0x20\t\t; Controller read (dummy)\n\tLDH\t(.P1),A\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tCPL\n\tAND\t#0x0F\n\tSWAP\tA\n\tLD\tB,A\n\tLD\tA,#0x30\n\tLDH\t(.P1),A\n\tLD\tA,#0x10\n\tLDH\t(.P1),A\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLDH\tA,(.P1)\n\tLD\tA,#0x30\n\tLDH\t(.P1),A\n\tLDH\t A,(.P1)\n\tAND\t#0x03\n\tCP\t#0x03\n\tJR\tNZ,.sgb_mode\n\n.dmg_mode:\n;\tLD\tHL,#.MLT_REQ_1\n;\tCALL\t.sgb_transfer\n;\tCALL\t.wait4\n\tXOR\tA\n\tRET\n\n.sgb_mode:\n\tLD\tHL,#.MLT_REQ_1\n\tCALL\t.sgb_transfer\n\tCALL\t.wait4\n\tLD\tA,#0xFF\n\tRET\n\n.sgb_transfer::\n\tLD\tA,(HL)\t\t; Top of command data\n\tAND\t#0x03\n\tRET\tZ\n\tLD\tB,A\t\t; Number of translated packet\n\tLD\tC,#0x00\t\t; Lower part of #FF00\n1$:\n\tPUSH\tBC\n\tXOR\tA\t\t; Start to write\n\tLDH\t(C),A\n\tLD\tA,#0x30\n\tLDH\t(C),A\n\tLD\tB,#0x10\t\t; Set counter to transfer 16 byte\n2$:\tLD\tE,#0x08\t\t; Set counter to transfer 8 bit\n\tLD\tA,(HL+)\n\tLD\tD,A\n\n3$:\n\tBIT\t0,D\n\tLD\tA,#0x10\t\t; P14 = high, P15 = low  (output \"1\")\n\tJR\tNZ,4$\n\tLD\tA,#0x20\t\t; P14 = low,  P15 = high (output \"0\")\n4$:\n\tLDH\t(C),A\n\tLD\tA,#0x30\t\t; P14 = high, P15 = high\n\tLDH\t(C),A\n\tRR\tD\t\t; Shift 1 bit to right\n\tDEC\tE\n\tJR\tNZ,3$\n\n\tDEC\tB\n\tJR\tNZ,2$\n\tLD\tA,#0x20\t\t; 129th bit \"0\" output\n\tLDH\t(C),A\n\tLD\tA,#0x30\n\tLDH\t(C),A\n\n\tPOP\tBC\n\tDEC\tB\n\tRET\tZ\n\tCALL\t.wait4\t\t; Software wait for about 4 frames\n\tJR\t1$\n\n.wait4:\n\tLD\tDE,#7000\n1$:\n\tNOP\t\t\t; 1 +\n\tNOP\t\t\t; 1 +\n\tNOP\t\t\t; 1 +\n\tDEC\tDE\t\t; 2 +\n\tLD\tA,D\t\t; 1 +\n\tOR\tE\t\t; 1 +\n\tJR\tNZ,1$\t\t; 3 = 10 cycles\n\tRET\n\n.MLT_REQ_1:\n\t.byte\t.MLT_REQ*8|1,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n.MLT_REQ_2:\n\t.byte\t.MLT_REQ*8|1,0x01,0x00,0x00,0x00,0x00,0x00,0x00\n\t.byte\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\n"
  },
  {
    "path": "libc/stubs.rasm",
    "content": "\tGLOBAL \tSTACK\n\tGLOBAL \tOAM\n\tGLOBAL\trefresh_OAM\n\n\tSECTION \"stubs_1\", BSS[$C000]\nOAM:\n\tDS\t$A0\n\tSECTION \"stubs_2\", HRAM[$FF80]\nrefresh_OAM:\n\tSECTION \"stubs_4\", BSS[$E000]\nSTACK:\n"
  }
]