Repository: Fabrizio-Caruso/CROSS-LIB
Branch: master
Commit: cb85d0590332
Files: 8180
Total size: 45.1 MB
Directory structure:
gitextract_v60rhtgp/
├── .devcontainer/
│ ├── devcontainer.json
│ └── post-start.sh
├── .gitignore
├── README.md
├── cfg/
│ ├── ___empty.cfg
│ └── default.cfg
├── docs/
│ ├── ARCHITECTURES.md
│ ├── Alice32k.txt
│ ├── BUILD.md
│ ├── BUILD_PROCESS.md
│ ├── COMPILERS.md
│ ├── COMPILER_NAMES.md
│ ├── CREDITS.txt
│ ├── CROSSLIB.md
│ ├── CROSS_LIB_APIS.md
│ ├── CROSS_LIB_APIS.txt
│ ├── CX16.txt
│ ├── Creativision_binary_structure.txt
│ ├── CrossLib.odp
│ ├── DISCLAIMER.md
│ ├── EnglishArticle.md
│ ├── FEATURE_STATUS.ods
│ ├── GAMES.md
│ ├── GIOCHI.md
│ ├── HARDWARE_AGNOSTIC_CODE.md
│ ├── HOW_TO_ADD_A_NEW_GAME.md
│ ├── HOW_TO_ADD_NEW_TARGET.txt
│ ├── HOW_TO_INSTALL_COMPILERS.txt
│ ├── HOW_TO_LOAD.md
│ ├── HOW_TO_LOAD_THE_GAME.md
│ ├── HOW_TO_LOAD_THE_GAME_ON_REAL_HARDWARE.md
│ ├── INSTALL.md
│ ├── LICENCE.txt
│ ├── LINUX_SETUP.md
│ ├── MSDOS_big_banging.txt
│ ├── PREREQUISITES.md
│ ├── PRESENTAZIONE_ITA/
│ │ ├── Documenti_on_line.txt
│ │ └── Giochi/
│ │ ├── EMULATORI_DA_USARE.txt
│ │ ├── xbomber/
│ │ │ ├── Xbomber_atari_color.xex
│ │ │ └── Xbomber_gamegear.gg
│ │ └── xsnake/
│ │ ├── Xsnake_gb.gb
│ │ └── Xsnake_sms.sms
│ ├── SNAPSHOTS.md
│ ├── STATUS.md
│ ├── SUPPORT_FOR_NEW_TARGET.txt
│ ├── SYSTEMS.md
│ ├── TESTS.md
│ ├── THE_GAME.txt
│ ├── TILES.txt
│ ├── TODO.txt
│ ├── VGA_from_protected_mode.txt
│ ├── VZ.txt
│ ├── XL.md
│ ├── alt_conio_fonts.s
│ ├── articles/
│ │ ├── CALL_APPLE/
│ │ │ └── apple2.txt
│ │ ├── CROSS_LIB_PUBLIC.rtf
│ │ ├── CROSS_LIB_PUBLIC_ENG.rtf
│ │ ├── article.txt
│ │ └── articolo_ITA.txt
│ ├── bbc/
│ │ ├── chibiakumas.txt
│ │ └── putchar.txt
│ ├── bbc_sounds/
│ │ ├── bbc.h
│ │ └── bbctest.c
│ ├── compilation_parameters.txt
│ ├── compiler_install.txt
│ ├── conio_macros_vs_functions.txt
│ ├── docker.txt
│ ├── games/
│ │ ├── BOMBER.txt
│ │ ├── CHASE.txt
│ │ ├── HORDE.txt
│ │ ├── SHOOT.txt
│ │ ├── SNAKE.txt
│ │ └── VERBIX.txt
│ ├── generic_tiles.txt
│ ├── hector_sound.txt
│ ├── manual/
│ │ ├── XSize.txt
│ │ ├── YSize.txt
│ │ ├── _XL_CHAR.txt
│ │ ├── _XL_CLEAR_SCREEN.txt
│ │ ├── _XL_DELETE.txt
│ │ ├── _XL_DOWN.txt
│ │ ├── _XL_DRAW.txt
│ │ ├── _XL_EXPLOSION_SOUND.txt
│ │ ├── _XL_FIRE.txt
│ │ ├── _XL_INIT_GRAPHICS.txt
│ │ ├── _XL_INIT_INPUT.txt
│ │ ├── _XL_INIT_SOUND.txt
│ │ ├── _XL_INPUT.txt
│ │ ├── _XL_KEY_PRESSED.txt
│ │ ├── _XL_LEFT.txt
│ │ ├── _XL_PING_SOUND.txt
│ │ ├── _XL_PRINT.txt
│ │ ├── _XL_PRINTD.txt
│ │ ├── _XL_RAND.txt
│ │ ├── _XL_RIGHT.txt
│ │ ├── _XL_SET_TEXT_COLOR.txt
│ │ ├── _XL_SHOOT_SOUND.txt
│ │ ├── _XL_SLEEP.txt
│ │ ├── _XL_SLOW_DOWN.txt
│ │ ├── _XL_TICK_SOUND.txt
│ │ ├── _XL_TOCK_SOUND.txt
│ │ ├── _XL_UP.txt
│ │ ├── _XL_WAIT_FOR_INPUT.txt
│ │ └── _XL_ZAP_SOUND.txt
│ ├── mc10.txt
│ ├── mc10_2.txt
│ ├── mega65.txt
│ ├── presentazione.md
│ ├── presentazione.txt
│ ├── requirements.txt
│ └── zzap_issue.txt
├── logs/
│ └── .gitkeep
├── roms/
│ ├── mame/
│ │ └── .keepthisfile.txt
│ └── vice/
│ ├── c64/
│ │ └── .keepthisfile.txt
│ ├── pet/
│ │ └── .keepthisfile.txt
│ ├── plus4/
│ │ └── .keepthisfile.txt
│ └── vic20/
│ └── .keepthisfile.txt
├── src/
│ ├── Makefile_common
│ ├── assets/
│ │ ├── LoggerSingleton.py
│ │ ├── __init__.py
│ │ ├── copy_assets.py
│ │ ├── examples/
│ │ │ ├── README.txt
│ │ │ ├── single_tiles/
│ │ │ │ ├── tile_shape0.txt
│ │ │ │ └── tile_shape1.txt
│ │ │ └── tile_sets/
│ │ │ ├── asm/
│ │ │ │ ├── 8x6_cidelsa_digits.s
│ │ │ │ ├── 8x6_cidelsa_fonts.s
│ │ │ │ ├── Antiriad_Chars.asm
│ │ │ │ ├── test_vchar-charset.s
│ │ │ │ ├── tile_8x6_shapeA.txt
│ │ │ │ ├── tile_8x6_shapeA_rotated.txt
│ │ │ │ ├── tiles_all.asm
│ │ │ │ ├── tiles_all_2.asm
│ │ │ │ ├── tiles_bin.asm
│ │ │ │ ├── tiles_charPad.asm
│ │ │ │ ├── tiles_magellan.a99
│ │ │ │ └── tiles_magellan_2.a99
│ │ │ └── basic/
│ │ │ ├── test.txt
│ │ │ ├── tiles_atari.bas
│ │ │ ├── tiles_atari_2.bas
│ │ │ ├── tiles_bbc.bas
│ │ │ ├── tiles_cbm.bas
│ │ │ ├── tiles_cbm_10_liner.bas
│ │ │ ├── tiles_cbm_10_liner_2.bas
│ │ │ ├── tiles_cbm_10_liner_3.bas
│ │ │ ├── tiles_cbm_10_liner_4.bas
│ │ │ ├── tiles_cbm_2.bas
│ │ │ ├── tiles_cpc.bas
│ │ │ ├── tiles_msx_headless_hex.bas
│ │ │ ├── tiles_oric.bas
│ │ │ ├── tiles_oric_2.bas
│ │ │ ├── tiles_oric_3.bas
│ │ │ ├── tiles_oric_4.bas
│ │ │ ├── tiles_oric_5.bas
│ │ │ └── tiles_sinclair.bas
│ │ ├── generate_assets.py
│ │ ├── templates/
│ │ │ ├── 4x4/
│ │ │ │ └── 4x4_chars.h.template
│ │ │ ├── 6x8/
│ │ │ │ ├── 6x8_chars.h.template
│ │ │ │ └── z88dk_6x8_pmd85.asm.template
│ │ │ ├── 6x9/
│ │ │ │ └── 6x9_chars.h.template
│ │ │ ├── 7x8/
│ │ │ │ └── 7x8_chars.h.template
│ │ │ ├── 8x6/
│ │ │ │ ├── 8x6_chars.h.template
│ │ │ │ ├── 8x6_tiles.s.template
│ │ │ │ └── z88dk_8x6_sprites_definitions.h.template
│ │ │ └── 8x8/
│ │ │ ├── 8x8_chars.h.template
│ │ │ ├── cc65_agat.s.template
│ │ │ ├── cc65_gamate_tiles.s.template
│ │ │ ├── cc65_nes_color_tiles.s.template
│ │ │ ├── cc65_nes_tiles.s.template
│ │ │ ├── cc65_pce_tiles.s.template
│ │ │ ├── cc65_udc.s.template
│ │ │ ├── cc65_udc_64_chars.s.template
│ │ │ ├── cc65_udc_6chars.s.template
│ │ │ ├── cc65_udc_arcade.s.template
│ │ │ ├── cc65_udc_arcade_64_chars.s.template
│ │ │ ├── cc65_udc_arcade_VIC20.s.template
│ │ │ ├── cc65_udc_arcade_conio.s.template
│ │ │ ├── cc65_udc_arcade_v2.s.template
│ │ │ ├── cc65_udc_atari7800_160A.s.template
│ │ │ ├── cc65_udc_vic20_19_tiles.s.template
│ │ │ ├── cc65_udc_vic20_25_tiles.s.template
│ │ │ ├── cc65_udc_vic20_27_tiles.s.template
│ │ │ ├── cc65_udc_vic20_64_chars.s.template
│ │ │ ├── cmoc_udc_tiles.s.template
│ │ │ ├── cmoc_udc_tiles_and_fonts.s.template
│ │ │ ├── z88dk_cpc_Chars8.asm.template
│ │ │ ├── z88dk_gameboy.asm.template
│ │ │ ├── z88dk_pv1000.asm.template
│ │ │ ├── z88dk_sprites_definitions.h.template
│ │ │ └── z88dk_xchase.asm.template
│ │ └── unit_tests/
│ │ └── testAssets.py
│ ├── config.ini
│ ├── cross_lib/
│ │ ├── boot/
│ │ │ └── multi8/
│ │ │ └── bootstrap.c
│ │ ├── cfg/
│ │ │ ├── cc65/
│ │ │ │ ├── alt/
│ │ │ │ │ ├── vic20-16k.cfg
│ │ │ │ │ ├── vic20-24k.cfg
│ │ │ │ │ ├── vic20-3k.cfg
│ │ │ │ │ ├── vic20-8k.cfg
│ │ │ │ │ ├── vic20-8k_GFX_tight.cfg
│ │ │ │ │ ├── vic20-8k_old_GFX.cfg
│ │ │ │ │ ├── vic20-8k_tight.cfg
│ │ │ │ │ └── vic20_unexpanded.cfg
│ │ │ │ ├── apple2-hgr.cfg
│ │ │ │ ├── apple2enh-hgr.cfg
│ │ │ │ ├── atari5200_redefined_chars.cfg
│ │ │ │ ├── atari5200_redefined_chars_32k.cfg
│ │ │ │ ├── atari7800_more_ram.cfg
│ │ │ │ ├── atari_mode12.cfg
│ │ │ │ ├── atari_mode1_redefined_chars.cfg
│ │ │ │ ├── atarixl_mode12.cfg
│ │ │ │ ├── atmos_better_tap.cfg
│ │ │ │ ├── c16-16k.cfg
│ │ │ │ ├── c16-16k_GFX.cfg
│ │ │ │ ├── c16-16k_GFX_64chars.cfg
│ │ │ │ ├── c16-16k_GFX_64chars_stack_0x30.cfg
│ │ │ │ ├── c16-16k_GFX_64chars_stack_0x30_less_hd_stack.cfg
│ │ │ │ ├── c16-32k.cfg
│ │ │ │ ├── c16-32k_GFX.cfg
│ │ │ │ ├── c16-32k_GFX_64chars.cfg
│ │ │ │ ├── c64_GFXat0xC000.cfg
│ │ │ │ ├── creativision-16k.cfg
│ │ │ │ ├── creativision-16k_2.cfg
│ │ │ │ ├── creativision-16k_less_stack.cfg
│ │ │ │ ├── creativision-18k.cfg
│ │ │ │ ├── creativision-24k.cfg
│ │ │ │ ├── creativision-32k.cfg
│ │ │ │ ├── creativision-32k_alt.cfg
│ │ │ │ ├── creativision-8k.cfg
│ │ │ │ ├── creativision-8k_less_stack.cfg
│ │ │ │ ├── gamate_reduced_stack.cfg
│ │ │ │ ├── gamate_reduced_stack_2.cfg
│ │ │ │ ├── nes_fx.cfg
│ │ │ │ ├── osic1p_less_stack.cfg
│ │ │ │ ├── pce.cfg
│ │ │ │ ├── pce_16k.cfg
│ │ │ │ ├── pce_16k_less_stack.cfg
│ │ │ │ ├── pce_32k.cfg
│ │ │ │ ├── pce_8k_less_stack.cfg
│ │ │ │ ├── pet_8k.cfg
│ │ │ │ ├── plus4_GFX.cfg
│ │ │ │ ├── supervision-16k.cfg
│ │ │ │ ├── supervision-16k_GFX.cfg
│ │ │ │ ├── supervision-16k_GFX_2.cfg
│ │ │ │ ├── supervision-16k_GFX_2_stack_0x1B.cfg
│ │ │ │ ├── supervision-16k_GFX_3.cfg
│ │ │ │ ├── supervision-64k.cfg
│ │ │ │ ├── vic20-16k_CODE2_GFX.cfg
│ │ │ │ ├── vic20-16k_CODE2_GFX_ALT_V2.cfg
│ │ │ │ ├── vic20-16k_CODE2_GFX_V2.cfg
│ │ │ │ ├── vic20-16k_GFX.cfg
│ │ │ │ ├── vic20-3k_GFX.cfg
│ │ │ │ ├── vic20-8k_CODE2_GFX.cfg
│ │ │ │ ├── vic20-8k_CODE2_GFX_V2.cfg
│ │ │ │ ├── vic20-8k_CODE2_GFX_V2_alt.cfg
│ │ │ │ ├── vic20-8k_GFX.cfg
│ │ │ │ ├── vic20-8k_GFX_25_tiles.cfg
│ │ │ │ ├── vic20-8k_GFX_stack_0x1B.cfg
│ │ │ │ ├── vic20-8k_memory_mapped_GFX.cfg
│ │ │ │ ├── vic20-cart.cfg
│ │ │ │ ├── vic20.cfg
│ │ │ │ ├── vic20_unexpanded_gfx.cfg
│ │ │ │ └── vic20_unexpanded_gfx_low_stack.cfg
│ │ │ ├── gcc4ti99/
│ │ │ │ └── linkfile.cfg
│ │ │ ├── vbcc/
│ │ │ │ └── bbc/
│ │ │ │ ├── bbc
│ │ │ │ ├── bbc2
│ │ │ │ ├── bbc2_posix
│ │ │ │ ├── bbc5
│ │ │ │ ├── bbc5_posix
│ │ │ │ ├── bbc7
│ │ │ │ ├── bbc7_posix
│ │ │ │ ├── bbc_posix
│ │ │ │ ├── bbcmaster
│ │ │ │ ├── vlink.cmd
│ │ │ │ ├── vlink2.cmd
│ │ │ │ ├── vlink5.cmd
│ │ │ │ └── vlink7.cmd
│ │ │ └── z88dk/
│ │ │ ├── zpragma.inc
│ │ │ ├── zpragma_clib.inc
│ │ │ ├── zpragma_clib_no_printf.inc
│ │ │ └── zpragma_sms.inc
│ │ ├── cross_lib.h
│ │ ├── crt/
│ │ │ └── cc65/
│ │ │ └── vic20/
│ │ │ └── vic20_cart.crt
│ │ ├── display/
│ │ │ ├── alt_print/
│ │ │ │ ├── atari_mode1_alt_print.c
│ │ │ │ ├── comx_alt_print.c
│ │ │ │ ├── memory_mapped_alt_print.c
│ │ │ │ ├── memory_mapped_alt_print.h
│ │ │ │ ├── mo5_alt_print.c
│ │ │ │ ├── ncurses_alt_print.c
│ │ │ │ ├── simple_alt_stats.c
│ │ │ │ ├── tgi_alt_print.c
│ │ │ │ └── tgi_gfx_print.c
│ │ │ ├── color_definitions.h
│ │ │ ├── conio_patch.h
│ │ │ ├── display_macros.c
│ │ │ ├── display_macros.h
│ │ │ ├── display_target_color.h
│ │ │ ├── display_target_geometry.h
│ │ │ ├── graphics_mode/
│ │ │ │ ├── antic_mode6_graphics.h
│ │ │ │ ├── apple2_hgr_graphics.h
│ │ │ │ ├── atari7800_color_graphics.h
│ │ │ │ ├── atari_lynx_tgi_graphics.h
│ │ │ │ ├── bbc_graphics.h
│ │ │ │ ├── bit_mapped_16_graphics.h
│ │ │ │ ├── bit_mapped_4_graphics.h
│ │ │ │ ├── bit_mapped_graphics.h
│ │ │ │ ├── buffered_graphics.h
│ │ │ │ ├── conio_graphics.h
│ │ │ │ ├── cpc_cpcrslib_graphics.h
│ │ │ │ ├── dual_memory_mapped_graphics.h
│ │ │ │ ├── lcc1802_color_graphics.h
│ │ │ │ ├── lcc1802_graphics.h
│ │ │ │ ├── memory_mapped_graphics.h
│ │ │ │ ├── nes_conio_graphics.h
│ │ │ │ ├── no_graphics.h
│ │ │ │ ├── oric_color_graphics.h
│ │ │ │ ├── pv1000_graphics.h
│ │ │ │ ├── quad_memory_mapped_graphics.h
│ │ │ │ ├── rex_graphics.h
│ │ │ │ ├── terminal_graphics.h
│ │ │ │ ├── vdp_mode1_graphics.h
│ │ │ │ ├── vectorial_graphics.h
│ │ │ │ ├── vga_graphics.h
│ │ │ │ └── z88dk_sprites_graphics.h
│ │ │ ├── graphics_settings.h
│ │ │ ├── init_graphics/
│ │ │ │ ├── ack/
│ │ │ │ │ ├── msdos386/
│ │ │ │ │ │ ├── init386_vga.s
│ │ │ │ │ │ └── msdos386_init_graphics.c
│ │ │ │ │ └── msdos86/
│ │ │ │ │ ├── CGA.txt
│ │ │ │ │ ├── EGA.txt
│ │ │ │ │ ├── init_vga.s
│ │ │ │ │ └── msdos86_init_graphics.c
│ │ │ │ ├── cc6303/
│ │ │ │ │ └── mc10_init_graphics.c
│ │ │ │ ├── cc65/
│ │ │ │ │ ├── agat/
│ │ │ │ │ │ └── agat_init_graphics.c
│ │ │ │ │ ├── apple2/
│ │ │ │ │ │ ├── apple2_hgr_init_graphics.c
│ │ │ │ │ │ └── hgr.s
│ │ │ │ │ ├── apple2enh/
│ │ │ │ │ │ └── apple2enh_80col_init_graphics.c
│ │ │ │ │ ├── atari/
│ │ │ │ │ │ ├── atari_mode1_redefined_chars_init_graphics.c
│ │ │ │ │ │ └── disable_setcursor.s
│ │ │ │ │ ├── atari5200/
│ │ │ │ │ │ ├── atari5200_init_graphics.c
│ │ │ │ │ │ └── setcolor.h
│ │ │ │ │ ├── atari7800/
│ │ │ │ │ │ ├── atari7800_init_graphics.c
│ │ │ │ │ │ └── atari7800_init_graphics_debug.c
│ │ │ │ │ ├── atari_lynx/
│ │ │ │ │ │ └── atari_lynx_gfx_init_graphics.c
│ │ │ │ │ ├── atmos/
│ │ │ │ │ │ └── atmos_redefined_characters_init_graphics.c
│ │ │ │ │ ├── c128/
│ │ │ │ │ │ └── c128_80col_init_graphics.c
│ │ │ │ │ ├── c264/
│ │ │ │ │ │ ├── c16_linked_redefined_chars_init_graphics.c
│ │ │ │ │ │ └── c16_redefined_chars_init_graphics.c
│ │ │ │ │ ├── c64/
│ │ │ │ │ │ └── c64_init_graphics.c
│ │ │ │ │ ├── c65/
│ │ │ │ │ │ └── c65_init_graphics.c
│ │ │ │ │ ├── creativision/
│ │ │ │ │ │ ├── creativision_color_init_graphics.c
│ │ │ │ │ │ └── creativision_init_graphics.c
│ │ │ │ │ ├── cx16/
│ │ │ │ │ │ └── cx16_init_graphics.c
│ │ │ │ │ ├── mega65/
│ │ │ │ │ │ └── mega65_init_graphics.c
│ │ │ │ │ ├── nes/
│ │ │ │ │ │ └── nes_init_graphics.c
│ │ │ │ │ ├── pce/
│ │ │ │ │ │ └── pce_init_graphics.c
│ │ │ │ │ ├── supervision/
│ │ │ │ │ │ └── supervision_init_graphics.c
│ │ │ │ │ └── vic20/
│ │ │ │ │ └── vic20_init_graphics.c
│ │ │ │ ├── cmoc/
│ │ │ │ │ ├── coco/
│ │ │ │ │ │ └── coco_init_graphics.c
│ │ │ │ │ ├── coco3/
│ │ │ │ │ │ └── coco3_init_graphics.c
│ │ │ │ │ └── mo5/
│ │ │ │ │ └── mo5_init_graphics.c
│ │ │ │ ├── gcc/
│ │ │ │ │ ├── ncurses_init_graphics.c
│ │ │ │ │ └── terminal_init_graphics.c
│ │ │ │ ├── gcc4ti99/
│ │ │ │ │ └── gcc4ti99_init_graphics.c
│ │ │ │ ├── lcc1802/
│ │ │ │ │ └── comx/
│ │ │ │ │ ├── comx_color_init_graphics.c
│ │ │ │ │ ├── comx_init_graphics.c
│ │ │ │ │ └── micro_color_init_graphics.c
│ │ │ │ ├── vbcc/
│ │ │ │ │ └── bbc/
│ │ │ │ │ ├── bbc_init_graphics.c
│ │ │ │ │ └── bbc_init_graphics_test.c
│ │ │ │ └── z88dk/
│ │ │ │ ├── aquarius/
│ │ │ │ │ └── aquarius_init_graphics.c
│ │ │ │ ├── c128/
│ │ │ │ │ └── c128_init_graphics.c
│ │ │ │ ├── cpc/
│ │ │ │ │ └── cpc_cpcrslib_init_graphics.c
│ │ │ │ ├── g850/
│ │ │ │ │ └── g850_init_graphics.c
│ │ │ │ ├── msx/
│ │ │ │ │ └── msx_redefined_chars_init_graphics.c
│ │ │ │ ├── rex/
│ │ │ │ │ └── rex_init_graphics.c
│ │ │ │ ├── sms/
│ │ │ │ │ └── sms_init_graphics.c
│ │ │ │ ├── udg/
│ │ │ │ │ ├── udg_init_graphics.c
│ │ │ │ │ └── udg_msx_test.c
│ │ │ │ ├── vz200/
│ │ │ │ │ └── vz200_init_graphics.c
│ │ │ │ ├── x07/
│ │ │ │ │ └── x07_init_graphics.c
│ │ │ │ ├── z88/
│ │ │ │ │ ├── z88_init_graphics.c
│ │ │ │ │ └── z88_udg_init_graphics.c
│ │ │ │ ├── zx80/
│ │ │ │ │ └── zx80_init_graphics.c
│ │ │ │ └── zx81/
│ │ │ │ └── zx81_init_graphics.c
│ │ │ ├── redefine_characters/
│ │ │ │ └── udg_map.h
│ │ │ ├── tiles/
│ │ │ │ ├── agat_settings.h
│ │ │ │ ├── apple2_hgr_settings.h
│ │ │ │ ├── atari7800_settings.h
│ │ │ │ ├── atari_mode1_redefined_chars_settings.h
│ │ │ │ ├── atmos_redefined_characters_settings.h
│ │ │ │ ├── bbc_settings.h
│ │ │ │ ├── c128_settings.h
│ │ │ │ ├── c264_link_time_redefined_chars_settings.h
│ │ │ │ ├── c264_redefined_chars_settings.h
│ │ │ │ ├── c64_conio_settings.h
│ │ │ │ ├── c64_memory_mapped_settings.h
│ │ │ │ ├── cidelsa_no_gfx.h
│ │ │ │ ├── cmoc_memory_mapped_settings.h
│ │ │ │ ├── comx_color_settings.h
│ │ │ │ ├── comx_settings.h
│ │ │ │ ├── cpc_cpcrslib_settings.h
│ │ │ │ ├── creativision_settings.h
│ │ │ │ ├── cx16_settings.h
│ │ │ │ ├── default_image_settings.h
│ │ │ │ ├── default_quad_graphics_settings.h
│ │ │ │ ├── micro_color_settings.h
│ │ │ │ ├── micro_settings.h
│ │ │ │ ├── msx_redefined_chars_settings.h
│ │ │ │ ├── nes_conio_settings.h
│ │ │ │ ├── nes_settings.h
│ │ │ │ ├── pce_settings.h
│ │ │ │ ├── petscii_memory_mapped_settings.h
│ │ │ │ ├── pv1000_settings.h
│ │ │ │ ├── supervision_settings.h
│ │ │ │ ├── tgi_gfx_settings.h
│ │ │ │ ├── udg_settings.h
│ │ │ │ ├── vdp_mode1_settings.h
│ │ │ │ ├── vic20_exp_16k_settings.h
│ │ │ │ ├── vic20_exp_16k_v2_settings.h
│ │ │ │ ├── vic20_exp_3k_light_settings.h
│ │ │ │ ├── vic20_exp_3k_settings.h
│ │ │ │ ├── vic20_rom_chars_and_26_tiles_settings.h
│ │ │ │ ├── vic20_rom_chars_and_27_tiles_settings.h
│ │ │ │ └── vic20_rom_chars_and_6_tiles_settings.h
│ │ │ └── tiles.h
│ │ ├── include/
│ │ │ └── standard_libs.h
│ │ ├── input/
│ │ │ ├── input_macros.c
│ │ │ ├── input_macros.h
│ │ │ └── input_target_settings.h
│ │ ├── rand/
│ │ │ ├── rand.c
│ │ │ ├── rand.h
│ │ │ └── rand_lcc1802_devkit_include.c
│ │ ├── sleep/
│ │ │ ├── sleep_macros.c
│ │ │ └── sleep_macros.h
│ │ ├── sound/
│ │ │ ├── ack/
│ │ │ │ └── msdos86/
│ │ │ │ └── msdos86_sounds.h
│ │ │ ├── cc65/
│ │ │ │ ├── atari7800/
│ │ │ │ │ └── atari7800_sounds.h
│ │ │ │ ├── atari_lynx/
│ │ │ │ │ ├── atari_lynx_sounds.c
│ │ │ │ │ ├── atari_lynx_sounds.h
│ │ │ │ │ └── chibisound.asm
│ │ │ │ ├── atmos/
│ │ │ │ │ └── atmos_sounds.h
│ │ │ │ ├── c264/
│ │ │ │ │ ├── c264_sounds.c
│ │ │ │ │ └── c264_sounds.h
│ │ │ │ ├── creativision/
│ │ │ │ │ ├── creativision_sounds.c
│ │ │ │ │ └── creativision_sounds.h
│ │ │ │ ├── cx16/
│ │ │ │ │ ├── cx16_sounds.c
│ │ │ │ │ └── cx16_sounds.h
│ │ │ │ ├── gamate/
│ │ │ │ │ ├── gamate_sounds.c
│ │ │ │ │ └── gamate_sounds.h
│ │ │ │ ├── pet/
│ │ │ │ │ ├── pet_sounds.c
│ │ │ │ │ └── pet_sounds.h
│ │ │ │ ├── pokey/
│ │ │ │ │ ├── pokey_sounds.c
│ │ │ │ │ └── pokey_sounds.h
│ │ │ │ ├── sid/
│ │ │ │ │ ├── sid_sounds.c
│ │ │ │ │ └── sid_sounds.h
│ │ │ │ ├── supervision/
│ │ │ │ │ ├── reverse_engineered_notes.txt
│ │ │ │ │ ├── supervision_sounds.c
│ │ │ │ │ └── supervision_sounds.h
│ │ │ │ └── vic20/
│ │ │ │ ├── vic20_explosion_sound.c
│ │ │ │ ├── vic20_explosion_sound.h
│ │ │ │ ├── vic20_sounds.c
│ │ │ │ └── vic20_sounds.h
│ │ │ ├── gcc4ti99/
│ │ │ │ ├── ti99_sounds.c
│ │ │ │ └── ti99_sounds.h
│ │ │ ├── generic/
│ │ │ │ ├── ascii_sounds.h
│ │ │ │ ├── bit_bang_sounds.c
│ │ │ │ ├── bit_bang_sounds.h
│ │ │ │ ├── dac_sounds.c
│ │ │ │ └── dac_sounds.h
│ │ │ ├── lcc1802/
│ │ │ │ └── comx/
│ │ │ │ ├── comx_sounds.c
│ │ │ │ └── comx_sounds.h
│ │ │ ├── sound_macros.h
│ │ │ ├── vbcc/
│ │ │ │ └── bbc/
│ │ │ │ ├── bbc_sounds.c
│ │ │ │ └── bbc_sounds.h
│ │ │ └── z88dk/
│ │ │ ├── bit_bang/
│ │ │ │ └── z88dk_bit_bang_sounds.h
│ │ │ ├── gb/
│ │ │ │ ├── gb_sounds.c
│ │ │ │ └── gb_sounds.h
│ │ │ └── psg/
│ │ │ ├── ay-3-8910_psg_sounds.c
│ │ │ ├── psg_sounds.h
│ │ │ └── sn76489a_psg_sounds.c
│ │ └── text/
│ │ └── letters.h
│ ├── debug/
│ │ ├── CONIO_TEST.COM
│ │ ├── Makefile
│ │ ├── amiga_core.h
│ │ ├── atari2600_graphics_test.c
│ │ ├── atari7800_test.c
│ │ ├── atari7800_test2.c
│ │ ├── atari7800_test3.c
│ │ ├── atari_lynx.c
│ │ ├── bar.c
│ │ ├── bbctest.c
│ │ ├── bitbang.c
│ │ ├── build_conio_test.txt
│ │ ├── coco3_test.c
│ │ ├── coco_strings_test.c
│ │ ├── comx_class.c
│ │ ├── comx_conv_debug.c
│ │ ├── comx_hello.c
│ │ ├── comx_hello_integer.c
│ │ ├── comx_mod.c
│ │ ├── comx_pointer2func.c
│ │ ├── comx_pp_debug.c
│ │ ├── comx_simple_class.c
│ │ ├── comx_simplest_class.c
│ │ ├── comx_size_debug.c
│ │ ├── conio.c
│ │ ├── conio0.c
│ │ ├── conio_test.c
│ │ ├── cpc_test.c
│ │ ├── cprintf.c
│ │ ├── debug_images.h
│ │ ├── empty42.c
│ │ ├── extern.c
│ │ ├── extern.h
│ │ ├── foo.c
│ │ ├── foo.h
│ │ ├── fx.c
│ │ ├── gamate_conio_test.c
│ │ ├── gamate_conio_test2.c
│ │ ├── gb_main.c
│ │ ├── gcc_class.c
│ │ ├── gcc_simple_class.c
│ │ ├── gcc_simplest_class.c
│ │ ├── gcc_test.c
│ │ ├── generic_psg.c
│ │ ├── getk_test.c
│ │ ├── h0comx.c
│ │ ├── hello_cgetc.c
│ │ ├── hello_conio.c
│ │ ├── hello_fputc.c
│ │ ├── hello_sdl.c
│ │ ├── helloworld.c
│ │ ├── helloworld_background_color.c
│ │ ├── helloworld_getchar.c
│ │ ├── htron.c
│ │ ├── hwcomx.c
│ │ ├── hwcomx1.c
│ │ ├── hwcomx2.c
│ │ ├── hwcomx_gotoxy.c
│ │ ├── hwcomx_gotoxy2.c
│ │ ├── hwcomx_pp_debug.c
│ │ ├── hwpecom.c
│ │ ├── intern.c
│ │ ├── intern.h
│ │ ├── lcc1802_test.c
│ │ ├── lcc1802_test_NEW.c
│ │ ├── litterals.c
│ │ ├── m5.c
│ │ ├── main_use_amiga_core.c
│ │ ├── mapfile_shoot_pet_func.txt
│ │ ├── mc10_getk.s
│ │ ├── mc10_test1.c
│ │ ├── mc10_test2.c
│ │ ├── mc10_test3.c
│ │ ├── mc10_test4.c
│ │ ├── msx_test.c
│ │ ├── msx_test2.c
│ │ ├── ncurses_test.c
│ │ ├── nes_bgcolor.c
│ │ ├── psg_test.c
│ │ ├── psg_test2.c
│ │ ├── psg_test3.c
│ │ ├── rand.c
│ │ ├── struct.c
│ │ ├── testBitwiseAnd.c
│ │ ├── test_gb.c
│ │ ├── test_getk.c
│ │ ├── test_joy.c
│ │ ├── test_joy2.c
│ │ ├── test_sleep.c
│ │ ├── test_vsync.c
│ │ ├── testc16.c
│ │ ├── tgi_lynx_black_test.c
│ │ ├── tgi_lynx_cgetc_test.c
│ │ ├── tgi_lynx_test.c
│ │ ├── ti99.c
│ │ ├── ti99_test.c
│ │ ├── unsigned_right_shift.c
│ │ ├── wait_for_key.c
│ │ ├── world.c
│ │ └── x07.c
│ ├── examples/
│ │ ├── animate/
│ │ │ ├── Makefile.animate
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── background/
│ │ │ ├── Makefile.background
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── blob/
│ │ │ ├── Makefile.blob
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ └── shape20.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── boundary/
│ │ │ ├── Makefile.boundary
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── characters/
│ │ │ ├── Makefile.characters
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── color/
│ │ │ ├── Makefile.color
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── graphics/
│ │ │ ├── Makefile.graphics
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── images.h
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── tiles/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ └── ASCII/
│ │ │ │ └── char_tiles.h
│ │ │ └── tools/
│ │ │ ├── digit_0.txt
│ │ │ ├── digit_1.txt
│ │ │ ├── digit_2.txt
│ │ │ ├── digit_3.txt
│ │ │ ├── digit_4.txt
│ │ │ ├── digit_5.txt
│ │ │ ├── digit_6.txt
│ │ │ ├── digit_7.txt
│ │ │ ├── digit_8.txt
│ │ │ ├── digit_9.txt
│ │ │ ├── extract_least.py
│ │ │ ├── join_digits.py
│ │ │ ├── shape0.txt
│ │ │ ├── shape1.txt
│ │ │ ├── shape2.txt
│ │ │ ├── shape3.txt
│ │ │ ├── shape4.txt
│ │ │ ├── shape5.txt
│ │ │ ├── shape6.txt
│ │ │ ├── shape7.txt
│ │ │ ├── shape8.txt
│ │ │ ├── shape9.txt
│ │ │ └── test.txt
│ │ ├── hello/
│ │ │ ├── Makefile.hello
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── input/
│ │ │ ├── Makefile.input
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── invaders/
│ │ │ ├── Makefile.invaders
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── tile_aliases.h
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── matrix/
│ │ │ ├── Makefile.matrix
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── tile_aliases.h
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── numbers/
│ │ │ ├── Makefile.numbers
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── palette/
│ │ │ ├── Makefile.palette
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── random/
│ │ │ ├── Makefile.random
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── sleep/
│ │ │ ├── Makefile.sleep
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── sounds/
│ │ │ ├── Makefile.sounds
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── target/
│ │ │ ├── Makefile.target
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── text/
│ │ │ ├── Makefile.text
│ │ │ ├── config/
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ └── zombies/
│ │ ├── Makefile.zombies
│ │ ├── config/
│ │ │ └── project_config.mk
│ │ ├── images.h
│ │ ├── main.c
│ │ └── tiles/
│ │ ├── 6x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 6x9/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 7x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 8x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ └── ASCII/
│ │ └── char_tiles.h
│ ├── games/
│ │ ├── bomber/
│ │ │ ├── Makefile.bomber
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── main.c
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── tile_aliases.h
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ ├── aquarius/
│ │ │ │ ├── aquarius_char_tiles.h
│ │ │ │ └── aquarius_quad_char_tiles.h
│ │ │ ├── char_tiles.h
│ │ │ └── quad_char_tiles.h
│ │ ├── chase/
│ │ │ ├── Makefile.chase
│ │ │ ├── Makefile.chase_BK
│ │ │ ├── bullet.h
│ │ │ ├── character.h
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── definitions.h
│ │ │ ├── end_screen.h
│ │ │ ├── game_settings.h
│ │ │ ├── game_text.h
│ │ │ ├── ghost.h
│ │ │ ├── horizontal_missile.h
│ │ │ ├── images.h
│ │ │ ├── init_images.h
│ │ │ ├── item.h
│ │ │ ├── level.h
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── makefiles.chase/
│ │ │ │ ├── Makefile.ack_targets
│ │ │ │ ├── Makefile.cc6303_targets
│ │ │ │ ├── Makefile.cc65_targets
│ │ │ │ ├── Makefile.cmoc_targets
│ │ │ │ ├── Makefile.cross-dev-kit_targets
│ │ │ │ ├── Makefile.emcc_targets
│ │ │ │ ├── Makefile.gcc_amiga_targets
│ │ │ │ ├── Makefile.gcc_atari_st_targets
│ │ │ │ ├── Makefile.gcc_targets
│ │ │ │ ├── Makefile.gcc_tms9900_targets
│ │ │ │ ├── Makefile.gcc_z8k_pcos_targets
│ │ │ │ ├── Makefile.lcc1802_targets
│ │ │ │ ├── Makefile.sdcc_targets
│ │ │ │ ├── Makefile.vbcc_targets
│ │ │ │ ├── Makefile.xtc68_targets
│ │ │ │ ├── Makefile.z88dk_targets
│ │ │ │ └── makefiles_z88dk/
│ │ │ │ ├── Makefile_z88dk_a-k
│ │ │ │ ├── Makefile_z88dk_l-p
│ │ │ │ ├── Makefile_z88dk_q-z
│ │ │ │ └── Makefile_z88dk_zsdcc
│ │ │ ├── memory/
│ │ │ │ ├── c16_memory.s
│ │ │ │ ├── creativision_memory.s
│ │ │ │ ├── gal_memory.asm
│ │ │ │ ├── gamate_memory.s
│ │ │ │ ├── oric1_memory.s
│ │ │ │ ├── pet_memory.s
│ │ │ │ └── vic20_memory.s
│ │ │ ├── move_player.h
│ │ │ ├── rocket.h
│ │ │ ├── settings.h
│ │ │ ├── shapes/
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ └── shape7.txt
│ │ │ │ └── 8x6/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── skull.h
│ │ │ ├── speed_game_settings.h
│ │ │ ├── split_files/
│ │ │ │ ├── bullet.c
│ │ │ │ ├── character.c
│ │ │ │ ├── end_screen.c
│ │ │ │ ├── game_text.c
│ │ │ │ ├── ghost.c
│ │ │ │ ├── horizontal_missile.c
│ │ │ │ ├── init_images.c
│ │ │ │ ├── item.c
│ │ │ │ ├── level.c
│ │ │ │ ├── main.c
│ │ │ │ ├── move_player.c
│ │ │ │ ├── rocket.c
│ │ │ │ ├── skull.c
│ │ │ │ └── strategy.c
│ │ │ ├── strategy.h
│ │ │ ├── text_strings.h
│ │ │ ├── tiles/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ └── ASCII/
│ │ │ │ ├── aquarius/
│ │ │ │ │ └── aquarius_char_tiles.h
│ │ │ │ └── char_tiles.h
│ │ │ └── variables.h
│ │ ├── horde/
│ │ │ ├── Makefile.horde
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── images.h
│ │ │ ├── main.c
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ └── shape26.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ └── shape26.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ └── shape26.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape25.txt
│ │ │ │ └── shape26.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ ├── aquarius/
│ │ │ │ └── aquarius_char_tiles.h
│ │ │ └── char_tiles.h
│ │ ├── shoot/
│ │ │ ├── Makefile.shoot
│ │ │ ├── bullet.h
│ │ │ ├── character.h
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── definitions.h
│ │ │ ├── doc/
│ │ │ │ ├── items.txt
│ │ │ │ ├── levels.txt
│ │ │ │ └── secrets.txt
│ │ │ ├── end_screen.h
│ │ │ ├── game_settings.h
│ │ │ ├── game_text.h
│ │ │ ├── ghost.h
│ │ │ ├── horizontal_missile.h
│ │ │ ├── images.h
│ │ │ ├── init_images.h
│ │ │ ├── item.h
│ │ │ ├── level.h
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── memory/
│ │ │ │ ├── c16_memory.s
│ │ │ │ ├── creativision_memory.s
│ │ │ │ ├── creativision_memory_light.s
│ │ │ │ ├── creativision_memory_tiny.s
│ │ │ │ ├── gal_memory.asm
│ │ │ │ ├── gamate_memory.s
│ │ │ │ ├── oric1_memory.s
│ │ │ │ ├── pet_memory.s
│ │ │ │ └── vic20_memory.s
│ │ │ ├── move_player.h
│ │ │ ├── rocket.h
│ │ │ ├── settings.h
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ └── shape26.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ └── shape3.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ └── shape6.txt
│ │ │ ├── skull.h
│ │ │ ├── sleep.h
│ │ │ ├── speed_game_settings.h
│ │ │ ├── split_files/
│ │ │ │ ├── bullet.c
│ │ │ │ ├── character.c
│ │ │ │ ├── end_screen.c
│ │ │ │ ├── game_text.c
│ │ │ │ ├── ghost.c
│ │ │ │ ├── horizontal_missile.c
│ │ │ │ ├── init_images.c
│ │ │ │ ├── item.c
│ │ │ │ ├── level.c
│ │ │ │ ├── main.c
│ │ │ │ ├── move_player.c
│ │ │ │ ├── rocket.c
│ │ │ │ ├── skull.c
│ │ │ │ ├── sleep.c
│ │ │ │ └── strategy.c
│ │ │ ├── strategy.h
│ │ │ ├── text_strings.h
│ │ │ ├── tiles/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile26.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── variables.h
│ │ ├── shuriken/
│ │ │ ├── Makefile.shuriken
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── docs/
│ │ │ │ ├── 12x12_multi_tile_1.txt
│ │ │ │ ├── 12x12_multi_tile_2.txt
│ │ │ │ ├── 12x16_multi_tile.txt
│ │ │ │ ├── 14x16_multi_tile.txt
│ │ │ │ ├── 14x16_multi_tile_2.txt
│ │ │ │ ├── 14x16_multi_tile_3.txt
│ │ │ │ ├── 14x16_multi_tile_4.txt
│ │ │ │ ├── 14x16_shapes.txt
│ │ │ │ ├── 16x12_multi_tile.txt
│ │ │ │ ├── 16x16_multi_tile.txt
│ │ │ │ ├── 7x8.txt
│ │ │ │ ├── mine_shape1.txt
│ │ │ │ └── mine_shape2.txt
│ │ │ ├── level_00_horiz.h
│ │ │ ├── level_01_vert_bars.h
│ │ │ ├── level_02_cross.h
│ │ │ ├── level_03_07_11_boss.h
│ │ │ ├── level_04_horiz_walls.h
│ │ │ ├── level_05_h_barriers.h
│ │ │ ├── level_06_rain.h
│ │ │ ├── level_08_vert_walls.h
│ │ │ ├── level_09_squares.h
│ │ │ ├── level_10_many.h
│ │ │ ├── levels.h
│ │ │ ├── main.c
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── screen_types.h
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── snake/
│ │ │ ├── Makefile.snake
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── control_player.h
│ │ │ ├── doc/
│ │ │ │ ├── game_play.txt
│ │ │ │ ├── info.txt
│ │ │ │ ├── levels.txt
│ │ │ │ └── whatsnew.txt
│ │ │ ├── game_text.h
│ │ │ ├── init_images.h
│ │ │ ├── levels.h
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── memory/
│ │ │ │ ├── c16_memory.s
│ │ │ │ ├── creativision_memory.s
│ │ │ │ ├── gamate_memory.s
│ │ │ │ └── vic20_memory.s
│ │ │ ├── move_snake.h
│ │ │ ├── settings.h
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ └── shape25.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ └── shape25.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ └── shape25.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ └── shape8.txt
│ │ │ │ └── 8x8/
│ │ │ │ └── shape25.txt
│ │ │ ├── snake.h
│ │ │ ├── split_files/
│ │ │ │ ├── control_player.c
│ │ │ │ ├── game_text.c
│ │ │ │ ├── main.c
│ │ │ │ ├── move_snake.c
│ │ │ │ ├── snake.c
│ │ │ │ └── variables.c
│ │ │ ├── tiles/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ ├── 8x8/
│ │ │ │ │ ├── tile0.txt
│ │ │ │ │ ├── tile1.txt
│ │ │ │ │ ├── tile10.txt
│ │ │ │ │ ├── tile11.txt
│ │ │ │ │ ├── tile12.txt
│ │ │ │ │ ├── tile13.txt
│ │ │ │ │ ├── tile14.txt
│ │ │ │ │ ├── tile15.txt
│ │ │ │ │ ├── tile16.txt
│ │ │ │ │ ├── tile17.txt
│ │ │ │ │ ├── tile18.txt
│ │ │ │ │ ├── tile19.txt
│ │ │ │ │ ├── tile2.txt
│ │ │ │ │ ├── tile20.txt
│ │ │ │ │ ├── tile21.txt
│ │ │ │ │ ├── tile22.txt
│ │ │ │ │ ├── tile23.txt
│ │ │ │ │ ├── tile24.txt
│ │ │ │ │ ├── tile25.txt
│ │ │ │ │ ├── tile3.txt
│ │ │ │ │ ├── tile4.txt
│ │ │ │ │ ├── tile5.txt
│ │ │ │ │ ├── tile6.txt
│ │ │ │ │ ├── tile7.txt
│ │ │ │ │ ├── tile8.txt
│ │ │ │ │ └── tile9.txt
│ │ │ │ └── ASCII/
│ │ │ │ ├── aquarius/
│ │ │ │ │ └── aquarius_char_tiles.h
│ │ │ │ └── char_tiles.h
│ │ │ └── variables.h
│ │ ├── stinger/
│ │ │ ├── Makefile.stinger
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── docs/
│ │ │ │ ├── empty_stinger1.txt
│ │ │ │ ├── empty_stinger2.txt
│ │ │ │ ├── score.txt
│ │ │ │ ├── stinger.txt
│ │ │ │ ├── stinger1.txt
│ │ │ │ └── stinger2.txt
│ │ │ ├── images.h
│ │ │ ├── main.c
│ │ │ ├── makefiles/
│ │ │ │ └── Makefile.override
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ ├── aquarius/
│ │ │ │ └── aquarius_char_tiles.h
│ │ │ └── char_tiles.h
│ │ ├── trex/
│ │ │ ├── Makefile.trex
│ │ │ ├── config/
│ │ │ │ ├── game_config.mk
│ │ │ │ └── project_config.mk
│ │ │ ├── docs/
│ │ │ │ ├── dino.txt
│ │ │ │ ├── shape2x8left.txt
│ │ │ │ ├── shape2x8right.txt
│ │ │ │ ├── tile2x8left.txt
│ │ │ │ └── tile2x8right.txt
│ │ │ ├── images.h
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape2x8left.txt
│ │ │ │ │ ├── shape2x8right.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape2x8left.txt
│ │ │ │ │ ├── shape2x8right.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape2x8left.txt
│ │ │ │ │ ├── shape2x8right.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape2x8left.txt
│ │ │ │ │ ├── shape2x8right.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── bird12x8left.txt
│ │ │ │ ├── bird12x8right.txt
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile2x8left.txt
│ │ │ │ ├── tile2x8right.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile2x8left.txt
│ │ │ │ ├── tile2x8right.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile2x8left.txt
│ │ │ │ ├── tile2x8right.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile2x8left.txt
│ │ │ │ ├── tile2x8right.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ └── verbix/
│ │ ├── Makefile.verbix
│ │ ├── config/
│ │ │ ├── game_config.mk
│ │ │ └── project_config.mk
│ │ ├── dictionary.h
│ │ ├── main.c
│ │ ├── makefiles/
│ │ │ └── Makefile.override
│ │ ├── shapes/
│ │ │ ├── 6x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── 8x8/
│ │ │ ├── shape0.txt
│ │ │ ├── shape1.txt
│ │ │ ├── shape10.txt
│ │ │ ├── shape11.txt
│ │ │ ├── shape12.txt
│ │ │ ├── shape13.txt
│ │ │ ├── shape14.txt
│ │ │ ├── shape15.txt
│ │ │ ├── shape16.txt
│ │ │ ├── shape17.txt
│ │ │ ├── shape18.txt
│ │ │ ├── shape19.txt
│ │ │ ├── shape2.txt
│ │ │ ├── shape20.txt
│ │ │ ├── shape21.txt
│ │ │ ├── shape22.txt
│ │ │ ├── shape23.txt
│ │ │ ├── shape24.txt
│ │ │ ├── shape25.txt
│ │ │ ├── shape26.txt
│ │ │ ├── shape3.txt
│ │ │ ├── shape4.txt
│ │ │ ├── shape5.txt
│ │ │ ├── shape6.txt
│ │ │ ├── shape7.txt
│ │ │ ├── shape8.txt
│ │ │ └── shape9.txt
│ │ ├── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ ├── atari7800/
│ │ │ │ ├── atari7800_char_tiles.h
│ │ │ │ └── atari7800_no_color_char_tiles.h
│ │ │ ├── char_tiles.h
│ │ │ ├── mc10/
│ │ │ │ └── mc10_char_tiles.h
│ │ │ ├── vz/
│ │ │ │ └── vz_char_tiles.h
│ │ │ └── zx81/
│ │ │ └── zx81_char_tiles.h
│ │ └── words_16/
│ │ ├── a.txt
│ │ ├── c.txt
│ │ ├── compress.py
│ │ ├── d.txt
│ │ ├── e.txt
│ │ ├── h.txt
│ │ ├── i.txt
│ │ ├── l.txt
│ │ ├── m.txt
│ │ ├── missing_words.txt
│ │ ├── n.txt
│ │ ├── o.txt
│ │ ├── p.txt
│ │ ├── r.txt
│ │ ├── s.txt
│ │ ├── t.txt
│ │ ├── u.txt
│ │ ├── word_frequency.txt
│ │ ├── words_16letters.txt
│ │ └── y.txt
│ ├── makefiles.common/
│ │ ├── auxiliary/
│ │ │ ├── Makefile_ALL
│ │ │ ├── Makefile_assets
│ │ │ ├── Makefile_combo
│ │ │ ├── Makefile_common
│ │ │ ├── Makefile_compilers
│ │ │ ├── Makefile_default_values
│ │ │ └── Makefile_tools
│ │ ├── debug/
│ │ │ ├── Makefile.cc6303_debug
│ │ │ ├── Makefile.cc65_debug
│ │ │ ├── Makefile.cmoc_debug
│ │ │ ├── Makefile.lcc1802_debug
│ │ │ └── Makefile.z88dk_debug
│ │ └── targets/
│ │ ├── ack/
│ │ │ └── Makefile.ack_targets
│ │ ├── amiga_gcc/
│ │ │ └── Makefile.gcc_amiga_targets
│ │ ├── atari_mint_gcc/
│ │ │ └── Makefile_atari_st
│ │ ├── cc65/
│ │ │ ├── Makefile_c128_8502
│ │ │ ├── Makefile_c65
│ │ │ ├── Makefile_cx16
│ │ │ ├── Makefile_kim1
│ │ │ ├── Makefile_osic1p
│ │ │ ├── Makefile_sym1
│ │ │ └── Makefile_telestrat
│ │ ├── emcc/
│ │ │ └── Makefile.emcc_targets
│ │ ├── gcc4ti/
│ │ │ └── Makefile_ti99
│ │ ├── gcc_z8k_pcos/
│ │ │ └── Makefile.gcc_z8k_pcos_targets
│ │ ├── sdcc/
│ │ │ └── Makefile.sdcc_targets
│ │ ├── vbcc/
│ │ │ ├── Makefile_amiga
│ │ │ ├── Makefile_atari_jaguar
│ │ │ ├── Makefile_bbc
│ │ │ └── Makefile_m65
│ │ ├── xtc68/
│ │ │ └── Makefile.xtc68_targets
│ │ └── z88dk/
│ │ ├── Makefile_abc80
│ │ ├── Makefile_abc800
│ │ ├── Makefile_alphatro
│ │ ├── Makefile_altair8800
│ │ ├── Makefile_attache
│ │ ├── Makefile_aussie
│ │ ├── Makefile_bee
│ │ ├── Makefile_bic
│ │ ├── Makefile_bit90
│ │ ├── Makefile_bondwell
│ │ ├── Makefile_bondwell2
│ │ ├── Makefile_c7420
│ │ ├── Makefile_coleco_adam
│ │ ├── Makefile_corvette
│ │ ├── Makefile_dai
│ │ ├── Makefile_dmv
│ │ ├── Makefile_eg2k
│ │ ├── Makefile_einstein
│ │ ├── Makefile_enterprise
│ │ ├── Makefile_excalibur64
│ │ ├── Makefile_fp1100
│ │ ├── Makefile_g800
│ │ ├── Makefile_gemini
│ │ ├── Makefile_gl4000
│ │ ├── Makefile_gl6000sl
│ │ ├── Makefile_hemc
│ │ ├── Makefile_hgmc
│ │ ├── Makefile_homelab
│ │ ├── Makefile_homelab2
│ │ ├── Makefile_kaypro
│ │ ├── Makefile_kaypro83
│ │ ├── Makefile_kramermc
│ │ ├── Makefile_krokha
│ │ ├── Makefile_lambda
│ │ ├── Makefile_lm80c
│ │ ├── Makefile_lviv
│ │ ├── Makefile_m5
│ │ ├── Makefile_mbc200
│ │ ├── Makefile_micro8085
│ │ ├── Makefile_mikro80
│ │ ├── Makefile_misc_cpm
│ │ ├── Makefile_multi8
│ │ ├── Makefile_myvision
│ │ ├── Makefile_mz2500
│ │ ├── Makefile_nabu
│ │ ├── Makefile_nascom
│ │ ├── Makefile_nc100
│ │ ├── Makefile_nc200
│ │ ├── Makefile_newbrain
│ │ ├── Makefile_ondra
│ │ ├── Makefile_osborne1
│ │ ├── Makefile_osca
│ │ ├── Makefile_oz
│ │ ├── Makefile_p2000
│ │ ├── Makefile_pasopia7
│ │ ├── Makefile_pc6001
│ │ ├── Makefile_pcw40
│ │ ├── Makefile_pcw80
│ │ ├── Makefile_pencil2
│ │ ├── Makefile_phc25
│ │ ├── Makefile_pmd85
│ │ ├── Makefile_pps
│ │ ├── Makefile_primo
│ │ ├── Makefile_pv1000
│ │ ├── Makefile_pv2000
│ │ ├── Makefile_px4
│ │ ├── Makefile_px8
│ │ ├── Makefile_radio86
│ │ ├── Makefile_rc700
│ │ ├── Makefile_rx78
│ │ ├── Makefile_smc777
│ │ ├── Makefile_sol20
│ │ ├── Makefile_sos
│ │ ├── Makefile_spc1000
│ │ ├── Makefile_special
│ │ ├── Makefile_srr
│ │ ├── Makefile_super80
│ │ ├── Makefile_super80r
│ │ ├── Makefile_sv8000
│ │ ├── Makefile_svi
│ │ ├── Makefile_ti82
│ │ ├── Makefile_ti83
│ │ ├── Makefile_ti83p
│ │ ├── Makefile_ti85
│ │ ├── Makefile_ti86
│ │ ├── Makefile_tiki100
│ │ ├── Makefile_tim011
│ │ ├── Makefile_ts2068
│ │ ├── Makefile_tvc
│ │ ├── Makefile_v1050
│ │ ├── Makefile_vector06c
│ │ ├── Makefile_x07
│ │ ├── Makefile_x1
│ │ ├── Makefile_x820
│ │ ├── Makefile_z80tvgame
│ │ ├── Makefile_z88
│ │ ├── Makefile_zx80
│ │ ├── Makefile_zxn
│ │ └── extras/
│ │ ├── Makefile_agon
│ │ ├── Makefile_c128
│ │ ├── Makefile_camputers_lynx
│ │ ├── Makefile_cpc
│ │ ├── Makefile_gal
│ │ ├── Makefile_gal_plus
│ │ └── Makefile_pc88
│ ├── makefiles.other/
│ │ └── chase/
│ │ ├── alt/
│ │ │ ├── Makefile.cc65_alternative_builds
│ │ │ ├── Makefile.z88dk_alternative_builds
│ │ │ └── z88dk_alternative_builds/
│ │ │ ├── Makefile.z88dk_alternative_builds_a-n
│ │ │ ├── Makefile.z88dk_alternative_builds_o-z
│ │ │ ├── Makefile.z88dk_alternative_builds_qaopm
│ │ │ └── Makefile.z88dk_alternative_builds_zsdcc
│ │ ├── bench/
│ │ │ └── Makefile.cc65_bench
│ │ ├── experimental/
│ │ │ └── Makefile.z88dk_experimental_targets
│ │ ├── tests/
│ │ │ ├── Makefile.tests
│ │ │ └── Makefile.z88dk_quick_tests
│ │ └── wip/
│ │ ├── Makefile.ack_wip_targets
│ │ ├── Makefile.cc65_wip_targets
│ │ └── Makefile.z88dk_wip_targets
│ ├── modules/
│ │ ├── LoggerSingleton.py
│ │ ├── __init__.py
│ │ ├── build_functions.py
│ │ ├── clean_functions.py
│ │ ├── commands.py
│ │ ├── default_values.py
│ │ ├── execute.py
│ │ ├── file_functions.py
│ │ ├── help_functions.py
│ │ ├── import_from_source.py
│ │ ├── init.py
│ │ ├── input_functions.py
│ │ ├── option_functions.py
│ │ ├── params.py
│ │ ├── print_functions.py
│ │ ├── project_functions.py
│ │ ├── run.py
│ │ ├── shape_functions.py
│ │ ├── split_projects.py
│ │ ├── strings.py
│ │ ├── target_defs.py
│ │ ├── test_self_defs.py
│ │ ├── tests.py
│ │ └── tiles.py
│ ├── patches/
│ │ └── move_globals.py
│ ├── template_projects/
│ │ ├── Makefile_game.template
│ │ ├── arcade_game_code.template/
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── config/
│ │ │ ├── game_config.mk.template
│ │ │ └── project_config.mk.template
│ │ ├── demo_code.template/
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── helloworld_code.template/
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ ├── 6x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 6x9/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 7x8/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ ├── 8x6/
│ │ │ │ │ ├── shape0.txt
│ │ │ │ │ ├── shape1.txt
│ │ │ │ │ ├── shape10.txt
│ │ │ │ │ ├── shape11.txt
│ │ │ │ │ ├── shape12.txt
│ │ │ │ │ ├── shape13.txt
│ │ │ │ │ ├── shape14.txt
│ │ │ │ │ ├── shape15.txt
│ │ │ │ │ ├── shape16.txt
│ │ │ │ │ ├── shape17.txt
│ │ │ │ │ ├── shape18.txt
│ │ │ │ │ ├── shape19.txt
│ │ │ │ │ ├── shape2.txt
│ │ │ │ │ ├── shape20.txt
│ │ │ │ │ ├── shape21.txt
│ │ │ │ │ ├── shape22.txt
│ │ │ │ │ ├── shape23.txt
│ │ │ │ │ ├── shape24.txt
│ │ │ │ │ ├── shape25.txt
│ │ │ │ │ ├── shape26.txt
│ │ │ │ │ ├── shape3.txt
│ │ │ │ │ ├── shape4.txt
│ │ │ │ │ ├── shape5.txt
│ │ │ │ │ ├── shape6.txt
│ │ │ │ │ ├── shape7.txt
│ │ │ │ │ ├── shape8.txt
│ │ │ │ │ └── shape9.txt
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ ├── test_code.template/
│ │ │ ├── main.c
│ │ │ ├── shapes/
│ │ │ │ └── 8x8/
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ └── shape6.txt
│ │ │ └── tiles/
│ │ │ ├── 6x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25 _ORIG.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile25_ORIG.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile26.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ ├── 8x8/
│ │ │ │ ├── tile0.txt
│ │ │ │ ├── tile1.txt
│ │ │ │ ├── tile10.txt
│ │ │ │ ├── tile11.txt
│ │ │ │ ├── tile12.txt
│ │ │ │ ├── tile13.txt
│ │ │ │ ├── tile14.txt
│ │ │ │ ├── tile15.txt
│ │ │ │ ├── tile16.txt
│ │ │ │ ├── tile17.txt
│ │ │ │ ├── tile18.txt
│ │ │ │ ├── tile19.txt
│ │ │ │ ├── tile2.txt
│ │ │ │ ├── tile20.txt
│ │ │ │ ├── tile21.txt
│ │ │ │ ├── tile22.txt
│ │ │ │ ├── tile23.txt
│ │ │ │ ├── tile24.txt
│ │ │ │ ├── tile25.txt
│ │ │ │ ├── tile3.txt
│ │ │ │ ├── tile4.txt
│ │ │ │ ├── tile5.txt
│ │ │ │ ├── tile6.txt
│ │ │ │ ├── tile7.txt
│ │ │ │ ├── tile8.txt
│ │ │ │ └── tile9.txt
│ │ │ └── ASCII/
│ │ │ └── char_tiles.h
│ │ └── text_game_code.template/
│ │ ├── main.c
│ │ ├── shapes/
│ │ │ ├── 6x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 6x9/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 7x8/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ ├── 8x6/
│ │ │ │ ├── shape0.txt
│ │ │ │ ├── shape1.txt
│ │ │ │ ├── shape10.txt
│ │ │ │ ├── shape11.txt
│ │ │ │ ├── shape12.txt
│ │ │ │ ├── shape13.txt
│ │ │ │ ├── shape14.txt
│ │ │ │ ├── shape15.txt
│ │ │ │ ├── shape16.txt
│ │ │ │ ├── shape17.txt
│ │ │ │ ├── shape18.txt
│ │ │ │ ├── shape19.txt
│ │ │ │ ├── shape2.txt
│ │ │ │ ├── shape20.txt
│ │ │ │ ├── shape21.txt
│ │ │ │ ├── shape22.txt
│ │ │ │ ├── shape23.txt
│ │ │ │ ├── shape24.txt
│ │ │ │ ├── shape25.txt
│ │ │ │ ├── shape26.txt
│ │ │ │ ├── shape3.txt
│ │ │ │ ├── shape4.txt
│ │ │ │ ├── shape5.txt
│ │ │ │ ├── shape6.txt
│ │ │ │ ├── shape7.txt
│ │ │ │ ├── shape8.txt
│ │ │ │ └── shape9.txt
│ │ │ └── 8x8/
│ │ │ ├── shape0.txt
│ │ │ ├── shape1.txt
│ │ │ ├── shape10.txt
│ │ │ ├── shape11.txt
│ │ │ ├── shape12.txt
│ │ │ ├── shape13.txt
│ │ │ ├── shape14.txt
│ │ │ ├── shape15.txt
│ │ │ ├── shape16.txt
│ │ │ ├── shape17.txt
│ │ │ ├── shape18.txt
│ │ │ ├── shape19.txt
│ │ │ ├── shape2.txt
│ │ │ ├── shape20.txt
│ │ │ ├── shape21.txt
│ │ │ ├── shape22.txt
│ │ │ ├── shape23.txt
│ │ │ ├── shape24.txt
│ │ │ ├── shape25.txt
│ │ │ ├── shape26.txt
│ │ │ ├── shape3.txt
│ │ │ ├── shape4.txt
│ │ │ ├── shape5.txt
│ │ │ ├── shape6.txt
│ │ │ ├── shape7.txt
│ │ │ ├── shape8.txt
│ │ │ └── shape9.txt
│ │ └── tiles/
│ │ ├── 6x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile26.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 6x9/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile26.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 7x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile26.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 8x6/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile26.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ ├── 8x8/
│ │ │ ├── tile0.txt
│ │ │ ├── tile1.txt
│ │ │ ├── tile10.txt
│ │ │ ├── tile11.txt
│ │ │ ├── tile12.txt
│ │ │ ├── tile13.txt
│ │ │ ├── tile14.txt
│ │ │ ├── tile15.txt
│ │ │ ├── tile16.txt
│ │ │ ├── tile17.txt
│ │ │ ├── tile18.txt
│ │ │ ├── tile19.txt
│ │ │ ├── tile2.txt
│ │ │ ├── tile20.txt
│ │ │ ├── tile21.txt
│ │ │ ├── tile22.txt
│ │ │ ├── tile23.txt
│ │ │ ├── tile24.txt
│ │ │ ├── tile25.txt
│ │ │ ├── tile26.txt
│ │ │ ├── tile3.txt
│ │ │ ├── tile4.txt
│ │ │ ├── tile5.txt
│ │ │ ├── tile6.txt
│ │ │ ├── tile7.txt
│ │ │ ├── tile8.txt
│ │ │ └── tile9.txt
│ │ └── ASCII/
│ │ └── char_tiles.h
│ ├── unit_tests/
│ │ ├── testDefaults.py
│ │ ├── testImport.py
│ │ ├── testParams.py
│ │ ├── testShapes.py
│ │ ├── testStrings.py
│ │ └── testTiles.py
│ └── xl
└── tools/
├── README.txt
├── atari_st/
│ └── usr/
│ └── share/
│ └── terminfo/
│ └── s/
│ └── st52
├── bbc/
│ └── bbcim-1.0.1/
│ ├── Makefile
│ ├── READ_ME
│ ├── doc/
│ │ ├── ARCHIVE_FORMAT-0.83
│ │ ├── LICENCE
│ │ ├── bbcim.1
│ │ └── bbcim.ps
│ └── src/
│ ├── archief.c
│ ├── bbc_crc.c
│ ├── bbcim.c
│ ├── ddos2dfs.c
│ ├── diskb_add.c
│ ├── diskb_del.c
│ ├── expand_im.c
│ ├── intersplits.c
│ ├── minimaliseer.c
│ ├── nieuw_diskb.c
│ ├── overschrijf.c
│ ├── overschrijf.h
│ ├── splits_cat.c
│ ├── w62.c
│ └── xbeeb.c
├── cc65/
│ ├── apple2/
│ │ ├── MASTER_BOOT_ASCHASE.DSK
│ │ └── ac.jar
│ ├── atari/
│ │ └── mkatr-master/
│ │ ├── .clang-format
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── bomber.atr
│ │ └── src/
│ │ ├── asm/
│ │ │ ├── boot128.asm
│ │ │ ├── boot128.h
│ │ │ ├── boot256.asm
│ │ │ ├── boot256.h
│ │ │ └── get_boot.sh
│ │ ├── atr.c
│ │ ├── atr.h
│ │ ├── compat.c
│ │ ├── compat.h
│ │ ├── crc32.c
│ │ ├── crc32.h
│ │ ├── darray.c
│ │ ├── darray.h
│ │ ├── disksizes.h
│ │ ├── flist.c
│ │ ├── flist.h
│ │ ├── lsatr.c
│ │ ├── lsdos.c
│ │ ├── lsdos.h
│ │ ├── lsextra.c
│ │ ├── lsextra.h
│ │ ├── lshowfen.c
│ │ ├── lshowfen.h
│ │ ├── lssfs.c
│ │ ├── lssfs.h
│ │ ├── mkatr.c
│ │ ├── msg.c
│ │ ├── msg.h
│ │ ├── spartafs.c
│ │ ├── spartafs.h
│ │ └── version.h
│ ├── atari7800/
│ │ ├── extzp.inc
│ │ ├── extzp.s
│ │ ├── sfx.s
│ │ ├── sfx_monolythic.s
│ │ └── sfxlib/
│ │ ├── sfx_70stvcomputer.s
│ │ ├── sfx_activate.s
│ │ ├── sfx_advbite.s
│ │ ├── sfx_advdragonslain.s
│ │ ├── sfx_advdrop.s
│ │ ├── sfx_advpickup.s
│ │ ├── sfx_alienaggressor.s
│ │ ├── sfx_alienbuzz.s
│ │ ├── sfx_aliencoo.s
│ │ ├── sfx_alienkitty.s
│ │ ├── sfx_alienklaxon.s
│ │ ├── sfx_alienlife.s
│ │ ├── sfx_alientrill1.s
│ │ ├── sfx_alientrill2.s
│ │ ├── sfx_anotherjumpdies.s
│ │ ├── sfx_anotherjumpman.s
│ │ ├── sfx_anotherup.s
│ │ ├── sfx_arfarf.s
│ │ ├── sfx_babyribbit.s
│ │ ├── sfx_babyribbithop.s
│ │ ├── sfx_babywah.s
│ │ ├── sfx_bassbump.s
│ │ ├── sfx_bassbump2.s
│ │ ├── sfx_berzerkrobotdeath.s
│ │ ├── sfx_bling.s
│ │ ├── sfx_bubbleup.s
│ │ ├── sfx_buzzbomb.s
│ │ ├── sfx_cabwhistle.s
│ │ ├── sfx_cavalry.s
│ │ ├── sfx_chirp.s
│ │ ├── sfx_crystalchimes.s
│ │ ├── sfx_deeproar.s
│ │ ├── sfx_denied.s
│ │ ├── sfx_distressed.s
│ │ ├── sfx_distressed2.s
│ │ ├── sfx_distressed3.s
│ │ ├── sfx_distressed4.s
│ │ ├── sfx_doorpound.s
│ │ ├── sfx_downthepipe.s
│ │ ├── sfx_dragit.s
│ │ ├── sfx_drip.s
│ │ ├── sfx_dropmedium.s
│ │ ├── sfx_dropped.s
│ │ ├── sfx_dunno.s
│ │ ├── sfx_echo1.s
│ │ ├── sfx_echo2.s
│ │ ├── sfx_echobang.s
│ │ ├── sfx_eek.s
│ │ ├── sfx_eek2.s
│ │ ├── sfx_electrobump.s
│ │ ├── sfx_electropunch.s
│ │ ├── sfx_electrosplosion.s
│ │ ├── sfx_electroswitch.s
│ │ ├── sfx_electroswitch2.s
│ │ ├── sfx_explosion.s
│ │ ├── sfx_falling.s
│ │ ├── sfx_gooditem.s
│ │ ├── sfx_gotthecoin.s
│ │ ├── sfx_gotthering.s
│ │ ├── sfx_hahaha.s
│ │ ├── sfx_hahaha2.s
│ │ ├── sfx_hophip.s
│ │ ├── sfx_hophipquick.s
│ │ ├── sfx_hophop.s
│ │ ├── sfx_humanoid.s
│ │ ├── sfx_jump1.s
│ │ ├── sfx_jump2.s
│ │ ├── sfx_jump3.s
│ │ ├── sfx_jumpman.s
│ │ ├── sfx_jumpo.s
│ │ ├── sfx_laserrecoil.s
│ │ ├── sfx_longgongsilver.s
│ │ ├── sfx_maser.s
│ │ ├── sfx_nonobounce.s
│ │ ├── sfx_oneup.s
│ │ ├── sfx_ouch.s
│ │ ├── sfx_pewpew.s
│ │ ├── sfx_pickupprize.s
│ │ ├── sfx_pitfalljump.s
│ │ ├── sfx_plainlaser.s
│ │ ├── sfx_plonk.s
│ │ ├── sfx_poof1.s
│ │ ├── sfx_poof2.s
│ │ ├── sfx_powerup.s
│ │ ├── sfx_pulsecannon.s
│ │ ├── sfx_quack.s
│ │ ├── sfx_ribbit.s
│ │ ├── sfx_roarcheep.s
│ │ ├── sfx_roarroar.s
│ │ ├── sfx_rubberhammer.s
│ │ ├── sfx_rubbermallet.s
│ │ ├── sfx_salvolasershot.s
│ │ ├── sfx_simplebuzz.s
│ │ ├── sfx_snore.s
│ │ ├── sfx_spaceinvshoot.s
│ │ ├── sfx_spawn.s
│ │ ├── sfx_spring.s
│ │ ├── sfx_squeek.s
│ │ ├── sfx_strum.s
│ │ ├── sfx_teleported.s
│ │ ├── sfx_tom.s
│ │ ├── sfx_transporter.s
│ │ ├── sfx_twinkle.s
│ │ ├── sfx_uhoh.s
│ │ ├── sfx_uncovered.s
│ │ ├── sfx_warcry.s
│ │ ├── sfx_whoa.s
│ │ ├── sfx_wilhelm.s
│ │ ├── sfx_wolfwhistle.s
│ │ ├── sfx_yahoo.s
│ │ └── sfx_yeah.s
│ ├── bbc/
│ │ └── INSTALL/
│ │ └── bbcim-1.2/
│ │ ├── Makefile
│ │ ├── READ_ME
│ │ ├── doc/
│ │ │ ├── ARCHIVE_FORMAT-0.83
│ │ │ ├── CHANGES
│ │ │ ├── EMAIL
│ │ │ ├── LICENCE
│ │ │ ├── TO_DO
│ │ │ ├── USE_AS_LIBRARY
│ │ │ ├── WatfordDFS_format.txt
│ │ │ └── bbcim.1
│ │ ├── lib/
│ │ │ ├── Makefile
│ │ │ ├── NOT_USED/
│ │ │ │ └── d_write_cat.c
│ │ │ ├── _config.h
│ │ │ ├── bbcim_internal.h
│ │ │ ├── bbcimlib.c
│ │ │ ├── disk_add_file.c
│ │ │ ├── disk_catalogue_extract.c
│ │ │ ├── disk_catalogue_extract__dfs.c
│ │ │ ├── disk_combine_ss.c
│ │ │ ├── disk_convert_ddos_to_dfs.c
│ │ │ ├── disk_convert_w62_to_dfs.c
│ │ │ ├── disk_delete_file.c
│ │ │ ├── disk_expand.c
│ │ │ ├── disk_id.c
│ │ │ ├── disk_minimise.c
│ │ │ ├── disk_new.c
│ │ │ ├── disk_set_boot.c
│ │ │ ├── disk_split_ds.c
│ │ │ ├── error.c
│ │ │ ├── include/
│ │ │ │ └── bbcim.h
│ │ │ ├── overschrijf.c
│ │ │ ├── overschrijf.h
│ │ │ ├── shared/
│ │ │ │ ├── _ansi_console.h
│ │ │ │ ├── _bbc_crc.c
│ │ │ │ ├── _bbc_crc.h
│ │ │ │ ├── _bbc_filenames.c
│ │ │ │ ├── _bbc_filenames.h
│ │ │ │ ├── _read_write_wrappers.c
│ │ │ │ ├── _read_write_wrappers.h
│ │ │ │ └── archive_format/
│ │ │ │ ├── ARCHIVE_FORMAT-0.83
│ │ │ │ ├── EMAIL
│ │ │ │ ├── Makefile
│ │ │ │ ├── READ_ME
│ │ │ │ ├── _bbc_archive.h
│ │ │ │ ├── _bbc_archive_read_attributes.c
│ │ │ │ ├── _bbc_archive_write_attributes.c
│ │ │ │ ├── _weg/
│ │ │ │ │ └── archive_error.c
│ │ │ │ └── test/
│ │ │ │ ├── Makefile
│ │ │ │ └── archive_test.c
│ │ │ └── utils.c
│ │ ├── prog/
│ │ │ ├── Makefile
│ │ │ ├── _config.h
│ │ │ ├── _help.c
│ │ │ ├── _help_man.c
│ │ │ ├── bbcim.c
│ │ │ ├── functions/
│ │ │ │ ├── archive_cleanup.c
│ │ │ │ ├── archive_crc_check.c
│ │ │ │ └── catalogue_to_inf.c
│ │ │ ├── shared/
│ │ │ │ └── _ansi_console.h
│ │ │ └── utils.c
│ │ └── test/
│ │ ├── Makefile
│ │ └── libtest.c
│ ├── c64/
│ │ └── prg2crt.py
│ ├── gamate/
│ │ └── gamate-fixcart.c
│ ├── osic1p/
│ │ └── srecord-1.64/
│ │ ├── AUTHORS
│ │ ├── BUILDING
│ │ ├── LICENSE
│ │ ├── Makefile.in
│ │ ├── README
│ │ ├── RELEASE
│ │ ├── aegis.conf
│ │ ├── aegis.conf.d/
│ │ │ ├── aede-policy
│ │ │ ├── aemakegen
│ │ │ ├── architecture
│ │ │ ├── build
│ │ │ ├── debian
│ │ │ ├── diff
│ │ │ ├── history
│ │ │ ├── merge
│ │ │ ├── new_file_template
│ │ │ ├── rss
│ │ │ └── test
│ │ ├── configure
│ │ ├── debian/
│ │ │ ├── changelog
│ │ │ ├── compat
│ │ │ ├── control
│ │ │ ├── copyright
│ │ │ ├── docs
│ │ │ ├── libsrecord-dev.install
│ │ │ ├── libsrecord0.install
│ │ │ ├── rules
│ │ │ ├── srecord-doc.install
│ │ │ ├── srecord.install
│ │ │ └── watch
│ │ ├── etc/
│ │ │ ├── BUILDING.man
│ │ │ ├── CHANGES.1.0.txt
│ │ │ ├── CHANGES.1.1.txt
│ │ │ ├── CHANGES.1.10.txt
│ │ │ ├── CHANGES.1.2.txt
│ │ │ ├── CHANGES.1.3.txt
│ │ │ ├── CHANGES.1.4.txt
│ │ │ ├── CHANGES.1.5.txt
│ │ │ ├── CHANGES.1.6.txt
│ │ │ ├── CHANGES.1.7.txt
│ │ │ ├── CHANGES.1.8.txt
│ │ │ ├── CHANGES.1.9.txt
│ │ │ ├── CHANGES.sh
│ │ │ ├── Howto.conf.in
│ │ │ ├── README.man
│ │ │ ├── apt-get-depends.cook
│ │ │ ├── archive.cook
│ │ │ ├── autoconf.cook
│ │ │ ├── change_log.man
│ │ │ ├── check-tarball.sh
│ │ │ ├── configure.ac
│ │ │ ├── crc16-ccitt.html
│ │ │ ├── debian.png.uue
│ │ │ ├── doc_cat.png.uue
│ │ │ ├── doc_chip.png.uue
│ │ │ ├── doc_gen.png.uue
│ │ │ ├── doc_lens.png.uue
│ │ │ ├── doc_lib.png.uue
│ │ │ ├── documentation.cook
│ │ │ ├── download.html
│ │ │ ├── doxygen.cfg
│ │ │ ├── doxygen.cook
│ │ │ ├── groff.sh
│ │ │ ├── howto.cook
│ │ │ ├── howto_qemu_hardy64.txt
│ │ │ ├── index.html
│ │ │ ├── mailing-list.html
│ │ │ ├── man-html-index.sh
│ │ │ ├── metrics.cook
│ │ │ ├── new.sh
│ │ │ ├── page-list.awk
│ │ │ ├── ppa-upload.sh
│ │ │ ├── ref-ptx.ignore
│ │ │ ├── ref-ptx.sh
│ │ │ ├── ref-ptx1.awk
│ │ │ ├── ref-ptx2.awk
│ │ │ ├── reference.man
│ │ │ ├── rpm-build.sh
│ │ │ ├── srecord.lsm
│ │ │ ├── srecord.png.uue
│ │ │ ├── ssp.awk
│ │ │ ├── tags.cook
│ │ │ ├── template/
│ │ │ │ ├── c
│ │ │ │ ├── cc
│ │ │ │ ├── etc-new-so
│ │ │ │ ├── generic
│ │ │ │ ├── h
│ │ │ │ ├── lib_cc
│ │ │ │ ├── lib_h
│ │ │ │ ├── man
│ │ │ │ ├── sh
│ │ │ │ └── test
│ │ │ ├── whining.png.uue
│ │ │ ├── windows.html
│ │ │ └── x_defs_pack.vhd
│ │ ├── install-sh
│ │ ├── libdir/
│ │ │ └── pkgconfig/
│ │ │ └── srecord.pc.in
│ │ ├── man/
│ │ │ ├── man1/
│ │ │ │ ├── srec_cat.1
│ │ │ │ ├── srec_cmp.1
│ │ │ │ ├── srec_examples.1
│ │ │ │ ├── srec_info.1
│ │ │ │ ├── srec_input.1
│ │ │ │ └── srec_license.1
│ │ │ ├── man3/
│ │ │ │ ├── srecord.3
│ │ │ │ └── srecord_license.3
│ │ │ └── man5/
│ │ │ ├── srec_aomf.5
│ │ │ ├── srec_ascii_hex.5
│ │ │ ├── srec_atmel_generic.5
│ │ │ ├── srec_binary.5
│ │ │ ├── srec_brecord.5
│ │ │ ├── srec_coe.5
│ │ │ ├── srec_cosmac.5
│ │ │ ├── srec_dec_binary.5
│ │ │ ├── srec_emon52.5
│ │ │ ├── srec_fairchild.5
│ │ │ ├── srec_fastload.5
│ │ │ ├── srec_formatted_binary.5
│ │ │ ├── srec_forth.5
│ │ │ ├── srec_fpc.5
│ │ │ ├── srec_idt.5
│ │ │ ├── srec_intel.5
│ │ │ ├── srec_intel16.5
│ │ │ ├── srec_logisim.5
│ │ │ ├── srec_mem.5
│ │ │ ├── srec_mif.5
│ │ │ ├── srec_mips_flash.5
│ │ │ ├── srec_mos_tech.5
│ │ │ ├── srec_motorola.5
│ │ │ ├── srec_msbin.5
│ │ │ ├── srec_needham.5
│ │ │ ├── srec_os65v.5
│ │ │ ├── srec_ppb.5
│ │ │ ├── srec_ppx.5
│ │ │ ├── srec_signetics.5
│ │ │ ├── srec_spasm.5
│ │ │ ├── srec_spectrum.5
│ │ │ ├── srec_stewie.5
│ │ │ ├── srec_tektronix.5
│ │ │ ├── srec_tektronix_extended.5
│ │ │ ├── srec_ti_tagged.5
│ │ │ ├── srec_ti_tagged_16.5
│ │ │ ├── srec_ti_txt.5
│ │ │ ├── srec_trs80.5
│ │ │ ├── srec_vmem.5
│ │ │ └── srec_wilson.5
│ │ ├── script/
│ │ │ └── test_prelude.sh.in
│ │ ├── srec_cat/
│ │ │ ├── arglex3.cc
│ │ │ ├── arglex3.h
│ │ │ └── main.cc
│ │ ├── srec_cmp/
│ │ │ └── main.cc
│ │ ├── srec_info/
│ │ │ └── main.cc
│ │ ├── srecord/
│ │ │ ├── adler16.cc
│ │ │ ├── adler16.h
│ │ │ ├── adler32.cc
│ │ │ ├── adler32.h
│ │ │ ├── arglex/
│ │ │ │ ├── abbreviate.cc
│ │ │ │ ├── test_ambiguous.cc
│ │ │ │ ├── tool/
│ │ │ │ │ ├── get_interval.cc
│ │ │ │ │ ├── get_interval_small.cc
│ │ │ │ │ ├── get_number.cc
│ │ │ │ │ ├── get_string.cc
│ │ │ │ │ ├── input.cc
│ │ │ │ │ └── output.cc
│ │ │ │ ├── tool.cc
│ │ │ │ └── tool.h
│ │ │ ├── arglex.cc
│ │ │ ├── arglex.h
│ │ │ ├── bitrev.cc
│ │ │ ├── bitrev.h
│ │ │ ├── config.h.in
│ │ │ ├── config.messy.h
│ │ │ ├── crc16.cc
│ │ │ ├── crc16.h
│ │ │ ├── crc32.cc
│ │ │ ├── crc32.h
│ │ │ ├── defcon.cc
│ │ │ ├── defcon.h
│ │ │ ├── endian/
│ │ │ │ └── decode_word.cc
│ │ │ ├── endian.cc
│ │ │ ├── endian.h
│ │ │ ├── fletcher16.cc
│ │ │ ├── fletcher16.h
│ │ │ ├── fletcher32.cc
│ │ │ ├── fletcher32.h
│ │ │ ├── format_printf.h
│ │ │ ├── input/
│ │ │ │ ├── catenate.cc
│ │ │ │ ├── catenate.h
│ │ │ │ ├── file/
│ │ │ │ │ ├── aomf.cc
│ │ │ │ │ ├── aomf.h
│ │ │ │ │ ├── ascii_hex.cc
│ │ │ │ │ ├── ascii_hex.h
│ │ │ │ │ ├── atmel_generic.cc
│ │ │ │ │ ├── atmel_generic.h
│ │ │ │ │ ├── binary.cc
│ │ │ │ │ ├── binary.h
│ │ │ │ │ ├── brecord.cc
│ │ │ │ │ ├── brecord.h
│ │ │ │ │ ├── cosmac.cc
│ │ │ │ │ ├── cosmac.h
│ │ │ │ │ ├── dec_binary.cc
│ │ │ │ │ ├── dec_binary.h
│ │ │ │ │ ├── emon52.cc
│ │ │ │ │ ├── emon52.h
│ │ │ │ │ ├── fairchild.cc
│ │ │ │ │ ├── fairchild.h
│ │ │ │ │ ├── fastload.cc
│ │ │ │ │ ├── fastload.h
│ │ │ │ │ ├── formatted_binary.cc
│ │ │ │ │ ├── formatted_binary.h
│ │ │ │ │ ├── four_packed_code.cc
│ │ │ │ │ ├── four_packed_code.h
│ │ │ │ │ ├── guess.cc
│ │ │ │ │ ├── hexdump.cc
│ │ │ │ │ ├── hexdump.h
│ │ │ │ │ ├── idt.cc
│ │ │ │ │ ├── idt.h
│ │ │ │ │ ├── intel.cc
│ │ │ │ │ ├── intel.h
│ │ │ │ │ ├── intel16.cc
│ │ │ │ │ ├── intel16.h
│ │ │ │ │ ├── logisim.cc
│ │ │ │ │ ├── logisim.h
│ │ │ │ │ ├── mif.cc
│ │ │ │ │ ├── mif.h
│ │ │ │ │ ├── mips_flash.cc
│ │ │ │ │ ├── mips_flash.h
│ │ │ │ │ ├── mos_tech.cc
│ │ │ │ │ ├── mos_tech.h
│ │ │ │ │ ├── motorola.cc
│ │ │ │ │ ├── motorola.h
│ │ │ │ │ ├── msbin.cc
│ │ │ │ │ ├── msbin.h
│ │ │ │ │ ├── needham.cc
│ │ │ │ │ ├── needham.h
│ │ │ │ │ ├── os65v.cc
│ │ │ │ │ ├── os65v.h
│ │ │ │ │ ├── ppb.cc
│ │ │ │ │ ├── ppb.h
│ │ │ │ │ ├── ppx.cc
│ │ │ │ │ ├── ppx.h
│ │ │ │ │ ├── signetics.cc
│ │ │ │ │ ├── signetics.h
│ │ │ │ │ ├── spasm.cc
│ │ │ │ │ ├── spasm.h
│ │ │ │ │ ├── spectrum.cc
│ │ │ │ │ ├── spectrum.h
│ │ │ │ │ ├── stewie.cc
│ │ │ │ │ ├── stewie.h
│ │ │ │ │ ├── tektronix.cc
│ │ │ │ │ ├── tektronix.h
│ │ │ │ │ ├── tektronix_extended.cc
│ │ │ │ │ ├── tektronix_extended.h
│ │ │ │ │ ├── ti_tagged.cc
│ │ │ │ │ ├── ti_tagged.h
│ │ │ │ │ ├── ti_tagged_16.cc
│ │ │ │ │ ├── ti_tagged_16.h
│ │ │ │ │ ├── ti_txt.cc
│ │ │ │ │ ├── ti_txt.h
│ │ │ │ │ ├── trs80.cc
│ │ │ │ │ ├── trs80.h
│ │ │ │ │ ├── vmem.cc
│ │ │ │ │ ├── vmem.h
│ │ │ │ │ ├── wilson.cc
│ │ │ │ │ └── wilson.h
│ │ │ │ ├── file.cc
│ │ │ │ ├── file.h
│ │ │ │ ├── filter/
│ │ │ │ │ ├── and.cc
│ │ │ │ │ ├── and.h
│ │ │ │ │ ├── bitrev.cc
│ │ │ │ │ ├── bitrev.h
│ │ │ │ │ ├── byte_swap.cc
│ │ │ │ │ ├── byte_swap.h
│ │ │ │ │ ├── checksum/
│ │ │ │ │ │ ├── bitnot.cc
│ │ │ │ │ │ ├── bitnot.h
│ │ │ │ │ │ ├── negative.cc
│ │ │ │ │ │ ├── negative.h
│ │ │ │ │ │ ├── positive.cc
│ │ │ │ │ │ └── positive.h
│ │ │ │ │ ├── checksum.cc
│ │ │ │ │ ├── checksum.h
│ │ │ │ │ ├── crop.cc
│ │ │ │ │ ├── crop.h
│ │ │ │ │ ├── fill.cc
│ │ │ │ │ ├── fill.h
│ │ │ │ │ ├── interval/
│ │ │ │ │ │ ├── length.cc
│ │ │ │ │ │ ├── length.h
│ │ │ │ │ │ ├── maximum.cc
│ │ │ │ │ │ ├── maximum.h
│ │ │ │ │ │ ├── minimum.cc
│ │ │ │ │ │ └── minimum.h
│ │ │ │ │ ├── interval.cc
│ │ │ │ │ ├── interval.h
│ │ │ │ │ ├── message/
│ │ │ │ │ │ ├── adler16.cc
│ │ │ │ │ │ ├── adler16.h
│ │ │ │ │ │ ├── adler32.cc
│ │ │ │ │ │ ├── adler32.h
│ │ │ │ │ │ ├── crc16.cc
│ │ │ │ │ │ ├── crc16.h
│ │ │ │ │ │ ├── crc32.cc
│ │ │ │ │ │ ├── crc32.h
│ │ │ │ │ │ ├── fletcher16.cc
│ │ │ │ │ │ ├── fletcher16.h
│ │ │ │ │ │ ├── fletcher32.cc
│ │ │ │ │ │ ├── fletcher32.h
│ │ │ │ │ │ ├── gcrypt.cc
│ │ │ │ │ │ ├── gcrypt.h
│ │ │ │ │ │ ├── stm32.cc
│ │ │ │ │ │ └── stm32.h
│ │ │ │ │ ├── message.cc
│ │ │ │ │ ├── message.h
│ │ │ │ │ ├── not.cc
│ │ │ │ │ ├── not.h
│ │ │ │ │ ├── offset.cc
│ │ │ │ │ ├── offset.h
│ │ │ │ │ ├── or.cc
│ │ │ │ │ ├── or.h
│ │ │ │ │ ├── random_fill.cc
│ │ │ │ │ ├── random_fill.h
│ │ │ │ │ ├── sequence.cc
│ │ │ │ │ ├── sequence.h
│ │ │ │ │ ├── split.cc
│ │ │ │ │ ├── split.h
│ │ │ │ │ ├── unfill.cc
│ │ │ │ │ ├── unfill.h
│ │ │ │ │ ├── unsplit.cc
│ │ │ │ │ ├── unsplit.h
│ │ │ │ │ ├── xor.cc
│ │ │ │ │ └── xor.h
│ │ │ │ ├── filter.cc
│ │ │ │ ├── filter.h
│ │ │ │ ├── generator/
│ │ │ │ │ ├── constant.cc
│ │ │ │ │ ├── constant.h
│ │ │ │ │ ├── random.cc
│ │ │ │ │ ├── random.h
│ │ │ │ │ ├── repeat.cc
│ │ │ │ │ └── repeat.h
│ │ │ │ ├── generator.cc
│ │ │ │ ├── generator.h
│ │ │ │ ├── interval.cc
│ │ │ │ └── interval.h
│ │ │ ├── input.cc
│ │ │ ├── input.h
│ │ │ ├── interval/
│ │ │ │ ├── coverage.cc
│ │ │ │ └── flatten.cc
│ │ │ ├── interval.cc
│ │ │ ├── interval.h
│ │ │ ├── memory/
│ │ │ │ ├── chunk.cc
│ │ │ │ ├── chunk.h
│ │ │ │ ├── walker/
│ │ │ │ │ ├── adler16.cc
│ │ │ │ │ ├── adler16.h
│ │ │ │ │ ├── adler32.cc
│ │ │ │ │ ├── adler32.h
│ │ │ │ │ ├── alignment.cc
│ │ │ │ │ ├── alignment.h
│ │ │ │ │ ├── compare.cc
│ │ │ │ │ ├── compare.h
│ │ │ │ │ ├── continuity.cc
│ │ │ │ │ ├── continuity.h
│ │ │ │ │ ├── crc16.cc
│ │ │ │ │ ├── crc16.h
│ │ │ │ │ ├── crc32.cc
│ │ │ │ │ ├── crc32.h
│ │ │ │ │ ├── fletcher16.cc
│ │ │ │ │ ├── fletcher16.h
│ │ │ │ │ ├── fletcher32.cc
│ │ │ │ │ ├── fletcher32.h
│ │ │ │ │ ├── gcrypt.cc
│ │ │ │ │ ├── gcrypt.h
│ │ │ │ │ ├── stm32.cc
│ │ │ │ │ ├── stm32.h
│ │ │ │ │ ├── writer.cc
│ │ │ │ │ └── writer.h
│ │ │ │ ├── walker.cc
│ │ │ │ └── walker.h
│ │ │ ├── memory.cc
│ │ │ ├── memory.h
│ │ │ ├── output/
│ │ │ │ ├── file/
│ │ │ │ │ ├── aomf.cc
│ │ │ │ │ ├── aomf.h
│ │ │ │ │ ├── ascii_hex.cc
│ │ │ │ │ ├── ascii_hex.h
│ │ │ │ │ ├── asm.cc
│ │ │ │ │ ├── asm.h
│ │ │ │ │ ├── atmel_generic.cc
│ │ │ │ │ ├── atmel_generic.h
│ │ │ │ │ ├── basic.cc
│ │ │ │ │ ├── basic.h
│ │ │ │ │ ├── binary.cc
│ │ │ │ │ ├── binary.h
│ │ │ │ │ ├── brecord.cc
│ │ │ │ │ ├── brecord.h
│ │ │ │ │ ├── c.cc
│ │ │ │ │ ├── c.h
│ │ │ │ │ ├── coe.cc
│ │ │ │ │ ├── coe.h
│ │ │ │ │ ├── cosmac.cc
│ │ │ │ │ ├── cosmac.h
│ │ │ │ │ ├── dec_binary.cc
│ │ │ │ │ ├── dec_binary.h
│ │ │ │ │ ├── emon52.cc
│ │ │ │ │ ├── emon52.h
│ │ │ │ │ ├── fairchild.cc
│ │ │ │ │ ├── fairchild.h
│ │ │ │ │ ├── fastload.cc
│ │ │ │ │ ├── fastload.h
│ │ │ │ │ ├── formatted_binary.cc
│ │ │ │ │ ├── formatted_binary.h
│ │ │ │ │ ├── forth.cc
│ │ │ │ │ ├── forth.h
│ │ │ │ │ ├── four_packed_code.cc
│ │ │ │ │ ├── four_packed_code.h
│ │ │ │ │ ├── hexdump.cc
│ │ │ │ │ ├── hexdump.h
│ │ │ │ │ ├── idt.cc
│ │ │ │ │ ├── idt.h
│ │ │ │ │ ├── intel.cc
│ │ │ │ │ ├── intel.h
│ │ │ │ │ ├── intel16.cc
│ │ │ │ │ ├── intel16.h
│ │ │ │ │ ├── line_termination.cc
│ │ │ │ │ ├── logisim.cc
│ │ │ │ │ ├── logisim.h
│ │ │ │ │ ├── mem.cc
│ │ │ │ │ ├── mem.h
│ │ │ │ │ ├── mif.cc
│ │ │ │ │ ├── mif.h
│ │ │ │ │ ├── mips_flash.cc
│ │ │ │ │ ├── mips_flash.h
│ │ │ │ │ ├── mos_tech.cc
│ │ │ │ │ ├── mos_tech.h
│ │ │ │ │ ├── motorola.cc
│ │ │ │ │ ├── motorola.h
│ │ │ │ │ ├── msbin.cc
│ │ │ │ │ ├── msbin.h
│ │ │ │ │ ├── needham.cc
│ │ │ │ │ ├── needham.h
│ │ │ │ │ ├── os65v.cc
│ │ │ │ │ ├── os65v.h
│ │ │ │ │ ├── ppb.cc
│ │ │ │ │ ├── ppb.h
│ │ │ │ │ ├── ppx.cc
│ │ │ │ │ ├── ppx.h
│ │ │ │ │ ├── signetics.cc
│ │ │ │ │ ├── signetics.h
│ │ │ │ │ ├── spasm.cc
│ │ │ │ │ ├── spasm.h
│ │ │ │ │ ├── spectrum.cc
│ │ │ │ │ ├── spectrum.h
│ │ │ │ │ ├── stewie.cc
│ │ │ │ │ ├── stewie.h
│ │ │ │ │ ├── tektronix.cc
│ │ │ │ │ ├── tektronix.h
│ │ │ │ │ ├── tektronix_extended.cc
│ │ │ │ │ ├── tektronix_extended.h
│ │ │ │ │ ├── ti_tagged.cc
│ │ │ │ │ ├── ti_tagged.h
│ │ │ │ │ ├── ti_tagged_16.cc
│ │ │ │ │ ├── ti_tagged_16.h
│ │ │ │ │ ├── ti_txt.cc
│ │ │ │ │ ├── ti_txt.h
│ │ │ │ │ ├── trs80.cc
│ │ │ │ │ ├── trs80.h
│ │ │ │ │ ├── vhdl.cc
│ │ │ │ │ ├── vhdl.h
│ │ │ │ │ ├── vmem.cc
│ │ │ │ │ ├── vmem.h
│ │ │ │ │ ├── wilson.cc
│ │ │ │ │ └── wilson.h
│ │ │ │ ├── file.cc
│ │ │ │ ├── file.h
│ │ │ │ ├── filter/
│ │ │ │ │ ├── reblock.cc
│ │ │ │ │ └── reblock.h
│ │ │ │ ├── filter.cc
│ │ │ │ └── filter.h
│ │ │ ├── output.cc
│ │ │ ├── output.h
│ │ │ ├── patchlevel.h
│ │ │ ├── pretty_size.cc
│ │ │ ├── pretty_size.h
│ │ │ ├── progname.cc
│ │ │ ├── progname.h
│ │ │ ├── quit/
│ │ │ │ ├── exception.cc
│ │ │ │ ├── exception.h
│ │ │ │ ├── normal.cc
│ │ │ │ ├── normal.h
│ │ │ │ ├── prefix.cc
│ │ │ │ └── prefix.h
│ │ │ ├── quit.cc
│ │ │ ├── quit.h
│ │ │ ├── r250.cc
│ │ │ ├── r250.h
│ │ │ ├── record.cc
│ │ │ ├── record.h
│ │ │ ├── sizeof.h
│ │ │ ├── srecord.h
│ │ │ ├── stm32.cc
│ │ │ ├── stm32.h
│ │ │ ├── string/
│ │ │ │ ├── quote_c.cc
│ │ │ │ ├── url_decode.cc
│ │ │ │ └── url_encode.cc
│ │ │ ├── string.h
│ │ │ ├── versn_stamp.cc
│ │ │ ├── versn_stamp.h
│ │ │ └── vsnprintf.cc
│ │ ├── srecord-1.64.spec
│ │ ├── test/
│ │ │ ├── 00/
│ │ │ │ ├── t0001a.sh
│ │ │ │ ├── t0002a.sh
│ │ │ │ ├── t0003a.sh
│ │ │ │ ├── t0004a.sh
│ │ │ │ ├── t0005a.sh
│ │ │ │ ├── t0006a.sh
│ │ │ │ ├── t0007a.sh
│ │ │ │ ├── t0008a.sh
│ │ │ │ ├── t0009a.sh
│ │ │ │ ├── t0010a.sh
│ │ │ │ ├── t0011a.sh
│ │ │ │ ├── t0012a.sh
│ │ │ │ ├── t0013a.sh
│ │ │ │ ├── t0014a.sh
│ │ │ │ ├── t0015a.sh
│ │ │ │ ├── t0016a.sh
│ │ │ │ ├── t0017a.sh
│ │ │ │ ├── t0018a.sh
│ │ │ │ ├── t0019a.sh
│ │ │ │ ├── t0020a.sh
│ │ │ │ ├── t0021a.sh
│ │ │ │ ├── t0022a.sh
│ │ │ │ ├── t0023a.sh
│ │ │ │ ├── t0024a.sh
│ │ │ │ ├── t0025a.sh
│ │ │ │ ├── t0026a.sh
│ │ │ │ ├── t0027a.sh
│ │ │ │ ├── t0028a.sh
│ │ │ │ ├── t0029a.sh
│ │ │ │ ├── t0030a.sh
│ │ │ │ ├── t0031a.sh
│ │ │ │ ├── t0032a.sh
│ │ │ │ ├── t0033a.sh
│ │ │ │ ├── t0034a.sh
│ │ │ │ ├── t0035a.sh
│ │ │ │ ├── t0036a.sh
│ │ │ │ ├── t0037a.sh
│ │ │ │ ├── t0037b.sh
│ │ │ │ ├── t0038a.sh
│ │ │ │ ├── t0039a.sh
│ │ │ │ ├── t0040a.sh
│ │ │ │ ├── t0050a.sh
│ │ │ │ ├── t0051a.sh
│ │ │ │ ├── t0052a.sh
│ │ │ │ ├── t0053a.sh
│ │ │ │ ├── t0055a.sh
│ │ │ │ ├── t0056a.sh
│ │ │ │ ├── t0057a.sh
│ │ │ │ ├── t0058a.sh
│ │ │ │ ├── t0059a.sh
│ │ │ │ ├── t0060a.sh
│ │ │ │ ├── t0061a.sh
│ │ │ │ ├── t0062a.sh
│ │ │ │ ├── t0063a.sh
│ │ │ │ ├── t0065a.sh
│ │ │ │ ├── t0066a.sh
│ │ │ │ ├── t0067a.sh
│ │ │ │ ├── t0068a.sh
│ │ │ │ ├── t0069a.sh
│ │ │ │ ├── t0070a.sh
│ │ │ │ ├── t0071a.sh
│ │ │ │ ├── t0072a.sh
│ │ │ │ ├── t0073a.sh
│ │ │ │ ├── t0075a.sh
│ │ │ │ ├── t0076a.sh
│ │ │ │ ├── t0077a.sh
│ │ │ │ ├── t0078a.sh
│ │ │ │ ├── t0079a.sh
│ │ │ │ ├── t0080a.sh
│ │ │ │ ├── t0081a.sh
│ │ │ │ ├── t0082a.sh
│ │ │ │ ├── t0083a.sh
│ │ │ │ ├── t0085a.sh
│ │ │ │ ├── t0086a.sh
│ │ │ │ ├── t0087a.sh
│ │ │ │ ├── t0088a.sh
│ │ │ │ ├── t0089a.sh
│ │ │ │ ├── t0090a.sh
│ │ │ │ ├── t0091a.sh
│ │ │ │ ├── t0092a.sh
│ │ │ │ ├── t0093a.sh
│ │ │ │ ├── t0095a.sh
│ │ │ │ ├── t0096a.sh
│ │ │ │ ├── t0097a.sh
│ │ │ │ ├── t0098a.sh
│ │ │ │ └── t0099a.sh
│ │ │ ├── 01/
│ │ │ │ ├── t0100a.sh
│ │ │ │ ├── t0101a.sh
│ │ │ │ ├── t0102a.sh
│ │ │ │ ├── t0103a.sh
│ │ │ │ ├── t0105a.sh
│ │ │ │ ├── t0106a.sh
│ │ │ │ ├── t0107a.sh
│ │ │ │ ├── t0108a.sh
│ │ │ │ ├── t0109a.sh
│ │ │ │ ├── t0110a.sh
│ │ │ │ ├── t0111a.sh
│ │ │ │ ├── t0112a.sh
│ │ │ │ ├── t0113a.sh
│ │ │ │ ├── t0115a.sh
│ │ │ │ ├── t0116a.sh
│ │ │ │ ├── t0117a.sh
│ │ │ │ ├── t0118a.sh
│ │ │ │ ├── t0119a.sh
│ │ │ │ ├── t0120a.sh
│ │ │ │ ├── t0121a.sh
│ │ │ │ ├── t0122a.sh
│ │ │ │ ├── t0123a.sh
│ │ │ │ ├── t0125a.sh
│ │ │ │ ├── t0126a.sh
│ │ │ │ ├── t0127a.sh
│ │ │ │ ├── t0128a.sh
│ │ │ │ ├── t0129a.sh
│ │ │ │ ├── t0130a.sh
│ │ │ │ ├── t0131a.sh
│ │ │ │ ├── t0132a.sh
│ │ │ │ ├── t0133a.sh
│ │ │ │ ├── t0135a.sh
│ │ │ │ ├── t0136a.sh
│ │ │ │ ├── t0137a.sh
│ │ │ │ ├── t0138a.sh
│ │ │ │ ├── t0139a.sh
│ │ │ │ ├── t0150a.sh
│ │ │ │ ├── t0151a.sh
│ │ │ │ ├── t0152a.sh
│ │ │ │ ├── t0153a.sh
│ │ │ │ ├── t0155a.sh
│ │ │ │ ├── t0156a.sh
│ │ │ │ ├── t0157a.sh
│ │ │ │ ├── t0158a.sh
│ │ │ │ ├── t0159a.sh
│ │ │ │ ├── t0160a.sh
│ │ │ │ ├── t0161a.sh
│ │ │ │ ├── t0162a.sh
│ │ │ │ ├── t0163a.sh
│ │ │ │ ├── t0165a.sh
│ │ │ │ ├── t0166a.sh
│ │ │ │ ├── t0167a.sh
│ │ │ │ ├── t0168a.sh
│ │ │ │ ├── t0169a.sh
│ │ │ │ ├── t0170a.sh
│ │ │ │ ├── t0171a.sh
│ │ │ │ ├── t0172a.sh
│ │ │ │ ├── t0173a.sh
│ │ │ │ ├── t0175a.sh
│ │ │ │ ├── t0176a.sh
│ │ │ │ ├── t0177a.sh
│ │ │ │ ├── t0178a.sh
│ │ │ │ ├── t0179a.sh
│ │ │ │ ├── t0180a.sh
│ │ │ │ ├── t0181a.sh
│ │ │ │ ├── t0182a.sh
│ │ │ │ ├── t0183a.sh
│ │ │ │ ├── t0185a.sh
│ │ │ │ ├── t0186a.sh
│ │ │ │ ├── t0187a.sh
│ │ │ │ ├── t0188a.sh
│ │ │ │ ├── t0189a.sh
│ │ │ │ ├── t0191a.sh
│ │ │ │ ├── t0192a.sh
│ │ │ │ ├── t0193a.sh
│ │ │ │ ├── t0195a.sh
│ │ │ │ ├── t0196a.sh
│ │ │ │ ├── t0197a.sh
│ │ │ │ ├── t0198a.sh
│ │ │ │ └── t0199a.sh
│ │ │ ├── 02/
│ │ │ │ ├── t0200a.sh
│ │ │ │ ├── t0201a.sh
│ │ │ │ ├── t0202a.sh
│ │ │ │ ├── t0203a.sh
│ │ │ │ ├── t0205a.sh
│ │ │ │ ├── t0206a.sh
│ │ │ │ ├── t0207a.sh
│ │ │ │ ├── t0209a.sh
│ │ │ │ ├── t0210a.sh
│ │ │ │ ├── t0211a.sh
│ │ │ │ ├── t0212a.sh
│ │ │ │ ├── t0213a.sh
│ │ │ │ ├── t0215a.sh
│ │ │ │ ├── t0216a.sh
│ │ │ │ ├── t0217a.sh
│ │ │ │ ├── t0218a.sh
│ │ │ │ ├── t0219a.sh
│ │ │ │ ├── t0220a.sh
│ │ │ │ ├── t0221a.sh
│ │ │ │ ├── t0222a.sh
│ │ │ │ ├── t0223a.sh
│ │ │ │ ├── t0225a.sh
│ │ │ │ ├── t0227a.sh
│ │ │ │ ├── t0228a.sh
│ │ │ │ ├── t0229a.sh
│ │ │ │ ├── t0230a.sh
│ │ │ │ ├── t0231a.sh
│ │ │ │ ├── t0232a.sh
│ │ │ │ ├── t0233a.sh
│ │ │ │ ├── t0235a.sh
│ │ │ │ ├── t0236a.sh
│ │ │ │ ├── t0237a.sh
│ │ │ │ ├── t0238a.sh
│ │ │ │ ├── t0239a.sh
│ │ │ │ ├── t0250a.sh
│ │ │ │ ├── t0251a.sh
│ │ │ │ └── t0253a.sh
│ │ │ ├── arglex_ambiguous/
│ │ │ │ └── main.cc
│ │ │ ├── crc16/
│ │ │ │ └── main.cc
│ │ │ ├── fletcher16/
│ │ │ │ └── main.cc
│ │ │ ├── gecos/
│ │ │ │ └── main.cc
│ │ │ ├── hyphen/
│ │ │ │ └── main.cc
│ │ │ └── url_decode/
│ │ │ └── main.cc
│ │ └── test_hyphen/
│ │ └── module.cook
│ └── telestrat/
│ ├── mfmlib.h
│ ├── old2mfm.c
│ ├── sedoric3.h
│ ├── tap2dsk.c
│ └── tap2dsk.txt
├── cmoc/
│ ├── coco/
│ │ └── file2dsk/
│ │ ├── Source/
│ │ │ ├── Makefile
│ │ │ └── file2dsk.c
│ │ └── version_1.0.8.txt
│ ├── dragon/
│ │ ├── bin2cas.pl
│ │ └── bin2cas.txt
│ ├── mo5/
│ │ ├── f2k5.c
│ │ └── sap/
│ │ ├── dfloppy.c
│ │ ├── floppy.h
│ │ ├── lfloppy.c
│ │ ├── libsap.c
│ │ ├── libsap.h
│ │ ├── licence.txt
│ │ ├── makefile
│ │ ├── makefile.dj
│ │ ├── makefile.lnx
│ │ ├── readme.txt
│ │ ├── sap2.c
│ │ └── sapfs.c
│ └── to7/
│ └── k7tools/
│ ├── getmemo7.c
│ ├── getrom.c
│ ├── makefile
│ ├── makefile.dj
│ ├── makefile.lnx
│ ├── readme.txt
│ └── wav2k7.c
├── cpm/
│ ├── ANY2IMD.COM
│ ├── BIN2IMD.COM
│ ├── DMK2IMD.COM
│ ├── IMD.COM
│ ├── IMDA.COM
│ ├── IMDU.COM
│ ├── IMDV.COM
│ ├── TD02IMD.COM
│ ├── TESTFDC.COM
│ └── imd118sc/
│ ├── ANY2IMD.C
│ ├── BIN2IMD.C
│ ├── DMK2IMD.C
│ ├── IMD.C
│ ├── IMDA.C
│ ├── IMDU.C
│ ├── IMDV.C
│ ├── README.TXT
│ ├── REMTAB.COM
│ ├── TD02IMD.C
│ ├── TD0NOTES.TXT
│ ├── TESTFDC.C
│ └── VERSION.H
├── gcc/
│ ├── libncurses.a
│ └── libncurses.dll.a
├── generic/
│ └── CC1541/
│ ├── Makefile
│ ├── README.md
│ └── cc1541.c
├── olivetti_m20/
│ └── m20floppy-0.61/
│ ├── COPYING
│ ├── ChangeLog
│ ├── Makefile
│ ├── README
│ ├── blockop.c
│ ├── blockop.h
│ ├── cmdopts.h
│ ├── cpgdefs.h
│ ├── cpgtypes.h
│ ├── fhdr.h
│ ├── imgopen.c
│ ├── imgopen.h
│ ├── main.c
│ ├── packend.h
│ ├── packstrt.h
│ ├── pcosdir.h
│ ├── roprotos.h
│ ├── roserv.c
│ ├── rwprotos.h
│ ├── rwserv.c
│ ├── util.c
│ ├── util.h
│ └── version.h
├── ti99/
│ ├── cart_header.asm
│ ├── crt0.c
│ ├── crt0_ea5.asm
│ ├── ea5split/
│ │ ├── Makefile
│ │ └── ea5split.c
│ ├── ea5tocart.jar
│ ├── ea5tocart.txt
│ └── elf2ea5/
│ ├── Makefile
│ ├── elf.h
│ └── elf2ea5.c
└── z88dk/
├── abc80/
│ └── abcdisk-2.7/
│ ├── .gitignore
│ ├── Makefile.in
│ ├── README.txt
│ ├── _gitignore
│ ├── abcdisk.h
│ ├── abcfile.c
│ ├── abcread.c
│ ├── abctext.c
│ ├── abcwrite.c
│ ├── abs.c
│ ├── asmsrc/
│ │ ├── bac80.asm
│ │ ├── bac80.inc
│ │ ├── bac800.asm
│ │ ├── bac800a.asm
│ │ ├── bac800d.asm
│ │ ├── bac80r.asm
│ │ ├── copy80.inc
│ │ ├── end80.inc
│ │ ├── mkcsrc.pl
│ │ ├── relocate.inc
│ │ ├── run800.inc
│ │ ├── setup80.inc
│ │ ├── setup800.inc
│ │ └── start80.inc
│ ├── autoconf/
│ │ ├── helpers/
│ │ │ ├── compile
│ │ │ ├── config.guess
│ │ │ ├── config.sub
│ │ │ └── install-sh
│ │ └── m4/
│ │ ├── pa_add_cflags.m4
│ │ ├── pa_add_cppflags.m4
│ │ ├── pa_add_flags.m4
│ │ ├── pa_add_headers.m4
│ │ ├── pa_add_ldflags.m4
│ │ ├── pa_arg_bool.m4
│ │ ├── pa_arg_enabled.m4
│ │ ├── pa_check_bad_stdc_inline.m4
│ │ ├── pa_func_attribute.m4
│ │ ├── pa_func_attribute_error.m4
│ │ ├── pa_have_func.m4
│ │ └── pa_sym.m4
│ ├── autogen.sh
│ ├── bac80.c
│ ├── bac800.c
│ ├── bas.c
│ ├── bin2abc.c
│ ├── bin2abc.h
│ ├── casdecode.c
│ ├── casencode.c
│ ├── clib/
│ │ ├── dirent.c
│ │ └── dirent.h
│ ├── compiler.h
│ ├── config/
│ │ └── config.h.in
│ ├── configure
│ ├── configure.ac
│ ├── deinter.c
│ ├── formats.c
│ ├── ihex.c
│ ├── mangle.c
│ ├── mkrel
│ ├── patchlevel.h
│ ├── relocs.c
│ ├── tag
│ ├── unmangle.c
│ └── util.c
├── apple2/
│ └── CPM2.2(56k).dsk
├── cpc/
│ ├── cpcrslib/
│ │ ├── borra.bat
│ │ ├── cambios.txt
│ │ ├── cpc_AnyKeyPressed.asm
│ │ ├── cpc_AssignKey.asm
│ │ ├── cpc_Chars.asm
│ │ ├── cpc_Chars8.asm
│ │ ├── cpc_ClrScr.asm
│ │ ├── cpc_CollSp.asm
│ │ ├── cpc_DeleteKeys.asm
│ │ ├── cpc_DisableFirmware.asm
│ │ ├── cpc_EnableFirmware.asm
│ │ ├── cpc_GetScrAddress.asm
│ │ ├── cpc_GetScrAddress0.asm
│ │ ├── cpc_GetSp.asm
│ │ ├── cpc_GetSp0.asm
│ │ ├── cpc_GetTiles.asm
│ │ ├── cpc_InitTileMap.asm
│ │ ├── cpc_InputText.asm
│ │ ├── cpc_KeysData.asm
│ │ ├── cpc_PrintGphStr.asm
│ │ ├── cpc_PrintGphStr0.asm
│ │ ├── cpc_PrintGphStr0M1.asm
│ │ ├── cpc_PrintGphStr2X.asm
│ │ ├── cpc_PrintGphStrM1.asm
│ │ ├── cpc_PrintGphStrM12X.asm
│ │ ├── cpc_PrintGphStrStd.asm
│ │ ├── cpc_PrintGphStrStd0.asm
│ │ ├── cpc_PrintGphStrStdXY.asm
│ │ ├── cpc_PrintGphStrXY.asm
│ │ ├── cpc_PrintGphStrXY2X.asm
│ │ ├── cpc_PrintGphStrXYM1.asm
│ │ ├── cpc_PrintGphStrXYM12X.asm
│ │ ├── cpc_PrintStr.asm
│ │ ├── cpc_PutCpSpTileMap2b.asm
│ │ ├── cpc_PutMaskSp.asm
│ │ ├── cpc_PutMaskSp0.asm
│ │ ├── cpc_PutMaskSp2x8.asm
│ │ ├── cpc_PutMaskSp4x16.asm
│ │ ├── cpc_PutMaskSpTileMap2b.asm
│ │ ├── cpc_PutMaskSprite.asm
│ │ ├── cpc_PutMaskSpriteTileMap2b.asm
│ │ ├── cpc_PutORSpTileMap2b.asm
│ │ ├── cpc_PutSp.asm
│ │ ├── cpc_PutSp0.asm
│ │ ├── cpc_PutSpTileMap.asm
│ │ ├── cpc_PutSpTileMap2b.asm
│ │ ├── cpc_PutSpTileMapO.asm
│ │ ├── cpc_PutSpTr.asm
│ │ ├── cpc_PutSpTr0.asm
│ │ ├── cpc_PutSpXOR.asm
│ │ ├── cpc_PutSpXOR0.asm
│ │ ├── cpc_PutSprite.asm
│ │ ├── cpc_PutSpriteXOR.asm
│ │ ├── cpc_PutTile2x8.asm
│ │ ├── cpc_PutTile2x8b.asm
│ │ ├── cpc_PutTile4x16.asm
│ │ ├── cpc_PutTiles.asm
│ │ ├── cpc_PutTrSp8x16TileMap2b.asm
│ │ ├── cpc_PutTrSpTileMap2b.asm
│ │ ├── cpc_PutTrSpriteTileMap2b.asm
│ │ ├── cpc_RLI.asm
│ │ ├── cpc_RRI.asm
│ │ ├── cpc_Random.asm
│ │ ├── cpc_ReadTile.asm
│ │ ├── cpc_RedefineKey.asm
│ │ ├── cpc_ResetTouchedTiles.asm
│ │ ├── cpc_ScanKeyboard.asm
│ │ ├── cpc_ScrollLeft.asm
│ │ ├── cpc_ScrollLeft0.asm
│ │ ├── cpc_ScrollRight.asm
│ │ ├── cpc_ScrollRight0.asm
│ │ ├── cpc_SetBorder.asm
│ │ ├── cpc_SetColorGphStr.asm
│ │ ├── cpc_SetColorGphStrM1.asm
│ │ ├── cpc_SetColour.asm
│ │ ├── cpc_SetInk.asm
│ │ ├── cpc_SetInkGphStr.asm
│ │ ├── cpc_SetInkGphStrM1.asm
│ │ ├── cpc_SetMode.asm
│ │ ├── cpc_SetModo.asm
│ │ ├── cpc_SetTile.asm
│ │ ├── cpc_SetTouchTileXY.asm
│ │ ├── cpc_ShowScrTileMap.asm
│ │ ├── cpc_ShowScrTileMap2.asm
│ │ ├── cpc_ShowTileMap.asm
│ │ ├── cpc_ShowTouchedTiles.asm
│ │ ├── cpc_ShowTouchedTiles2.asm
│ │ ├── cpc_SpRLM1.asm
│ │ ├── cpc_SpRRM1.asm
│ │ ├── cpc_SpUpdX.asm
│ │ ├── cpc_SpUpdY.asm
│ │ ├── cpc_SuperbufferAddress.asm
│ │ ├── cpc_TestKey.asm
│ │ ├── cpc_TestKeyF.asm
│ │ ├── cpc_TestKeyboard.asm
│ │ ├── cpc_TouchTileSpXY.asm
│ │ ├── cpc_TouchTileXY.asm
│ │ ├── cpc_TouchTiles.asm
│ │ ├── cpc_UnExo.asm
│ │ ├── cpc_Uncrunch.asm
│ │ ├── cpc_UpdScr.asm
│ │ ├── cpc_UpdScrAddresses.asm
│ │ ├── cpc_UpdTileTable.asm
│ │ ├── cpc_UpdateTileMap.asm
│ │ ├── cpcrslib.h
│ │ ├── cpcrslib.lib
│ │ ├── make.bat
│ │ ├── multiplication1.asm
│ │ ├── multiplication2.asm
│ │ └── optimizando_codigo.txt
│ ├── cpcrslib.h
│ ├── cpcrslib.lib
│ ├── cpcwyzlib/
│ │ ├── borra.bat
│ │ ├── cpc_WyzConfigurePlayer.asm
│ │ ├── cpc_WyzInitPlayer.asm
│ │ ├── cpc_WyzLoadSong.asm
│ │ ├── cpc_WyzPlayer.asm
│ │ ├── cpc_WyzSetPlayerOff.asm
│ │ ├── cpc_WyzSetPlayerOn.asm
│ │ ├── cpc_WyzSetTempo.asm
│ │ ├── cpc_WyzStartEffect.asm
│ │ ├── cpc_WyzStartSound.asm
│ │ ├── cpc_WyzStopMusic.asm
│ │ ├── cpc_WyzTestPlayer.asm
│ │ ├── cpcwyzlib.h
│ │ ├── cpcwyzlib.lib
│ │ └── make.bat
│ ├── cpcxfs/
│ │ └── readme
│ └── nocart/
│ ├── amsdos.rom
│ ├── basic.rom
│ ├── os.rom
│ ├── readme.txt
│ ├── src/
│ │ ├── amsdos.rom
│ │ ├── basic.rom
│ │ ├── main.cpp
│ │ ├── makefile
│ │ ├── nocart.sln
│ │ ├── nocart.vcxproj
│ │ ├── nocart.vcxproj.filters
│ │ ├── opth.c
│ │ ├── opth.h
│ │ ├── original/
│ │ │ ├── amsdos.rom
│ │ │ ├── basic.rom
│ │ │ └── os.rom
│ │ ├── os.rom
│ │ ├── patchbasic.asm
│ │ ├── patchdos.asm
│ │ ├── patchos.asm
│ │ ├── patchroms.bat
│ │ └── patchroms.sh
│ └── test/
│ ├── amsdos.rom
│ ├── basic.rom
│ ├── bmc.dsk
│ ├── da3a.dsk
│ ├── os.rom
│ ├── test.asm
│ ├── test.bat
│ ├── test.cpr
│ ├── test.dsk
│ └── test.sh
├── einstein/
│ └── EDIP1e/
│ ├── CPM2_BLK.DSK
│ ├── DOS80.DSK
│ ├── EDIPV1e.txt
│ ├── README.txt
│ ├── TESTlge.TXT
│ ├── XBAS_131_40TSS.DSK
│ ├── XTAL205_40TSS.DSK
│ ├── XTAL205_80TDS.DSK
│ └── ZDOS_BLK.DSK
├── oz/
│ └── makewzd.c
├── pacman/
│ ├── pacman.5e
│ └── pacman.5f
├── samcoupe/
│ ├── pyz80.py
│ ├── sam_wrapper.asm
│ ├── samdos2
│ └── samdos2_empty
└── trs80_model2/
└── LB225D.IMD
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/alpine
{
"name": "Cross-Lib",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "ghcr.io/cross-lib/devcontainers/base:1.0.6-ubuntu",
// "postStartCommand": "bash .devcontainer/post-start.sh",
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"files.trimTrailingWhitespace": false,
"python.defaultInterpreterPath": "/usr/local/bin/python"
}
},
"codespaces": {
// Set *default* codespaces specific settings.json values on container create.
"settings": {
"files.trimTrailingWhitespace": false,
"python.defaultInterpreterPath": "/usr/local/bin/python"
}
}
}
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
================================================
FILE: .devcontainer/post-start.sh
================================================
sudo install /usr/local/bin/p2hex /usr/bin
PATH=.:$PATH
================================================
FILE: .gitignore
================================================
.bash_history
.python_history
deliverables
**_shapes
roms/mame/*.zip
roms/vice/vic20/chargen
roms/vice/vic20/kernal
roms/vice/vic20/basic
roms/vice/c64/chargen
roms/vice/c64/kernal
roms/vice/c64/basic
roms/vice/plus4/chargen
roms/vice/plus4/kernal
roms/vice/plus4/basic
roms/vice/plus4/3plus1hi
roms/vice/plus4/3plus1lo
roms/vice/pet/chargen
roms/vice/pet/kernal1
roms/vice/pet/kernal2
roms/vice/pet/kernal4
roms/vice/pet/basic1
roms/vice/pet/basic2
roms/vice/pet/basic4
roms/vice/pet/edit*
roms/vice/pet/characters*
src/cfg/*
**.lis
**mapfile.txt
**global.txt
**A.BEE
*.o
*.def
*.swp
*.img
*.tap
*.prg
build/*
src/projects/*
**generated_assets
**__pycache__
src/assets/generated_assets/*
src/examples/matrix/generated_assets/*
src/examples/tiles/generated_assets/*
src/examples/invaders/generated_assets/*
src/examples/zombies/generated_assets/*
src/examples/sounds/generated_assets/*
src/games/chase/generated_assets/*
src/games/shoot/generated_assets/*
src/games/bomber/generated_assets/*
src/games/snake/generated_assets/*
src/games/horde/generated_assets/*
src/games/shoot/main.c
src/games/chase/main.c
src/games/snake/main.c
src/test/*.exe
src/*.asm
src/examples/full_lcc1802_combo.c
src/games/full_lcc1802_combo.c
src/experiments/*
src/wincmoc_main.c
src/*.asm
src/chase/*.s
src/nes/*.o
src/nes/nes_graphics.s
*.swp
*.swo
src/wincmoc_input.c
src/wincmoc_graphics.c
./tools/cpcrslib/cpcrslib.lib
./map.txt
*.stackdump
src/wincmoc_tmp.c
src/*combo.c
src/modules/*.pyc
*.lst
tools/EDIP1e/xchase.DSK
src/cross_lib/display/*.s
src/chase/wincmoc*
a.exe
a.out
src/games/full_combo_rand.c
src/examples/full_combo_rand.c
src/examples/reduced_full_lcc1802_combo.c
src/examples/reduced_full_lcc1802_color_combo.c
src/games/reduced_full_lcc1802_combo.c
src/games/reduced_full_lcc1802_color_combo.c
src/games/reduced_full_lcc1802_micro_combo.c
src/games/reduced_full_lcc1802_combo_no_sounds.c
src/debug/*.bin
src/debug/cprintf
src/debug/*.inf
src/debug/bbctest
src/debug/bbctest1
src/debug/bbctest2
src/debug/*.dsk
src/debug/*.nes
src/assets/*.pyc
src/debug/gamate_conio_test
src/debug/gamate_conio_test2
tools/cc65/gamate/gamate-fixcart.exe
tools/cc65/osic1p/srecord-1.64/config.log
tools/cmoc/mo5/f2k5.exe
tools/cc65/gamate/gamate-fixcart.out
tools/cc65/telestrat/tap2dsk.exe
tools/cc65/telestrat/tap2dsk
tools/cc65/telestrat/tap2dsk.out
tools/cc65/telestrat/old2mfm.exe
tools/cc65/telestrat/old2mfm
tools/cc65/telestrat/old2mfm.out
tools/cmoc/mo5/f2k5.out
tools/bbc/bbcim.exe
tools/bbc/bbcim.out
tools/generic/CC1541/cc1541.exe
tools/generic/CC1541/cc1541.out
tools/generic/cc1541.exe
tools/generic/cc1541.out
tools/generic/exomizer/exomizer.exe
tools/generic/exomizer/exomizer.out
tools/generic/exomizer.exe
tools/generic/exomizer
tools/generic/exomizer/src/asm.tab.h
tools/generic/exomizer/src/asm.tab.c
tools/generic/CC1541/cc1541
tools/z88dk/oz/makewzd.exe
tools/z88dk/oz/makewzd.out
tools/cmoc/coco/file2dsk/file2dsk.exe
tools/cmoc/coco/file2dsk/file2dsk.out
tools/cmoc/mo5/sap/*.exe
tools/cmoc/mo5/sap/*.out
tools/cmoc/mo5/sapfs.exe
tools/cmoc/mo5/sapfs.out
tools/cmoc/mo5/sap/sap2
tools/cc65/atari/mkatr-master/lsatr.exe
tools/cc65/atari/mkatr-master/mkatr.exe
tools/cc65/atari/mkatr-master/lsatr.out
tools/cc65/atari/mkatr-master/mkatr.out
tools/z88dk/cpc/nocart/nocart.exe
tools/z88dk/cpc/nocart/nocart.out
tools/olivetti_m20/m20.exe
tools/olivetti_m20/m20.out
tools/ti99/elf2ea5.exe
tools/ti99/elf2ea5.out
tools/ti99/ea5split.exe
tools/ti99/ea5split.out
logs/*.log
tools/z88dk/abc80/abcdisk-2.7/conftest.c
tools/z88dk/abc80/abcdisk-2.7/abcwrite
tools/z88dk/abc80/abcdisk-2.7/bin2abc
tools/z88dk/abc80/abcdisk-2.7/confdefs.h
**/*.sym
**/*.dSYM
**/*.DS_Store
================================================
FILE: README.md
================================================
# CROSS LIB

*Cross-Lib* and games built with it (e.g., Chase, Shoot, Bomber, Snake, Horde, Verbix, Shuriken, Stinger, Trex)
by Fabrizio Caruso (fabrizio_caruso@hotmail.com)
*Cross-Lib* is a *WORA* (Write Once Run Anywhere) framework for vintage systems, i.e.,
you code your game in C **once** and *Cross-Lib* builds the very same game for about 200 vintage systems (console, computers, etc.) with **the very same code**.
Read the Disclaimer.
-------------------------------------------
## CROSS-LIB-HD
Cross-Lib-HD is an equivalent backward-compatible framework, still work-in-progress:
http://github.com/Fabrizio-Caruso/CROSS-LIB-HD
Its goal is to provide a **higher number of redefinable tiles**, while maintaining the **same API's** and possibly the same number of supported targets as Cross-Lib.
Cross-Lib-HD is not meant to replace Cross-Lib because the latter can provide slightly smaller binaries, a higher number of colors and a higher number of targets with real graphics.
A game with the need for a higher number of tiles may require Cross-Lib-HD, whereas games with a lower number of tiles will work on both but on Cross-Lib may get a better color pallette and/or graphics on some very limited targets.
-------------------------------------------
## ARTICLES ABOUT CROSS-LIB
Article [in English], first published in C.A.L.L. Apple Volume 3 Number 1 (January 2023): C.A.L.L.-Apple
Article [in French], first published in the French magazine "Programmez! Hors série #6": Programmez!
-------------------------------------------
## THE GAMES
Click on the links below to play the games on your browser.
1. Trex is a mini-game and an obvious clone of off-line Chrome T-Rex game.
2. Stinger is a tank-shooter with several enemies, levels, power-ups and items to pick.
3. Shuriken is somehow inspired by Pac-man and Pengo.
4. Verbix is a Scrabble-like game that looks like Tetrix with letters.
5. Horde is a zombie shooter with several different enemies, levels, power-ups and special items to pick.
6. Snake is my personal re-interpretation of Nibbler (arcade game) to which I have added more game elements.
7. Bomber is a mini-game and clone of Air Attack (aka Blitz).
8. Shoot is a shooter somehow similar to Robotron. It has many items and secrets to discover.
9. Chase is somehow similar to *Gnome Robots* but in real-time game and with several items and power-ups.
-------------------------------------------
## MORE THAN 200 SUPPORTED TARGETS
Cross-Lib can be used to build games for more than 200 different vintage systems (computers, consoles, arcade boards, pocket calculators, etc.).
An almost complete list of the supported systems with their status is in: Supported Systems
Some supported vintage CPU architectures are:
- `GBZ80`
- `Intel 8080/85`
- `Intel 8086`
- `MOS 6502`
- `Motorola 6803`
- `Motorola 6809`
- `RCA 1802`
- `TMS 9900`
- `Zilog 80`
Cross-Lib has also some support for vintage 16-bit and 32-bit systems and the native host PC.
For a more complete list of architectures you can look at: Architectures
-------------------------------------------
## SUPPORTED HOSTS
Cross-Lib runs under __any POSIX__-like environment such as
- ***Linux***
- ***Windows/Cygwin***
- ***Windows Subsystem for Linux***
- ***Windows/MSYS2***
- ***MacOS***
- ***FreeBSD***
-------------------------------------------
## REQUIREMEMTS
Cross-Lib requires a **POSIX** environment with at least
- **Python** (2.7 is the bare minimum but 3.x provides more features)
- **make** (GNU make)
- one or more **ANSI C compiler(s)**
If you want to produce interactive binaries for the *native terminal* you need a **native compiler** (*gcc* or any other compiler such as *clang*) with **ncurses** or **ncursesw**.
In order to build binaries for a supported vintage system, the corresponding **cross-compiler** has to be installed (see the list of supported targets to see which compiler is required).
### Currently supported cross-compilers
The current set of supported cross-compilers is:
- `CC65`,
- `Z88DK` (`SCCZ80` and `ZSDCC`),
- `CMOC`,
- `LCC1802`,
- `TMS9900-GCC`
- `ACK`,
- `VBCC`,
- `CC6303`
Partially supported cross-compilers:
- `GCC-Z8K`,
- `XTC68`
- `GCC-ATARI-ST`,
- `GCC-AMIGA`,
For more details click on Compilers
### Tools to generate disk/tape/cartridge images
Very few targets use special tools to generate tape/disk/cartridge images.
Some of these tools are built from source on the fly the first time they are required. Most require *gcc* or *g++*.
In order to generate disk images for the *Apple][* and derivative targets Cross-Lib uses *ac.jar* for which **java** is necessary.
To generate tape images for the *CoCo 1/2* and *Dragon 32/64* targets Cross-Lib uses bin2cas.pl for which **perl** is required.
-------------------------------------------
## NO ACTUAL INSTALLATION NECESSARY
An actual installation is not necessary because Cross-Lib is made of scripts and a C *source library*, which is compiled on the fly when building binaries for target systems.
Moreover even installing the required compilers may not be necessary because Cross-Lib can be used through GitHub Codespaces (with preinstalled compilers) on any browser.
Additionally ou can also use it with
- the pre-built docker image (compilers are preinstalled),
- the dockerfile to build an image or (compilers are preinstalled),
- a clone of this repository (which requires the installation of the compilers).
For the details click on Installation
-------------------------------------------
## THE `xl` SCRIPT
Inside the project main directory, you find the `src` and the `build` directories:
- `src` contains the source code and all other files that are necessary to build the games and the examples;
- `build` is supposed to be empty at first and it is the target directory for the build process.
First of all you need to be in the `src` directory.
From `src` you can use the `xl` script to do different operations on projects.
`xl` is used as follows:
```
xl <[optional] parameters>
```
You can get help with:
```
xl help <[optional] command>
```
You can build games and examples with :
`xl <[optional] system_name>`
For example `xl snake vic20` builds the *snake* for the *Commodore Vic 20 +16K* and `xl stinger` builds *stinger* for the *native terminal*.
For more details click on XL script
-------------------------------------------
## THE TOOL-CHAIN
Cross-Lib provides a full tool-chain to build universal vintage 8-bit games.
### Cross-Lib components
Cross-Lib provides:
- a C library with hardware-agnostic APIs for game development;
- the "user-friendly" script `xl`.
### The build process
When a game is built for a specific target, the Cross-Lib tool-chain will automatically:
1. if needed, **convert abstract graphics assets** into target specific assets on the fly;
2. **compile and link** the game code (and the target-specific game assets) by using the appropriate compiler;
3. if needed, whenever possible, **create disk/cassette/cartridge images**.
### The Workflow
The user has to:
- **code** the game in C with Cross-Lib APIs in a hardware-agnostic way;
- **draw** the abstract graphics assets and store them in the *tiles* or *shapes* directory;
- **run** the `xl` script (see below).

For more details click on Build
-------------------------------------------
## HOW TO CODE WITH CROSS-LIB
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HARDWARE_AGNOSTIC_CODE.md
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/CROSS_LIB_APIS.md
-------------------------------------------
## LOADING THE GAMES
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD.md
-------------------------------------------
## ACKNOWLEDGEMENTS
Cross-Lib would not exist without the cross-compilers and the support of their developers and the support of some people who have helped me handle the input/output of some targets.
A partial list of the people who have helped in found in Credits
-------------------------------------------
## LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: cfg/___empty.cfg
================================================
================================================
FILE: cfg/default.cfg
================================================
================================================
FILE: docs/ARCHITECTURES.md
================================================
## SUPPORTED ARCHITECTURES
### 8-BIT ARCHITECTURES
- COSMAC RCA 1802 and derivates
- Intel 8080 and derivatives
- MOS 6502 and derivatives
- Motorola 6809 and derivatives
- Motorola 6803
- Zilog 80 and derivatives
### 16-BIT ARCHITECTURES
- Intel 8088/8086
- Motorola 68000/68008
- PDP11
- TMS 9900
- Zilog Z8000
### 32-BIT ARCHITECTURES
- PowerPC
- Intel 386
- Motorola 68020
- MIPS32r2 (little-endian)
### 32/64-BIT ARCHITECTURE
We also support any current architecture for which GCC can produce a working binary.
================================================
FILE: docs/Alice32k.txt
================================================
By Christophe Possamaï
//***************************************
//* CODE DEMO redefinition caractere *
//* ligne de commande pour compilation: *
//* cc68 -tmc10 tuto.c -o tuto *
//* pour executer sur alice: *
//* chargement: CLOADM *
//* execution: EXEC *
//***************************************
#include
// definition Registres
#define R0 0xBF20 //commande
#define R1 0xBF21 //paramètre principal
#define R2 0xBF22 //paramètre
#define R3 0xBF23 //paramètre
#define R4 0xBF24 //pointeur auxiliaire haut
#define R5 0xBF25 //pointeur auxiliaire bas
#define R6 0xBF26 //pointeur principal haut
#define R7 0xBF27 //pointeur principal bas
#define EXEC 0x8 // a ajouter au registe pour execution.
// Definition couleurs
#define noir 0
#define rouge 1
#define vert 2
#define orange 3
#define bleu 4
#define magenta 5
#define cyan 6
#define rose 7
#define vertc 10
#define jaune 11
#define magentac 13
#define blanc 15
char tuiles_0[] ={0x00,0x00,0x7C,0x92,0x92,0xFE,0xEE,0x7C,0x54,0x00};
char tuiles_1[] ={0x7E,0xC3,0xA9,0xFD,0xFD,0xFD,0xB9,0x91,0xC3,0x7E};
// fonction Poke
void poke(uint16_t addr, uint8_t value) {*((uint8_t*)addr) = value;}
//fonction Peek
uint8_t peek(uint16_t address) {
// Utilisez un pointeur pour accéder à l'adresse mémoire spécifiée
uint8_t *memoryPointer = (uint8_t *)address;
// Utilisez le pointeur pour lire la valeur à l'adresse spécifiée
return *memoryPointer;
}
// positionne le curseur pour afficher un caractere
void posxy(unsigned char colonne, unsigned char ligne) {
poke(R6, ligne); // R6 (MP / LIGNE)
poke(R7, colonne); // R7 (MP / COL)
}
// parametre
void param(unsigned char b) {
poke(R2, b); // R2 (B)
}
// defnie la couleur du prichain caractere
void color(unsigned char crayon, unsigned char papier) {
unsigned char b=0,a;
if(crayon>rose) {
b=1;
crayon-=8;
}
if(papier>rose) {
b=1;
papier-=8;
}
a=papier+(crayon*16);
poke(R2, b); // R2 (B)
poke(R3, a); // R3 (A) couleur
}
// affiche un caractere
void affichr(unsigned char c) {
poke(R1, c); // R1 (C)
poke(R0+EXEC, 0); // R0 + EXEC (KRF)
}
// fonction pour afficher une chaine de caractere ASCII a une position et avec les couleurs.
void print(signed char x, signed char y, char *texte) {
char *c = texte; // Correction ici
if (x < 0) {
x = (40 - sizeof(texte)) / 2;
}
posxy(x, y);
for (; *c != '\0'; c++) {
poke(R1, *c);
poke(R0+EXEC, 1);
}
}
// Fonction pour redefinir un caracteres
void redefin(char numcaractere,char* data){ //CARACTERES REDÉFINIS
uint16_t A = numcaractere+192;
char i;
for (i = 0; i < 10; ++i) {
poke(R4, A / 256);
poke(R5, A & 255);
poke(R1, data[i]);
poke(R0+EXEC, 48 + 4); // OCT + AUX_PTR (EXEC)
A += 4;
}
}
void main() {
redefin(0,tuiles_0); //redifinition du caractere 0/128
redefin(1,tuiles_1); //redifinition du caractere 1/128
color(rouge,noir);
print(6, 0,"Demo redefinition caracteres");
color(bleu,noir);
param(128+32+16);// bascule sur les caractères redéfinit
posxy(19, 8);
affichr(0);
posxy(20, 8);
affichr(1);
}
================================================
FILE: docs/BUILD.md
================================================
# BUILD INSTRUCTIONS
## Build the default target for a given system
In order to build a game or a test, you need to be in the `src` directory.
You build a project (either a game or a test) for a specific system by either using the `xl build` script or an equivalent `make` command.
A convenient shortcut is
### Using `xl build`
I recommend that you use `xl build` as follows:
`xl build [project_name] [optional system_name] [optional number of threads]`
where `[project name]` is either an example, a built-in game or user-defined project.
A convenient shortcut is using just `xl` as follows:
`xl [project_name] [optional system_name] [optional number of threads]`
The `[optional system_name]` parameter is the name of the target. If no target is specified then the native target (the host terminal) is implied.
The `[optional number of threads]` is used to specify the number of threads to use for multiple targets that can be built in parallel.
Built-in games are
`chase`, `shoot`, `bomber`, `snake`, `horde`.
Current examples are:
`helloworld`, `text`, `pause`, `background`, `tiles`, `input`, `sounds`, `matrix`, `zombies`, `invaders`.
For the list of supported systems look at
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md
If no system name is given, a native version of the game or test is built by using `gcc` and `ncurses`.
*Only when using the script*: If you use the script you can pass `games`, `tests` or `all` as `[game_or_test_name]` to build all games, tests or all projects (games and tests) for a specific system or list of systems.
As system you can also pass a group of systems such as:
- `[compiler name]_targets` to build a given project for all targets compiled by a given compiler (e.g., `cc65_targets`, `z88dk_targets`, `cmoc_targets`, etc.)
- `all` to build a given project on all possible targets (avoid this if you are not sure as it fails if you have not installed *all* compilers).
Examples (`xl build` is shortened to `xl`):
- `xl snake` -> It builds Cross Snake for the native console by using `gcc` and `ncurses`.
- `xl chase` -> It builds Cross Chase for the native console by using `gcc` and `ncurses`.
- `xl bomber atari` -> It builds Cross Bomber for the Atari 8-bit target (by using the appropriate cross-compiler, i.e., CC65)
- `xl snake vic20` -> It builds Cross Snake for the Commodore Vic 20.
- `xl games msx` -> It builds all game projects for the MSX target (by using the appropriate cross-compiler, i.e., the ones in Z88DK).
- `xl bomber cc65_targets` -> It builds Cross Bomber for all targets that use CC65.
- `xl tests c64` -> It builds all tests for the Commodore 64 target
- `xl all coco` -> It builds all projects (games and tests) for the TRS-80 Color Computer (by using the appropriate cross-compiler, i.e., CMOC)
### Using `make`
Using a standard `make` command is possible but you will get fewer options.
For game projects you can use:
`make [system_name] -f ./games/[game_name]/Makefile.[game_name]`
For test projects you can use:
`make [system_name] -f ./tests/[test_name]/Makefile.[test_name]`
Examples for games:
- `make vic20 -f ./games/horde/Makefile.horde` builds *Cross Horde* for Commodore Vic 20.
- `make c64 -f ./games/chase/Makefile.chase` builds *Cross Chase* for Commodore 64.
- `make nes -f ./games/shoot/Makefile.shoot` builds *Cross Shoot* for the Nintendo NES videogame console.
- `make spectrum -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for the Sinclair ZX Spectrum.
- `make ti83 -f ./games/chase/Makefile.chase` builds *Cross Chase* for the Texas Instrument TI 83 scientific calculator.
- `make ncurses -f ./games/chase/Makefile.chase` builds *Cross Chase* for all targets by using GCC for the native host console (e.g., CYGWIN, Linux, etc. console).
- `make cc65_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the CC65 cross-compiler for the MOS 6502-based systems.
- `make cmoc_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the CMOC cross-compiler for the Motorola 6809-based systems.
- `make z88dk_targets ./games/chase/Makefile.chase` builds *Cross Chase* for all targets that are built with the SCCZ80 and ZSDCC cross-compilers of the Z88DK dev-kit for Zilog 80-based and Intel 8080-based systems.
- `make cc65_targets -f ./games/shoot/Makefile.shoot` builds *Cross Shoot* for all targets that are built with the CC65 cross-compiler for the MOS 6502-based systems.
- `make z88dk_targets -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for all targets that are built with the SCCZ80 and ZSDCC cross-compilers of the Z88DK dev-kit for Zilog 80-based and Intel 8080-based systems.
- `make lcc1802_targets -f ./games/bomber/Makefile.bomber` builds *Cross Bomber* for all targets that are built with the LCC1802 cross-compiler for the RCA COSMAC 1802-based systems.
Examples for tests:
- `make vic20 -f ./tests/tiles/Makefile.tiles` builds the test `tiles` for the Commodore Vic 20.
- `make cpc -f ./tests/sounds/Makefile.sounds` builds the test `sounds` for the Amstrad CPC computer.
- `make atari -f ./tests/invaders/Makefile.invaders` builds the tests `invaders` for the Atari 8-bit computer.
## Targets built by multiple dev-kits
Some targets, e.g., CP/M and Commodore 128, can be built by two different compilers because they can run different CPU architectures or because we may want to have multiple versions.
In such cases we can specify the CPU in the target name:
Examples using `xl build`
- `xl build chase c128_targets` builds Cross Chase for all Commodore 128 targets for both the MOS 8502 and for the more exotic Zilog 80 non-CP/M mode.
- `xl build chase c128_8502_targets` builds Cross Chase for all Commodore 128 targets for the MOS 8502 architecture in both 40 and 80 column mode.
- `xl build chase c128_z80_targets` builds Cross Chase for all Commodore 128 targets for the Zilog 80 non-CP/M mode in both 40 and 80 column mode.
- `xl build chase cpm_targets` builds Cross Chase for all "generic" CP/M targets for both the Intel 8080 and Zilog 80 architecture.
- `xl build chase cpm_8080_targets` builds Cross Chase for all "generic" CP/M targets for the Intel 8080 architecture (compatible with Zilog 80 systems).
- `xl build chase cpm_z80_targets` builds Cross Chase for all "generic" CP/M targets for both the Zilog 80 architecture (not compatible with Intel 8080 systems).
Examples using `make`:
- `make c128_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for both the MOS 8502 and for the more exotic Zilog 80 non-CP/M mode.
- `make c128_8502_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for the MOS 8502 architecture in both 40 and 80 column mode.
- `make c128_z80_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all Commodore 128 targets for the Zilog 80 non-CP/M mode in both 40 and 80 column mode.
- `make cpm_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all "generic" CP/M targets for both the Intel 8080 and Zilog 80 architecture.
- `make cpm_8080_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all "generic" CP/M targets for the Intel 8080 architecture (compatible with Zilog 80 systems).
- `make cpm_z80_targets -f ./games/chase/Makefile.chase` builds Cross Chase for all "generic" CP/M targets for both the Zilog 80 architecture (not compatible with Intel 8080 systems).
================================================
FILE: docs/BUILD_PROCESS.md
================================================
The `xl` script will trigger the full build process which will produce the target specific version of the project
or massively build the same project for several targets (or even build several projects for one or more targets).
For example for the build of a project for the sole GameBoy target we may represent
the interactions of various Cross-Lib components with this diagram:

================================================
FILE: docs/COMPILERS.md
================================================
# SUPPORTED COMPILERS
The program is written in ANSI C and currently compiled with
- CC65 for all MOS 6502 targets (http://www.cc65.org/),
- SCCZ80 (from Z88DK) for most Zilog 80 and Intel 8080 targets (https://www.z88dk.org/),
- ZSDCC (from Z88DK) for some Zilog 80 and Intel 8080 targets (https://www.z88dk.org/),
- CMOC for Motorola 6809 targets (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html),
- LCC1802 for COSMAC RCA 1802 targets (https://sites.google.com/site/lcc1802/downloads),
- ACK for PC 8088/8086, CP/M Intel 8080, Linux 386/68K/PPC/MIPS, PDP11 (https://github.com/davidgiven/ack),
- XTC68 (C68) for the Motorola 68008-based Sinclair QL (https://github.com/stronnag/xtc68),
- VBCC for BBC Micro, BBC Master and other systems (http://www.compilers.de/vbcc.html)
- Z8KGCC for the Zilog Z8000-based Olivetti M20 series (http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html),
- CC6303 for the Motorola 6803-based targets (https://github.com/EtchedPixels/CC6303 or https://github.com/zu2/CC6303),
- "GCC for Atari ST" (http://vincent.riviere.free.fr/soft/m68k-atari-mint/),
- "GCC for Amiga" (https://github.com/bebbo/amiga-gcc),
- "GCC for TI" for the Texas TI99/4a (https://github.com/mburkley/tms9900-gcc),
- GCC for modern 32/64-bit PC under any operating systems
Previous versions used
- WinCMOC for 6809 targets (https://sourceforge.net/projects/cmoc-win32/).
WinCMOC has been abandoned because it uses an old CMOC version that has broken pointer to functions and because it is no longer maintained by its author.
For other targets, the following compilers and dev-kits may be included in future versions of the tool-chain:
- QDOS-GCC for the Sinclair QL (http://morloch.hd.free.fr/qdos/qdosgcc.html)
- SDCC for Z80 and other targets (http://sdcc.sourceforge.net/),
- PVSNESLIB for the Super Nintendo Entertainment System (https://github.com/alekmaul/pvsneslib),
- amiga-os-toolchain for all Amigas (https://github.com/cahirwpz/amigaos-cross-toolchain),
- GCC6809 for other 6809 targets (https://sourceforge.net/projects/freewpc/files/GCC-6809/),
- TIGCC for 68k-based TI calculators (http://tigcc.ticalc.org/).
The tool-chain also uses some third-party target-specific tools to create usable cassette/disk/rom images.
This is documented in https://github.com/Fabrizio-Caruso/CROSS-CHASE/blob/master/tools/README.txt
================================================
FILE: docs/COMPILER_NAMES.md
================================================
## Compiler names of currently supported compilers
- `ack`
- `cc65`
- `cmoc`
- `emcc` (totally experimental Emscripten to produce WebAssembly/Javascript)
- `gcc`
- `gcc_amiga`
- `gcc_atari_st`
- `gcc_ti99`
- `gcc_z8k` (currently buildable only under Linux)
- `lcc1802`
- `xtc68`
- `z88dk` (for both the SCCZ80 and the ZSDCC cross-compiler in Z88DK)
================================================
FILE: docs/CREDITS.txt
================================================
CREDITS
I have been helped by people who are involved in the cross compilers Z88Dk, CC65, CMOC, ACK, LCC1802, GCC for TI99 development.
In particular I must thank:
- Alex Thissen for his support on the docker release and on the Atari Lynx target
- Stefano Bodrato for lots of help on all Z80 targets including development on the Z88Dk to support my library and games.
- Bill Rowe for improving LCC1802 and supporting my library
- Antonino Porcino for providing his online emulators and helping me test my games.
- Marcen van Tongeren: for implementing the dev-kit in LCC1802 and supporting CrossLib
- Christian Groessler: has helped me to improve the Makefile and fix an issue on the Atari 8-bit color version.
- Simon Jonassen: Help on getting a good routine for the keyboard input for all CoCo and Dragon models.
- Tursi (from AtariAge) for his Classic99 emulator, his support with libti99 and general help on the TI99/4A
- Asmusr (from AtariAge) for his JS99er JavaScript emulator, support on the cartUrl parameter, and the generation of cartridge images from EA5 files
- Mark Burkley for his great work and support on GCC for the TI compiler
- *Hamlet* for the logo.
================================================
FILE: docs/CROSSLIB.md
================================================
## CROSSLIB
For each target, at least one of the following modes has to be implemented:
1. memory-mapped graphics (display can be implemented by writing bytes into video memory)
2. conio-like (display is performed by either direct conio APIs or a wrapper that provides conio APIs, e.g., ADM3/A, VT52, VT100, etc.)
3. TGI (CC65-specific graphics APIs)
4. Z88DK Sprites (Z88DK-specific sprite APIs)
5. CPCRSLIB (Amstrad CPC-specific graphics APIs)
6. bit-mapped (display is implemented by writing into video memory and each bytes corresponds to one or more pixels)
7. buffered (stdlib-only "graphics" for targets with just stdlib support)
A graphic mode may implement the concrete graphics by either calling low level graphics instructions (e.g., writing into video-memory) or by calling higher level instructions (e.g., using control codes).
For example for a CPM target with ADM3/A control codes, we use
1. CrossLib APIs that call
2. conio.h APIs that call
3. ADM3/A control codes
For a target with direct or indirect video memory (e.g., Commodore 64, MSX, etc.), one may use:
1. CrossLib APIs that implement
2. Direct (or indirect) writes into video memory
Remark: For some targets multiple implementations are possible (C64 may use conio APIs as provided by C65, memory-mapped graphics, TGI APIs)
================================================
FILE: docs/CROSS_LIB_APIS.md
================================================
# CROSS-LIB APIs
## GRAPHICS
`_XL_INIT_GRAPHICS()`
It initializes the graphics. Necessary for any build that wants to show anything on the screen.
--------------------------------------------------------
`XSize`: Number of tiles that can be displayed horizontally on the (usable) screen
`YSize`: Number of tiles that can be displayed vertically on the (usable) screen
`_TILE_1`, ..., `_TILE_24`, `_DOLLAR_TILE`: Displayable tiles with _XL_DRAW
`_XL_BLACK`, `_XL_WHITE`, `_XL_RED`, `_XL_CYAN`, `_XL_GREEN`, `_XL_YELLOW`, `_XL_BLUE`: Currently available colors
--------------------------------------------------------
`_XL_DRAW(X, Y, T, C)`
It displays tile T at position (X,Y) with color C if color C is available or its "closest" match when C is not supported by a target.
--------------------------------------------------------
`_XL_DELETE(X,Y)`
It deletes a tile-sized area of the screen at position (X,Y)
--------------------------------------------------------
`_XL_CLEAR_SCREEN()`
It clears the whole screen.
--------------------------------------------------------
`_XL_WAIT_VSYNC()`
It waits for the vertical synch if this is supported by the target. It does nothing otherwise.
--------------------------------------------------------
## TEXT
A "Cross-Lib string" is string formed with only the following 37 possible characters
`_XL_SPACE`, `_XL_a`, ..., `_XL_z`, `_XL_A`, ..., `_XL_Z`, `'0'`, ..., `'9'`
where capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.
--------------------------------------------------------
`_XL_PRINT(X,Y,S)`
It prints the "Cross-Lib string" S starting a position (X,Y).
--------------------------------------------------------
`_XL_PRINT_CENTERED(S)`
Same as `XL_PRINT` but it just displays the "Cross-Lib string" S at the center of the screen
--------------------------------------------------------
`_XL_PRINT_CENTERED_ON_ROW(Y,S)`
Same as `XL_PRINT` but it just displays the "Cross-Lib string" S centered on row Y
--------------------------------------------------------
`_XL_PRINT_CENTERED_ON_ROW_WITH_COLOR(Y,C,S)`
Same as `_XL_PRINT_CENTERED_ON_ROW` but with color C (if the target supports text color)
--------------------------------------------------------
`_XL_PRINT_CENTERED_WITH_COLOR(C,S)`
Same as `_XL_PRINT_CENTERED` but with color C (if the target supports text color)
--------------------------------------------------------
`_XL_PRINTD(X,Y,L,N)`
It prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y)
--------------------------------------------------------
`_XL_SET_TEXT_COLOR(C)`
It sets the text color to C. Such color will be used on next PRINT and PRINTD for targets that support colored text.
If any other display operation is present (e.g., `_XL_DRAW`), then there is no guarantee that the color C will be used afterwards.
--------------------------------------------------------
## INPUT
`_XL_INIT_INPUT()`
It initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input
--------------------------------------------------------
`_XL_INPUT()`
It returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).
The result J is meant to be used with the Boolean functions below.
--------------------------------------------------------
`_XL_UP(J)`, `_XL_DOWN(J)`, `_XL_LEFT(J)`, `_XL_RIGHT(J)`, `_XL_FIRE(J)`
These Boolean functions return 1 (true) if J represents a specific movement or fire button/key, and 0 (false) otherwise.
--------------------------------------------------------
`_XL_KEY_PRESSED()`
This Boolean function returns 1 (true) if any key or fire button is pressed.
--------------------------------------------------------
`_XL_WAIT_FOR_INPUT()`
It waits for any key or fire button to be pressed.
--------------------------------------------------------
## SOUND
`_XL_INIT_SOUND()`
It initializes the sound system. Necessary for any program that produces sound.
--------------------------------------------------------
`_XL_ZAP_SOUND()`: Long rising sound
`_XL_PING_SOUND()`: Short high-pitched sound
`_XL_TICK_SOUND()`: Very short high-pitched sound
`_XL_TOCK_SOUND()`: Very short low-pitched sound
`_XL_EXPLOSION_SOUND()`: Long noise
`_XL_SHOOT_SOUND()`: Short noise
## SLEEP
`_XL_SLEEP(S)`
It waits S seconds or an approximations of S seconds depending on the target
--------------------------------------------------------
`_XL_SLOW_DOWN(T)`
It waits T loops (0<=T<=65535)
--------------------------------------------------------
## RANDOM
`_XL_RAND()`
It generates a pseudo-random number in the range \[0,32767\]
================================================
FILE: docs/CROSS_LIB_APIS.txt
================================================
--------------------------------------------------------------------------------------
CROSS-LIB APIs
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
GRAPHICS
--------------------------------------------------------------------------------------
--------------------------------
_XL_INIT_GRAPHICS()
It initializes the graphics. Necessary for any build that wants to show anything on the screen.
--------------------------------
XSize: Number of tiles that can be displayed horizontally on the (usable) screen
--------------------------------
YSize: Number of tiles that can be displayed vertically on the (usable) screen
--------------------------------
_TILE_1, ..., _TILE_24, _DOLLAR_TILE
Displayable tiles with _XL_DRAW
--------------------------------
_XL_BLACK, _XL_WHITE, _XL_RED, _XL_CYAN, _XL_GREEN, _XL_YELLOW, _XL_BLUE
Currently available colors
--------------------------------
_XL_DRAW(X, Y, T, C)
It displays tile T at position (X,Y) with color C if color C is available or its "closest" match when C is not supported by a target.
--------------------------------
_XL_DELETE(X,Y)
It deletes a tile-sized area of the screen at position (X,Y)
--------------------------------
_XL_CLEAR_SCREEN()
It clears the whole screen.
--------------------------------
_XL_WAIT_VSYNC()
It waits for the vertical synch if this is supported by the target. It does nothing otherwise.
--------------------------------------------------------------------------------------
TEXT
--------------------------------------------------------------------------------------
--------------------------------
_XL_PRINT(X,Y,S)
It prints the "Cross-Lib string" S starting a position (X,Y).
A "Cross-Lib string" is string formed with only the following 37 possible characters
_XL_SPACE, _XL_a, ..., _XL_z, _XL_A, ..., _XL_Z, '0', ..., '9'
where capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.
--------------------------------
_XL_PRINTD(X,Y,L,N)
It prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y)
--------------------------------
_XL_SET_TEXT_COLOR(C)
It sets the text color to C. Such color will be used on next PRINT and PRINTD for targets that support colored text.
If any other display operation is present (e.g., _XL_DRAW), then there is no guarantee that the color C will be used afterwards.
--------------------------------------------------------------------------------------
INPUT
--------------------------------------------------------------------------------------
--------------------------------
_XL_INIT_INPUT()
It initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input
--------------------------------
_XL_INPUT()
It returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).
The result J is meant to be used with the Boolean functions below.
--------------------------------
_XL_UP(J), _XL_DOWN(J), _XL_LEFT(J), _XL_RIGHT(J), _XL_FIRE(J)
These Boolean functions return 1 (true) if J represents a specific movement or fire button/key, and 0 (false) otherwise.
--------------------------------
_XL_KEY_PRESSED()
This Boolean function returns 1 (true) if any key or fire button is pressed.
--------------------------------
_XL_WAIT_FOR_INPUT()
It waits for any key or fire button to be pressed.
--------------------------------------------------------------------------------------
SOUND
--------------------------------------------------------------------------------------
--------------------------------
_XL_INIT_SOUND()
It initializes the sound system. Necessary for any program that produces sound.
--------------------------------
_XL_ZAP_SOUND()
Long rising sound
--------------------------------
_XL_PING_SOUND()
Short high-pitched sound
--------------------------------
_XL_TICK_SOUND()
Very short high-pitched sound
--------------------------------
_XL_TOCK_SOUND()
Very short low-pitched sound
--------------------------------
_XL_EXPLOSION_SOUND()
Long noise
--------------------------------
_XL_SHOOT_SOUND()
Short noise
--------------------------------------------------------------------------------------
SLEEP
--------------------------------------------------------------------------------------
--------------------------------
_XL_SLEEP(S)
It waits S seconds or an approximations of S seconds depending on the target
--------------------------------
_XL_SLOW_DOWN(T)
It waits T loops (0<=T<=65535)
--------------------------------------------------------------------------------------
RANDOM
--------------------------------------------------------------------------------------
_XL_RAND()
It generates a pseudo-random number in the range [0,32767]
================================================
FILE: docs/CX16.txt
================================================
VERA ports:
In a nutshell the values at $9F20, $9F21 & $9F22 specify a starting VRAM address and an auto-increment value (in $9F22). Reading $9F23 reads the next VRAM byte.
Writing $9F23 writes the next VRAM byte.
----
For example:
$9F20 = 0
$9F21 = 0
$9F22 = %00010001
This points at VRAM address 65536 with Auto Increment value of 1
----
Bit 0 of $9F22 is considered the bank the rest of the bits in 22 set the auto increment mode
The address is Little Endian from $9F20 to the bank bit in $22
----
HSCALE = ( DESIRED RES/640 ) * 128
VSCALE = (DESIREDRES/480) * 128
----
VRAM:
The FONT resides at 1:$F000
The text screen memory is at $1:BOOO layed out as
ATTR, CHAR, ATTR, CHAR.....
================================================
FILE: docs/Creativision_binary_structure.txt
================================================
From FunnyMu source code:
-----------------------------------
Reset CPU -> PC counter is initialized from values in $FFFC,$FFFD?
-----------------------------------
if(F=fopen(Cartridge, "rb")) {
CartSize=fread(CART, 1, 0x8000, F); // read a max of 32KB in CART
rewind(F); // rewinds reading to 0
if (CartSize==0x1000) { // cart is 4KB
printf("4KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xB000, 1, 0x1000, F); // main 4Kb at 0xB000
memcpy(RAM+0x9000, RAM+0xA000, 0x1000); // mirror 4KB at 0x9000
} else
if (CartSize==0x1800) { // cart is 6KB
printf("6KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xB000, 1, 0x1000, F); // main 4Kb at 0xB000
memcpy(RAM+0x9000, RAM+0xB000, 0x1000); // mirror 4KB at 0x9000
CartSize=fread(RAM+0xA800, 1, 0x0800, F); // main 2Kb at 0xA800
memcpy(RAM+0xA000, RAM+0xA800, 0x0800); // mirror 2KB at 0xA000
memcpy(RAM+0x8800, RAM+0xA800, 0x0800); // mirror 2KB at 0x8800
memcpy(RAM+0x8000, RAM+0xA800, 0x0800); // mirror 2KB at 0x8000
} else
if (CartSize==0x2000) { // cart is 8KB
printf("8KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xA000, 1, 0x2000, F); // main 8Kb at 0xA000
memcpy(RAM+0x8000, RAM+0xA000, 0x2000); // mirror 8KB at 0x8000
} else
if (CartSize==0x2800) { // cart is 10KB
printf("10KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xA000, 1, 0x2000, F); // main 8Kb at 0xA000
memcpy(RAM+0x8000, RAM+0xA000, 0x2000); // mirror 8KB at 0x8000
CartSize=fread(RAM+0x7800, 1, 0x0800, F); // main 2KB at 0x7800
memcpy(RAM+0x5800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x5800
memcpy(RAM+0x7000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x7000
memcpy(RAM+0x6800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x6800
memcpy(RAM+0x6000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x6000
memcpy(RAM+0x5000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x5000
memcpy(RAM+0x4800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x4800
memcpy(RAM+0x4000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x4000 (needed by Werben ++++ Informieren)
} else
if (CartSize==0x3000) { // cart is 12KB
printf("12KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xA000, 1, 0x2000, F); // main 8Kb at 0xA000
memcpy(RAM+0x8000, RAM+0xA000, 0x2000); // mirror 8KB at 0x8000
CartSize=fread(RAM+0x7000, 1, 0x1000, F); // main 4Kb at 0x7000
memcpy(RAM+0x5000, RAM+0x7000, 0x1000); // mirror 4KB at 0x5000
memcpy(RAM+0x6000, RAM+0x7000, 0x1000); // mirror 4KB at 0x6000
memcpy(RAM+0x4000, RAM+0x7000, 0x1000); // mirror 4KB at 0x4000 (needed by Basic 82)
} else
if (CartSize==0x4000) { // cart is 16KB
printf("16KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xA000, 1, 0x2000, F); // main 8Kb at 0xA000
CartSize=fread(RAM+0x8000, 1, 0x2000, F); // second 8Kb at 0x8000
} else
if (CartSize==0x4800) { // cart is 18KB
printf("18KBytes cartridge found...OK\n");
CartSize=fread(RAM+0xA000, 1, 0x2000, F); // main 8Kb at 0xA000
CartSize=fread(RAM+0x8000, 1, 0x2000, F); // second 8Kb at 0x8000
CartSize=fread(RAM+0x7800, 1, 0x0800, F); // main 2KB at 0x7800
memcpy(RAM+0x6800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x6800
memcpy(RAM+0x5800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x5800
memcpy(RAM+0x4800, RAM+0x7800, 0x0800); // mirror 2Kb at 0x4800
memcpy(RAM+0x7000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x7000
memcpy(RAM+0x6000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x6000
memcpy(RAM+0x5000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x5000
memcpy(RAM+0x4000, RAM+0x7800, 0x0800); // mirror 2Kb at 0x4000
} else
if (CartSize==0x8000) { // cart is 32KB
printf("32KBytes cartridge found...OK\n");
CartSize=fread(RAM+0x4000, 1, 0x8000, F); // main 32Kb at 0x4000
}
fclose(F);
}
else
P="NOT FOUND";
================================================
FILE: docs/DISCLAIMER.md
================================================
# DISCLAIMER
All information on the site (https://github.com/Fabrizio-Caruso/CROSS-LIB) and the software it describes is provided in good faith, however we make no representation or warranty of any kind, express or implied, regarding the accuracy, adequacy, validity, reliability, availability or completeness of any information on the site https://github.com/Fabrizio-Caruso/CROSS-LIB and the software it provides.
Under no circumstance shall we have any liability to you for any loss or damage of any kind incurred as a result of the use of the aforementioned site and any software it provides (games, tests, tools, library, source code, scripts. etc.) or reliance on any information provided on the site. Your use of the site and the software it provides and your reliance on any information on the site is solely at your own risk.
================================================
FILE: docs/EnglishArticle.md
================================================
# CROSS-LIB
by Fabrizio Caruso
## INTRODUCTION
The goal of this article is to present Cross-Lib, briefly show how to use it and present the 6 "universal" games I have written with it.
By "universal" here I mean that these games will run on about 200 different systems (consoles, computers, arcade boards, pocket calculators, etc.) despite using the very same game code.
For more details we refer to the GitHub page: http://www.github.com/Fabrizio-Caruso/CROSS-LIB/
## WHAT IS CROSS-LIB?
Cross-Lib (https://github.com/Fabrizio-Caruso/CROSS-LIB/) is a free open source tool for retro-coding for a multitude of 8-bit and vintage systems from the ‘80s (computers, consoles, pocket calculators, arcade boards, etc.)
such as Apple //, all 8-bit Commodore computers, Atari 800, Amstrad CPC, Sinclair ZX 81, Sinclair ZX Spectrum, TRS-80 CoCo, Dragon 32, TRS-80 MC-10, Thomson Mo5 and To7, MSX, Oric-1, Oric Atmos, BBC Micro, etc. as well as consoles such as GameBoy, Sega Master System, GameGear, Nintendo NES, etc.
and other devices such as Texas Instruments pocket calculators. The main CPU architectures are Zilog 80, MOS 6502, Intel 8080, Motorola 6803, Motorola 6809 and RCA 1802.
Cross-Lib also supports several lesser known systems such as the Philips VG-5000, the Jupiter Ace and several exotic and rare systems such as the yugoslav Galaksija, the Hungarian Homlab-2,
several computers from the Eastern German Robotron series such as the Robotron KC 85, etc.
A large, yet partial list of the supported systems is at the page:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md.
Cross-Lib has two main components:
1. A "universal" C library (e.g., a collection of C APIs mostly for input/output);
2. A Python script to manage game projects (e.g., to build, create, clone, etc.) and manipulate graphics assets (e.g., to create, import or rip assets)
The main goal of Cross-Lib is to provide a *hardware abstraction layer* for hundreds of vintage systems so that the *very same* game code can be used without any adaptation for all its supported systems.
Several articles have been published on Cross-Lib ([rg], [prog]) and its games ([ceo] and, in by this very magazine, [app]).
## CROSS-LIB VS OTHER DEV-KITS
Historically, 8-bit systems were programmed directly on the system and mostly in Assembly, or for simpler programs in interpreted BASIC.
Today cross-development simplifies developers’ tasks a lot (modern editors, simplified debugging, efficient and quick compilation, etc.) and can be done in C.
The problem with the portability of C code comes from the diversity of the machines and from the fact that ANSI C does not provide a standard library for graphics, sounds, input, etc.
A partial solution is already provided by some dev-kits such as CC65 (for MOS 6502), Z88DK (for the Zilog 80 and Intel 8080), LCC1802 (for the RCA 1802), CMOC (for the Motorola 6890), etc.
By using one of these dev-kits, we can exploit their cross-compatible libraries for input and output.
On the other hand:
1. Each dev-kit only covers a subset of all 8-bit architectures.
2. Even within a given dev-kit, its libraries do not necessarily provide the very same input/output APIs across the entirety of its supported targets.
Cross-Lib improves on these points and lets you do things that you cannot do with other tools:
1. cover many more vintage 8-bit architectures, including very exotic ones;
2. writing 100% WORA code, i.e., "write once, run anywhere" (after re-compilation);
3. using WORA graphics resources, i.e., define abstract graphics assets for several totally different systems;
4. using a simplified tool-chain to create, compile and test the games.
The closest dev-kits to Cross-Lib with respect to these points are
- 8-bit-Unity [un8] (meant to be used with CC65), which does incredible things but only for very few MOS 6502-based systems;
- Z88DK, which has huge libraries but only covers Zilog 80 and Intel 8080 systems.
On the other hand Cross-Lib is not a compiler. It uses several compilers to build the binary files (executable files, disk images, tape images, cartridge images, etc.) for retro-consoles and retro-computers.
By providing an abstraction layer for all 8-bit systems, Cross-Lib makes some compromises with respect to what we could do if we were coding only for a specific system.
In particular, graphics is somehow limited by what is possible on all systems. Sound effects are even more limited.
## COMPILERS
Cross-Lib is supposed to be used with C compilers but which ones?
A native compiler (for example GCC) can be used to build native binaries that can be run, for instance, under Windows.
Today the support for native compilation is limited to the text terminal, which means no graphics other than ASCII on the host machine.
Currently Cross-Lib fully supports the following cross-compilers and dev-kits with graphics and sound effects for most of its targets:
- CC65 [cc65] for most systems based on the MOS 6502 architecture;
- Z88DK [z88dk] for systems based on the Zilog 80 and Intel 8080 architectures;
- CMOC [cmoc] for systems that use the Motorola 6809;
- LCC1802 [lcc1802] for systems that use the COSMAC RCA 1802 ;
- GCC for TI [ti] for the Texas Instruments TI99/4A based on the 16-bit TMS9900.
Cross-Lib also supports other compilers (currently with limited or absent graphics and sound effects) such as
- ACK [ack] for 8088/8086, Intel 8080 CP/M, 386/68K/PPC/MIPS Linux and PDP11,
- XTC68 [xtc68] for the Sinclair QL,
- VBCC [vbcc] for the BBC Micro, BBC Master, the Amiga and others,
- CC6303 [cc6303] for the Motorola 6803;
- several versions of modded GCC to target vintage computers (Atari ST [st], Olivetti M20 [m20]).
Cross-Lib supports a large sub-set of ANSI C89 because most available cross-compilers for 8-bit architectures only implement a sub-set of ANSI C89.
Therefore we write in C (a sub-set of ANSI C C89) with Cross-Lib APIs for graphics, sounds, input.
In particular we must avoid:
- "float" and "double" types,
- copies and parameters by value of "struct" objects,
- any use of the heap.
For hints on how to code efficiently for 8-bit systems we refer to [effc] and for specific hints on how to code with these compilers we refer to [c8b].
## INSTALLATION
Cross-Lib itself does not require any real installation.
It is enough to download the repository files (from the GitHub page) or to clone the repository with:
git clone https://www.github.com/Fabrizio-Caruso/CROSS-LIB/
On the other hand it requires:
- a POSIX environment (e.g., Windows with Cygwin, Linux, FreeBSD, etc.);
- Make (GNU Make);
- Python 2.7 or Python 3.* [optional but necessary to simplify many operations];
- GCC compiler with ncurses libraries [optional];
- any compiler necessary to build for a desired target architecture (e.g., CC65, Z88DK, etc.)
- JAVA (only to be disk images for the Apple //).
Once you have Cross-Lib with its dependencies in a POSIX environment, you should move to the "src" directory.
Inside "src" you will find the "xl" Python script and the following directories
- "cross-lib", which contains the library code;
- "games" with built-in games;
- "examples" with built-in examples;
- "projects" with user-defined projects.
If you have correctly installed just Makefile, Python and any compiler (e.g. GCC) in a POSIX environment, it should already be possible to minimally use Cross-Lib to build the Chase game by running the following command inside the "src" directory (you will have to make sure that the "." directory is in your PATH environment variable otherwise you will have to explicitly use "./xl" instead of "xl"):
"xl chase stdio", which will build the game Chase in turn-based mode for the target if the compiler (e.g., the native console if you use GCC).
As stdio has no support for immediate input, the game will be, at best, barely playable in turn-based mode.
Most games won't be playable at all, because this can only work for games that are aware of this (e.g., chase) where the code invokes a specific refresh command to re-display the content of the screen like a slide-slow.
This can be used to test if the games compile with a given compiler.
## HOW TO USE THE XL SCRIPT
If just one of the supported compilers is installed, Cross-Lib can be used with the "xl" Python script inside the "src" directory.
If GCC with ncurses is installed, a native version of the games and examples can be built with:
"xl build \" or just "xl \"
For example
"xl snake"
builds the "snake" game for the native console.
If a cross compiler (CC65, Z88DK, CMOC, CC6303, LCC1802, etc) is installed, the games and examples can be built for the corresponding systems.
For example, if CC65 is installed,
"xl horde apple2"
builds the "horde" game for the Apple // with 6-color HGR graphics.
The "xl" script takes several commands. In particular you can see a list of the available commands with "xl commands".
You can get an explanation of each command with examples with
"xl help \".
If we want to create a new project, we need to use
"xl create \",
which will create a project with a trivial "hello world" example inside the "projects" directory.
We can also start with a template code for a game if we pass the additional parameter "game":
"xl create \ game".
## HELLO WORLD
Coding with Cross-Lib is like normal coding in C (with ANSI C89) with the only addition that all input/output is done through Cross-Lib APIs.
Cross-Lib comes with many examples in the src/examples/ directory as well as a few games in the src/games directory.
Both of which can be used to learn how to code with Cross-Lib.
We could start to look at src/examples/helloworld/, whose main.c files contains:
```
#include "cross_lib.h"
int main(void)
{
_XL_INIT_GRAPHICS();
_XL_CLEAR_SCREEN();
_XL_SET_TEXT_COLOR(_XL_WHITE);
_XL_PRINT_CENTERED("HELLO WORLD");
while(1){};
return EXIT_SUCCESS;
}
```
We remark that all Cross-Lib specific functions start with the _XL_ prefix:
1. _XL_INIT_GRAPHICS() required to initialize the display ;
2. _XL_CLEAR_SCREEN() which cleans the content of the screen ;
3. _XL_SET_TEXT_COLOR(_XL_WHITE) which defines the color to be used by the text and characters ;
4. _XL_PRINT_CENTERED("HELLO WORLD") which displays "HELLO WORLD" on the center of the screen.
If we want to use one of the examples or games as a starting point we can clone the project with:
xl clone \ \
Or we can start from (almost) scratch with
xl create \
Once we have a new project, we can build it with
xl \ \
or
xl \
if we want to build the project for the native terminal.
We can run the project for the native terminal with:
xl run \
For example we could run these commands:
xl clone helloworld myhelloworld [to clone helloworld and create myhellworld]
We modify the project myhelloworld (found inside ./src/projects/myhelloworld/)
xl build myhelloworld (or equivalently xl myhelloworld) [to build a native binary of the new project]
xl run myhelloworld [to run the new project]
xl build myhelloworld c64 [to build the same project for the Commodore 64]
## CODING WITH ABSTRACTIONS
In order to code with Cross-Lib for all targets at the same time, Cross-Lib uses several abstractions.
Graphics is only tile-based. In the code, tiles are abstract as their exact shape will depend on the target type.
The game code only sees tiles as macros _TILE_0, _TILE_1, _TILE_2, etc.
Each concrete target will interpret tiles in different ways depending on whether the target can or cannot assign free shapes to tiles and
on the number of pixels that define tiles on that system.
Sound is currently only limited to few sound effects that are rendered somehow similarly across multiple targets.
Input is limited to 4 directions and a single fire button. On each target this will be mapped to either 5 keys (usually I J K L SPACE)
or the main joystick/controller/gamepad.
Running "xl manual" will output a manual with all commands.
## MAIN DEVELOPMENT FLOW
Producing "universal" games with Cross-Lib for the developer boils down to these main steps:
- Creating or cloning a project (with xl create or xl clone);
- Writing the abstract game code in ANSI C with Cross-Lib APIs for input/output;
- Manually creating or automatically importing abstract assets (with commands such as e.g., xl shapes, xl import, xl rip, xl tile);
- Running the xl script to build the project for one or multiple targets (with xl build).
The "xl build \ \" command (or its equivalent short form "xl \ \")
executes one or several Makefile targets, which generally:
- generate a concrete asset file from the abstract asset files
- compile the source code (game code and target-specific portions of Cross-Lib library);
- include or link the asset files with the compiled source code;
- if necessary a tool is used to create a usable disk/floppy/rom/cartridge image (this is the case for the Apple // for which disk images are generated).
[INSERT FLOW PICTURE HERE]
## GRAPHICS
Graphics is performed by displaying "tiles", whose shape can be defined. The number of tiles is currently limited to 27 but future versions of Cross-Lib will overcome this constraint.
We can also display "characters" (letters, digits and the space character) but their shape is (currently) fixed.
Characters and tiles have the same size. Characters are used for the text, whereas tiles are used for graphics.
ASCII-only targets will be able to only assign ASCII shapes to tiles, whereas targets with real graphics will assign a "freely defined" shape to tiles.
Currently each tile only has one tile-specific foreground color and a common background color.
The definition of their shapes is not done in the C code.
Instead it is done inside the \/tiles directory, which contains sub-directories with files with tile definitions for the ASCII case and
for the graphics-enabled targets, e.g., 8x8 (for most targets), 7x8 (for the Apple //), 6x8 (for the Oric series and NTSC COMX-35), etc...
In the aforementioned files the shapes are described by either ASCII codes for ASCII-only targets or sequences of bytes for graphics-enabled targets.
These files can be:
1. edited manually or
2. automatically imported from several programs such as CharPad [chPad] (with "xl import \ \") or
3. automatically ripped from BASIC or Assembly listings (with "xl rip \ \") or
4. generated by some simple "pictorial" text files with drawings made of "#" and "." characters
(with "xl shapes \ \ \ or "xl tile \ \ \".
You can see how to use these commands by running "xl help \".
In the game code tile graphics is primarily performed by invoking these functions (to display or delete tiles):
void _XL_DRAW_TILE(uint8_t x, uint8_t y, uint8_t tile_number, uint8_t tile_color);
void _XL_DELETE(uint8_t x, uint8_t y);
## SOUND
Sound is even more limited than graphics and it is restricted to a few predefined effects.
The sound commands have this form:
void _XL_\_SOUND(void);
For example:
XL_EXPLOSION_SOUND() produces an explosion sound (or something vaguely similar to it depending on the target)
## INPUT
Input is limited to four directions and a single fire button.
The primary input APIs are:
uint8_t _XL_INPUT(void);
uint8_t _XL_LEFT(uint8_t input);
uint8_t _XL_RIGHT(uint8_t input);
uint8_t _XL_UP(uint8_t input);
uint8_t _XL_DOWN(uint8_t input);
uint8_t _XL_FIRE(uint8_t input);
where _XL_INPUT polls the input and the other functions are used to determined the specific input.
## GRAPHICS, SOUNDS AND INPUT IN ONE EXAMPLE
Inside the src/examples/animate directory you can find the following example that could be used as a blueprint for a simple game.
This simple example has graphics, input and sound.
When compiled for any of the possible systems, it will produce the very same program but the exact tile shapes and sounds will depend on the target.
For example it can be compiled for the native console with:
xl animate
or for the Apple // with
xl animate apple2
or for the MSX with
xl animate msx
```
#include "cross_lib.h"
#define MIN_X 1
#define MAX_X (XSize-2)
#define MIN_Y 1
#define MAX_Y (YSize-2)
#define DOWN_TILE _TILE_0
#define UP_TILE _TILE_1
#define RIGHT_TILE _TILE_2
#define LEFT_TILE _TILE_3
#define FIRE_TILE _TILE_4
int main(void)
{
uint8_t x;
uint8_t y;
uint8_t input;
uint8_t tile;
_XL_INIT_GRAPHICS();
_XL_INIT_SOUND();
_XL_INIT_INPUT();
_XL_CLEAR_SCREEN();
x = XSize/2;
y = YSize/2;
tile = DOWN_TILE;
while(1)
{
_XL_SET_TEXT_COLOR(_XL_WHITE);
_XL_PRINTD(0,0,3,x);
_XL_PRINTD(5,0,3,y);
input = _XL_INPUT();
if(_XL_UP(input))
{
_XL_DELETE(x,y);
tile = UP_TILE;
--y;
}
else if (_XL_DOWN(input))
{
_XL_DELETE(x,y);
tile = DOWN_TILE;
++y;
}
else if (_XL_LEFT(input))
{
_XL_DELETE(x,y);
tile = LEFT_TILE;
--x;
}
else if(_XL_RIGHT(input))
{
_XL_DELETE(x,y);
tile = RIGHT_TILE;
++x;
}
else if(_XL_FIRE(input))
{
_XL_DRAW(x,y,FIRE_TILE,_XL_WHITE);
_XL_EXPLOSION_SOUND();
_XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);
}
if((y>=MIN_Y)&&(y<=MAX_Y)&&(x>=MIN_X)&&(x<=MAX_X))
{
_XL_DRAW(x,y,tile,_XL_WHITE);
}
else
{
_XL_DELETE(x,y);
_XL_ZAP_SOUND();
_XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);
x = XSize/2;
y = YSize/2;
}
_XL_SLOW_DOWN(4*_XL_SLOW_DOWN_FACTOR);
}
return EXIT_SUCCESS;
}
```
## THE GAMES
Cross-Lib comes with some games I have written with it. As for July 2023, it includes seven games:
- Shuriken
- Verbix
- Horde
- Snake
- Bomber
- Shoot
- Chase
### SHURIKEN
Shuriken is somehow similar to PAC-MAN in that you need to collect all diamonds to complete non-boss levels while you need to avoid being hit by the shurikens.
In boss levels you have to additionally kill all the shurikens by using the movable blocks that are deadly for them.
You can also collect special items that make you temporarily invincible (white ring) or that slow down the shurikens (blue large diamond).
### VERBIX
Verbix is a Scrabble-like game that looks also a bit like Tetris.
In this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.
You can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.
### HORDE
Horde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.
You control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.
If you run out of arrows, you will get a few arrows after a short period.
In each level you are confronted with a horde of zombies that become harder as you progress.
### SNAKE
Snake is my personal interpretation of a hybrid game between the arcade game Nibbler and the Nokia cell phone game Snake to which I have added more game elements.
As in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.
As in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control, consumes its energy and eventually dies.
In each level you are also confronted with mines that kill you if the snake's head touches them.
As a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.
The game has several secrets and level to discover.
### BOMBER
Bomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet.
The game concept is horrible (not my own concept) but it can be addictive nevertheless.
Your plane has to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.
You do not control the plane and can only press fire to drop a bomb at a time.
### SHOOT
Shoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.
You can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).
You can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.
At the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skull-shaped enemies.
As a secondary goal you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
The game has many secrets, levels and items to discover.
### CHASE
Cross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.
The main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.
Similarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by several bullets fired by the gun item.
You can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
## FUTURE DEVELOPMENT
Cross-Lib is actively developed. Planned future developments are:
- support for more targets and architectures (e.g., Apple ||gs, Apple 1, etc.);
- improved targets (e.g, DHGR mode for the 80-column capable Apple // models);
- improved APIs (more tiles, improved sounds, etc.);
- simplified setup (docker file with all compilers, tools and dependencies);
- improved scripts to handle graphics assets;
- improved support for the native target;
- more games.
## BIBLIOGRAPHY
[ack] ACK, Tanenbaum A., Jacobs C. et al., C compiler for Intel 8088, PDP 11, CP/M-80,etc., https://github.com/davidgiven/ack
[app] Cross Chase: A Massively 8-bi Multi-System Game, Caruso F., Call-A.P.P.L.E., vol. 28, No. 1, Feb 2018, pages 31-33, http://www.callapple.org
[c8b] 8-bit C, Caruso F., https://github.com/Fabrizio-Caruso/8bitC
[cc6303] CC6303, Cox A., C compiler for the Motorola 6800 and 6803, https://github.com/EtchedPixels/CC6303
[cc65] CC65, C compiler for the MOS 6502, https://sourceforge.net/projects/cc65/
[ceo] Cross Chase, Caruso F., CEO-MAG, No. 327-328, Juillet-Août 2017, https://ceo.oric.org/
[chPad] CharPad, Subchrist Software, https://subchristsoftware.itch.io/charpad-c64-free
[cmoc] CMOC, Sarrazin P., C compiler for the Motorola 6809, https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html
[effc] Efficient C Code for 8-bit Microcontrollers, Jones N., https://barrgroup.com/embedded-systems/how-to/efficient-c-code
[m20] Z8KGCC, Groessler C., GCC modded for the Olivetti M20, http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html
[lcc1802] LCC1802, Rowe B., C compiler for the RCA 1802, https://github.com/bill2009/lcc1802
[prog] Cross-Lib, Caruso F., Programmez! Hors Série #6, pages 72-82.
[rg] Interview to F. Caruso about Cross-Lib, RetroGamer #240, page 100, https://www.retrogamer.net/
[st] GCC, Rivière V., modded for the Atari ST, http://vincent.riviere.free.fr/soft/m68k-atari-mint/
[ti] GCC, (Insomnia), modded for the TI99/4A, http://atariage.com/forums/topic/164295-gcc-for-the-ti
[un8] 8-Bit Unity, Beaucamp A. (8-bit Dude), http://8bit-unity.com/
[vbcc] VBCC, Barthelmann V., C compiler for the BBC Micro, BBC Master, Amiga, etc., http://www.compilers.de/vbcc.html
[xtc68] XTC68, Hudson J., C compiler Sinclair QL, https://github.com/stronnag/xtc68
[z88dk] Z88DK, C compiler and dev-kit for the Zilog 80 and Intel 8080 architectures.
================================================
FILE: docs/GAMES.md
================================================
# THE GAMES
-------------------------------------------
## TREX

CONTROLS: either SPACE or FIRE.
1. Commodore Vic 20:
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXtrexti.bin
3. MSX:
https://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_msx_16k.rom
4. Video Technology Laser 500:
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/trexBETA/Xtrex_laser500_keyboard.bin
-------------------------------------------
## STINGER


CONTROLS: either the joystick or J (move lefte), L(move right), SPACE (check word)
1. Commodore Vic 20:
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXstingerti.bin
3. MSX:
https://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_msx_16k.rom
4. Video Technology Laser 500:
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/stinger/Xstinger_laser500.bin
-------------------------------------------
## SHURIKEN


CONTROLS: either the joystick or I (up rotate), J (move left/left rotate), K (down rotate), L(move right, right rotate), SPACE (check word)
1. Commodore Vic 20:
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXshurikenti.bin
3. MSX:
https://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_msx_16k.rom
4. Video Technology Laser 500:
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/shuriken/Xshuriken_laser500.bin
-------------------------------------------
## VERBIX


Cross Verbix is a word game somehow similar to Scrabble and to a much lesser extent similar to Tetris: you must construct correct English words by rotating columns of letters or by rotating the bottom row before the letters reach the top level.
You can get extra points if you complete the level earlier by lowering the stack of letters below the second row.
CONTROLS: either the joystick or I (up rotate), J (move left/left rotate), K (down rotate), L(move right, right rotate), SPACE (check word)
1. Commodore Vic 20:
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXverbixti.bin
3. MSX:
https://webmsx.org/?cartridge1_url=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_msx_16k.rom
4. Video Technology Laser 500:
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_laser500.bin
5. Video Technology Laser 200 / VZ200:
https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/verbix/Xverbix_vz200_24k.vz
## HORDE



Cross Horde is a zombie shooter with several different enemies, levels and power-ups and items to pick.
You die if a zombie reaches the wall behind the bow or if a zombie hits you with its bullets.
In order to improve your fire power you can pick up the rings that are dropped when some zombies die.
Rings will improve in this order:
- the range of your bow
- the speed of your bow
- the number of arrows thrown at once
- the power of your bow
After these improvements, the rings will be necessary to unblock special items and to achieve the temporary "hyper" power.
CONTROLS: either the joystick or J (left), L (right), SPACE (fire).
1. Commodore Vic 20:
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vic20_exp_8k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXhordeti.bin
3. Commodore 64:
https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_c64.prg
4. MSX 1:
https://homebrew.file-hunter.com/index.php?id=crosshorde
5. Sinclair ZX Spectrum 48K: \
https://spectrumcomputing.co.uk/playonline.php?eml=2&downid=140691 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=140691
6. Video Technology Laser 200 / VZ200:
https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vz200_24k.vz
7. Video Technology Laser 500:
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_laser500.bin
8. Commodore 264 series (C16/C116/C+4):
https://plus4world.powweb.com/play/cross_horde
Binaries are in the release section (Click on Assets): \
https://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XHorde1.0
-------------------------------------------
## SNAKE



This my own re-interpretation of Nibbler (arcade) and Snake (primarily a cell phone game), to which I have added many more game elements.
You have to go through 32 levels (with 16 different maps) + an optional secret level (with its own map).
To complete a level you have to eat all the apples while:
- avoiding your own tail and body
- avoiding the fixed and bouncing mines
- avoiding to starve by losing your energy (eat apples to prevent this).
As you starve, the snake moves faster and faster.
Walls do not kill you and let you pause the game and think about your next move.
You can also catch special items that will help in your quest:
- ring (collect 3 or even 4 for extra points and to spawn more special items such as "freeze")
- freeze (special item that freezes the mines and restores your energy
- $ (extra points... but also some secret effects if you collect many)
- extra life (special and hard to unlock item that gives 1 extra life)
CONTROLS: either the joystick or I J K L to move and SPACE to start/continue.
You can play the game online:
1. Commodore Vic 20: \
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXsnaketi.bin
3. Commodore 64: \
https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_c64.prg
4. MSX 1: \
https://homebrew.file-hunter.com/index.php?id=crosssnake
5. Sinclair ZX Spectrum 48K: \
https://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137608 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137608
6. Video Technology Laser 200 / VZ200: \
https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vz200_24k.vz
7. Video Technology Laser 500: \
https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_laser500.bin
8. Commodore 264 series (C16/C116/C+4): \
http://plus4world.powweb.com/play/cross_snake_2_0
Binaries are in the release section (Click on Assets): \
https://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XSnake2.0
-------------------------------------------
## BOMBER

The game's goal is to destroy all buildings so that you can land on an empty road.
The game is a clone of Air Attack (aka Blitz) game that was first developed on the Commodore Pet.
The game is controlled by the single fire button (first joystick button for targets with joystick input and space key for targets with keyboard input).
Your score depends on the number of building destroyed, the level reached and how fast you complete each single level.
The game has 9 levels and it ends after the eighth level.
CONTROLS: either the joystick fire button or SPACE.
You can play the game online:
1. Commodore Vic 20: \
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vic20_exp_8k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXbomberti.bin
3. Commodore 64: \
https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_c64.prg
4. MSX 1: \
https://homebrew.file-hunter.com/index.php?id=crossbomber
5. Sinclair ZX Spectrum 48K: \
https://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137605 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137605
6. Video technology Laser 200 / VZ200: \
https://nippur72.github.io/laser310-emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vz200_24k.vz
7. Video technology Laser 500: \
https://nippur72.github.io/laser500emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/bomber/Xbomber_laser500.bin
8. Commodore 264 series (C16/C116/C+4): \
http://plus4world.powweb.com/play/cross_bomber
Binaries are in the release section (Click on Assets): \
https://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XBomber
-------------------------------------------
## SHOOT

The game's goal is to kill all common enemies or kill all 4 "skulls".
Common enemies can be killed quickly if pushed against the walls by shooting at them.
The "skulls" and the boss cannot be pushed and are harder to kill.
You have to avoid all enemies, rockets and chasing missiles.
All flashing items have positive effects and can grant you special powers.
Your bullets have a limited power that can be improved by catching the special fire power item.
You can also fetch the mine item that grants you 3 powerful mines to use against all your enemies.
Discover the 12 items. Some items are secret. In total the game has 16 secrets.
You can unlock the 16 secrets by shooting at the skulls and at the missile and rocket bases in different ways.
The game has 16 different levels including 2 boss levels + 1 secret level.
CONTROLS: either the joystick or I J K L to move and SPACE to fire.
You can play the gamne online:
1. Commodore VIC 20: \
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/XShoot_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXshootti.bin
3. Commodore 64: \
https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_c64.prg
4. MSX 1: \
https://homebrew.file-hunter.com/index.php?id=crossshoot
5. Sinclair ZX Spectrum 48K: \
https://spectrumcomputing.co.uk/playonline.php?eml=2&downid=137606 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137606
6. Video Technology Laser 200 / VZ 200: \
https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_vz200_24k.vz
7. Video Technology Laser 500: \
https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_laser500.bin
8. Commodore 264 series (C16/C116/C+4): \
http://plus4world.powweb.com/play/cross_shoot
Binaries are in the release section (Click on Assets): \
https://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XShootRebuild
-------------------------------------------
## CHASE

The game's goal is to lure the "ghosts" into the mines and possibly kill the "skull" by repeatedly using the gun.
You have to avoid all enemies, the mines, all walls, rockets and chasing missiles.
All flashing items have positive effects and can grant you some special powers. Discover the 10 items.
If you use the gun against the skull and/or the missiles and rockets, you can unlock some special secret items.
There are 20 different levels including 4 boss levels.
CONTROLS: either the joystick or I J K L (to move) and SPACE to fire.
You can play the game online for different systems:
1. Commodore Vic 20: \
https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vic20_exp_16k.prg
2. TI99/4A:
https://js99er.net/#/?cartUrl=https:%2F%2Fgithub.com%2FFabrizio-Caruso%2FCROSS-LIB%2Freleases%2Fdownload%2Fti99_1.32%2FXchaseti.bin
3. Commodore 64: \
https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_c64.prg
4. MSX 1: \
https://homebrew.file-hunter.com/index.php?id=crosschase
5. Sinclair ZX Spectrum 48K: \
https://spectrumcomputing.co.uk/playonline.php?eml=2&downid=112056 or https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=112056
6. Video Technology Laser 210 / VZ200 : \
https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vz200_18k.vz
7. Video Technology Laser 500: \
https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_laser500.bin
8. Commodore 264 series (C16/C116/C+4): \
http://plus4world.powweb.com/play/cross_chase_32k_v0_9
Binaries are in the release section (Click on Assets): \
https://github.com/Fabrizio-Caruso/CROSS-LIB/releases/tag/XChase
================================================
FILE: docs/GIOCHI.md
================================================
# I GIOCHI
A secondo del sistema il gioco prevede
- l'uso del joystick nella port più comune (in genere port 1 tranne che port 2 su C64) oppure
- l'uso di I J K L per i movimenti e SPAZIO per FIRE.
-------------------------------------------
## CROSS HORDE



Cross Horde è uno zombie shooter con diversi tipi di nemici, power-ups e oggetti da raccogliere.
Si muore se uno zombie raggiunge il muro o se uno zombie ci colpisce con un suo proiettile.
Per migliorare la potenza di fuoco si possono raccogliere gli anelli che alcuni zombie ci lasciano alla loro morte.
Gli anelli hanno questi effetti in ordine temporale:
- aumenta la distanza dei nostri colpi
- aumenta la velocità di ricarica del nostro arco
- aumenta il numero di frecce lanciate contemporaneamente
- aumenta la potenza di ogni freccia
Una volta raggiunti tutti questi miglioramenti, gli anelli successivi saranno utile per sbloccare oggetti speciali e per raggiungere la potenza di fuoco "hyper".
Il gioco è disponibile pure online:
1. Commodore 264 series (C16/C116/C+4):
https://plus4world.powweb.com/play/cross_horde
2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vic20_exp_8k.prg
3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_c64.prg
4. Video Technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_vz200_24k.vz
5. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XHorde1.0/Xhorde_laser500.bin
-------------------------------------------
## CROSS SNAKE - THE GAME



E' la mia personale re-interpretazione del gioco arcade Nibbler e del gioco per cellulare Snake, alla quale io ho aggiunto ulteriori elementi di gioco.
Ci sono 32 livelli (su 16 mappe diverse) + un livello opzionale segreto (con la sua mappa).
Per completare un livello si devono mangiare tutte le mele preveste dal livello:
- evitando di mordere il proprio corpo;
- evitando di colpire con la testa le mine (mobili e fisse);
- evitando di morire di fame, cioè perdendo tutta l'energia (non trascorrere troppo tempo senza mangiare una mela).
Più tempo passa senza mangiare mele, più veloce si muoverà il serpente e questo rende i movimenti sempre più difficili.
I muri non uccidono (come nel gioco arcade Nibbler) e tu possono essere utili per fermare il serpente per decidere la mossa successiva.
Puoi catturare oggetti speciali:
- anello (prendine 3 or anche 4 per punti extra e per generare altri oggetti speciali come "freeze");
- freeze (oggetto speciale che congela temporaneamente le mine e rallenta il serpente);
- $ (punti extra ma anche effetti speciali se se ne prendono molti)
- vita extra (oggetto difficile da sbloccare)
Il gioco è disponibile pure online:
1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_snake_2_0
2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vic20_exp_16k.prg
3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_c64.prg
4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crosssnake
5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137608
6. Video Technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_vz200_24k.vz
7. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XSnake2.0/Xsnake_laser500.bin
-------------------------------------------
## CROSS BOMBER - THE GAME

Lo scopo del gioco è distruggere tutti gli edifici in maniera da potere atterrare.
Trattasi di un clone di Air Attack (anche noto come Blitz) che fu sviluppato la prima volta per Commodore Pet.
Il gioco è controllato dal solo pulsate di fuoco (quindi FIRE o SPAZIO).
Il punteggio dipende dal numero di edifici distrutti, dal livello raggiunto e da quanto velocemente si completi ogni singolo livello.
Il gioco prevede 8 livelli e termina alla fine dell'ottavo livello.
Il gioco è disponibile pure online:
1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_bomber
2. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vic20_exp_8k.prg
3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_c64.prg
4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crossbomber
5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137605
6. Video technology Laser 200 / VZ200: https://nippur72.github.io/laser310-emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XBomber/Xbomber_vz200_24k.vz
7. Video technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&?load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/bomber/Xbomber_laser500.bin
-------------------------------------------
## CROSS SHOOT - THE GAME

Lo scopo del gioco è di occidere tutti i nemici comuni oppure alternativamente uccidere i 4 teschi prima di avere ucciso tutti gli altri nemici.
Completare un livello uccidendo i 4 teschi permette di avere più punti e di sbloccare segreti, oggetti e bonus.
I nemici comuni possono essere uccisi velocemente se spinti dai nostri proiettili contro i muri.
Devi evitare tutti i nemici e i missili di vario tipo.
Tutti gli oggetti che lampeggiano hanno effetti positivi per noi e ci possono darci poteri speciali.
I tuoi proiettili hanno una potenza limitata che puoi essere migliorata da un oggetto specifico.
Puoi anche raccogliere un oggetto che ti dà 3 mine da usare contro tutti i nemici.
Puoi scoprire 12 oggetti. Alcuni di questi oggetti sono segreti. Il gioco ha in totale 16 segreti (di vario tipo).
Per trovare i segreti la strategia migliore è quella di distruggere diversi teschi e basi di missili.
Il gioco prevede 16 diversi livelli compresi 2 boss + 1 livello segreto.
Il gioco è disponibile pure online:
1. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_shoot
2. Commodore VIC 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/XShoot_vic20_exp_16k.prg
3. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_c64.prg
4. MSX 1: https://homebrew.file-hunter.com/index.php?id=crossshoot
5. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=137606
6. Video Technology Laser 200 / VZ 200: https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_vz200_24k.vz
7. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XShootRebuild/Xshoot_laser500.bin
-------------------------------------------
## CROSS CHASE - THE GAME

Lo scopo del gioco è quello di fare finiti i nemici sulle mine e se possibile uccidere pure il teschio colpendolo con più colpi (dopo avere preso la pistola).
Il gioco è quindi simile ad una versione real-time di Gnome Robots ma ha anche diversi elementi di gioco aggiuntivi.
Devi evitare tutti i nemici, le mine, i muri e i missili di vario genere.
Tutti gli oggetti lampeggianti hanno effetti positivi e possono darti poteri speciali. Ci sono 10 oggeti diversi da scoprire e sbloccare.
Per sbloccare alcuni segreti e oggetti speciali, dovrai usare la pistola contro il teschio e/o contro le basi dei missili.
Il gioco prevde 20 livelli diversi compresi 4 boss.
Il gioco è disponibile pure online:
1. Atari LYNX: https://atarigamer.com/lynx/play/CrossChase/675300242
2. Commodore 264 series (C16/C116/C+4): http://plus4world.powweb.com/play/cross_chase_32k_v0_9
3. Commodore Vic 20: https://nippur72.github.io/vic20-emu/?joy=1&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vic20_exp_16k.prg
4. Commodore 64: https://nippur72.github.io/c64-emu/?joy=3&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_c64.prg
5. MSX 1: https://homebrew.file-hunter.com/index.php?id=crosschase
6. Sinclair ZX Spectrum 48K: https://spectrumcomputing.co.uk/playonline.php?eml=1&downid=112056
7. Video Technology Laser 210 / VZ200 : https://nippur72.github.io/laser310-emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_vz200_18k.vz
8. Video Technology Laser 500: https://nippur72.github.io/laser500emu/?restore=false&load=http://github.com/Fabrizio-Caruso/CROSS-LIB/releases/download/XChase/Xchase_laser500.bin
================================================
FILE: docs/HARDWARE_AGNOSTIC_CODE.md
================================================
## HARDWARE-AGNOSTIC CODE
Thanks to Cross-Lib APIs, the game code can be *hardware-agnostic*.
Using only Cross-Lib APIs is not enough, though, as Cross-Lib covers targets that have different screen size, screen shape and targets that lack some hardware features such as graphics, colors, sounds.
### ANSI C (A sub-set of)
The code has to be compiled by several different compilers that do not necessarily support the latest version of the C standard.
Therefore it should be written in a sub-set of ANSI C89 that is common among all supported compilers.
This sub-set can be described as (mostly) ANSI C89 without:
- `float` types;
- `struct` copies, assignments, parameters (use pointers to `struct` instead);
- dynamically allocated memory (`malloc`, `free`).
Moreover for performance reasons it is better to avoid recursion (as this has an extreme high cost on MOS 6502 targets).
Some C99 features are available:
- Modern `//` comments are allowed.
- `stdint.h` is not available but `uint8_t` and `uint16_t` are (with no need for extra include directive).
### Screen size
Using Cross-Lib APIs is not enough as the screen size and shape may be different.
Cross-Lib exposes a constant `XSize` for the width of the screen and a constant `YSize` for the height of the screen.
Both these macros are measured in terms of numbers of *tiles* (see next section).
The game code should rely on fractions of `XSize` and of `YSize` and never use hard-coded sizes or use conditional directives to cover all sizes.
By doing so, upon compilation, the game will auto-adapt to the target's screen size.
### Tile-based Graphics
Graphics in Cross-Lib is tile-based as this is the only possible graphics that can be supported by all targets.
For targets with graphics, the shapes of tiles are only defined at compilation time and cannot be re-defined.
So, for targets with graphics, smoothly moving sprites can only be implemented as software sprites through pre-shifted tiles.
Most targets with graphics have 8x8 pixel tiles but some other targets with graphics have different shapes.
So do not implement logic that only assumes 8x8 pixel tiles (e.g. when implementing software sprites with pre-shifted tiles).
If you want to support targets with no graphics (i.e., tiles are just mapped to ASCII characters),
you either avoid code that depends on tile shapes or if you, you have to implement an alternative version for non-graphics targets.
For example for the game Cross Snake you can see how it is rendered on the MSX 1 (graphics, sounds, colors) and on the Game Boy (graphics, sounds but no colors):


For more snapshots we refer to:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/SNAPSHOTS.md
### Colors, Sounds and Graphics
Some targets have no colors or no color on text, or no sounds, or no graphics.
So do not write any logic that relies only on the presence of colors/sounds/graphics; or if you do, use conditional directives to implement an alternative logic for targets with no colors/sounds/graphics.
### Learn from the built-in games and tests
Cross-Lib comes with games and tests whose code can be used to learn how to code universal games.
The code of the games is in:
https://github.com/Fabrizio-Caruso/CROSS-LIB/tree/master/src/games
The code of the examples is in:
https://github.com/Fabrizio-Caruso/CROSS-LIB/tree/master/src/examples
================================================
FILE: docs/HOW_TO_ADD_A_NEW_GAME.md
================================================
## HOW TO ADD A NEW GAME
Adding a new game is just a matter of
- copying src/Makefile.bomber into src/Makefile.
- copying src/games/bomber into src/games/
- add an exception to src/.gitignore for src/games//generated_assets
================================================
FILE: docs/HOW_TO_ADD_NEW_TARGET.txt
================================================
HOW TO COMPILE FOR A NEW TARGET
Adding a new target computer with no sound, no joystick/gamepad inpu
and no user-defined graphics can be as simple as just recompiling
with no modification if the compiler supports conio.h.
In most cases this won't produce the best result. So some little tuning
is usually necessary.
If no conio is natively supported, some little conio wrapper and/or
re-implementation of the display APIs in display_macros.c is necessary.
Here we describe the simplest cases when conio is already available,
no sound and no user defined graphics is expected.
Usually you have to do the following steps:
1. SCREEN SIZE
By default screen size is 16x16 cells.
So, if you want your target (e.g., NEW_TARGET) to use a different cell count.
You need to compile with the -D__NEW_TARGET__ option to let the code know you
are compiling for NEW_TARGET
edit display_macros.h and add something like:
...
#elif defined(__NEW_TARGET__)
#define XSize
...
#elif defined(__NEW_TARGET__)
#define YSize
...
2. SPEED
By default no slow down is inserted in the main loop but in some cases your game
may run too fast.
So you will need to edit settings.h to add some slow-down:
...
#elif defined(__NEW_TARGET__)
#define SLOW_DOWN
#define GAME_SLOW_DOWN
...
3. SLEEP
If the compiler does not implement the sleep function, you need to either implement one
yourself or compile with -DNO_SLEEP if you want no sleep.
4. KEYBOARD INPUT
Some targets may detect key-presses as capital and others as small letters.
You can tune this in settings.h.
5. INPUT
Some targets may no implement getk to read the keyboard input.
In this case you need to provide a substitute in input_macros.h and input_macros.c
================================================
FILE: docs/HOW_TO_INSTALL_COMPILERS.txt
================================================
-------------------------------------------------------------------------------------------------------
XTC68
-------------------------------------------------------------------------------------------------------
1. You need to clone
https://github.com/stronnag/xtc68
2. So you need a 32bit development environment on a x86-64 machine.
So, you may need to run:
"sudo apt install libc6-dev-i386"
or install the corresponding Cygwin package
or just be in a 32-bit environment
3. You need to unzip
424frun1.zip
(found inside the tools/xtc68 directory and originally taken from "Runtime disk1"
in http://www.dilwyn.me.uk/c/index.html into the "support" directory which you find inside the newly cloned code.
i.e., download the disk1 http://www.dilwyn.me.uk/c/424frun1.zip from http://www.dilwyn.me.uk/c/index.html and put it inside the "support" directory
4. Run "make all"
5. Run "install.sh"
Remark:
After linking and compilation the command will give us the number of bytes used for the "dataspace".
In order to use the binary inside an emulator we need to add some meta-data and choose an emulator, e.g.,
QPC from https://www.kilgus.net/qpc/ :
- run the following commands
"
f$=“dos1_“
l=FLEN(\f$)
mem=RESPR(l)
LBYTES f$,mem
SEXEC ram1_,mem,l,= dataspace bytes>
"
- you will have the program in ram1 with the name chosen by the SEXEC command, which you run by selecting ram1 and the program.
-------------------------------------------------------------------------------------------------------
Z8K-GCC
-------------------------------------------------------------------------------------------------------
0. Under Linux 64-bit, you may need to install
libc6:i386,
libncurses5:i386,
libstdc++6:i386
zlib1g:i386
1. Use: z8kgcc-jan-19-2009-linux-fc9.tar
from:
ftp://ftp.groessler.org/pub/chris/olivetti_m20/misc/z8kgcc/z8kgcc-jan-19-2009.tar.bz2
or:
http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc-jan-19-2009-linux-fc9.tar.bz2
Main site: http://www.z80ne.com/m20/index.php.
2. Decompress it into /opt in order to have "z8k-pcos-gcc" inside /opt/z8kgcc-jan-2009/bin
3. Add "/opt/z8kgcc-jan-2009/bin" to your PATH
For example by inserting the following line in .bashrc
export PATH="/opt/z8kgcc-jan-2009/bin:$PATH"
Disk images
In order to insert the binary inside a disk image download the tool m20floppy from ftp://ftp.groessler.org/…/ol…/imgtools/m20floppy-0.61.tar.gz
Use a bootable image from https://github.com/…/m…/tools/olivetti_m20/pcos20h_empty.img
Compilation
- to produce an object file do something like : qcc -c hello.c -o hello.o
- to link and produce a binary "a_out" do something like qcc crt.o part1.o part2.o
-------------------------------------------------------------------------------------------------------
GCC for TI
-------------------------------------------------------------------------------------------------------
Compiler Installation:
git clone https://github.com/mburkley/tms9900-gcc
(IMPORTANT:As of 2024/10/18 only 1.32 branch is stable)
git checkout 1.32
sudo apt install build-essential libgmp-dev libmpfr-dev
cd tms900-gcc
./install.sh /opt/gcc4ti
--------------------------------------------------------------------------------
libTi99:
git clone https://github.com/tursilion/libti99
Modify the Makefile to make it point to /opt/gcc/bin
e.g.,
TMS9900_DIR?=/opt/gcc4ti/bin
ELF2EA5_DIR?=/opt/gcc4ti/bin
EA5_SPLIT_DIR?=/opt/gcc4ti/bin
Once the it has finished to build (even if with errors), make sure that
- the header files are in /opt/gcc4ti/include
- libti99 is in /opt/gcc4ti/lib
The lib may fail if it does not find classic 99 emulator, but it builds the libti99 file anyway.
So you have to move it manually to /opt/gcc4ti/lib and to move the .h files to /opt/gcc4ti/include.
A cleaner way would be to have the Makefile also point to classic99.
----
OLD procedure
for the Texas TI99/4a
(http://atariage.com/forums/topic/164295-gcc-for-the-ti/page-6),
1. download and decompress gcc-installer.tar.gz from http://atariage.com/forums/topic/164295-gcc-for-the-ti/page-1
2. install libgmp-dev libmpfr-dev tree
For Cygwin install:
Category "Devel"
- gcc-core
- libiconv
- make
- patchutils
Category "Libs"
- libgmp-devel
- libmpfr-devel
Category "Interpreters"
- m4
3. export set MAKEINFO=missing (to fix one error about texinfo) [maybe no longer necessary]
4. run the "install.sh " script command
5. find files inside /bin
--------------
NEW version
-------------------------------------------------------------------------------------------------------
GCC for Atari ST
-------------------------------------------------------------------------------------------------------
1. download the cross compiler from http://vincent.riviere.free.fr/soft/m68k-atari-mint/
2. follow the instructions from the installation site
3. use as GCC
4. place st52 terminfo file inside usr\share\terminfo\s in the same virtual hard disk as the .tos file(s)
================================================
FILE: docs/HOW_TO_LOAD.md
================================================
In order to run the game you will have to follow a different procedure depending on whether you want to load it into an emulated system or a real system.
### Loading the game into an emulated vintage system
In most cases loading an executable into an emulator is straightforward.
For a detailed guide on how to load the game on several emulated systems for which the procedure is not obvious, we refer to:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD_THE_GAME.md
### Loading the game into a real vintage system
This depends on the systems and the format used to store the game. For some hints on this take a look at:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/HOW_TO_LOAD_THE_GAME_ON_REAL_HARDWARE.md
================================================
FILE: docs/HOW_TO_LOAD_THE_GAME.md
================================================
## HOW TO LOAD THE GAME
This document only describes some non-obvious procedures on how to load the game
on some emulators (similar procedures can be followed on the real machines):
-----------------------------------------------------------
### AGAT 7 and 9
Use the Agat emulator 1.29 (the one not detected as a virus):
https://sourceforge.net/projects/agatemulator/
Select "(2) IKP-9"
Chose second option from below
Right click top of the window
Go to 140k drive
Select game disk image
Type:
"
CATALOG,S6
BRUN XL
"
-----------------------------------------------------------
### AGON LIGHT
Use https://github.com/astralaster/agon-light-emulator
Put the binaries inside the sdcard directory
dir to list the content of the emulated SDK
load
run
-----------------------------------------------------------
### ALPHATRONIC
Use MAME/MESS
mame64.exe alphatro -uimodekey DEL -window -cartridge1 c:\Retro\CROSS-CHASE\build\FULL_alphatro.rom
---------------------------------------------------------
### AMSTRAD CPC/GX4000
You can use Caprice, WinApe
- Tape (.cdt) version:
You need to attach the image as a tape
In BASIC type
|tape
run"
Start PLAY on the virtual tape player
- Disk (.dsk) version:
You need to attach the image as a disk
In BASIC type
run"XBIN .CPC"
- ROM (.cpr) version:
You need to attach the image as a cartridge
----------------------------------------------------------
### Amstrad NC 100
Use nc100em-1.2-2014 emulator .
Rename the binary to nc100.card and place it in the same folder as the emulator
Run the emulator.
Control-X to start the game
---------------------------------------------------------
### ATARI 5200
Use Altirra or use Atari800 emulator with the Atari 5200 bios roms and select Atari 5200 emulation.
Load as 16k one chip cartridge.
---------------------------------------------------------
### ATARI 7800
Use A7800 (http://7800.8bitdev.org/index.php/A7800_Emulator)
Select standard options.
Use it as Mame/Mess by:
TAB->load ROM->cartridge->select file
---------------------------------------------------------
### ATARI LYNX
Use Handy 0.95 emulator (https://sourceforge.net/projects/handy/?source=typ_redirect).
Place the rom into same folder as Handy emulator (https://atariage.com/Lynx/roms/LynxBoot.zip)
---------------------------------------------------------
### AQUARIUS
Unzip the .zip file.
Type CLOAD
First load the file starting with underscore
Type RUN
Type CLOAD
Then load the other file
-----------------------------------------------------------
### BBC MICRO / BBC MASTER
Use BeebEm 4.19 emulator.
File-> Load disk 0-> Select .img file
To load and run the game in dsk format you can use the following commands:
- *CAT to verify the disk content
- *RUN"XCHASE"
If you want to create a dsk image from a .inf image:
It is better to have short simple name files. For example let us assume XCHASE and XCHASE.INF
Use the binary and .inf files to
either
create a disk with tools such as bbcim or BBCExplorer-2.01
or
use BeebEm 4.16 emulator
1. to create an empty disk image (File->Disc Options->New Disc 0)
2. inject the binary into the new disk (Edit->Import files to disc->select .inf file)
-----------------------------------------------------------
### BIC / A5105
Use JKCEMU.
- (If not already selected) Einstellungen -> Select BIC
- Datei->Diskettenstation->Laufwerk 1->Open->Diskettenabbilddatei oeffnen->select file .dumb file->Nur lesen
- Datei->Schliessen
- Run file by its name (e.g., BULD/FU)
- Run DIR to see disk content/view/3/4/
-----------------------------------------------------------
### BIT90
Use Mame emulator.
Run it with something like:
mame64.exe bit90 -window -uimodekey DEL
Attach the .rom as a cartridge to load and run the game
-----------------------------------------------------------
### BONDWELL 2
Use Mame
- Start bw2
- May need to use ScrollLock (FN+`[` on some keyboards)
in order to enable TAB to enter the disk selection menu
- Select the CP/M 2.2 boot disk
- Use natural keyboard to type CTRL-C to leave the menu
- Switch to the game disk
-----------------------------------------------------------
### CAMPUTERS LYNX
Use Jinx emulator: https://jynxemulator.wordpress.com/download/
GitHub project: https://github.com/jonathan-markland/Jynx/releases
-----------------------------------------------------------
### CANON X-07
Use Takeda emulator
Insert the .CAS file with PLAY->select file
Use the CAS file with the following commands
CLOAD
RUN
-----------------------------------------------------------
### CASIO FP-1100
Use Takeda's fp1100.exe emulator.
You need to put MAME roms in the same directory as the binary.
Attach disk image
Reset
---------------------------------------------------------
### CCE MC-1000
Use the MESS emulator
e.g.
mess64.exe mc1000 -uimodekey DEL -window
mess64.exe mc1000 -uimodekey DEL -window -ramsize 48k (for the 48k expansion) )
Use File Manager to attach the WAV file
In BASIC do: TLOAD
Start the tape: Tape Control -> Tape
---------------------------------------------------------
### CBM 610
Use WinVice 3.1 and try multiple times.
Sometimes load"*",8 helps.
There must be a bug in WinVice disk drive emulation for this target.
-----------------------------------------------------------
### COLECOVISION
Use ColEm: https://fms.komkon.org/ColEm/
-----------------------------------------------------------
### COLECO ADAM
Use Mame emulator.
mame64.exe adam -window -flop1 .\disk\adam\cpm2.2_1.50.dsk -flop2 c:\Retro\CROSS-CHASE\build\FULL_coleco_adam.img
B:
Type the binary name (no extension) contained in B:
-------------------------------------------------------------
### Color Computer (CoCo)
Tape load
- Use XROAR emulator: https://www.6809.org.uk/xroar/
- Attach the .cas image
- Type
- CLOADM
Remark: You can also simply use the "run" option
Disk load
- Use XROAR emulator (Emulate CoCo DISK EXTENDED)
- Disable "keyboard translation" in the "Tool" tab
- Select a CoCO machine to emulate in the "Hardware" tab
- Attach the .dsk disk image in "File->Drive 1"
- Type:
- LOADM"XBIN
- EXEC
-------------------------------------------------------------
### Color Computer 3 (CoCo 3)
Use VCC emulator: https://github.com/VCCE/VCC/releases
Same as CoCo with XROAR but disk drives need to be enabled:
Disk load
Cartridge -> Cartridge -> Load Cart
fd502.dll (to enable disk drive emulation)
---------------------------------------------------------
### COMX
Use EMMA 02 (https://www.emma02.hobby-site.com/download.html)
Select COMX tab
Click on START (window may hide the option -> make it bigger)
Click on LOAD
Go to the directory with the .hex file
Select HEX Files
Chose the .hex file
Type RUN
[equivalent to CALL(@4401)]
----------------------------------------------------------
### CP/M (generic system) with ADM-3A control sequences
.COM binaries:
Examples of CP/M systems with ADM-3A support:
multiple Kaypro systems, Aussie Byte (Knight 2000), Decision Mate V
Use MAME emulator with correct roms and CP/M disks.
Examples:
- mame64.exe kaypro2x -flop1 ..\disk\kaypro\k10hald1.td0 -uimodekey DEL
- mame64.exe aussieby -flop1 ..\disk\aussie_byte\knight2000_boot.dsk -uimodekey DEL
WAIT for the operating system to fully load.
Use the quickload option to load the .COM file.
If you want to create a disk image you need to follow the instructions in the Z88DK wiki.
.DSK images:
Use MAME emulator with correct roms and CP/M disks
Examples:
- mame64.exe dmv -flop1 ..\disk\dmv\dm5-cpm.td0 -uimodekey DEL
- Attach image as disk B:
- Run B:
-
-----------------------------------------------------------
### CREATIVISION
Use MAME/MESS.
Mess 0.148 with crvision works fine:
mess64.exe crvision -window -uimodekey DEL -cart1 c:\Retro\CROSS-LIB\build\FULL_creativision_16k_SWAPPED.bin
mess64.exe crvision -window -uimodekey DEL -cart c:\Retro\CROSS-LIB\build\Xshoot_creativision_18k_SWAPPED.bin
-------------------------------------------------------------
### DAI
Use Mame emulator.
mame64.exe dai -window
Attach tape file
UT (to enter monitor)
R (to load)
G0800 (to start the game)
-------------------------------------------------------------
### Dragon
Tape load
- Use XROAR emulator
- Attach the .cas image
- Type
- CLOADM
Remark: You can also simply use the "run" option
Disk load
- Use XROAR emulator (Emulate DOSPLUS)
- Attach the .vdk disk image
- Type: RUN"XBIN.BIN"
-----------------------------------------------------------
### EACA 2000 - EG2K
Use the Genieous emulator: http://gaia.atilia.eu/content/view/3/4/
------------------------------------------------------------
### EMSCRIPTEN
This is a special target: its build is generated by Emscripten and it is targeting browsers.
The build for this target are .html, .js, , .wasm files.
In order to run a game built for this target you need to run an HTTP server:
- move the generated files inside the emsdk directory
- python -m SimpleHTTPServer
You can then run your program by using the following URL:
e.g., http://localhost:8000/FULL_emcc_buffered.html
For more info on Emscripten installation:
see https://emscripten.org/docs/getting_started/downloads.html
In particular:
- Make the "latest" SDK "active" for the current user. (writes .emscripten file)
./emsdk activate latest
- Activate PATH and other environment variables in the current terminal
source ./emsdk_env.sh
Note:
On Windows, run emsdk instead of ./emsdk, and emsdk_env.bat instead of source ./emsdk_env.sh.
WSL mounted on:
C:\Users\fabri\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs
------------------------------------------------------------
### ENTERPRISE
Use ep128emu (https://sourceforge.net/projects/ep128emu/files/)
Select config EP_128k_EXDOS_FileIO.cfg
Set working directory to the directory with your binary
F1 -> Select binary
----------------------------------------------------------
### EPSON PX-4 / HC-40
Use Takeda emulator for HC-40 with the right SYS.ROM file (https://fjkraan.home.xs4all.nl/comp/px4/).
Rename the binary into BASIC.ROM and replace the original BASIC.ROM that
should be (or have been) in the same directory as the HC-40 emulator executable.
----------------------------------------------------------
### EPSON PX-8 / HC-80
Use Takeda emulator for HC-80 with the right SYS.ROM file.
Rename the binary into BASIC.ROM and replace the original BASIC.ROM that
should be (or have been) in the same directory as the HC-80 emulator executable.
----------------------------------------------------------
### EPSON QC-10 / QX-10
Use Mame emulator
e.g.,
mame64.exe qx10 -window -uimodekey DEL -flop1 c:\Emulation\TEST\0.196\disk\qc10\EPSNQX10.dsk
Attach the disk image and type the binary name (run DIR to see name).
-----------------------------------------------------------
### BGR COMPUTERS EXCALIBUR 64
Use Mame emulator with the CP/M boot disk
e.g.,
mame64.exe excali64 -window -uimodekey DEL -flop1 c:\Emulation\TEST\0.196\disk\excali64\excalibur_cpm_system.raw
Attach the game image
B:
Run the binary in B: with its plain name (no extension)
-----------------------------------------------------------
### EXIDY SORCERER
Use Mess emulator.
Attach the .wav file
Type LOADG
---------------------------------------------------------
### PC-E200 / PC-G850 / PC-G815
Use the g800 emulator (https://ver0.sakura.ne.jp/pc/)
Run it from the cmd line with:
g800(.exe) -machine=e200
g800(.exe) -machine=g815
g800(.exe) -machine=g850
Once the emulated machine is started use:
MON (to enter the Assembly monitor)
G100 (to actually run the code)
---------------------------------------------------------
### Galaksija
Use the MESS emulator or
(for debugging) the online emulator https://galaksija.net/?i=2
Use File Manager to attach the WAV file
In BASIC run: OLD
Start the tape
In BASIC run: RUN
---------------------------------------------------------
### Galaksija Plus
Use GALe emualtor: https://galaksija.net/?i=1
Drop the .gtp file into the browser.
---------------------------------------------------------
### GAMATE
Use MESS/MAME (e.g., Mess 0.148).
Run mess.exe gamate
File Manager -> Select cartridge -> Choose the .bin file
---------------------------------------------------------
### GAMEGEAR
Use Mednafen.
Remark: Sound works fine here.
mednafen.exe c:\Retro\CROSS-LIB\build\Xhorde_gamegear.gg
Use Emulitious (https://emulicious.net/)
File -> Open File -> Select .gg file
or (maybe broken with no sound!)
Use Kega Fusion ((https://segaretro.org/Kega_Fusion).
File -> Open GameGear ROM -> Select .gg file
------------------------------------------------------------
### GRUNDY NEWBRAIN
Use NBemulator15.
Create a directory with _dir.txt, a.bas, a.dat
Insert this directory into the BASIC directory
Start the emulator
File -> Start Emulation
File -> Tape Management -> Select directory with the game's files
Type "LOAD"
Type "RUN"
---------------------------------------------------------
### HECTOR HR
Use DCHector or VB Hector emulator
[DCHector]
Select Hector HR(2)+.
File->Load Tape
Press 1 and wait for the game to load and run
---
[VB HECTOR]
Start the emulator
Select HR Plus
Fichier -> Ouvrir Fichier K7
Press 1 and wait for the game to load and run
Click on the emulator's window
---------------------------------------------------------
### HOMELAB 2### HECTOR HR
Use MAME emulator.
Use quickload to select the .htp file (and load it into memory)
CALL 17152
---------------------------------------------------------
### HOMELAB 3/4
Use MAME emulator.
Use quickload to select the .htp file (and load it into memory)
CALL $4300
---------------------------------------------------------
### HUEBLER/EVERT-MC
Use JKCEmu.
Einstellungen
Select HUEBLER/EVERT-MC
Uebernehmen
Schliessen
Datei -> Lauden -> Select binary
GO 0000
---------------------------------------------------------
### HUEBLER-GRAFIK-MC
Einstellungen
Select HUEBLER-GRAFIK-MC
Uebernehmen
Schliessen
Datei -> Lauden -> Select binary
GO 0000
---------------------------------------------------------
### JUPITER ACE
Use EightOne emulator.
For the FULL version game
"0 0 bload ace"
Open the FULL .wav version with
Tools->Wav Loader.
------------------------------------------------------------
### KAYPRO
Use Mame (See CP/M target)
mame64.exe kaypro2x -flop1 ..\disk\kaypro\k10hald1.td0 -uimodekey DEL
---------------------------------------------------------
### Luxor ABC 80
Use the ABC80SIM emulator (https://www.abc80.org/pub/abc80sim/, https://git.zytor.com/abc80/abc80sim.git/)
.ihx
Pass the ihx file as a parameter to the emulator
Run it directly with the command “A=CALL(49200)”
---
.bac
abc80 --casfile program.bac
run cas:
or
put the .bac file in the right directory (abcdir),
then run prb:xchase
---
.dsk
Rename the image to mo0
Put the image in abcdisk
run xchase
or
Rename the image to mo0
Put the image in
Run abc80 -Dd
run xchase
--------------------------------
Use ABC80Win.
Attach .dsk image
load"xchase"
run
---------------------------------------------------------
### Luxor ABC 800
Use the ABC80SIM emulator (https://www.abc80.org/pub/abc80sim/, https://git.zytor.com/abc80/abc80sim.git/)
.bac
abc80 --abc802 --memfile program.bac
Then "run mem:"
.dsk
Rename the image to mo0
Put the image in abcdisk
run xchase
or
Rename the image to mo0
Put the image in
Run abc80 -Dd
run xchase
Use ABC80Win
Attach .dsk image
load"xchase"
run
---------------------------------------------------------
### LVIV/LVOV
Use https://web.archive.org/web/20201215185635/https://github.com/izhaks/PK01LvovEmulator/releases/tag/v1.4
---------------------------------------------------------
### M100 / Olivetti M10 / KC85 / PC8201
.CO file can be loaded into VirtualT emulator through "File > Load file from HD" menu item.
Once the program is in memory, enter BASIC and give the following command:
CLEAR 0,49999
now the program can be loaded, either via the BASIC command RUNM "A.CO or by pressing F8 to get back to the menu and choosing it with the cursors.
---------------------------------------------------------
### Memotech MTX 500 and 512
Use Bill's MEMU (http://www.primrosebank.net/computers/mtx/emulators/Bills_MEMU_ds.htm)
memu -tape-overwrite -vid-win-big -snd-portaudio
Type:
LO.""
Then:
RUN
---
Place the .mtx binary into the directory "tapes"
Use memu-cfg.exe
F11 to enter the menu
Select MTX model if necessary (MTX500 or MTX512)
Select tape -> Choose the .mtx binary
Restart
MTX500 binary on MTX512
POKE 64122,0
NEW
LOAD""
RUN
MTX500 binary on MTX500 or MTX 512 binary n MTX512
LOAD""
RUN
Use the MESS 0.118 emulator
Rename FULL_MTX.mtx to FULL and place it in the same folder as the Mess emulator
In Basic do:
LOAD"FULL"
RUN
-----------------------------------------------------------
### MITS Altair 8800
Use http://www.classiccmp.org/altair32/
Switch it ON
Load the .bin y File -> Read Image File -> Select File -> Address: $0000
Click on STOP/RUN
-----------------------------------------------------------
### MITSUBISHI MULTI 8
Use Takeda emulator
Type "MON"
Then "R"
Select tape file with CMT -> Play -> Select file
Type "GC000"
-----------------------------------------------------------
### MICROBEE
(1) .WAV files
(1a) Use Mame/Mess_
For example with:
mbeepc85 -window -uimodekey DEL -cass c:\Retro\CROSS-LIB\build\.WAV
Type B to enter BASIC
Type LOAD
Go to Mame/Mess menu to control TAPE and select PLAY
---
(1b) Use UBEE512
Install UBEE512 (run script, copy roms into rom folder)
Select UBEE512 icon and select properties to add " ic" to the command
Run UBEE512
C:\Emulation\Computers\ubee512\ubee512.exe ic --tapei="a.wav"
Type LOAD
Right click to select TAPE to start loading the tape
Type RUN
-----------------------------------------------------------
### MICRO (MICROBOARD SYSTEM)
Use Emma 02 emulator.
Select RCA -> Microboard System
CARD2 -> 128 6x8 characters
CARD1 -> RAM U20 -> binary
START
-----------------
(2) .BEE files
Use Nanowasp emulator: http://nanowasp.org/
Click on TAPE to select the .BEE file to insert the file in the list of programs
Click on the selected file to insert in the tape player
Type LOADM
-----------------------------------------------------------
### MIKRO-80
Use E3000 emulator http://www.emulator3000.org/e3.htm
Select the binary to load and run it.
-----------------------------------------------------------
### MSX
Use BlueMSX
Attach image.
Run bload"cas:",r
Or use MAME
For example
mame.exe canonv20 -window -uimodekey DEL -cart1 c:\Retro\CROSS-LIB\build\Xhorde_msx_32k.rom -skip_gameinfo
-----------------------------------------------------------
### NICHIBUTSU MY VISION
Use Mame emulator
e.g., mame64.exe myvision -window -uimodekey DEL
Attach the .rom image file as a cartridge
-----------------------------------------------------------
### NASCOM
Use Virtual-Nascom (http://repo.or.cz/w/virtual-nascom.git)
Type virtualnascom [.nas file]
Once the monitor is running, enter “E 1000”
-----------------------------------------------------------
### NEC PC-6001
Use Virtual Nec Trek
Select 2 pages at start-up
Type "cload"
Select cassette image
Type "run"
---------------------------------------------------------
### Nintendo NES / Famicom
Use FCEUX (https://tasvideos.github.io/fceux/web/home.html)
Alternatively Use mednafen and run the following command:
mednafen.exe -fs 1 FULL_nes.nes
---------------------------------------------------------
### Ohio Scientific C1P
Start the WinOSI executable (http://osi.marks-lab.com/)
Under "Options" select "System Configuration...".
Select "OSI C1P / Superboard II (600 BOard)" as machine type.
On the "System ROMs" tab under "Specify ROM Type" select SYN600.
Press "OK"
Under "File" select "Attach Serial Input File...".
Select the file "FULL_osic1p.c1p".
In the emulator window you should see the "D/C/W/M" prompt.
Press "M" to run the monitor. You then should see the "0000 00" prompt of the machine monitor.
Press "l" (lowercase L). This will load the program and start it.
Memory configs in WinOSI
Open Osi.ini
32K -> RAMTOP=0x7FFF
8k _> RAMTOP=0x1FFF
-------------------------------------------------------------
### Olivetti M20
Use Mame
You need to attach the floppy image
mame64.exe m20 -window -flop1 c:\Retro\CROSS-CHASE\build\FULL_m20_buffered.img
At the prompt run with
aout.cmd
---------------------------------------------------------
### Sanyo PHC-25
Use https://github.com/hitchhikr/phc25
Screen -> 1 (to get more available memory)
cload
File->Read tape options->Read tape file->(select file)
run
----------------------------------------------------------
### Senio MAP-1010
You need to convert the phc file to a wav file.
In order to do this you can use castool:
castool convert phc [phc file] [wav output file]
Use TAKEDA emulator
CLOAD
CMT->Play->select file
run
----------------------------------------------------------
### MS-DOS 8086
Use DOSBOX.
Map the directory with the .COM binaries to a drive (e.g., C:)
Move to C:
Type the name of the .COM file
----------------------------------------------------------
### MS-DOS 386
Use DOSBOX.
Map the directory with the .EXE binaries to a drive (e.g., C:)
Move to C:
You need CWSDPMI
Run: CWSDPMI -p -s
Type the name of the .EXE file
------------------------------------------------------------
### TESLA ONDRA VILI
Use Mame emulator with the ondrav target
e.g., mame64.exe ondrav -window -uimodekey DEL
Press ENTER
Attach .wav image as tape
Start tape to load and autostart the game
------------------------------------------------------------
### ORIC 1 / ORIC ATMOS
Use the Oricutron emulator (https://github.com/pete-gordon/oricutron)
Attach the image.
Run CLOAD""
------------------------------------------------------------
### ORIC TELESTRAT
Use the modified version of Oricutron emulator: http://orix.oric.org/download/
Use the instructions on the link above to boot Orix operating system
Rename the binary file to a short name with no extension
Copy it into sdcard/bin
Run the binary by typing its name
------------------------------------------------------------
### OSCA
Use the OSCA emulator (http://www.basoft.co.uk/wordpress/emulation/computer-system-emulation/v6z80p/osca-emulator/)
Use WinImage to inject the .exe binary into a working .img file
Edit the config.txt to make it point to the modified .img file
Run by typing the executable name (whitout .exe)
------------------------------------------------------------
### OZ
Launch vOZ
Drag oz750.rom on the emulator's windows
choose the memory size (256K in my case)
press ENTER (CTRL key) to exit the display settings
press ENTER (CTRL key) again
(optional) Press F6 for brighter display
Drag .wzd on the emulator's windows
Choose the program 'slot' from the emulator's dialog window
Press F5 to select the custom program
-----------------------------------------------------------
### NAMCO PUCMAN (PACMAN)
Use the Mame emulator
You need the puckman.zip rom file.
You have to replace puckmod with the one generated by CrossLib Makefile.
Run Mame:
mame64.exe puckmod -window -uimodekey DEL
-----------------------------------------------------------
### PASOPIA 7
Use Takeda emulator (http://takeda-toshiya.my.coocan.jp/) with the Mame romset
Attach the disk image
Reset to start the game
-----------------------------------------------------------
### PC 8088/8086
Use qemu-system-i386 to start a bare metal PC 8088/8086 and attach the floppy image
qemu-system-i386.exe c:\Retro\CROSS-CHASE\build\FULL_pc8086_turn_based.img
---------------------------------------------------------
### PCE
Use mednafen and run the following command:
mednafen.exe -fs 1 TINY_pce.pce
---------------------------------------------------------
### Pecom 32/64
Use EMMA 02 (https://www.emma02.hobby-site.com/download.html)
Select Pecom tab
Click on START (window may hide the option -> make it bigger)
Click on LOAD
Go to the directory with the .hex file
Select HEX Files
Chose the .hex file
Type RUN [equivalent to CALL(&0201)]
---------------------------------------------------------
### Hanimex Pencil II
Use Mame emulator.
Run mame64.exe pencil2 -window -uimodekey DEL
Attach the ROM image
-----------------------------------------------------------
### NEC PC 8801
Use the M88 emulator: https://illusioncity.net/PC88/m88eng.rar
BIOS: https://archive.org/details/m-88.7z
Type:
MON
R
Select the tape file
G8A00 to start
-----------------------------------------------------------
### PETERS PLUS SPRINTER
Use SPRINT (http://web.archive.org/web/20040905083237/http://shaos.ru/nedopc/sprinter/sprint.htm)
run with something like SPRINTGW.EXE c:\Retro\CROSS-CHASE\build\FULL_pps.exe
---------------------------------------------------------
### Philips 2000
Use m2000-allegro5 emulator
Place the game file into the same directory as the m2000.exe and rename it into p2000.cas
In BASIC execute:
CLOAD
RUN
---------------------------------------------------------
### Philips VG 5000
Type CLOAD
Select the game file
----------------------------------------------------------
### PMD-85
Use Borik's PMD-85 Emulator (https://pmd85.borik.net/wiki/Emulator)
Select the .ptp image file.
Run
MGLD 00
Press the flash button.
Click on the play button.
JUMP 0000
----------------------------------------------------------
### PRIMO
Use Mame
e.g., mame64.exe primoa64 -window -uimodekey DEL
Use Quickload to load the .pp image
----------------------------------------------------------
### Robotron KC 85/2, 85/3, 85/4, 85/5, HC 900
Use the JKCEMU emulator.
Click on "Extra" tab.
Choose "Einstellungen"
Select your target (e.g., KC 85/5)
Press "Uebernehmen" and then "Schliessen"
Load file with "Datei" -> "Laden" -> Select File -> "Starten"
----------------------------------------------------------
### Robotron Z 1013
Use J1013 emulator (http://www.jens-mueller.org/j1013/download.html):
1. Press Datei->Laden
2. Select binary
3. Press Starten
---------------------------------------------------------
### Robotron Z 9001
Use the JKCEMU emulator.
Click on the "Extra" tab.
Choose "Einstellungen"
Select Z9001
Press "Uebernehmen"
Press "Schliessen"
Load file with "Datei"->"Laden"
Select file
Click "Starten"
-------------------------------------------------------------
### S-OS
Use sword05 (http://www.retropc.net/ohishi/s-os/sword05.lzh)
Place the file (a.obj) in the same directory as the emulator
(no space)La.obj
(no space)J 3000
-----------------------------------------------------------
### SAMSUNG SPC-1000
Use ESPC emulator
Type "LOAD"
CMT -> Play -> Select file
CMT -> Play button
---------------------------------------------------------
### SEGA MSTER SYSTEM
Use Kega Fusion Emulator (https://segaretro.org/Kega_Fusion)
File -> Load MasterSystem ROM -> Select .sms file
or
Use Emulitious (https://emulicious.net/)
File -> Open File -> Select .sms file
---------------------------------------------------------
### SEGA SC 3000
Use the MESS emulator
Run mess with
mess64.exe sc3000 -cart1 .sc -cass1 FULL_sc3000_32k.wav
Inside the emulator type:
LOAD
RUN
---------------------------------------------------------
### Sharp MZ
Use mz800Emu
Press C
Select .mzf file
----------------------------------------------------------
### SHARP X1
Use Takeda X1 emulator (you need the roms)
1. Start the emulator.
2. Click on FD0.
3. Select the disk image
-----------------------------------------------------------
### SHARP PC G850
Use g800win32 emulator (http://ver0.sakura.ne.jp/pc/)
g800.exe -machine=200 c:\Retro\CROSS-CHASE\build\FULL_g800_turn_based.ihx
Type "G100"
-----------------------------------------------------------
### ZX SPECTRUM NEXT
Use CSPECT emulator (http://www.cspect.org/)
Press F2
Select .nex binary to load and start it
-------------------------------------------------------------
### Sinclair QL
Use QPC https://www.kilgus.net/qpc/
Rename the binary to something short, e.g., xchase
Type the following commands to add the necessary meta-data and have the binary inside the emulated Sinclair QL
"
f$=“dos1_“
l=FLEN(\f$)
mem=RESPR(l)
LBYTES f$,mem
SEXEC ram1_,mem,l,
"
(*) dataspace has to be big enough, i.e., bigger than what the compiler shows as output.
A possible value is 4096.
Now the ram1 disk has the executable binary inside the QL. Select ram1 and then the game to start
-----------------------------------------------------------
### SONY SMC-77
Use Takeda emulator with Mame roms.
Insert the boot disk into the first floppy drive and the game disk in the second one
B:
Run the binary inside B: (no extension)
-----------------------------------------------------------
### SORD M5
Use MESS/MAME
You need the basic-i rom somewhere in your file system
You could run:
Mess 0.191
ROM:
mess64.exe m5 -window -ramsize 36k -cart1 c:\Retro\CROSS-LIB\build\Xbomber_m5_rom.rom
|Tape:
mess64.exe m5 -window -ramsize 36k -cart1 basic-i\basic-i.rom -cass c:\Retro\CROSS-LIB\build\Xbomber_m5.cas
or
mess64.exe m5 -uimodekey DEL -cart1 basic-i\basic-i.rom -ramsize 36k -window
You need to insert the tape
Type TAPE
Press ESC
---------------------------------------------------------
### SUPERVISION
Use Potator (https://emulationrealm.net/downloads/file/235-potator)
Use arrows for movements and C for fire
---------------------------------------------------------
### SONY SV 8000
Use the Mame emulator.
e.g., mame64.exe sv8000 -window -uimodekey DEL
Attach the .rom cartridge image to start the game.
---------------------------------------------------------
### DICK SMITH SUPER 80
Use the Mame emulator
e.g., mame64.exe super80 -window -uimodekey DEL
Use quickload to load and start the game
---------------------------------------------------------
### DICK SMITH SUPER 80R
Use the Mame emulator
e.g., mame64.exe super80r -window -uimodekey DEL
Ues quickload to load and start the game
-----------------------------------------------------------
### TATUNG EINSTEIN
With +cpm -subtype=einstein
a .dsk will be produced that can be used in combination with dos80.dsk.
-flop1 dos80.dsk -flop2 [created image]
Once booted, type:
1:
APP.COM
----------
USE EDIP1 1e (http://www.einstein.talktalk.net/edip.html?showpage=true)
to insert the .COM file into a disk image:
0. Rename your file such that no special characters (no underscore) are present
1. Run EDIP 1e
2. Select DOS80.DSK
3. Click on CREATE BLANK -> Name your disk image
4. Select DOS TATUNG XTAL...
5. Press SELECT -> Select File
6. Press SELECT -> Cancel -> Quit
Use MAME/MESS:
1. mame64.exe einstein -window -uimodekey DEL -flop1 c:\Emulation\Mame\EDIP1e\XCHASE.DSK
2. run the .COM file by typing its name
---------------------------------------------------------
### Telmac TMC-600
Use EMMA 02 (https://www.emma02.hobby-site.com/download.html)
Select telmac tab.
Select TMC-600
Click on START (window may hide the option -> make it bigger)
Click on LOAD
Go to the directory with the .hex file
Select HEX Files
Chose the .hex file
Type RUN [equivalent to CALL(@6300)]
-------------------------------------------------------------
### Thomson MO5/MO6/Prodest PC 128
- Tape
Use DCMOTO
Select Mo5 or Mo6 or Prodest PC 128
BASIC 1.0
Attach .k7 image
Type
LOADM
EXEC
BASIC 128 (Mo6/Prodest PC 128)
Attach .k7 imloadage
Type
LOADM"CASS:",&H600
EXEC
or
LOADM"CASS:",&H600,R
-------------------------------------------------------------
### Thomson TO7/TO8/TO9
- Disk .sap image
Use DCMOTO
Select T08D
Attach .sap image
Type
loadm "XLIB.bin"
exec
In order to load at an address lower than $A000 by bytes, you need to use CLEAR:
CLEAR ,,,&h8000
loadm "XLIB.bin",
exec
Example 1:
Cross Snake may need to be loaded at a lower start address than $A000, so you need to do:
CLEAR ,,,&h8000
loadm "XLIB.bin",-1024
Example 2:
Cross Shoot may need even more memory than Cross Snake. So you need to do:
CLEAR ,,,&H7FFF
LOADM"0:FULL_TO7.bin",-&HA000
EXEC
-----------------------------------------------------------
### TI-82
Use the VTI emulator
1. Load the Crash Shell into the calculator
- 2nd + x,T,\theta (LINK)
- Select Receive
- Drop Crash .82b
- 2ND + ON (OFF)
- ON (+ SAVE STATE to start from this point next time)
2. Load the game
- 2nd + x,T,\theta (LINK)
- Select Receive
- Drop .82p file
- 2ND + ON (OFF)
- ON (+ SAVE STATE to start from this point next time)
3. Run the game
- PRGM
- Select Crash (NOT the game)
- Select the game
-----------------------------------------------------------
### TI-83
Use the VTI emulator
1. Load the Ion Shell into the calculator
- 2nd + x,T,\theta,\pi (LINK)
- Select Receive
- Drop .83b Ion 1.5 or 1.6 file
- 2ND + ON (OFF)
- ON (+ SAVE STATE to start from this point next time)
2. Load the game
- 2nd + x,T,\theta,\pi (LINK)
- Select Receive
- Drop .83p file
- 2ND + ON (OFF)
- ON (+ SAVE STATE to start from this point next time)
3. Run the "a" application
- PRGM
- Select A
4. Run the game
- PRGM
- Select Ion (NOT the game)
- Select the game
Alternative load instructions:
- Use VTI 2.5 beta 4 or beta 5.
- Select TI83 (v1.07)
- Reset calculator (MEM CLEARED)
- 2nd, LINK, RECEIVE (do not press ENTER, yet)
- Look for ION.83G (memory dump)
- Press ENTER on ION
- Drag the file onto VTI
- Transmission error. Retry.
- PRGM -> ION (see prgmION) -> press Enter (INSTALLED)
- Compile your program with a name different from default abc80
- Transfer program as done with ION.83G
- Start the shell and program
-----------------------------------------------------------
### TI-85
Use the VTI emulator
1. Load the Rigel Shell into the calculator
- 2nd + X-Var (LINK) + F2
- Drop Rigel memory backup file
- 2ND + ON (OFF)
- ON (+ SAVE STATE to start from this point next time)
2. Load the game
- 2nd + X-Var (LINK) + F2
- Drop the .85s game binary
3. Run the game
- Custom + F1 (to select Rigel)
- Select the game
Alternative instructions:
- Install the emulator program VTI.
- Download the TI85.ROM and put it into VTI directory.
- Download and extract Rigel Shell.
- Start VTI. Select TI85.
- Click 2nd Link, then press F2 to receive.
- Right Mouse click and choose Send File to VTI. Choose the file rigel.85b from the Backups directory of the Rigel Shell.
- Quickly press F1 to confirm Warning about Memory backup, before transmission error message.
- Click 2nd OFF On, to init the Rigel Shell.
- Click 2nd Link, then press F2 to receive.
- Right Mouse click and choose Send File to VTI. Select spice.85s.
- Click 2nd OFF On, to init the Rigel Shell.
- Click Custom, then F1, and select SPICE program.
QUICK
- Load Rigel savestate
- Click 2nd OFF On
- Click 2nd Link, then press F2 to receive.
- Right Mouse click and choose Send File to VTI. Choose the .85s file
- Click 2nd OFF On, to init the Rigel Shell.
- Click Custom, then F1, and select A program.
-----------------------------------------------------------
### TI-86
Use Wabbitemu
You can load the .86p files by directly dragging them on VTI,
no need to go through the 'link" sequence, they'll be pushed in the TI86 memory.
- So, first drag InstLASM.86p,
- then enter: `asm(InstLASM)`
- press `F5` and confirm the reset process
- once you get the message "MEM CLEARED",
- drag LargeLd.86p on the calculator.
- Now you can upload *ONE SINGLE* "big" executable (built with the LASM startup option), just drag it on the calculator.
- To run: asm(LargeLd)
-----------------------------------------------------------
### TI99/4A
Use Classic99 (http://www.harmlesslion.com/cgi-bin/onesoft.cgi?1).
EA5 files are loaded as follows:
- Have one of the disks, e.g DSK1., point to the directory that contains the EA5 file: DSK1-> Set DSK1 -> Disk Type: FIAD
- Go to Cartridge->Apps->Editor/Assembler
- Press 2 to enter the Editor/Assembler
- Press 5 to run a file
- Enter DSK1.(file name)1
Example: DSK1.XCHASE1 -> loads Cross Chase
-----------------------------------------------------------
### TIKI-100
Use TIKI-100_emul (http://www.djupdal.org/tiki/emulator/)
Attach the image and type:
a
folowed by enter.
----------------------------------------------------------
### TRS-80 MC-10
Use VMC-10 emulator (https://github.com/PhoenixInteractiveNL/emuDownloadCenter/wiki/Emulator-virtualmc10#downloads)
Enable 16k (at least): Configure -> Memory -> 16k
Run:
CLOADM
Load the .c10 file: File->Play cassette file
Run:
EXEC
----------------------------------------------------------
### TRS-80 Model 1/2/4
.cas version:
If you use trs80gp-1.8
Type enter to get to the console
Use load option
If you use trs32
.cas version:
Use trs32 emulator.
Type L+enter at Cass?
Type enter at Memory?
Type System
Attach .cas
Show cassette
Type ../BUI
Press PLAY
Wait...
Press / + enter to start
.cmd version:
Get to BASIC prompt
File->Run-> Select .cmd file
----------------------------------------------------------
### VIDEOTON TVC
Use WinTVC emulator (http://gaia.atilia.eu/downloads/)
Start the emulator and wait until the BASIC prompt
Load the .cas file with "CAS direkt betoeltese"
Type "run" to start
-----------------------------------------------------------
### VECTOR 06C
Use E3000 emulator http://www.emulator3000.org/e3.htm
Select the binary to load and run it.
----------------------------------------------------------
### VTECH Laser 500
Use the online Laser500emu (https://nippur72.github.io/laser500emu/).
Drop the .bin or .wav file onto the browser window
----------------------------------------------------------
### Z80 TV GAME
Use Takeda emulator with Mame roms
Start the game: Cart -> Insert -> Select .rom image file
Input: Host -> Input -> Joystick1 -> Redefine keys
================================================
FILE: docs/HOW_TO_LOAD_THE_GAME_ON_REAL_HARDWARE.md
================================================
## Loading the game into a real vintage system
The loading procedure depends on the systems and the format used to store the game.
- Most vintage systems used cassette players. For such systems the .wav or any other reproducible format (e.g., mp3)
is the easiest solution because it can be played by a PC or smartphone connected to the audio in of the vintage system.
If a different format is produced, we suggest the use of a tool to convert into a playable.
If the emulator supports the creation of .wav files, one way to do this is to use the `save` or equivalent BASIC command.
- Several vintage systems use floppy disks.
Some hardware solutions (e.g., XUM1541 cables for the Commodore 8-bit series) can be used to transfer disk images into real disks.
Some other hardware solutions (SD2IEC for the Commodore 8-bit series, SI2SD for the Atari 8-bit series) allow the use disk images by a vintage system.
- Some other systems use cartridges. Cartridge images can be store into EPROMs or can be used directly by some special hardware (e.g., EasyFlash for the Commodore 64).
================================================
FILE: docs/INSTALL.md
================================================
## NO LOCAL INSTALLATION
Having a Dockerfile and a devcontainer configuration means that anyone with a GitHub account can just clone this repository and run it with GitHub CodeSpaces (free of charge with some restrictions): https://github.com/codespaces.
-------------------------------------------
## LOCAL DOKCER WITH A PRE-BUILD DOCKER IMAGE
You can pull and run the latest pre-build image with
```
docker run -it -v {cross-lib_location}:/usr/src/cross-lib ghcr.io/cross-lib/devcontainers/base:1.0.5-ubuntu
```
where {cross-lib_location} could be something like: *c:\sources\cross-lib*.
Once in the docker container, you can enter the *src* directory with *cd /usr/src/cross-lib/src* and
use the *xl* script, e.g., *./xl stinger cc65*.
Or just pull the pre-build image with
```
docker pull ghcr.io/cross-lib/devcontainers/base:1.0.5-ubuntu
```
An older image can be pulled here
```
docker pull fabriziocaruso:crosslib:0.1
```
and follow the same instructions as for docker image built from a dockerfile.
-------------------------------------------
## LOCAL DOCKER WITH THE DOCKERFILE
The dockerized version of Cross-Lib can used by
- cloning this repository into a directory (let us refer to it as ``);
- building the docker image that contains the dependencies by running the command
```docker build . -t crosslib:```;
from the `/CROSS-LIB/.devcontainer` directory.
- running the docker container and mapping the cloned repository into a directory (e.g. `/workspaces/crosslib`) in the container with
```docker run -it -v :/workspaces/crosslib --env-file /.devcontainer/container.env crosslib: bash```
- (once in the docker container) by entering `workspaces/crosslib/src` and running `xl` commands.
-------------------------------------------
## LOCAL NON-DOCKER INSTALLATION - PREREQUISITES
Cross-Lib is meant to be used under a POSIX environment (Windows+Cygwin, Linux, etc.).
In order to be able to build the games and tests on all `default targets` you need:
- GNU `make`
- `python` (2.x or 3.x)
- `gcc` and `ncurses` (necessary only for native builds)
- cross-compilers (necessary to build for vintage targets)
- `java` only to build disk images for the Apple//e, Apple\]\[ and the Agat 7/9 targets
- `perl` only to build cassette images for the CoCo 1/2 and Dragon 32/64 targets
For the compilers to work, you may need to add the location of their binaries to the `$PATH` environment variable and to add the execution rights to those binaries.
If the compiler's binary cannot be found, you may have to set their paths in: `src\makefiles.common\auxiliary/Makefile_compilers`, e.g., `Z88DK_PATH`, `LCC1802_PATH`, etc..
For more details on the prerequisites we refer to:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/PREREQUISITES.md
-------------------------------------------
## LOCAL NON-DOCKER INSTALLATION OF THE TOOL-CHAIN
The tool-chain Cross-Lib can be installed on different POSIX-compliant environments.
It has been tested on:
- Windows (7, 10) + `Cygwin`
- Windows Subsystem for Linux
- MacOS X
- Linux Ubuntu 18.04 under the Windows Subsystem
- Linux (KUbuntu 18.04, Lubuntu 21.10)
- FreeBSD 13.0
Cross-Lib itself does not require any installation. It is just a source library and scripts that is ready to be used as is, by just downloading or cloning the content of this repository.
For example you can do it by:
```
git clone https://github.com/Fabrizio-Caruso/CROSS-LIB.git
```
In order to use Cross-Lib you will need to install the prerequisites described in the previous section.
The way these prerequisites are installed vary depending on the environment.
### Under Windows + Cygwin
For Windows + Cygwin the tested and verified installation procedure uses:
- `Cygwin` setup to install `gcc`, `make`, `python`, `java`
- `CC65` is installed under Windows by just downloading and decompressing its snapshot (https://sourceforge.net/projects/cc65/).
- `Z88DK` is installed under Windows by downloading and decompressing its latest nightly build (http://nightly.z88dk.org/).
- `CMOC` and `ACK` are installed from sources. Look at the installation procedure under Linux for the details.
- `LCC1802` is installed under Windows by simply decompressing its released binary version (https://github.com/bill2009/lcc1802/releases).
### Under Linux
For Linux (native or under the Windows Subsystem), the tested and verified procedure both standard repositories and installation from sources.
A detailed procedure for recent Ubuntu distributions is described here:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/LINUX_SETUP.md
### ACKNOWLEDGEMENTS
Thanks to Alex Thissen, a version of Cross-Lib with (Z88DK, CC65, CMOC and native compilers) is available as a Docker image (to be built by using the provided Dockerfile) with a devcontainer configuration.
================================================
FILE: docs/LICENCE.txt
================================================
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
================================================
FILE: docs/LINUX_SETUP.md
================================================
# CROSS-LIB SET-UP UNDER LINUX
We give here the procedure to install Cross-Lib and its dependencies under Linux.
In particular this procedure is the one I have used under LUBUNTU 21.10.
On other distributions the same procedure or a similar one can be used depending on how packages are handled.
Even under Windows with Cygwin many of these steps are similar but the way packages are installed is very different (i.e., using Cygwin's `setup.exe`).
We do not cover *all* supported compilers here. We only fully covered the fully supported ones under Linux.
In particular we describe how to install:
- `GCC` for native compilation
- `CC65` for MOS 6502-based targets
- `Z88DK` for Zilog 80, Intel 8080-based targets
- `CMOC` for Motorola 6809-based targets
We give some information on how to install some experimentally supported compilers:
- `ACK` for Intel 8088-based targets and other targets (partially supported and currently only used for one game)
- `LCC1802` for RCA COSMAC 1802-based targets (with only experimental support under Linux)
-----------------------------
## Python Installation
The whole tool-chain uses heavily Python scripts. So we need Python to do anything.
Python 2.7 or Python 3.X can used.
Under any recent Ubuntu distribution, Python is trivially installed with:
```
sudo apt install python
```
-----------------------------
## Enable builds for the host
Native builds can be performed as long as an ANSI C compiler and the `ncurses` libraries are installed.
By default Cross-Lib expects `gcc` to be the native compiler.
A different one can be used (including a non-native one, which would defeat the purpose of a native compiler).
In order to select a different compiler edit the `NATIVE_CC` variable in `src/makefiles.common/auxiliary/Makefile.compilers`.
The `gcc` compiler may be pre-installed. In not present, `gcc` is trivially installed with
```
sudo apt install gcc
```
The `ncurses` libraries can be installed with:
```
sudo apt install libncurses5-dev libncursesw5-dev
```
The native target is the default target for the script command `xl build`.
This makes it possible to try and debug the code natively if desired. No emulator and no cross-compiler is necessary to start using Cross-Lib.
Currently the native target is just an ncurses-enabled terminal target. So no graphics. Only ASCII characters will be displayed.
So you can use Cross-Lib to build old and new games and to create new ones by using the `xl` command and by providing no target or equivalently the `ncurses` target.
To get started you can build some of the games by using `xl build [name of the game or test]`.
Example:
The following commands will be three games for the native target:
```
xl build bomber
xl build snake
xl build horde
```
-----------------------------
## Enable builds for MOS 6502-based targets
Nearly all MOS 6502-based targets supported by Cross-Lib rely on `CC65`. Very few others experimental targets use `VBCC`.
On very recent Ubuntu distributions we can install `CC65` by just:
```
sudo apt install cc65
```
In order to build disk images for the `Apple][` and `Apple//e` targets we need `java`, which we can install with:
```
sudo apt install openjdk-17-jre-headless
```
-----------------------------
## Enable builds for Motorola 6809-based targets
Cross-Lib relies on `CMOC` for all its supported Motorola 6809-targets.
In order to install `CMOC` you can use build from its source code and follow its simple installation procedure.
First of all you need to download `LWTOOLS` (the linker) from http://www.lwtools.ca/, and install it with
```
make
sudo make install
```
Then you download `CMOC`'s source code from http://perso.b2b2c.ca/~sarrazip/dev/cmoc.html and install it with:
```
apt install bison
apt install flex
configure
make
sudo make install
```
----------------------
## Enable builds for targets based on Zilog 80 and Intel 8080
Cross-Lib relies on the `Z88DK` dev-kit for all its targets based on the Zilog 80, Intel 8080/5, and GBZ80.
`Z88DK` contains two separate cross-compilers: `SCCZ80` and `ZSDCC`. Using `SCCZ80` is enough to build most Cross-Lib targets.
So the installation of `ZSDCC` is not strictly necessary to build new games.
Here we describe how to download and install `Z88DK` from its source code.
### Z88DK dependencies
In order to be able to compile the source you have to install the following packages by running `apt install [list of packages]`:
```
apt install
build-essential
dos2unix
libboost-all-dev
texinfo
texi2html
libxml2-dev
subversion
bison
flex
zlib1g-dev
m4
```
### Installation from source code
In order to download `Z88DK`'s source code you can run:
```
wget http://nightly.z88dk.org/z88dk-latest.tgz
```
and then decompress it with:
```
tar -xzf z88dk-latest.tgz
```
You can now start the build process by using the `build.sh` script:
```
cd z88dk
export BUILD_SDCC=1
chmod 777 build.sh
./build.sh
```
In order to finalize the installation and to be able to use Z88DK from any location you need to set the following environment variables:
```
export PATH=${PATH}:${HOME}/z88dk/bin
export ZCCCFG=${HOME}/z88dk/lib/config
```
----------------------------------------------------------
## Enable builds for RCA COSMAC 1802-based targets
The build process for RCA COSMAC 1802-based targets relies on the `LCC1802` compiler.
This has not been tested, yet, under Linux.
Its installation procedure under Linux is described in:
https://github.com/bill2009/lcc1802
----------------------------------------------------------
## Enable builds for Intel 8088-based targets
In order to use Cross-Lib for targets based on the Intel 8088 and some other 16 and 32-bit vintage targets you can use `ACK`.
Support for these targets is currently only experimental.
`ACK` can be downloaded from https://github.com/davidgiven/ack.
It depends only on `flex` and `yacc` or `bison` and it is installed with:
```
make
sudo make install
```
================================================
FILE: docs/MSDOS_big_banging.txt
================================================
Skip to content
Chat history
You said:
How can I produce sounds with the speaker by big banging in msdos 8086?
ChatGPT said:
On an 8086 under MS-DOS you can produce sound with the PC speaker in two different ways:
Correct way (using the PIT timer, channel 2) – stable tone
True “bit banging” – manually toggling the speaker line for crude square waves
Below are both methods with full explanations and sample 8086 code.
✅ 1. REAL MODE / MS-DOS PC SPEAKER USING PIT (recommended)
The PC speaker is controlled by:
Function Port
PIT channel 2 control 43h
PIT channel 2 data 42h
Speaker gate + data enable 61h
→ Steps to play a tone:
Program PIT channel 2 for square-wave mode.
Load divisor into port 42h (frequency = 1,193,180 / divisor).
Enable speaker bit 0 and 1 in port 61h.
Delay.
Turn off speaker.
Example: 1 kHz tone
; ====== Play 1 kHz tone ======
; PIT clock = 1,193,180 Hz
; divisor = 1193180 / 1000 ≈ 1193 = 04A9h
mov al, 0B6h ; Channel 2, lobyte/hibyte, mode 3 (square wave)
out 43h, al
mov ax, 1193
out 42h, al ; Low byte
mov al, ah
out 42h, al ; High byte
; Enable speaker (bits 0 and 1 of port 61h)
in al, 61h
or al, 03h
out 61h, al
; ---- Delay loop ----
mov cx, 0FFFFh
.delay:
loop .delay
; Disable speaker
in al, 61h
and al, 0FCh ; clear bits 0 and 1
out 61h, al
This produces a clean, stable square wave.
✅ 2. TRUE “BIT BANGING” (no PIT)
This is closer to the literal meaning of bit-banging: you manually drive the speaker by flipping bit 1 of port 61h at the desired rate.
The PC speaker is connected to bit 1 (value 2) of port 61h.
→ Principle
Flip bit 1 rapidly:
0 → 1 → 0 → 1 → 0 → …
The switching speed = frequency × 2.
So for a 1 kHz tone, toggle 2000 times per second.
Example: crude software-generated square wave
; ====== Bit-banged speaker tone ======
in al, 61h
or al, 01h ; enable speaker gate
out 61h, al
mov bx, 2000 ; number of toggles (duration)
bitloop:
in al, 61h
xor al, 02h ; toggle speaker data bit (bit 1)
out 61h, al
; small delay to control pitch
mov cx, 80
delay:
loop delay
dec bx
jnz bitloop
; turn off speaker
in al, 61h
and al, 0FCh
out 61h, al
This method:
gives you full control
but tone quality is rough
pitch depends on CPU speed (so unstable on fast machines or emulators)
Choosing a method
Method Pros Cons
PIT (hardware) stable, accurate, classic PC speaker tone slightly more code
Bit banging unlimited waveforms, educational, works without PIT crude, speed-dependent
If you want, I can also provide:
A macro-based sound library
C-callable 8086 routines
A bit-banged melody player
A PIT-based music routine using int 08h (timer interrupts)
ChatGPT can make mistakes. Check important info. See Cookie Preferences.
================================================
FILE: docs/PREREQUISITES.md
================================================
## Prerequisites
- [Non-UNIX only] Install a POSIX environment if necessary, e.g., Cygwin.
- Install `make` in your environment.
- Install `python` (2.x or 3.x)
- Install the required cross-compilers
- [Only for some compilers] Make sure they are either installed as described in the Makefile variables: `Z88DK_PATH`, `CC65_PATH`, `LCC1802_PATH`, etc. or set these variables accordingly.
- [Z88DK-only] Select the optimization level in Makefile by setting the variables: `SCZZ80_OPTS` (`-O3` for highest optimizations), `ZSDCC_OPTS` (`-SO3` for high optimizations; `-SO3 --max-allocs-per-node200000` for highest and extremely slow optimizations).
- [Native builds only] Install `gcc` and `ncurses`
- [Only to have disk images for the Apple //e and Apple\]\[] Install `java`
================================================
FILE: docs/PRESENTAZIONE_ITA/Documenti_on_line.txt
================================================
CROSS-LIB breve presentazione in italiano: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/presentazione.md
LISTA PARZIALE DEI SISTEMI SUPPORTATI: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md
DESCRIZIONE DEI GIOCHI (in italino): https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/GIOCHI.md
CROSS-LIB pagina principale (in inglese) : https://github.com/Fabrizio-Caruso/CROSS-LIB
CROSS-LIB presentazione lunga (in inglese) con slides: https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/CrossLib.odp
================================================
FILE: docs/PRESENTAZIONE_ITA/Giochi/EMULATORI_DA_USARE.txt
================================================
ATARI 8-bit: Altirra
Commodore 64: Vice
Commodore Vic 20 + 8k: Vice (settare memoria a +8k)
Game Boy: Visual Boy Advance Emulator
Game Gear: Emulicious (ULTIMA versione)
Sega Master System: Emulicious (ULTIMA versione)
Sinclair ZX Spectrum: Fuse
================================================
FILE: docs/SNAPSHOTS.md
================================================
## Snapshots








================================================
FILE: docs/STATUS.md
================================================
## STATUS
Last update: 2026/03/16
### 8-BIT targets
target name | long target name | working | CPU family | dev-kit | real-time input | graphics | sound | notes
--------------------|---------------------------------------------|----------|---------------|---------|-----------------|----------------|---------|-----------
*abc80* | Luxor ABC 80 | YES | Zilog 80 | Z88DK | OK | missing | missing |
*abc800* | Luxor ABC 800 | YES | Zilog 80 | Z88DK | OK? | missing | missing |
*ace* | Jupiter Ace | YES | Zilog 80 | Z88DK | OK | OK | OK |
*agat* | Agat-7/9 | YES | MOS 6502 | CC65 | OK | OK | OK |
*alphatro* | Alphatronic | YES | Zilog 80 | Z88DK | OK | N/A | missing |
*altair8800* | MITS Altair 8800 | YES | Intel 8080 | Z88DK | OK | N/A | N/A |
*apple2* | Apple II | YES | MOS 6502 | CC65 | OK | OK | OK |
*apple2_z80* | Apple II | YES | Zilog 80 | Z88DK | OK | missing | missing |
*apple2enh* | Apple //e | YES | MOS 6502 | CC65 | OK | OK | OK |
*aquarius* | Mattel Aquarius | YES | Zilog 80 | Z88DK | OK | N/A | OK |
*aquarius plus* | Aquarius Plus | YES | Zilog 80 | Z88DK | OK | OK | OK |
*atari5200* | Atari 5200 | YES | MOS 6502 | CC65 | OK | OK | OK |
*atari7800* | Atari 7800 | YES | MOS 6502 | CC65 | OK | OK | OK |
*atari* | Atari 8-bit (e.g., Atari 800) | YES | MOS 6502 | CC65 | OK | OK | OK |
*atari_lynx* | Atari Lynx | YES | MOS 6502 | CC65 | OK | OK | OK |
*attache* | Otrona Attache | YES | Zilog 80 | Z88DK | OK | OK | missing |
*aussie* | Aussie Byte (Knight 2000) | YES | Zilog 80 | Z88DK | OK | missing | OK |
*bbc* | BBC Micro | YES | MOS 6502 | VBCC | OK | OK | OK |
*bbcmaster* | BBC Master | YES | MOS 6502 | VBCC | OK | OK | OK |
*bic* | BIC/A5105 | YES | Zilog 80 | Z88DK | OK | ? | ? |
*bit90* | Bit Corporation BIT 90 | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489A
*bondwell* | Bondwell | YES? | Zilog 80 | Z88DK | OK | ? | ? |
*bondwell2* | Bondwell 2 | YES? | Zilog 80 | Z88DK | OK | OK | ? |
*c128_8502* | Commodore 128 [8502 CPU] | YES | MOS 6502 | CC65 | OK | OK | OK | GFX in VDC mode
*c128* | Commodore 128 [Z80 CPU] | YES | Zilog 80 | Z88DK | OK | OK | OK | GFX with VIC (OK) and VDC (slow)
*c16* | Commodore 264 series (16/116/+4) | YES | MOS 6502 | CC65 | OK | OK | OK |
*c64* | Commodore 64 | YES | MOS 6502 | CC65 | OK | OK | OK |
*c65* | Commodore 65 | ? | MOS 6502 | CC65 | OK? | missing | missing |
*cbm510* | Commodore CBM 510 | YES | MOS 6502 | CC65 | OK | missing | missing |
*cbm610* | Commodore CBM 610 | YES | MOS 6502 | CC65 | OK | missing | missing |
*camputers_lynx* | Camputers Lynx 48k/96k/128k | YES | Zilog 80 | Z88DK | OK | OK | missing |
*cidelsa_altair* | Cidelsa Altair arcade board | YES | RCA 1802 | LCC1802 | OK | missing | OK |
*cidelsa_destroyer* | Cidelsa Destroyer arcade board | YES | RCA 1802 | LCC1802 | OK | missing | OK |
*cidelsa_draco* | Cidelsa Draco arcade board | YES | RCA 1802 | LCC1802 | OK | missing | OK |
*coco* | Color Computer 1/2 | YES | Motorola 6809 | CMOC | OK | OK | OK |
*coco3* | Color Computer 3 | YES | Motorola 6809 | CMOC | OK | OK | OK |
*coleco* | Colecovision | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489A
*coleco_adam* | Colecovision Adam | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489A
*comx* | COMX-35 | YES | RCA 1802 | LCC1802 | OK | OK | OK |
*corvette* | Corvette | YES? | Zilog 80 | Z88DK | OK? | OK? | missing |
*cpc* | Amstrad CPC | YES | Zilog 80 | Z88DK | OK | OK | OK |
*cpm_8080* | CP/M Intel 8080 | YES | Intel 8080 | Z88DK | OK | N/A | N/A |
*cpm_z80* | CP/M Z80 with adm3a/vt52/vt100 | YES | Zilog 80 | Z88DK | OK | N/A | N/A |
*creativision* | VTech Creativision | YES | MOS 6502 | CC65 | OK | OK | OK |
*cx16* | Commander X16 | YES | MOS 6502 | CC65 | OK | OK | OK |
*dai* | DAI | YES | Intel 8080 | Z88DK | missing | N/A ? | N/A ? |
*dmv* | Decision Mate V | YES | Zilog 80 | Z88DK | OK | ? | ? |
*dragon* | Dragon 32/64 | YES | Motorola 6809 | CMOC | OK | OK | OK |
*e200* | Sharp PC-E200 | YES | Zilog 80 | Z88DK | OK | missing | missing |
*eg2k* | EACA EG2000 Color Genie | YES | Zilog 80 | Z88DK | OK | OK | OK ? |
*einstein* | Tatung Einstein TC-01 | YES | Zilog 80 | Z88DK | OK | OK ? | OK ? | PSG AY-3-8910
*einstein256* | Tatung Einstein TC-01 | YES | Zilog 80 | Z88DK | OK | OK ? | OK ? | PSG AY-3-8910
*enterprise* | Enterprise 64/128 | YES | Zilog 80 | Z88DK | missing | missing | missing |
*excalibur64* | Excalibur64 | YES | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*fp1100* | Casio FP-1100 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*g815* | Sharp PC-G815 | YES | Zilog 80 | Z88DK | OK | missing | missing |
*g850* | Sharp PC-G850 | YES | Zilog 80 | Z88DK | OK | missing | missing |
*gal* | Galaksija | YES | Zilog 80 | Z88DK | OK | N/A | N/A |
*gal_plus* | Galaksija Plus | YES | Zilog 80 | Z88DK | OK | OK ? | N/A |
*gamate* | Gamate | YES | MOS 6502 | CC65 | OK | OK | OK |
*gamegear* | Game Gear | YES | Zilog 80 | Z88DK | OK | OK | OK ? | PSG SN76489 Mednafen OK
*gb* | Game Boy | YES | GBZ80 | Z88DK | OK | OK | OK | grey levels
*gemini* | Gemini | YES? | Zilog 80 | Z88DK | OK | ? | ? |
*gl4000* | VTech Genius Leader 4000 | YES | Zilog 80 | Z88DK | missing | missing | missing |
*gl6000sl* | VTech Genius Leader 6000sl | YES | Zilog 80 | Z88DK | OK | OK | missing |
*gx4000* | Amstrad GX-4000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*hbios* | HBIOS generic target | ? | Zilog 80 | Z88DK | missing | missing | missing |
*hector1* | Hector 1 | YES | Zilog 80 | Z88DK | OK? | missing | missing | extremely low memory
*hectorhr* | Hector HR2+ / Hector HRX | YES | Zilog 80 | Z88DK | OK | OK | missing |
*hemc* | Huebler/Evert-MC | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*hgmc* | Huebler-Grafik-MC | YES | Zilog 80 | Z88DK | OK | missing | N/A ? |
*homelab* | Homelab 4 | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*homelab2* | Homelab 2 | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*kaypro83* | Kaypro 83 | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*kaypro* | Kaypro 2X | YES | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*interact* | Interact | YES | Intel 8080 | Z88DK | OK? | missing | missing | extremely low memory
*kc* | Robotron KC-85/2/3/4 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*kc85* | Kyocera 85 | YES | Intel 8085 | Z88DK | OK | missing | missing |
*kramermc* | Kramer-MC | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*krokha* | Krokha | YES? | Zilog 80 | Z88DK | OK | ? | ? |
*lambda* | Lambda 8300 | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*laser500* | Laser 500 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*lm80c* | LM80C | YES | Zilog 80 | Z88DK | OK? | OK | missing |
*m10* | Olivetti M10 | YES | Intel 8085 | Z88DK | OK | missing | missing |
*m100* | TRS-80 M100 | YES | Intel 8085 | Z88DK | OK | missing | missing |
*m5* | Sord M5 | YES | Zilog 80 | Z88DK | OK | OK | OK ? |
*map1010* | Seiko MAP-1010 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*mbc200* | Sanyo MBC 200 | YES? | Zilog 80 | Z88DK | OK | missing | missing |
*mc10* | TRS-80 MC-10 / Alice Matra 4k | YES | Motorola 6803 | CC6303 | OK | missing | OK |
*mc1000* | CCE MC-1000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*mega65* | Mega 65 / Commodore 65 | YES | MOS 6502 | CC65 | OK | missing | OK |
*micro8085* | Micro 8085 | YES? | Intel 8085 | Z88DK | N/A? | N/A? | N/A? |
*microboard* | Microboard Computer Development System | YES | RCA 1802 | LCC1802 | OK | OK | OK |
*microbee* | Microobee | YES | Zilog 80 | Z88DK | OK | OK | OK |
*microbee_premium* | Microobee Premium | YES | Zilog 80 | Z88DK | OK | OK | OK |
*mikro80* | Mikro 80 | YES | Intel 8080 | Z88DK | OK | N/A | N/A |
*mo5* | Thomson Mo series / Olivetti Prodest PC 128 | YES | Motorola 6809 | CMOC | OK | OK | OK |
*msx* | MSX 1 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*msx 2* | MSX 2/2+/Turbo | YES | Zilog 80 | Z88DK | OK | OK | OK |
*mtx* | Memotech MTX 512 | YES | Zilog 80 | Z88DK | OK | OK | OK ? |
*mtx500* | Memotech MTX 500 | YES | Zilog 80 | Z88DK | OK | OK | OK ? |
*multi8* | Mitsubishi Multi 8 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*myvision* | Nichibutsu My Vision | YES | Zilog 80 | Z88DK | OK | OK | OK |
*mz* | Sharp MZ 80/700 | YES | Zilog 80 | Z88DK | OK | N/A | OK |
*mz2500* | Sharp MZ 2500 | YES | Zilog 80 | Z88DK | OK | missing | missing |
*nabu* | Nabu PC | YES? | Zilog 80 | Z88DK | OK? | OK? | missing |
*nascom* | Nascom | YES | Zilog 80 | Z88DK | OK | N/A | missing |
*nc100* | Amstrad NC-100/150 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*nc200* | Amstrad NC-200 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*nes* | Nintendo Enterteinment System | YES | MOS 6502 | CC65 | OK | OK | missing |
*newbrain* | Grundy Newbrain | YES | Zilog 80 | Z88DK | missing | missing | missing |
*ondra* | Tesla Ondra Vili | YES | Zilog 80 | Z88DK | OK | OK ? | missing |
*oric* | Tangerine Oric 1/Atmos | YES | MOS 6502 | CC65 | OK | OK | OK |
*osborne1* | Osborne 1 | YES | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*osca* | OSCA v6z80p | YES | Zilog 80 | Z88DK | OK | missing | missing |
*osic1p* | Ohio Scientific Challenger 1P | YES | MOS 6502 | CC65 | OK | N/A ? | N/A ? |
*oz* | Sharp OZ-700 | YES | Zilog 80 | Z88DK | N/A ? | N/A ? | N/A ? |
*p2000* | Philips P2000 | YES | Zilog 80 | Z88DK | OK | N/A | OK |
*pacman* | Pacman Namco arcade board | NO | Zilog 80 | Z88DK | missing | missing | missing |
*pasaopia7* | Toshiba Pasopia 7 | YES | Zilog 80 | Z88DK | OK | missing | missing | PSG SN76489
*pc6001* | NEC PC 6001 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*pc8201* | NEC PC 8201 | YES | Intel 8085 | Z88DK | OK | missing | missing |
*pc88* | NEC PC 8801 | YES | Zilog 80 | Z88DK | OK | OK ? | missing |
*pce* | PCEngine | YES | MOS 6502 | CC65 | OK | OK | OK |
*pcw* | Amstrad PCW | ? | Zilog 80 | Z88DK | ? | missing | missing |
*pecom* | Pecom 32/64 | YES | RCA 1802 | LCC1802 | OK | OK | OK |
*pencil2* | Hanimex Pencil II | YES | Zilog 80 | Z88DK | OK | OK ? | missing | PSG SN76489
*pet* | Commodore Pet | YES | MOS 6502 | CC65 | OK | N/A | OK |
*phc25* | Sanyo PHC-25 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*lviv* | PK-01 LVIV/LVOV | YES | Intel 8080 | Z88DK | OK | OK | missing |
*pmd85* | PMD85 | YES | Intel 8080 | Z88DK | OK | OK ? | missing |
*pps* | Peters Plus Sprinter | YES | Zilog 80 | Z88DK | OK | N/A ? | missing |
*primo* | Microkey Primo | YES | Zilog 80 | Z88DK | OK | OK ? | OK ? |
*pv1000* | Casio PV1000 | YES | Zilog 80 | Z88DK | OK | OK | missing |
*pv2000* | Casio PV2000 | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489
*px4* | Epson PX-4/HC-40 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*px8* | Epson PX-8/HC-80 | YES | Zilog 80 | Z88DK | OK | OK | N/A ? |
*qc10* | Epson QX-10/QC-10 | YES | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*radio86* | Radio 86 | YES? | Zilog 80 | Z88DK | OK | OK? | missing |
*rex* | Xircom Rex 6000 | ? | Zilog 80 | Z88DK | missing | missing | missing |
*rc2014* | RC 2014 board | ? | Zilog 80 | Z88DK | missing | missing | missing |
*rc700* | Regnecentralen RC700 | YES | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*rcmx00* | Rabbit Control Module | ? | Zilog 80 | Z88DK | missing | missing | missing |
*rx78* | Bandai RX-78 | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489
*samcoupe* | Sam Coupe | YES | Zilog 80 | Z88DK | OK | OK | OK |
*sc3000* | Sega SC 3000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*scz180* | SC126 and SC130 boards | ? | Zilog 80 | Z88DK | missing | missing | missing |
*sg1000* | Sega SG 1000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*smc777* | Sony SMC-70 / SMC-777 | YES | Zilog 80 | Z88DK | OK | OK | missing | PSG SN76489
*sms* | Sega Master System | YES | Zilog 80 | Z88DK | OK | OK | OK? | PSG SN76489 Mednafen OK
*sol20* | Sol 20 | YES? | Intel 8085 | Z88DK | OK? | missing | missing |
*sos* | S-OS | YES | Zilog 80 | Z88DK | N/A | N/A | N/A |
*spc1000* | Samsung SPC 1000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*special* | Specialist | NO | Zilog 80 | Z88DK | OK | N/A ? | N/A ? |
*zx* | Sinclair Spectrum 16k/48k | YES | Zilog 80 | Z88DK | OK | OK | OK |
*zx* | Sinclair Spectrum 128k | YES | Zilog 80 | Z88DK | OK | OK | OK | PSG sounds could be improved
*srr* | Exidy Sorcerer | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*super80* | Dick Smith Super 80/80d/80e/80m | YES | Zilog 80 | Z88DK | OK | N/A | OK |
*super80r* | Dick Smith Super 80r/80v | YES | Zilog 80 | Z88DK | OK | OK ? | OK |
*supervision* | Watara Supervision | YES | MOS 6502 | CC65 | OK | OK | OK |
*sv8000* | Bandai Supervision 8000 | YES | Zilog 80 | Z88DK | OK | missing | OK ? | 4k rom limit
*svi* | Spectravideo 318/328 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*t200* | TRS-80 T200 | YES | Intel 8085 | Z88DK | OK | missing | missing |
*telestrat* | Oric Telestrat | YES | MOS 6502 | CC65 | missing | missing | missing |
*tmc600* | Telmac TMC-600 | YES | RCA 1802 | LCC1802 | OK | N/A | OK |
*ti82* | Texas Instruments TI 82 | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*ti83* | Texas Instruments TI 83 | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*ti8x* | Texas Instruments TI 83 Plus | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*ti85* | Texas Instruments TI 85 | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*ti86* | Texas Instruments TI 86 | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*tiki100* | TIKI 100 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*tim 011* | Tim 011 | YES? | Zilog 180 | Z88DK | OK? | OK? | missing |
*to7* | Thomson To series | YES | Motorola 6809 | CMOC | OK | OK | OK |
*trs80* | TRS-80 Model I/III/IV | YES | Zilog 80 | Z88DK | OK | N/A | OK |
*ts2068* | Timex TS 2068 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*tvc* | Videoton TV Computer | YES | Zilog 80 | Z88DK | missing | missing | missing |
*vector06c* | Вектор-06Ц Vector06c | YES | Zilog 80 | Z88DK | OK | missing | missing |
*vg5k* | VG-5000 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*v1050* | V1050 | YES? | Zilog 80 | Z88DK | OK? | OK | missing |
*vic20* | Commodore Vic 20 | YES | MOS 6502 | CC65 | OK | OK | OK |
*vz* | VTech VZ200 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*x1* | Sharp X1 | YES | Zilog 80 | Z88DK | OK | OK ? | OK | mode 0 has udg
*x07* | Canon X-07 | YES | Zilog 80 | Z88DK | OK | ? | ? |
*x820* | Xerox 820 | YES? | Zilog 80 | Z88DK | OK | OK ? | OK |
*yaz180* | YAZ 180 board | ? | Zilog 80 | Z88DK | missing | missing | missing |
*z1013* | Robotron Z1013 | YES | Zilog 80 | Z88DK | OK | N/A | N/A ? |
*z80tvgame* | Z80 TV Game | YES | Zilog 80 | Z88DK | OK | OK ? | missing |
*z88* | Cambridge Z88 | YES | Zilog 80 | Z88DK | OK | OK | OK |
*z9001* | Robotron Z9001, KC 85/1, KC 87 | YES | Zilog 80 | Z88DK | OK | OK ? | missing |
*zx80* | Sinclair ZX80 | YES | Zilog 80 | Z88DK | OK ? | missing | N/A |
*zx81* | Sinclair ZX81 | YES | Zilog 80 | Z88DK | OK | OK | N/A |
*zxn* | ZX Spectrum Next | YES | Zilog 80 | Z88DK | OK | OK | OK |
TOTAL : 192
OK : 183 (170 with real-time input)
KO : 2
UNKNOWN : 7
-----------------------------------------------
#### Statistics on 8-bit targets
Dev-kit | no. 8-bit targets
--------|--------------------
Z88DK | 152
CC65 | 25
LCC1802 | 7
CMOC | 5
VBCC | 2
CC6303 | 1
-----------------------------------------------
CPU family | no. 8-bit targets |
--------------|--------------------|
Zilog 80 | 136 |
MOS 6502 | 27 |
RCA 1802 | 7 |
Intel 8085 | 7 |
Intel 8080 | 8 |
Motorola 6809 | 5 |
GBZ80 | 1 |
Motorola 6803 | 1 |
-----------------------------------------------------------------------------------------
### 16-BIT targets
target name | long target name | working | CPU family | dev-kit | real-time input | graphics | sound | notes
--------------------|---------------------------------------------|----------|---------------|---------|-----------------|----------------|---------|-----------
*amiga* | Commodore Amiga | YES | 68000 | GCC mod | missing | missing | missing |
*atari_st* | Atari ST | YES | 68000 | GCC mod | missing | missing | missing |
*olivetti_m20* | Olivetti M20 | YES | Zilog 8001 | Z8K-GCC | missing | missing | missing |
*pc86* | PC 8088/86 | YES | Intel 8086 | ACK | OK | OK | OK? |
*msdos86* | MS-DOS 8086 | YES | Intel 8086 | ACK | OK | OK | OK |
*pdp11v7* | PDP 11 V7 | ? | PDP 11 | ACK | missing | missing | missing |
*sinclair_ql* | Sinclair QL | YES | 68000 | XTC68 | missing | missing | missing |
*ti99* | Texas Instruments TI99/4A | YES | TMS 9900 | GCC mod | OK | OK | OK |
*minix68k* | Minix 68K | ? | 68000 | ACK | missing | missing | missing |
OK : 7 (3 with real-time input)
UNKNOWN : 2
-----------------------------------------------------------------------------------------
### 32-BIT targets (excluding modern PCs)
target name | long target name | working | CPU family | dev-kit | real-time input | graphics | sound | notes
--------------------|---------------------------------------------|----------|---------------|-----------|-----------------|----------------|---------|-----------
*linux386* | ELF linux for Intel 386 | YES | Intel 386 | ACK | missing | missing | missing |
*linux68k* | ELF linux for Motorola 68020 | YES | Motorola 68020| ACK | missing | missing | missing |
*linuxppc* | ELF linux for PPC | YES | PPC | ACK | missing | missing | missing |
*linuxmips* | ELF linux for little endian MIPS32r2 | ? | MIPS32r2 | ACK | missing | missing | missing |
*msdos386* | MS-DOS 386 DPMI | NO | Intel 386 | ACK | missing | missing | missing |
*osx386* | OSX X Mach0 for i386 | ? | Intel 386 | ACK | missing | missing | missing |
*osxppc* | OSX X Mach0 for PPC | ? | PPC | ACK | missing | missing | missing |
*rpi* | RPI GPU | ? | RPI GPU | ACK | missing | missing | missing |
OK : 3
KO : 4
UNKNOWN : 1
-----------------------------------------------------------------------------------------
### 32-BIT and 64-BIT targets on modern PC systems
target name | long target name | working | CPU family | dev-kit | real-time input | graphics | sound | notes
--------------------|---------------------------------------------|----------|---------------|-----------|-----------------|----------------|---------|-----------
*gcc* | Native Console version | YES | host CPU | native | OK | OK | OK |
*emcc* | Emscripten | YES | Web Assembly | emscripten| missing | missing | input |
OK : 2 (1 wiith real-time input)
-----------------------------------------------------------------------------------------
### GLOBAL STATISTICS
TOTAL : 211
OK : 194 (179 with real-time input)
KO : 4
UNKNOWN : 13
================================================
FILE: docs/SUPPORT_FOR_NEW_TARGET.txt
================================================
Example to add support to PV1000
Concerned files:
modified: ../.gitignore
modified: assets/templates/8x8/z88dk_pv1000.asm.template
modified: cross_lib/cross_lib.h
modified: cross_lib/display/color_definitions.h
modified: cross_lib/display/display_target_color.h
modified: cross_lib/display/graphics_settings.h
modified: cross_lib/display/tiles.h
modified: games/chase/config/project_config.mk
modified: games/shoot/makefiles/Makefile.override
modified: games/verbix/config/project_config.mk
modified: makefiles.common/targets/z88dk/Makefile_pv1000
Untracked files:
(use "git add ..." to include in what will be committed)
cross_lib/display/graphics_mode/pv1000_graphics.h
cross_lib/display/tiles/pv1000_settings.h
1. New graphics mode:
cross_lib/display/graphics_settings.h
cross_lib/display/graphics_mode/pv1000_graphics.h
2. Tile mapping:
cross_lib/display/tiles.h
cross_lib/display/tiles/pv1000_settings.h
================================================
FILE: docs/SYSTEMS.md
================================================
## SUPPORTED SYSTEMS
(as of 2020/09/30)
In principle you can compile the game with minimal input and output for any recent or old/ancient architecture for which there is an ANSI C capable compiler.
For most vintage systems, you can build a version of the game with some graphics, sounds and real time input.
### 8-BIT targets
For most systems, more than one version is built, in order to support different hardware configurations and expansions
(e.g., memory expansions, second CPU, 80-col display card, etc.).
- `abc80`: Luxor ABC 80
- `abc800`: Luxor ABC 800
- `ace`: Jupiter Ace
- `alphatro`: Alphatronic
- `altair8800`: MITS Altair 8800
- `apple2`: Apple //
- `apple2enh`: Enhanced Apple //e
- `aquarius`: Mattel Aquarius
- `atari5200`: Atari 5200
- `atari`: Atari 400/800/600XL/800XL/1200XL/65XE/130XE
- `atari_jaguar`: Atari Jaguar
- `atari_lynx`: Atari Lynx
- `attache`: Otrona Attache
- `aussie`: Aussie Byte
- `bbc`: BBC Micro
- `bbcmaster`: BBC Master
- `bic`: BIC/A5105
- `bit90`: Bit Corporation BIT 90
- `c128_8502`: Commodore 128 [8502 CPU]
- `c128_z80`: Commodore 128 [Z80 CPU]
- `c16`: Commodore 264 series (16/116/+4)
- `c64`: Commodore 64
- `c7420`: Philips VideoPac C7420 module (z88dk lib incomplete, work in progress)
- `cbm510`: Commodore CBM 510
- `cbm610`: Commodore CBM 610
- `camputers_lynx`: Camputers Lynx 48k/96k/128k
- `cidelsa_altair`: Cidelsa Altair arcade board
- `cidelsa_destroyer`: Cidelsa Destroyer arcade board
- `cidelsa_draco`: Cidelsa Draco arcade board
- `coco`: Color Computer
- `coleco`: Colecovision
- `coleco_adam`: Colecovision Adam
- `comx`: COMX-35
- `cpc`: Amstrad CPC
- `cpm_8080`: CP/M Intel 8080
- `cpm_z80`: CP/M Z80 with adm3a/vt52/vt100 terminals
- `creativision`: VTech Creativision
- `dai`: DAI
- `dmv`: Decision Mate V
- `dragon`: Dragon 32/64
- `eg2k`: EACA EG2000 Color Genie
- `einstein`: Tatung Einstein
- `enterprise`: Enterprise 64/128
- `excalibur64`: Excalibur64
- `fp1100`: Casio FP-1100
- `g800`: Sharp PC-G800
- `gal`: Galaksija
- `gal_plus`: Galaksija Plus
- `gamate`: Gamate
- `gb`: Game Boy
- `gx4000`: Amstrad GX-4000
- `hemc`: Huebler/Evert-MC
- `hgmc`: Huebler-Grafik-MC
- `homelab`: Homelab 4
- `homelab2`: Homelab 2
- `kaypro`: Kaypro 2X
- `kramermc`: Kramer-MCs
- `kc`: Robotron KC-85/2/3/4
- `lambda`: Lambda 8300
- `laser500`: Laser 500
- `m100`: TRS-80 M100 (z88dk lib incomplete, work in progress)
- `m5`: Sord M5
- `mega65`: Mega 65 / Commodore 65
- `mc1000`: CCE MC-1000
- `microboard`: Microboard Computer Development Board
- `microbee`: Microobee
- `mikro80`: Mikro 80
- `mo5`: Thomson Mo5 / Thomson Mo6 / Olivetti Prodest PC 128
- `msx`: MSX
- `mtx`: Memotech MTX 512
- `mtx500`: Memotech MTX 500
- `multi8`: Mitsubishi Multi 8
- `myvision`: Nichibutsu My Vision
- `mz`: Sharp MZ 80/700
- `mz2500`: Sharp MZ 2500
- `nascom`: Nascom
- `nc100`: Amstrad NC-100/150
- `nc200`: Amstrad NC-200
- `nes`: Nintendo Enterteinment System
- `newbrain`: Grundy Newbrain
- `ondra`: Tesla Ondra Vili
- `oric`: Tangerine Oric 1/Atmos
- `osborne1`: Osborne 1
- `osca`: OSCA v6z80p
- `osic1p`: Ohio Scientific Challenger 1P
- `oz`: Sharp OZ-700
- `p2000`: Philips P2000
- `pacman`: Pacman (work in progress)
- `pasaopia7`: Toshiba Pasopia 7
- `pc6001`: NEC PC 6001
- `pc88`: NEC PC 8801
- `pce`: PCEngine
- `pecom`: Pecom 32/64
- `pencil2`: Hanimex Pencil II
- `pet`: Commodore Pet
- `pmd85`: PMD85
- `pps`: Peters Plus Sprinter
- `primo`: Primo
- `pv1000`: Casio PV1000
- `pv2000`: Casio PV2000
- `px4`: Epson PX-4/HC-40
- `px8`: Epson PX-8/HC-80
- `qc10`: Epson QC-10/QX-10
- `rex`: Xircom Rex 6000 (no available emulator, work in progress)
- `rc700`: Regnecentralen RC700
- `rx78`: Bandai RX-78
- `samcoupe`: Sam Coupe
- `sc3000`: Sega SC 3000
- `sg1000`: Sega SG 1000
- `smc777`: Sony SMC-70 / SMC-777
- `sms`: Sega Master System
- `sos`: S-OS
- `spc1000`: Samsung SPC 1000
- `special`: Specialist
- `spectrum`: Sinclair Spectrum 16k/48k/128k
- `srr`: Exidy Sorcerer
- `super80`: Super 80/80d/80e/80m
- `super80r`: Super 80r/Super80v
- `supervision`: Watara Supervision
- `sv8000`: Bandai Supervision 8000
- `svi`: Spectravideo 318/328
- `telestrat`: Oric Telestrat
- `tmc600`: Telmac TMC-600
- `ti82`: Texas TI 82
- `ti83`: Texas TI 83
- `ti8x`: Texas TI 83 Plus
- `ti85`: Texas TI 85
- `ti86`: Texas TI 86
- `tiki100`: TIKI 100
- `to7`: Thomson To7 / To7/70 / To8 / To8d / To8+ / To9 / To9+
- `trs80`: TRS-80 Model I/III/IV
- `ts2068`: Timex TS 2068
- `tvc`: Videoton TV Computer
- `vector06c`: Вектор-06Ц - Vector06c
- `vg5k`: VG-5000
- `vic20`: Commodore Vic 20
- `vz200`: VTech VZ200
- `x07`: Casio X-07 (z88dk lib incomplete, work in progress)
- `x1`: Sharp X1
- `z1013`: Robotron Z1013
- `z80tvgame`: ZX80 TV Game
- `z88`: Cambridge Z88
- `z9001`: Robotron Z9001, Robotron KC 85/1, Robotron KC 87
- `zx80`: Sinclair ZX80
- `zx81`: Sinclair ZX81
- `zxn` : ZX Spectrum Next
### 16-BIT targets
- `amiga`: Amiga
- `atari_st`: Atari ST
- `cx16`: Commander X16 (work in progress)
- `olivetti_m20`: Olivetti M20
- `pc8086`: Intel 8088/8086 PC
- `pdp`: PDP 11 v7 (work in progress)
- `sinclair_ql`: Sinclair QL
- `ti99`: Texas Instruments TI99/4A
### 32-BIT targets
- `linux386`: ELF linux for Intel 386
- `linux68k`: ELF linux for Motorola 68020
- `linuxppc`: ELF linux for PPC
- `linuxmips`: ELF linux for little endian MIPS32r2 (work in progress)
### Modern 32/64-BIT PC targets
There are a plain stdlib (turn based) and an ncurses (action) version that can be compiled for multiple platforms for which an ANSI C compiler and ncurses are available, including Windows and Linux.
For example:
- Cygwin/Windows or Linux (gcc + ncurses, e.g., cygwin/Windows or Linux)
- Windows 32/64 bit console (mingw-gcc + ncurses, e.g., x86_64-w64-mingw32-gcc)
================================================
FILE: docs/TESTS.md
================================================
## COMPILATION TESTS
We can test the compilation of the game for multiple targets by running some tests that build a very simple version of the game that may not be playable.
The purpose of these tests is to test the compilation.
### SIMPLE GCC-ONLY TESTS
If you have installed `GCC`, you can run `make simple_test` (short compilation time), which builds the game by only using `GCC` for the host system.
This test will produce a binary that can be run on the host console.
### TESTS ON SEVERAL COMPILERS AND TARGETS
You can run many tests that use several cross-compilers and dev-kits not including Z88DK by running `make no_z88dk_test`.
You can run many tests that use several cross-compilers and dev-kits including Z88DK by running `make test` (long compilation time).
### MORE Z88DK-ONLY TESTS
If you have installed `Z88DK` you can test lots of Z80 systems and targets by
- `make sccz80_test` to test the compilation of different targets with `SCCZ80`;
- `make zsdcc_test` to test the compilation of different targets with `ZSDCC`
- `make z88dk_test` to cover both cross-compilers.
================================================
FILE: docs/THE_GAME.txt
================================================
THE GAME
by Fabrizio Caruso
- Game idea
The idea behind the game was my own and it was not inspired by any other game.
However, I later discovered that GNOME Robots is in some respects similar in its basic concept.
The key differences are that:
1. the main version of Cross Chase is an action game, whereas Robots is only a turn-based game
2. Cross Chase has other enemy types (skull, missiles, rockets) that require the use of the gun.
3. Cross Chase has other game elements such as different types of walls and items
- Game goals
The game goal is to kill two different types of enemies:
1. the "ghosts" (shown as faces or "O" in no graphics versions), which die if they end up on a mine (or if shot by a bullet)
2. the "skull" (shown as a skull or "+" in no graphics versions), which only dies if hit multiple times by bullets
Optionally the player can destroy (horizontal and possibly chasing) missiles and (vertical) rockets by shooting at their bases.
All enemies and walls are deadly for the player.
- Levels
There are 20 levels. The game has an end. Levels vary in terms of walls, missiles, rockets, items, speed, enemy's chasing strategy, etc.
Normal levels are completed only by killing all the ghosts.
Boss levels (every fifth level) are completed only by killing the skull.
- Items
Any item shown on the screen has a positive effect for the player. There are 10 items.
Special and secret items require the player to perform some actions on the same level and/or previous levels.
HINT: Use the gun to hit or even kill the skull and/or destroy missile and rocket bases to unlock more items in current and next levels.
================================================
FILE: docs/TILES.txt
================================================
TILES
In the code we use the name tiles for different things:
- tile absolute index [used to display] "_TILE_{index}", i.e., and index in memory that points to the tile data
- tile relative index [used to redefine] "_TILE_{index}_OFFSET", i.e. a relative index in memory (e.g., Atari 8-bit mode 1 characters are repeated 4 times)
- tile data (in template files) "", i.e., this is the data that defines the shape of tiles
- tile data in C code (in header files) "_TILE_{tile #}_UDG" contains ""
----------------------------------------------------------------------------------------------
TILE | TILE | CAN HAVE | EXAMPLE CHARACTER
INDEX | # | INTRINSIC COLOR (*) | IN CROSS CHASE AND CROSS SHOOT
----------------------------------------------------------------------------------------------
0 | 0 | CYAN | PLAYER DOWN
----------------------------------------------------------------------------------------------
1 | 1 | CYAN | PLAYER UP
----------------------------------------------------------------------------------------------
2 | 2 | CYAN | PLAYER RIGHT
----------------------------------------------------------------------------------------------
3 | 3 | CYAN | PLAYER LEFT
----------------------------------------------------------------------------------------------
4 | 4 | WHITE | GHOST
----------------------------------------------------------------------------------------------
5 | 5 | RED | MINE
----------------------------------------------------------------------------------------------
6 | 6 | RED | DEAD GHOST/BOSS
----------------------------------------------------------------------------------------------
7 | 7 | YELLOW | SKULL
----------------------------------------------------------------------------------------------
8 | 8 | GREEN | CALM-DOWN
----------------------------------------------------------------------------------------------
9 | 9 | CYAN/PURPLE/YELLOW | GUN/FIRE POWER
----------------------------------------------------------------------------------------------
10 | 10 | YELLOW | INVINCIBILITY
----------------------------------------------------------------------------------------------
11 | 11 | WHITE | BULLET
----------------------------------------------------------------------------------------------
12 | 12 | YELLOW | VERTICAL BRICK
----------------------------------------------------------------------------------------------
13 | 13 | YELLOW | HORIZONTAL BRICK
----------------------------------------------------------------------------------------------
14 | 14 | WHITE | LEFT HORIZONTAL MISSILE
----------------------------------------------------------------------------------------------
15 | 15 | WHITE | RIGHT HORIZONTAL MISSILE
----------------------------------------------------------------------------------------------
16 | 16 | WHITE | ROCKET
----------------------------------------------------------------------------------------------
17 | 17 | CYAN | FREEZE
----------------------------------------------------------------------------------------------
18 | 18 | RED | SUPER
----------------------------------------------------------------------------------------------
19 | 13 | CYAN |
----------------------------------------------------------------------------------------------
20 | 14 | CYAN |
----------------------------------------------------------------------------------------------
21 | 15 | CYAN |
----------------------------------------------------------------------------------------------
22 | 16 | CYAN |
----------------------------------------------------------------------------------------------
23 | 17 | CYAN |
----------------------------------------------------------------------------------------------
24 | 18 | YELLOW |
----------------------------------------------------------------------------------------------
0_B | 0 | WHITE | EXTRA LIFE (PLAYER_DOWN)
----------------------------------------------------------------------------------------------
4_B | 4 | YELLOW | SUICIDE (GHOST)
----------------------------------------------------------------------------------------------
5_B | 5 | YELLOW | BROKEN BRICK (BOMB)
----------------------------------------------------------------------------------------------
7_B | 7 | RED | CONFUSE (SKULL)
----------------------------------------------------------------------------------------------
DOLLAR |DOLLAR| YELLOW | DOLLAR SYMBOL [FIXED SHAPE]
----------------------------------------------------------------------------------------------
(*) Some systems have tiles/characters with pre-assigned colors. The intrinsic color is the pre-assigned color to a tile (on most systems).
================================================
FILE: docs/TODO.txt
================================================
TODO
1. Improve documentation on how to add new targets
2. Factorize cmoc/stdlib includes in all concerned files
3. Fix implicit declaraton of kbhit and getch
4. _XL_NO_LOWER_BORDER fix/implementation
5. Retest BEE input
6. Check Unix compilation (A7800 assets?)
7. Compiler options should be settable per game
Targets to improve/fix
Z80:
- Casio FP 1100 (random zombie characters/missed display)
- Bandai Supervision 8000 (REMARK: ONLY 4k roms in real hardware)
- TVC Videoton (not cursor position)
- M100 (only single pixel graphics)
- MZ 2500
- Cambridge Z88
- Sharp OZ
- Coleco Adam
- Super 80
- ABC 800
6809:
- Vectrex
8501:
- Minitel [SDCC]
6502:
- Oric Telestrat
- Acorn BBC Micro / Atom
- Atari 2600
65C816
- Super NES [GBDK: http://gbdk.sourceforge.net/]
68000:
- Amiga
8. Add more CP/M targets with just different disk image formats:
SUBTYPE actrix -Cz+cpmdisk -Cz-f -Czactrix -Cz--container=imd -D__ACTRIX__
SUBTYPE actrixss -Cz+cpmdisk -Cz-f -Czactrixss -Cz--container=imd -D__ACTRIX__
SUBTYPE adam -Cz+cpmdisk -Cz-f -Czcol1 -Cz--container=raw -D__COLECOADAM__ -D__COLECO__ -ladam -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -pragma-define:__HAVE_TMS99X8=1
SUBTYPE alphatro -Cz+cpmdisk -Cz-f -Czalphatro -Cz--container=imd -lalphatro_cpm -D__ALPHATRO__
SUBTYPE altos5 -Cz+cpmdisk -Cz-f -Czaltos5 -Cz--container=imd -D__ALTOS__
SUBTYPE altos580 -Cz+cpmdisk -Cz-f -Czaltos580 -Cz--container=imd -D__ALTOS__
SUBTYPE ampro -Cz+cpmdisk -Cz-f -Czampro -Cz--container=imd -D__AMPRO__
SUBTYPE amust -Cz+cpmdisk -Cz-f -Czamust -Cz--container=imd -D__AMUST__
SUBTYPE amustold -Cz+cpmdisk -Cz-f -Czamustold -Cz--container=imd -D__AMUST__
SUBTYPE apple2 -Cz+cpmdisk -Cz-f -Czapple2 -Cz--container=raw -Cz--extension=.dsk -lapple2 -D__APPLE__
SUBTYPE aussie -Cz+cpmdisk -Cz-f -Czaussie -Cz--container=imd -laussie -D__AUSSIE__
SUBTYPE archive -Cz+cpmdisk -Cz-f -Czarchive -Cz--container=imd -D__ARCHIVE__
SUBTYPE attache -Cz+cpmdisk -Cz-f -Czattache -lattache -D__ATTACHE__
SUBTYPE beehive -Cz+cpmdisk -Cz-f -Czbeehive -Cz--container=imd -D__BEEHIVE__
SUBTYPE bbc -Cz+cpmdisk -Cz-f -Czbbc -Cz--container=raw -Cz--extension=.ssd -D__BBC__
SUBTYPE bic -Cz+cpmdisk -Cz-f -Czbic -Cz--container=ana -lbic -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -D__BIC__
SUBTYPE bigboard -Cz+cpmdisk -Cz-f -Czbigboard -Cz--container=imd -Cz--container=imd -D__X820__ -lx820ii -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:TAR__clib_gfx_fatpix=1
SUBTYPE bondwell -Cz+cpmdisk -Cz-f -Czbw12 -lbondwell -D__BONDWELL__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25
SUBTYPE bondwell2 -Cz+cpmdisk -Cz-f -Czbw2 -lbondwell2 -D__BONDWELL2__ -pragma-define:CRT_ORG_GRAPHICS=47000 -pragma-define:REGISTER_SP=47000 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25 -clib=ixiy
SUBTYPE compactor -Cz+cpmdisk -Cz-f -Czcompactor -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE corvette -Cz+cpmdisk -Cz-f -Czcorvette -Cz--container=raw -D__CORVETTE__ -Cz--extension=.kdi -pragma-define:CLIB_FPUTC_CLS_CODE=0x1f -clib=8080
SUBTYPE corvboot -Cz+cpmdisk -Cz-f -Czcorvboot -Cz--container=raw -D__CORVETTE__ -Cz--extension=.kdi -pragma-define:CLIB_FPUTC_CLS_CODE=0x1f -clib=8080
SUBTYPE cpc -Cz+cpmdisk -Cz-f -Czcpcsystem -Cz--force-com-ext -lcpccpm -D__CPC__
SUBTYPE cpcvortex -Cz+cpmdisk -Cz-f -Czcpcvortex -Cz--force-com-ext -lcpccpm -D__CPC__
SUBTYPE dmvss -Cz+cpmdisk -Cz-f -Czdmvss -Cz--container=imd -D__DMV__
SUBTYPE dmv -Cz+cpmdisk -Cz-f -Czdmv -Cz--container=imd -D__DMV__
SUBTYPE eagle2 -Cz+cpmdisk -Cz-f -Czeagle2 -Cz--container=imd -D__EAGLE2__
SUBTYPE einstein -Cz+cpmdisk -Cz-f -Czeinstein -leinstein -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__EINSTEIN__ -pragma-define:__HAVE_TMS99X8=1 -pragma-define:CLIB_FPUTC_CLS_CODE=0x0c
SUBTYPE einstein256 -Cz+cpmdisk -Cz-f -Czeinstein -leinstein -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__EINSTEIN__ -D__EINSTEIN256__ -pragma-define:__HAVE_TMS99X8=1 -pragma-define:CLIB_FPUTC_CLS_CODE=0x0c -leinstein256
SUBTYPE excali64 -Cz+cpmdisk -Cz-f -Czexcali64 -Cz--container=raw -D__EXCALI64__ -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -lexcali64_cpm
SUBTYPE fmgcpm -Cz+cpmdisk -Cz-f -Czfmgcpm -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__
SUBTYPE fp1100 -Cz+cpmdisk -Cz-f -Czfp1100 -Cz--container=d88 -D__FP1100__ -lfp1100_cpm -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=40
SUBTYPE g2skk -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g2skkb -Cz+cpmdisk -Cz-f -Czg2skkb -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g2sgs -Cz+cpmdisk -Cz-f -Czg2sgs -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3lowe22a -Cz+cpmdisk -Cz-f -Czg3lowe22a -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3lowe22b -Cz+cpmdisk -Cz-f -Czg3lowe22b -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3holte22 -Cz+cpmdisk -Cz-f -Czg3holte22 -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3holte30 -Cz+cpmdisk -Cz-f -Czg3holte30 -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3kk -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE g3skk -Cz+cpmdisk -Cz-f -Czg2skk -Cz--container=dmk -ltrs80_cpm -D__TRS80__
SUBTYPE gemini -Cz+cpmdisk -Cz-f -Czgemini -Cz--container=imd -lgemini -D__GEMINI__
SUBTYPE gnat10 -Cz+cpmdisk -Cz-f -Czgnat10 -Cz--container=d88 -D__GNAT__
SUBTYPE holmes -Cz+cpmdisk -Cz-f -Czholmes -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE hp125 -Cz+cpmdisk -Cz-f -Czhp125 -Cz--container=imd -D__HP125__
SUBTYPE hz89 -Cz+cpmdisk -Cz-f -Czhz89 -Cz--container=imd -lgfxh19 -D__ZENITH__
SUBTYPE hz100 -Cz+cpmdisk -Cz-f -Czhz100 -Cz--container=imd -lgfxh19 -D__ZENITH__
SUBTYPE itt3030 -Cz+cpmdisk -Cz-f -Czitt3030 -D__ITT__
SUBTYPE kaypro83 -Cz+cpmdisk -Cz-f -Czkayproii -D__KAYPROII__ -D__KAYPRO83__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -pragma-define:CRT_ORG_GRAPHICS=47000 -lgfxkp83 -pragma-export:GRAPHICS_CHAR_SET=31 -pragma-export:GRAPHICS_CHAR_UNSET=32
SUBTYPE kaypro84 -Cz+cpmdisk -Cz-f -Czkayproii -D__KAYPRO84__ -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25 -lgfxkp
SUBTYPE lifeboat -Cz+cpmdisk -Cz-f -Czlifeboat -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__
SUBTYPE lynx -Cz+cpmdisk -Cz-f -Czlynx -Cz--container=raw -Cz--extension=.ldf -D__LYNX__
SUBTYPE lnw80 -Cz+cpmdisk -Cz-f -Czlnw80 -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE max80 -Cz+cpmdisk -Cz-f -Czmax80cpm3 -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE magnolia -Cz+cpmdisk -Cz-f -Czmagnolia -Cz--container=imd -lgfxh19 -D__ZENITH__
SUBTYPE mikko320 -Cz+cpmdisk -Cz-f -Czmikko-320 -Cz--container=dsk -D__MIKKO__ -clib=8085
SUBTYPE mbc1100 -Cz+cpmdisk -Cz-f -Czmbc1000 -Cz--container=imd -D__SANYO__ -D__MB1100__
SUBTYPE mbc1160 -Cz+cpmdisk -Cz-f -Czmbc1200 -Cz--container=imd -D__SANYO__ -D__MBC1160__
SUBTYPE mbc200 -Cz+cpmdisk -Cz-f -Czmbc1200 -Cz--container=imd -lmbc200 -D__SANYO__ -D__MBC200__ -pragma-define:CONSOLE_ROWS=33 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:ansirows=33
SUBTYPE md2 -Cz+cpmdisk -Cz-f -Czmorrow2 -Cz--container=imd -D__MORROW__
SUBTYPE md3 -Cz+cpmdisk -Cz-f -Czmorrow3 -Cz--container=imd -D__MORROW__
SUBTYPE mbc2000 -Cz+cpmdisk -Cz-f -Czmbc2000 -Cz--container=imd -D__SANYO__ -D__MBC2000__ -clib=8080
SUBTYPE merchant -Cz+cpmdisk -Cz-f -Czmerchant -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE microbee40 -Cz+cpmdisk -Cz-f -Czmicrobee-ds40 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lmicrobee -D__BEE__ -Ca-D__BEE__
SUBTYPE microbee -Cz+cpmdisk -Cz-f -Czmicrobee-ds80 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lmicrobee -D__BEE__ -Ca-D__BEE__
SUBTYPE micromate -Cz+cpmdisk -Cz-f -Czmicromate -Cz--container=imd -D__MICROMATE__
SUBTYPE montezuma -Cz+cpmdisk -Cz-f -Czmontezuma -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE m4cpm3 -Cz+cpmdisk -Cz-f -Czm4cpm3 -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE msx -Cz+fat -Cz-f -Czmsxdos -Cz--container -Czdsk -D__MSX__ -pragma-define:__HAVE_TMS99X8=1 -lcpm_msx
SUBTYPE mz80 -Cz+cpmdisk -Cz-f -Czmz80 -Cz--container=dsk -DSHARPMZ -D__SHARPMZ__
SUBTYPE mz800 -Cz+cpmdisk -Cz-f -Czmz800 -Cz--container=dsk -DSHARPMZ -D__SHARPMZ__
SUBTYPE mz2000 -Cz+cpmdisk -Cz-f -Czmz2000 -DSHARPMZ -D__SHARPMZ__
SUBTYPE mz2500 -Cz+cpmdisk -Cz-f -Czmz2500cpm -D__MZ2500__
SUBTYPE mz3500 -Cz+cpmdisk -Cz-f -Czmz3500 -Cz--container=raw -D__MZ3500__
SUBTYPE nabu -Cz+cpmdisk -Cz-f -Cznabupc -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1
SUBTYPE nabu-nshd8 -Cz+cpmdisk -Cz-f -Cznshd8 -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1
SUBTYPE naburn -Cz+cpmdisk -Cz-f -Cznaburn -Cz--container=raw -lnabu_cpm -pragma-define:CONSOLE_COLUMNS=32 -pragma-define:CONSOLE_ROWS=24 -D__NABUPC__ -Ca-D__NABUPC__ -pragma-define:__HAVE_TMS99X8=1
SUBTYPE nanos -Cz+cpmdisk -Cz-f -Czcaos -Cz--container=ana -D__NANOS__ -lnanos
SUBTYPE nascom -Cz+cpmdisk -Cz-f -Cznascomcpm -Cz--container=raw -lnascomcpm -pragma-export:CONSOLE_DISPLAY=0xf800 -pragma-define:CONSOLE_ROWS=16 -pragma-define:ansirows=16 -D__NASCOM__
SUBTYPE omikron -Cz+cpmdisk -Cz-f -Czomikron -Cz--container=imd -ltrs80_cpm -D__TRS80__
SUBTYPE osborne1 -Cz+cpmdisk -Cz-f -Czosborne1 -lgfxosborne1 -Cz--container=imd -D__OSBORNE1__
SUBTYPE osborne1sd -Cz+cpmdisk -Cz-f -Czosborne1sd -lgfxosborne1 -Cz--container=imd -D__OSBORNE1__
SUBTYPE partner -Cz+cpmdisk -Cz-f -Czidpfdd -Cz--container=raw -D__PARTNER__
SUBTYPE pasopia -Cz+cpmdisk -Cz-f -Czpasopia -Cz--container=d88 -D__PASOPIA__
SUBTYPE pc6001 -Cz+cpmdisk -Cz-f -Czpc6001 -Cz--container=d88 -D__PC6001__
SUBTYPE pc8001 -Cz+cpmdisk -Cz-f -Czpc8001 -Cz--container=d88 -D__PC88__
SUBTYPE pc88 -Cz+cpmdisk -Cz-f -Czpc88 -Cz--container=d88 -D__PC88__
SUBTYPE pcw40 -Cz+cpmdisk -Cz-f -Czpcw40 -lpcw -pragma-define:CRT_ORG_GRAPHICS=61000 -pragma-define:REGISTER_SP=61000 -pragma-export:CLIB_PCW_FARHEAP_BANK_START=0x90 -pragma-export:CLIB_PCW_DEFAULT_BANK=0x86
SUBTYPE pcw80 -Cz+cpmdisk -Cz-f -Czpcw80 -lpcw -pragma-define:CRT_ORG_GRAPHICS=61000 -pragma-define:REGISTER_SP=61000 -pragma-export:CLIB_PCW_FARHEAP_BANK_START=0x90 -pragma-export:CLIB_PCW_DEFAULT_BANK=0x86
SUBTYPE ptcpm -Cz+cpmdisk -Cz-f -Czptcpm -Cz--container=imd -ltrs80_cpm -lgfxtrs80m2 -D__TRS80__ -D__TRS80II__
SUBTYPE px -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -D__PX8__
SUBTYPE pxansi -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansicolumns=60 -pragma-define:ansipixels=480 -pragma-define:ansirows=10 -pragma-redirect:ansifont=_font_8x6_px -pragma-define:ansifont_is_packed=0 -D__PX8__
SUBTYPE px4 -Cz+px -lpx4 -Cz--32k -D__PX4__
SUBTYPE px4ansi -Cz+px -lpx4 -Cz--32k -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansipixels=240 -pragma-define:ansirows=8 -pragma-define:ansicolumns=30 -D__PX4__
SUBTYPE px8 -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -D__PX8__
SUBTYPE px8ansi -Cz+px -lpx8 -Ca-IDESTDIR/lib/target/px8/def -pragma-need=ansiterminal -D__CONIO_VT100 -pragma-define:ansicolumns=60 -pragma-define:ansipixels=480 -pragma-define:ansirows=10 -pragma-redirect:ansifont=_font_8x6_px -pragma-define:ansifont_is_packed=0 -D__PX8__
SUBTYPE qc10 -Cz+cpmdisk -Cz-f -Czqc10 -D__QC10__ -D__QX10__
SUBTYPE qc10m1 -Cz+cpmdisk -Cz-f -Czqc10m1 -D__QC10__ -D__QX10__
SUBTYPE rc700 -Cz+cpmdisk -Cz-f -Czrc700 -Cz--container=imd -D__RC700__ -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80 -lrc700 -pragma-export:GRAPHICS_CHAR_SET=127 -pragma-export:GRAPHICS_CHAR_UNSET=32
SUBTYPE rainbow -Cz+cpmdisk -Cz-f -Czrainbow -Cz--container=imd -D__RAINBOW__
SUBTYPE sagafox -Cz+cpmdisk -Cz-f -Czsagafox -Cz--container=imd
SUBTYPE sam -Cz+cpmdisk -Cz-f -Czpcw80 -Cz--container=raw -Cz--extension=.dsk -lsam_cpm -startup=3
SUBTYPE seequa -Cz+cpmdisk -Cz-f -Czseequa -Cz--container=imd
SUBTYPE smc777 -Cz+cpmdisk -Cz-f -Czsmc777 -D__SMC777__ -lsmc777_cpm -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=25
SUBTYPE svi -Cz+cpmdisk -Cz-f -Czsvi-40ss -D__SVI__ -pragma-define:__HAVE_TMS99X8=1
SUBTYPE teletek -Cz+cpmdisk -Cz-f -Czteletekds -Cz--container=imd -D__TELETEK__
SUBTYPE televideo -Cz+cpmdisk -Cz-f -Cztelevideo -Cz--container=imd -D__TELEVIDEO__
SUBTYPE tiki100 -Cz+cpmdisk -Cz-f -Cztiki100ss -D__TIKI100__ -ltiki100 -pragma-define:CRT_ORG_GRAPHICS=48000 -pragma-define:REGISTER_SP=48000 -pragma-define:CONSOLE_ROWS=32 -pragma-define:CONSOLE_COLUMNS=128
SUBTYPE tiki100_400k -Cz+cpmdisk -Cz-f -Cztiki100ds -D__TIKI100__ -ltiki100 -pragma-define:CRT_ORG_GRAPHICS=48000 -pragma-define:REGISTER_SP=48000 -pragma-define:CONSOLE_ROWS=32 -pragma-define:CONSOLE_COLUMNS=128
SUBTYPE tim011 -Cz+cpmdisk -Cz-f -Cztim011 -D__TIM011__ -Cz--container=raw -ltim011 -clib=z180
SUBTYPE v1050 -Cz+cpmdisk -Cz-f -Czv1050 -Cz--container=imd -D__V1050__ -lv1050 -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80
SUBTYPE cortex -Cz+cpmdisk -Cz-f -Czcortex -Cz--container=imd -D__V1050__ -lv1050 -pragma-define:CONSOLE_ROWS=25 -pragma-define:CONSOLE_COLUMNS=80
SUBTYPE vector06c -Cz+cpmdisk -Cz-f -Czvector06c -Cz--container=raw -D__VECTOR06C__ -clib=8080
SUBTYPE vt180 -Cz+cpmdisk -Cz-f -Czvt180 -Cz--container=imd -D__VT180__
SUBTYPE x1 -Cz+cpmdisk -Cz-f -Czsharpx1 -Cz--container=d88 -D__SHARPX1__ -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -lx1_cpm -pragma-define:CLIB_DEFAULT_SCREEN_MODE=1
SUBTYPE x820 -Cz+cpmdisk -Cz-f -Czx820 -Cz--container=imd -D__X820__ -lx820ii -pragma-define:CONSOLE_ROWS=24 -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CRT_ORG_GRAPHICS=50000 -pragma-define:TAR__clib_gfx_fatpix=1
SUBTYPE z80pack -Cz+cpmdisk -Cz-f -Czz80pack -Cz--container=raw -Cz--extension=.dsk
SUBTYPE z80retro -lz80retro_cpm -pragma-define:CONSOLE_COLUMNS=40 -pragma-define:CONSOLE_ROWS=24 -D__Z80RETRO__ -pragma-define:__HAVE_TMS99X8=1
SUBTYPE zxplus3 -Cz+cpmdisk -Cz-f -Czplus3 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3
SUBTYPE diskface -Cz+cpmdisk -Cz-f -Czdiskface -Cz--container=raw -Cz--extension=.raw -D__ZXPLUS3__ -lzxcpm -startup=4
SUBTYPE zxlec -Cz+zx -Cz--lec-cpm -D__ZXPLUS3__ -lzxcpm -startup=5
SUBTYPE lec80t -Cz+cpmdisk -Cz-f -Czlec80t -Cz--container=imd -D__ZXPLUS3__ -lzxcpm -startup=5
SUBTYPE scorpion -Cz+cpmdisk -Cz-f -Czscorpion -Cz--container=raw -Cz--extension=.trd -D__ZXPLUS3__ -lzxcpm -startup=3
SUBTYPE atmturbo -Cz+cpmdisk -Cz-f -Czatmturbo -Cz--container=raw -Cz--extension=.trd -D__ZXPLUS3__ -lzxcpm -startup=3
SUBTYPE quorum -Cz+cpmdisk -Cz-f -Czquorum -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3
SUBTYPE hc91 -Cz+cpmdisk -Cz-f -Czhc91 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3
SUBTYPE hc2000 -Cz+cpmdisk -Cz-f -Czhc2000 -Cz--container=dsk -D__ZXPLUS3__ -lzxcpm -startup=3
================================================
FILE: docs/VGA_from_protected_mode.txt
================================================
vga_mode13.s (ACK / Minix-386 assembly)
.globl set_mode13h
.globl set_textmode
.globl init_vga_memory
.globl A000
.data
! -------------------------------------------------------
! DPMI Real-Mode Register Structure (44 bytes)
! Layout (ACK labels below). This block is zeroed before use.
! -------------------------------------------------------
RMRegs:
RM_Edi: .long 0 ! offset 0
RM_Esi: .long 0 ! offset 4
RM_Ebp: .long 0 ! offset 8
RM_Res: .long 0 ! offset 12 (reserved)
RM_Ebx: .long 0 ! offset 16
RM_Edx: .long 0 ! offset 20
RM_Ecx: .long 0 ! offset 24
RM_Eax: .long 0 ! offset 28
RM_Flags: .word 0 ! offset 32
RM_ES: .word 0 ! offset 34
RM_DS: .word 0 ! offset 36
RM_FS: .word 0 ! offset 38
RM_GS: .word 0 ! offset 40
RM_IP: .word 0 ! offset 42
RM_CS: .word 0 ! offset 44 (note: some hosts expect 44+; we keep labels for compatibility)
RM_SP: .word 0
RM_SS: .word 0
RMRegs_end:
! -------------------------------------------------------
! Storage for protected-mode pointer/selector for A0000h
! The C side expects 'unsigned char *A000' symbol.
! -------------------------------------------------------
A000: .long 0
.text
! =======================================================
! void set_mode13h(void)
! - zero RM register block
! - set EAX = 0x0013 (BIOS: AH=0 AL=13h)
! - call DPMI: AX=0x0300, BL=0x10 (simulate int 10h)
! =======================================================
set_mode13h:
! Clear RM register structure bytewise
leal RMRegs, %edi
movl $0, %eax
movl $((RMRegs_end - RMRegs)), %ecx
1:
movb %al, (%edi)
incl %edi
loop 1b
! Set EAX = 0x00000013 for BIOS int 10h (set video mode)
movl $0x00000013, RM_Eax
! Prepare DPMI simulate real-mode int:
! AX = 0x0300, BL = int number (0x10)
movw $0x0300, %ax
movb $0x10, %bl
movb $0x00, %bh
! ES:DI -> pointer to RMRegs (DPMI expects a far pointer here)
leal RMRegs, %edi
int $0x31
ret
! =======================================================
! void set_textmode(void)
! - same as above but AX = 0x0003 (text mode 03h)
! =======================================================
set_textmode:
! Clear RM register structure
leal RMRegs, %edi
movl $0, %eax
movl $((RMRegs_end - RMRegs)), %ecx
2:
movb %al, (%edi)
incl %edi
loop 2b
! AX = 0x0003 (text mode)
movl $0x00000003, RM_Eax
movw $0x0300, %ax
movb $0x10, %bl
movb $0x00, %bh
leal RMRegs, %edi
int $0x31
ret
! =======================================================
! void init_vga_memory(void)
! - map physical A0000h (0xA0000) into protected-mode pointer
! - uses DPMI function 0x0800 (service varies by host),
! many hosts return selector:offset in EAX/Ebx — this is
! somewhat host-dependent; the simple approach below
! uses INT 31h with AX=0x0800 (allocate/ map) which on
! many DPMI hosts returns linear pointer in EAX.
! - After call we store EAX into A000 (caller reads it as pointer)
! =======================================================
init_vga_memory:
! physical base = 0x000A0000
movl $0x000A0000, %ebx
! size = 0x10000 (64K)
movl $0x00010000, %ecx
! access flags: 1 = read/write (host-specific)
movl $0x00000001, %edx
! DPMI function to map physical memory -> AX = 0x0800
movw $0x0800, %ax
int $0x31
! store returned pointer/selector (EAX) into A000
movl %eax, A000
ret
vga.h (C header)
/* vga.h */
#ifndef VGA_H
#define VGA_H
/* switch to VGA 320x200x256 */
void set_mode13h(void);
/* restore text mode 80x25 */
void set_textmode(void);
/* map VGA memory A0000 -> returns pointer in global A000 (extern) */
void init_vga_memory(void);
/* extern pointer to VGA linear memory (set by init_vga_memory) */
extern unsigned char *A000;
#endif
================================================
FILE: docs/VZ.txt
================================================
VZ keyboard echo fix
*((byte *)0x7839) |= 1; (that is, set bit 0 to "1")
================================================
FILE: docs/XL.md
================================================
## BUILDING PROJECTS
We recommend to use `xl` (equivalent to `xl build`) to build projects.
### Using `xl`
I recommend that you use `xl build`:
`xl [game_or_test_name] [optional system_name] [optional number of threads]`
A convenient shortcut is using just `xl` as follows:
`xl [project_name] [optional system_name] [optional number of threads]`
The `[optional system_name]` parameter is the name of the target. If no target is specified then the native target (the host terminal) is implied.
The `[optional number of threads]` is used to specify the number of threads to use for multiple targets that can be built in parallel.
Examples:
- `xl snake` -> It builds Cross Snake for the native console by using `gcc` and `ncurses`.
- `xl bomber atari` -> It builds Cross Bomber for the Atari 8-bit target (by using the appropriate cross-compiler, i.e., CC65)
- `xl snake vic20` -> It builds Cross Snake for the Commodore Vic 20.
- `xl games msx` -> It builds all game projects for the MSX target (by using the appropriate cross-compiler, i.e., the ones in Z88DK).
- `xl bomber cc65` -> It builds Cross Bomber for all targets that use CC65.
- `xl examples c64` -> It builds all examples for the Commodore 64 target
Remark: All binaries will be in the `build` directory (same depth level as `src`).
-------------------------------------------
## CREATING A NEW GAME PROJECT
In order to create a new game project we can use the `xl create` scripts that will create the necessary initial source code files, graphic assets and Makefile inside a folder in the `games` folder.
The script is used as follows:
`xl create [game project name] [initial code type]`
where `[initial code type]` can be
- `helloworld` or empty for initial code that only displays 'hello world'
- `game` for an initial code for a standard game with a main loop and a level loop
- `demo` for an initial code that uses most APIs.
Examples:
- `xl create foo` -> It creates a new game project `foo` with a trivial code that initializes sound, input and graphics and just displays `hello world` on the screen.
- `xl create bar game` -> It creates a new game project `bar` with code that initializes sound, input and graphics and contains the main loops that may be used in a standard game.
- `xl create foobar demo` -> It creates a new game project `foobar` with code that initializes sound, input and graphics and contains code that shows how to use most APIs.
-------------------------------------------
## CLEANING TEMPORARY FILES AND BINARIES
If you want to remove built binaries and temporary files that are produced during a build you can use 'xl clean'.
`xl clean`
--------------------------------------------
## DELETING PROJECTS
Non-built-in game projects can be deleted trhough the `xl delete` script in a very simple way:
`xl delete [game project name]`
Example:
`xl delete foo` -> It removes the `foo` source code, assets and Makefile files
================================================
FILE: docs/alt_conio_fonts.s
================================================
; The internal font structure for Atari7800 needs a full set of 128
; characters. Each character is 16 x 8 bits.
; The font consists of 8 rows of data:
; row7
; row6
; row5
; row4
; row3
; row2
; row1
; row0
; Each row is 256 bytes long
; As we have 2 bits per pixel we need 2 bytes to represent
; one character. So we can fit 128 characters in this font
; When you later use the font you must address the characters as
; 0, 2, 4, 6, ... 254
; Odd indices cannot be used.
.export _conio_font
.rodata
.align 256
_conio_font:
.byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $0, $0, $0, $0, $1, $40, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $82, $82
.byte $0, $0, $28, $0, $0, $0, $0, $0
.byte $2, $80, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $c3, $c3, $0, $0, $3c, $0
.byte $0, $0, $0, $0, $3, $c0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $0, $0
.byte $0, $0, $0, $0, $0, $0, $ff, $ff
.byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $0, $0, $5, $0, $1, $40, $15, $50
.byte $55, $50, $55, $50, $15, $40, $1, $54
.byte $15, $40, $15, $40, $5, $0, $15, $40
.byte $15, $0, $50, $50, $55, $50, $5, $50
.byte $55, $40, $55, $54, $55, $0, $5, $54
.byte $50, $50, $15, $40, $15, $40, $54, $14
.byte $55, $54, $50, $14, $50, $14, $5, $40
.byte $55, $0, $1, $50, $54, $14, $15, $40
.byte $15, $40, $55, $50, $5, $0, $50, $14
.byte $50, $14, $15, $40, $55, $54, $22, $88
.byte $a, $0, $a, $0, $0, $0, $a, $0
.byte $2, $80, $2a, $a0, $aa, $a0, $aa, $a0
.byte $2a, $80, $2, $a8, $2a, $80, $2a, $80
.byte $a, $0, $2a, $80, $2a, $0, $a0, $a0
.byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8
.byte $aa, $0, $a, $a8, $a0, $a0, $2a, $80
.byte $2a, $80, $a8, $28, $aa, $a8, $a0, $28
.byte $a0, $28, $a, $80, $aa, $0, $2, $a0
.byte $a8, $28, $2a, $80, $2a, $80, $aa, $a0
.byte $a, $0, $a0, $28, $a0, $28, $2a, $80
.byte $aa, $a8, $33, $cc, $f, $0, $f, $0
.byte $0, $0, $f, $0, $3, $c0, $3f, $f0
.byte $ff, $f0, $ff, $f0, $3f, $c0, $3, $fc
.byte $3f, $c0, $3f, $c0, $f, $0, $3f, $c0
.byte $3f, $0, $f0, $f0, $ff, $f0, $f, $f0
.byte $ff, $c0, $ff, $fc, $ff, $0, $f, $fc
.byte $f0, $f0, $3f, $c0, $3f, $c0, $fc, $3c
.byte $ff, $fc, $f0, $3c, $f0, $3c, $f, $c0
.byte $ff, $0, $3, $f0, $fc, $3c, $3f, $c0
.byte $3f, $c0, $ff, $f0, $f, $0, $f0, $3c
.byte $f0, $3c, $3f, $c0, $ff, $fc, $0, $0
.byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $0, $0, $5, $0, $1, $40, $54, $14
.byte $5, $0, $50, $50, $50, $50, $0, $50
.byte $50, $50, $50, $50, $5, $0, $50, $50
.byte $1, $40, $50, $50, $14, $14, $14, $14
.byte $14, $50, $14, $4, $14, $0, $14, $14
.byte $50, $50, $5, $0, $50, $50, $14, $14
.byte $14, $14, $50, $14, $50, $14, $14, $50
.byte $14, $0, $15, $40, $14, $14, $50, $50
.byte $5, $0, $50, $50, $15, $40, $54, $54
.byte $14, $50, $5, $0, $14, $14, $a, $a0
.byte $0, $0, $a, $0, $0, $0, $a, $0
.byte $2, $80, $a8, $28, $a, $0, $a0, $a0
.byte $a0, $a0, $0, $a0, $a0, $a0, $a0, $a0
.byte $a, $0, $a0, $a0, $2, $80, $a0, $a0
.byte $28, $28, $28, $28, $28, $a0, $28, $8
.byte $28, $0, $28, $28, $a0, $a0, $a, $0
.byte $a0, $a0, $28, $28, $28, $28, $a0, $28
.byte $a0, $28, $28, $a0, $28, $0, $2a, $80
.byte $28, $28, $a0, $a0, $a, $0, $a0, $a0
.byte $2a, $80, $a8, $a8, $28, $a0, $a, $0
.byte $28, $28, $f, $f0, $0, $0, $f, $0
.byte $0, $0, $f, $0, $3, $c0, $fc, $3c
.byte $f, $0, $f0, $f0, $f0, $f0, $0, $f0
.byte $f0, $f0, $f0, $f0, $f, $0, $f0, $f0
.byte $3, $c0, $f0, $f0, $3c, $3c, $3c, $3c
.byte $3c, $f0, $3c, $c, $3c, $0, $3c, $3c
.byte $f0, $f0, $f, $0, $f0, $f0, $3c, $3c
.byte $3c, $3c, $f0, $3c, $f0, $3c, $3c, $f0
.byte $3c, $0, $3f, $c0, $3c, $3c, $f0, $f0
.byte $f, $0, $f0, $f0, $3f, $c0, $fc, $fc
.byte $3c, $f0, $f, $0, $3c, $3c, $0, $0
.byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $55, $55, $0, $0, $1, $40, $55, $14
.byte $5, $0, $14, $0, $0, $50, $55, $54
.byte $0, $50, $50, $50, $5, $0, $50, $50
.byte $0, $50, $55, $50, $14, $14, $50, $0
.byte $14, $14, $14, $40, $14, $40, $50, $54
.byte $50, $50, $5, $0, $50, $50, $14, $50
.byte $14, $4, $51, $14, $50, $54, $50, $14
.byte $14, $0, $51, $50, $14, $50, $1, $50
.byte $5, $0, $50, $50, $50, $50, $55, $54
.byte $5, $40, $5, $0, $5, $4, $a8, $2a
.byte $a, $0, $0, $0, $aa, $aa, $0, $0
.byte $2, $80, $aa, $28, $a, $0, $28, $0
.byte $0, $a0, $aa, $a8, $0, $a0, $a0, $a0
.byte $a, $0, $a0, $a0, $0, $a0, $aa, $a0
.byte $28, $28, $a0, $0, $28, $28, $28, $80
.byte $28, $80, $a0, $a8, $a0, $a0, $a, $0
.byte $a0, $a0, $28, $a0, $28, $8, $a2, $28
.byte $a0, $a8, $a0, $28, $28, $0, $a2, $a0
.byte $28, $a0, $2, $a0, $a, $0, $a0, $a0
.byte $a0, $a0, $aa, $a8, $a, $80, $a, $0
.byte $a, $8, $fc, $3f, $f, $0, $0, $0
.byte $ff, $ff, $0, $0, $3, $c0, $ff, $3c
.byte $f, $0, $3c, $0, $0, $f0, $ff, $fc
.byte $0, $f0, $f0, $f0, $f, $0, $f0, $f0
.byte $0, $f0, $ff, $f0, $3c, $3c, $f0, $0
.byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $fc
.byte $f0, $f0, $f, $0, $f0, $f0, $3c, $f0
.byte $3c, $c, $f3, $3c, $f0, $fc, $f0, $3c
.byte $3c, $0, $f3, $f0, $3c, $f0, $3, $f0
.byte $f, $0, $f0, $f0, $f0, $f0, $ff, $fc
.byte $f, $c0, $f, $0, $f, $c, $0, $0
.byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $55, $55, $0, $0, $1, $40, $51, $54
.byte $5, $0, $5, $40, $5, $40, $50, $50
.byte $0, $50, $55, $40, $1, $40, $15, $40
.byte $15, $50, $50, $50, $15, $50, $50, $0
.byte $14, $14, $15, $40, $15, $40, $50, $0
.byte $55, $50, $5, $0, $0, $50, $15, $40
.byte $14, $0, $55, $54, $51, $54, $50, $14
.byte $15, $50, $50, $50, $15, $50, $15, $0
.byte $5, $0, $50, $50, $50, $50, $51, $14
.byte $5, $40, $15, $40, $1, $40, $a8, $2a
.byte $2, $80, $0, $0, $aa, $aa, $0, $0
.byte $2, $80, $a2, $a8, $a, $0, $a, $80
.byte $a, $80, $a0, $a0, $0, $a0, $aa, $80
.byte $2, $80, $2a, $80, $2a, $a0, $a0, $a0
.byte $2a, $a0, $a0, $0, $28, $28, $2a, $80
.byte $2a, $80, $a0, $0, $aa, $a0, $a, $0
.byte $0, $a0, $2a, $80, $28, $0, $aa, $a8
.byte $a2, $a8, $a0, $28, $2a, $a0, $a0, $a0
.byte $2a, $a0, $2a, $0, $a, $0, $a0, $a0
.byte $a0, $a0, $a2, $28, $a, $80, $2a, $80
.byte $2, $80, $fc, $3f, $3, $c0, $0, $0
.byte $ff, $ff, $0, $0, $3, $c0, $f3, $fc
.byte $f, $0, $f, $c0, $f, $c0, $f0, $f0
.byte $0, $f0, $ff, $c0, $3, $c0, $3f, $c0
.byte $3f, $f0, $f0, $f0, $3f, $f0, $f0, $0
.byte $3c, $3c, $3f, $c0, $3f, $c0, $f0, $0
.byte $ff, $f0, $f, $0, $0, $f0, $3f, $c0
.byte $3c, $0, $ff, $fc, $f3, $fc, $f0, $3c
.byte $3f, $f0, $f0, $f0, $3f, $f0, $3f, $0
.byte $f, $0, $f0, $f0, $f0, $f0, $f3, $3c
.byte $f, $c0, $3f, $c0, $3, $c0, $0, $0
.byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $0, $0, $0, $0, $1, $40, $50, $54
.byte $5, $0, $0, $50, $0, $50, $14, $50
.byte $55, $40, $50, $0, $0, $50, $50, $50
.byte $50, $50, $50, $50, $14, $14, $50, $0
.byte $14, $14, $14, $40, $14, $40, $50, $0
.byte $50, $50, $5, $0, $0, $50, $14, $50
.byte $14, $0, $55, $54, $55, $14, $50, $14
.byte $14, $14, $50, $50, $14, $14, $54, $0
.byte $5, $0, $50, $50, $50, $50, $50, $14
.byte $14, $50, $50, $50, $40, $50, $a, $a0
.byte $0, $a0, $0, $0, $0, $0, $0, $0
.byte $2, $80, $a0, $a8, $a, $0, $0, $a0
.byte $0, $a0, $28, $a0, $aa, $80, $a0, $0
.byte $0, $a0, $a0, $a0, $a0, $a0, $a0, $a0
.byte $28, $28, $a0, $0, $28, $28, $28, $80
.byte $28, $80, $a0, $0, $a0, $a0, $a, $0
.byte $0, $a0, $28, $a0, $28, $0, $aa, $a8
.byte $aa, $28, $a0, $28, $28, $28, $a0, $a0
.byte $28, $28, $a8, $0, $a, $0, $a0, $a0
.byte $a0, $a0, $a0, $28, $28, $a0, $a0, $a0
.byte $80, $a0, $f, $f0, $0, $f0, $0, $0
.byte $0, $0, $0, $0, $3, $c0, $f0, $fc
.byte $f, $0, $0, $f0, $0, $f0, $3c, $f0
.byte $ff, $c0, $f0, $0, $0, $f0, $f0, $f0
.byte $f0, $f0, $f0, $f0, $3c, $3c, $f0, $0
.byte $3c, $3c, $3c, $c0, $3c, $c0, $f0, $0
.byte $f0, $f0, $f, $0, $0, $f0, $3c, $f0
.byte $3c, $0, $ff, $fc, $ff, $3c, $f0, $3c
.byte $3c, $3c, $f0, $f0, $3c, $3c, $fc, $0
.byte $f, $0, $f0, $f0, $f0, $f0, $f0, $3c
.byte $3c, $f0, $f0, $f0, $c0, $f0, $0, $0
.byte $FF, $AA, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $55, $FF, $55, $FF, $55, $FF, $50, $14
.byte $55, $FF, $55, $FF, $55, $FF, $5, $50
.byte $50, $0, $14, $0, $50, $50, $50, $50
.byte $50, $50, $15, $40, $14, $14, $14, $14
.byte $14, $50, $14, $4, $14, $4, $14, $14
.byte $50, $50, $5, $0, $0, $50, $14, $14
.byte $14, $0, $54, $54, $54, $14, $14, $50
.byte $14, $14, $50, $50, $14, $14, $50, $50
.byte $45, $10, $50, $50, $50, $50, $50, $14
.byte $50, $14, $50, $50, $50, $14, $22, $88
.byte $a0, $a0, $0, $0, $0, $0, $0, $0
.byte $2, $80, $a0, $28, $2a, $0, $a0, $a0
.byte $a0, $a0, $a, $a0, $a0, $0, $28, $0
.byte $a0, $a0, $a0, $a0, $a0, $a0, $2a, $80
.byte $28, $28, $28, $28, $28, $a0, $28, $8
.byte $28, $8, $28, $28, $a0, $a0, $a, $0
.byte $0, $a0, $28, $28, $28, $0, $a8, $a8
.byte $a8, $28, $28, $a0, $28, $28, $a0, $a0
.byte $28, $28, $a0, $a0, $8a, $20, $a0, $a0
.byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0
.byte $a0, $28, $33, $cc, $f0, $f0, $0, $0
.byte $0, $0, $0, $0, $3, $c0, $f0, $3c
.byte $3f, $0, $f0, $f0, $f0, $f0, $f, $f0
.byte $f0, $0, $3c, $0, $f0, $f0, $f0, $f0
.byte $f0, $f0, $3f, $c0, $3c, $3c, $3c, $3c
.byte $3c, $f0, $3c, $c, $3c, $c, $3c, $3c
.byte $f0, $f0, $f, $0, $0, $f0, $3c, $3c
.byte $3c, $0, $fc, $fc, $fc, $3c, $3c, $f0
.byte $3c, $3c, $f0, $f0, $3c, $3c, $f0, $f0
.byte $cf, $30, $f0, $f0, $f0, $f0, $f0, $3c
.byte $f0, $3c, $f0, $f0, $f0, $3c, $0, $0
.byte $AA, $FF, $55, $FF, $55, $FF, $55, $FF ; SPACE
.byte $55, $FF, $55, $FF, $55, $FF, $15, $50
.byte $55, $FF, $55, $FF, $55, $FF, $1, $50
.byte $55, $50, $5, $40, $55, $50, $15, $40
.byte $15, $40, $5, $0, $55, $50, $5, $50
.byte $55, $40, $55, $54, $55, $54, $5, $50
.byte $50, $50, $15, $40, $1, $54, $54, $14
.byte $55, $0, $50, $14, $50, $14, $5, $40
.byte $55, $50, $15, $40, $55, $50, $15, $40
.byte $55, $50, $50, $50, $50, $50, $50, $14
.byte $50, $14, $50, $50, $55, $54, $82, $82
.byte $2a, $80, $0, $0, $0, $0, $0, $0
.byte $2, $80, $2a, $a0, $a, $0, $2a, $80
.byte $2a, $80, $2, $a0, $aa, $a0, $a, $80
.byte $aa, $a0, $2a, $80, $2a, $80, $a, $0
.byte $aa, $a0, $a, $a0, $aa, $80, $aa, $a8
.byte $aa, $a8, $a, $a0, $a0, $a0, $2a, $80
.byte $2, $a8, $a8, $28, $aa, $0, $a0, $28
.byte $a0, $28, $a, $80, $aa, $a0, $2a, $80
.byte $aa, $a0, $2a, $80, $aa, $a0, $a0, $a0
.byte $a0, $a0, $a0, $28, $a0, $28, $a0, $a0
.byte $aa, $a8, $c3, $c3, $3f, $c0, $0, $0
.byte $0, $0, $0, $0, $3, $c0, $3f, $f0
.byte $f, $0, $3f, $c0, $3f, $c0, $3, $f0
.byte $ff, $f0, $f, $c0, $ff, $f0, $3f, $c0
.byte $3f, $c0, $f, $0, $ff, $f0, $f, $f0
.byte $ff, $c0, $ff, $fc, $ff, $fc, $f, $f0
.byte $f0, $f0, $3f, $c0, $3, $fc, $fc, $3c
.byte $ff, $0, $f0, $3c, $f0, $3c, $f, $c0
.byte $ff, $f0, $3f, $c0, $ff, $f0, $3f, $c0
.byte $ff, $f0, $f0, $f0, $f0, $f0, $f0, $3c
.byte $f0, $3c, $f0, $f0, $ff, $fc, $0, $0
================================================
FILE: docs/articles/CALL_APPLE/apple2.txt
================================================
[INSERT LOGO PICTURE HERE]
[If desired, also INSERT PHOTO OF THE AUTHOR]
# INTRODUCTION
The goal of this article is to present Cross-Lib, briefly show how to use it and present the 6 "universal" games I have written with it.
By "universal" here I mean that these games will run on about 200 different systems (consoles, computers, arcade boards, pocket calculators, etc.) despite using the very same game code.
A detailed description of Cross-Lib is not in the scope of this article.
For more details we refer to the GitHub page: http://www.github.com/Fabrizio-Caruso/CROSS-LIB/
# WHAT IS CROSS-LIB?
Cross-Lib (https://github.com/Fabrizio-Caruso/CROSS-LIB/) is a free open source tool for retro-coding for a multitude of 8-bit and vintage systems from the ‘80s (computers, consoles, pocket calculators, arcade boards, etc.)
such as Apple //, all 8-bit Commodore computers, Atari 800, Amstrad CPC, Sinclair ZX 81, Sinclair ZX Spectrum, TRS-80 CoCo, Dragon 32, TRS-80 MC-10, Thomson Mo5 and To7, MSX, Oric-1, Oric Atmos, BBC Micro, etc. as well as consoles such as GameBoy, Sega Master System, GameGear, Nintendo NES, etc.
and other devices such as Texas Instruments pocket calculators. The main CPU architectures are Zilog 80, MOS 6502, Intel 8080, Motorola 6803, Motorola 6809 and RCA 1802.
Cross-Lib also supports several lesser known systems such as the Philips VG-5000, the Jupiter Ace and several exotic and rare systems such as the yugoslav Galaksija, the Hungarian Homlab-2,
several computers from the Eastern German Robotron series such as the Robotron KC 85, etc.
In particular for the Apple //, Cross-Lib currently supports the 6-color HGR mode for graphics, joystick input and a few 1-bit sound effects.
A large but partial list of the supported systems is at the page:
https://github.com/Fabrizio-Caruso/CROSS-LIB/blob/master/docs/STATUS.md.
Cross-Lib has two main components:
1. A "universal" C library (e.g., a collection of C APIs mostly for input/output);
2. A Python script to manage game projects (e.g., to build, create game projects, etc.) and manipulate graphics assets (e.g., to create, import or rip assets)
The main goal of Cross-Lib is to provide a *hardware abstraction layer* for hundreds of vintage systems so that the *very same* game code can be used without any adaptation for all its supported systems.
Several articles have been published on Cross-Lib ([rg], [prog]) and its games ([ceo] and, in by this very magazine, [app]).
# CROSS-LIB VS OTHER DEV-KITS
Historically, 8-bit systems were programmed directly on the system and mostly in Assembly, or for simpler programs in interpreted BASIC.
Today cross-development simplifies developers’ tasks a lot (modern editors, simplified debugging, efficient and quick compilation, etc.) and can be done in C.
The problem with the portability of C code comes from the diversity of the machines and from the fact that ANSI C does not provide a standard library for graphics, sounds, input, etc.
A partial solution is already provided by some dev-kits such as CC65 (for MOS 6502), Z88DK (for the Zilog 80 and Intel 8080), LCC1802 (for the RCA 1802), CMOC (for the Motorola 6890), etc.
By using one of these dev-kits, we can exploit their cross-compatible libraries for input and output.
On the other hand:
1. Each dev-kit only covers a subset of all 8-bit architectures.
2. Even within a given dev-kit, its libraries do not necessarily provide the very same input/output APIs across the entirety of its supported targets.
Cross-Lib improves on these points and lets you do things that you cannot do with other tools:
1. cover many more vintage 8-bit architectures, including very exotic ones;
2. writing 100% WORA code, i.e., "write once, run anywhere" (after re-compilation);
3. using WORA graphics resources, i.e., define abstract graphics assets for several totally different systems;
4. using a simplified tool-chain to create, compile and test the games.
The closest dev-kits to Cross-Lib with respect to these points are
- 8-bit-Unity [un8] (meant to be used with CC65), which does incredible things but only for very few MOS 6502-based systems;
- Z88DK, which has huge libraries but only covers Zilog 80 and Intel 8080 systems.
On the other hand Cross-Lib is not a compiler. It uses several compilers to build the binary files (executable files, disk images, tape images, cartridge images, etc.) for retro-consoles and retro-computers.
By providing an abstraction layer for all 8-bit systems, Cross-Lib makes some compromises with respect to what we could do if we were coding only for a specific system.
In particular, graphics is somehow limited by what is possible on all systems. Sound effects are even more limited.
# COMPILERS
Cross-Lib is supposed to be used with C compilers but which ones?
A native compiler (for example GCC) can be used to build native binaries that can be run, for instance, under Windows. Today the support for native compilation is limited to the text terminal, which means no graphics other than ASCII on the host machine.
Currently Cross-Lib fully supports the following cross-compilers and dev-kits with graphics and sound effects for most of its targets:
- CC65 [cc65] for most systems based on the MOS 6502 architecture;
- Z88DK [z88dk] for systems based on the Zilog 80 and Intel 8080 architectures;
- CMOC [cmoc] for systems that use the Motorola 6809;
- LCC1802 [lcc1802] for systems that use the COSMAC RCA 1802 ;
- GCC for TI [ti] for the Texas Instruments TI99/4A based on the 16-bit TMS9900.
Cross-Lib also supports other compilers (currently with limited or absent graphics and sound effects) such as
- ACK [ack] for 8088/8086, Intel 8080 CP/M, 386/68K/PPC/MIPS Linux and PDP11,
- XTC68 [xtc68] for the Sinclair QL,
- VBCC [vbcc] for the BBC Micro, BBC Master, the Amiga and others,
- CC6303 [cc6303] for the Motorola 6803;
- several versions of modded GCC to target vintage computers (Atari ST [st], Olivetti M20 [m20]).
Cross-Lib supports a large sub-set of ANSI C89 because most available cross-compilers for 8-bit architectures only implement a sub-set of ANSI C89.
Therefore we write in C (a sub-set of ANSI C C89) with Cross-Lib APIs for graphics, sounds, input.
In particular we must avoid:
- "float" and "double" types,
- copies and parameters by value of "struct" objects,
- any use of the heap.
For hints on how to code efficiently for 8-bit systems we refer to [effc] and for specific hints on how to code with these compilers we refer to [c8b].
# INSTALLATION
Cross-Lib itself does not require any real installation.
It is enough to download the repository files (from the GitHub page) or to clone the repository with:
git clone https://www.github.com/Fabrizio-Caruso/CROSS-LIB/
On the other hand it requires:
- a POSIX environment (e.g., Windows with Cygwin, Linux, FreeBSD, etc.);
- Make (GNU Make);
- Python 2.7 or Python 3.* [optional but necessary to simplify many operations];
- JAVA [optional but required to generate floppy disk images for the Apple //];
- GCC compiler with ncurses libraries [optional];
- any compiler necessary to build for a desired target architecture (e.g., CC65, Z88DK, etc.) [optional but CC65 is necessary for the Apple //].
Once you have Cross-Lib with its dependencies in a POSIX environment, you should move to the "src" directory.
Inside "src" you will find the "xl" Python script and the following directories
- "cross-lib", which contains the library code;
- "games" with built-in games;
- "examples" with built-in examples;
- "projects" with user-defined projects.
If you have correctly installed just Makefile, Python and (native) GCC in a POSIX environment, it should already be possible to minimally use Cross-Lib to build the Chase game by running the following command inside the "src" directory:
"xl chase gcc", which will build the game Chase in turn-based mode for the native console.
# HOW TO USE THE XL SCRIPT
If just one of the supported compilers is installed, Cross-Lib can be used with the "xl" Python script inside the "src" directory.
If GCC with ncurses is installed, a native version of the games and examples can be built with:
"xl build " or just "xl "
For example
"xl snake"
builds the "snake" game for the native console.
If a cross compiler (CC65, Z88DK, CMOC, CC6303, LCC1802, etc) is installed, the games and examples can be built for the corresponding systems.
For example, if CC65 is installed,
"xl horde apple2"
builds the "horde" game for the Apple // with 6-color HGR graphics.
The "xl" script takes several commands. In particular you can see a list of the available commands with "xl commands".
You can get an explanation of each command with examples with
"xl help ".
If we want to create a new project, we need to use
"xl create ",
which will create a project with a trivial "hello world" example inside the "projects" directory.
We can also start with a template code for a game if we pass the additional parameter "game":
"xl create game".
# HELLO WORLD
Coding with Cross-Lib is like normal coding in C (with ANSI C89) with the only addition that all input/output is done through Cross-Lib APIs.
Cross-Lib comes with many examples in the src/examples/ directory as well as a few games in the src/games directory.
Both of which can be used to learn how to code with Cross-Lib.
We could start to look at src/examples/helloworld/, whose main.c files contains:
#include "cross_lib.h"
int main(void)
{
_XL_INIT_GRAPHICS();
_XL_CLEAR_SCREEN();
_XL_SET_TEXT_COLOR(_XL_WHITE);
_XL_PRINT_CENTERED("HELLO WORLD");
while(1){};
return EXIT_SUCCESS;
}
We remark that all Cross-Lib specific functions start with the _XL_ prefix:
1. _XL_INIT_GRAPHICS() required to initialize the display ;
2. _XL_CLEAR_SCREEN() which cleans the content of the screen ;
3. _XL_SET_TEXT_COLOR(_XL_WHITE) which defines the color to be used by the text and characters ;
4. _XL_PRINT_CENTERED("HELLO WORLD") which displays "HELLO WORLD" on the center of the screen.
If we want to use one of the examples or games as a starting point we can clone the project with:
xl clone
Or we can start from (almost) scratch with
xl create
Once we have a new project, we can build it with
xl
or
xl
if we want to build the project for the native terminal.
We can run the project for the native terminal with:
xl run
For example we could run these commands:
xl clone helloworld myhelloworld [to clone helloworld and create myhellworld]
We modify the project myhelloworld (found inside ./src/projects/myhelloworld/)
xl build myhelloworld (or equivalently xl myhelloworld) [to build a native binary of the new project]
xl run myhelloworld [to run the new project]
xl build myhelloworld apple2 [to build the same project for the Apple //]
# CODING WITH ABSTRACTIONS
In order to code with Cross-Lib for all targets at the same time, Cross-Lib uses several abstractions.
Graphics is only tile-based. In the code, tiles are abstract as their exact shape will depend on the target type.
The game code only sees tiles as macros _TILE_0, _TILE_1, _TILE_2, etc.
Each concrete target will interpret tiles in different ways depending on whether the target can or cannot assign free shapes to tiles and
on the number of pixels that define tiles on that system.
Sound is currently only limited to few sound effects that are rendered somehow similarly across multiple targets.
Input is limited to 4 directions and a single fire button. On each target this will be mapped to either 5 keys (usually I J K L SPACE)
or the main joystick/controller/gamepad.
Running "xl manual" will output a manual with all commands.
# MAIN DEVELOPMENT FLOW
Producing "universal" games with Cross-Lib for the developer boils down to these main steps:
- Creating or cloning a project (with xl create or xl clone);
- Writing the abstract game code in ANSI C with Cross-Lib APIs for input/output;
- Manually creating or automatically importing abstract assets (with commands such as e.g., xl shapes, xl import, xl rip, xl tile);
- Running the xl script to build the project for one or multiple targets (with xl build).
The "xl build " command (or its equivalent short form "xl ")
executes one or several Makefile targets, which generally:
- generate a concrete asset file from the abstract asset files
- compile the source code (game code and target-specific portions of Cross-Lib library);
- include or link the asset files with the compiled source code;
- if necessary a tool is used to create a usable disk/floppy/rom/cartridge image (this is the case for the Apple // for which disk images are generated).
[INSERT FLOW PICTURE HERE]
# GRAPHICS
Graphics is performed by displaying "tiles", whose shape can be defined. The number of tiles is currently limited to 27 but future versions of Cross-Lib will overcome this constraint.
We can also display "characters" (letters, digits and the space character) but their shape is (currently) fixed.
Characters and tiles have the same size. Characters are used for the text, whereas tiles are used for graphics.
ASCII-only targets will be able to only assign ASCII shapes to tiles, whereas targets with real graphics will assign a "freely defined" shape to tiles.
Currently each tile only has one tile-specific foreground color and a common background color.
The definition of their shapes is not done in the C code.
Instead it is done inside the /tiles directory, which contains sub-directories with files with tile definitions for the ASCII case and
for the graphics-enabled targets, e.g., 8x8 (for most targets), 7x8 (for the Apple //), 6x8 (for the Oric series and NTSC COMX-35), etc...
In the aforementioned files the shapes are described by either ASCII codes for ASCII-only targets or sequences of bytes for graphics-enabled targets.
These files can be:
1. edited manually or
2. automatically imported from several programs such as CharPad [chPad] (with "xl import ") or
3. automatically ripped from BASIC or Assembly listings (with "xl rip ") or
4. generated by some simple "pictorial" text files with drawings made of "#" and "." characters
(with "xl shapes or "xl tile ".
You can see how to use these commands by running "xl help ".
In the game code tile graphics is primarily performed by invoking these functions (to display or delete tiles):
void _XL_DRAW_TILE(uint8_t x, uint8_t y, uint8_t tile_number, uint8_t tile_color);
void _XL_DELETE(uint8_t x, uint8_t y);
# SOUND
Sound is even more limited than graphics and it is restricted to a few predefined effects.
The sound commands have this form:
void _XL__SOUND(void);
For example:
XL_EXPLOSION_SOUND() produces an explosion sound (or something vaguely similar to it depending on the target)
For the Apple //, the sound effects are produced by simple 1-bit banging.
# INPUT
Input is limited to four directions and a single fire button.
The primary input APIs are:
uint8_t _XL_INPUT(void);
uint8_t _XL_LEFT(uint8_t input);
uint8_t _XL_RIGHT(uint8_t input);
uint8_t _XL_UP(uint8_t input);
uint8_t _XL_DOWN(uint8_t input);
uint8_t _XL_FIRE(uint8_t input);
where _XL_INPUT polls the input and the other functions are used to determined the specific input.
# GRAPHICS, SOUNDS AND INPUT IN ONE EXAMPLE
Inside the src/examples/animate directory you can find the following example that could be used as a blueprint for a simple game.
This simple example has graphics, input and sound.
When compiled for any of the possible systems, it will produce the very same program but the exact tile shapes and sounds will depend on the target.
For example it can be compiled for the native console with:
xl animate
or for the Apple // with
xl animate apple2
#include "cross_lib.h"
#define MIN_X 1
#define MAX_X (XSize-2)
#define MIN_Y 1
#define MAX_Y (YSize-2)
#define DOWN_TILE _TILE_0
#define UP_TILE _TILE_1
#define RIGHT_TILE _TILE_2
#define LEFT_TILE _TILE_3
#define FIRE_TILE _TILE_4
int main(void)
{
uint8_t x;
uint8_t y;
uint8_t input;
uint8_t tile;
_XL_INIT_GRAPHICS();
_XL_INIT_SOUND();
_XL_INIT_INPUT();
_XL_CLEAR_SCREEN();
x = XSize/2;
y = YSize/2;
tile = DOWN_TILE;
while(1)
{
_XL_SET_TEXT_COLOR(_XL_WHITE);
_XL_PRINTD(0,0,3,x);
_XL_PRINTD(5,0,3,y);
input = _XL_INPUT();
if(_XL_UP(input))
{
_XL_DELETE(x,y);
tile = UP_TILE;
--y;
}
else if (_XL_DOWN(input))
{
_XL_DELETE(x,y);
tile = DOWN_TILE;
++y;
}
else if (_XL_LEFT(input))
{
_XL_DELETE(x,y);
tile = LEFT_TILE;
--x;
}
else if(_XL_RIGHT(input))
{
_XL_DELETE(x,y);
tile = RIGHT_TILE;
++x;
}
else if(_XL_FIRE(input))
{
_XL_DRAW(x,y,FIRE_TILE,_XL_WHITE);
_XL_EXPLOSION_SOUND();
_XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);
}
if((y>=MIN_Y)&&(y<=MAX_Y)&&(x>=MIN_X)&&(x<=MAX_X))
{
_XL_DRAW(x,y,tile,_XL_WHITE);
}
else
{
_XL_DELETE(x,y);
_XL_ZAP_SOUND();
_XL_SLOW_DOWN(16*_XL_SLOW_DOWN_FACTOR);
x = XSize/2;
y = YSize/2;
}
_XL_SLOW_DOWN(4*_XL_SLOW_DOWN_FACTOR);
}
return EXIT_SUCCESS;
}
# THE GAMES
Cross-Lib comes with some games I have written with it. As for January 2023, it includes six games:
- Cross Verbix
- Cross Horde
- Cross Snake
- Cross Bomber
- Cross Shoot
- Cross Chase
which are also referred to as Verbix, Horde, Snake, Bomber, Shoot, Chase.
## VERBIX
Verbix is a Scrabble-like game that looks also a bit like Tetris.
In this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.
You can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.
[INSERT SNAPSHOT HERE]
## HORDE
Horde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.
You control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.
If you run out of arrows, you will get a few arrows after a short period.
In each level you are confronted with a horde of zombies that become harder as you progress.
[INSERT SNAPSHOT HERE]
## SNAKE
Snake is my personal interpretation of a hybrid game between the arcade game Nibbler and the Nokia cell phone game Snake to which I have added more game elements.
As in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.
As in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control, consumes its energy and eventually dies.
In each level you are also confronted with mines that kill you if the snake's head touches them.
As a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.
The game has several secrets and level to discover.
[INSERT SNAPSHOT HERE]
## BOMBER
Bomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet.
The game concept is horrible (not my own concept) but it can be addictive nevertheless.
Your plane has to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.
You do not control the plane and can only press fire to drop a bomb at a time.
[INSERT SNAPSHOT HERE]
## SHOOT
Shoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.
You can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).
You can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.
At the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skull-shaped enemies.
As a secondary goal you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
The game has many secrets, levels and items to discover.
[INSERT SNAPSHOT HERE]
## CHASE
Cross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.
The main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.
Similarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by several bullets fired by the gun item.
You can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
[INSERT SNAPSHOT HERE]
# FUTURE DEVELOPMENT
Cross-Lib is actively developed. Planned future developments are:
- support for more targets and architectures (e.g., Apple ||gs, Apple 1, etc.);
- improved targets (e.g, DHGR mode for the 80-column capable Apple // models);
- improved APIs (more tiles, improved sounds, etc.);
- simplified setup (docker file with all compilers, tools and dependencies);
- improved scripts to handle graphics assets;
- improved support for the native target;
- more games.
# BIBLIOGRAPHY
[ack] ACK, Tanenbaum A., Jacobs C. et al., C compiler for Intel 8088, PDP 11, CP/M-80,etc., https://github.com/davidgiven/ack
[app] Cross Chase: A Massively 8-bi Multi-System Game, Caruso F., Call-A.P.P.L.E., vol. 28, No. 1, Feb 2018, pages 31-33, http://www.callapple.org
[c8b] 8-bit C, Caruso F., https://github.com/Fabrizio-Caruso/8bitC
[cc6303] CC6303, Cox A., C compiler for the Motorola 6800 and 6803, https://github.com/EtchedPixels/CC6303
[cc65] CC65, C compiler for the MOS 6502, https://sourceforge.net/projects/cc65/
[ceo] Cross Chase, Caruso F., CEO-MAG, No. 327-328, Juillet-Août 2017, https://ceo.oric.org/
[chPad] CharPad, Subchrist Software, https://subchristsoftware.itch.io/charpad-c64-free
[cmoc] CMOC, Sarrazin P., C compiler for the Motorola 6809, https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html
[effc] Efficient C Code for 8-bit Microcontrollers, Jones N., https://barrgroup.com/embedded-systems/how-to/efficient-c-code
[m20] Z8KGCC, Groessler C., GCC modded for the Olivetti M20, http://www.z80ne.com/m20/sections/download/z8kgcc/z8kgcc.html
[lcc1802] LCC1802, Rowe B., C compiler for the RCA 1802, https://github.com/bill2009/lcc1802
[prog] Cross-Lib, Caruso F., Programmez! Hors Série #6, pages 72-82.
[rg] Interview to F. Caruso about Cross-Lib, RetroGamer #240, page 100, https://www.retrogamer.net/
[st] GCC, Rivière V., modded for the Atari ST, http://vincent.riviere.free.fr/soft/m68k-atari-mint/
[ti] GCC, (Insomnia), modded for the TI99/4A, http://atariage.com/forums/topic/164295-gcc-for-the-ti
[un8] 8-Bit Unity, Beaucamp A. (8-bit Dude), http://8bit-unity.com/
[vbcc] VBCC, Barthelmann V., C compiler for the BBC Micro, BBC Master, Amiga, etc., http://www.compilers.de/vbcc.html
[xtc68] XTC68, Hudson J., C compiler Sinclair QL, https://github.com/stronnag/xtc68
[z88dk] Z88DK, C compiler and dev-kit for the Zilog 80 and Intel 8080 architectures.
================================================
FILE: docs/articles/CROSS_LIB_PUBLIC.rtf
================================================
[File too large to display: 17.4 MB]
================================================
FILE: docs/articles/CROSS_LIB_PUBLIC_ENG.rtf
================================================
[File too large to display: 17.4 MB]
================================================
FILE: docs/articles/article.txt
================================================
CROSS CHASE
A massively 8-bit multi-system game
MYSELF - THE AUTHOR
My name is Fabrizio Caruso, I am a software engineer and a retro-computing enthusiast and collector.
I have collected about 80 computers from the late '70s, '80s and early '90.
I am mostly interested in the 8-bit era.
CROSS CHASE is my personal project
whose main purpose is to create a simple, yet fun, game
for literally ALL 8-bit computers/consoles/handhelds
from the '70s and '80s.
By ALL I mean any 8-bit computers with enough RAM and for which a capable ANSI C cross compiler exists.
My project is open source and it can be followed at:
https://github.com/Fabrizio-Caruso/CROSS-CHASE
where both the source code and pre-compiled binaries for more than 60 different systems and configurations
are freely available.
Please go back often to the GitHub page if you want the latest version because I make frequent updates.
HISTORY
This idea came to me when I found out about the CC65 cross development toolkit for 6502-based systems
(https://github.com/cc65/cc65).
I realized that CC65 provided a common language (ANSI C) for all its supported targets
and some common APIs for most of its targets.
I started playing around with it by modifying the "hello world" example, which is provided with it.
After 1400 Git commits from the "hello world" I have now an arcade-like game that can run on about 60 different
systems.
CC65 was clearly not enough and I had to resort to other toolkits such as:
Z88DK (https://github.com/z88dk/z88dk) which comes with two ANSI C cross compilers (ZSDCC and SCCZ80) for Z80-based systems
and WinCMOC and CMOC proper (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html) which are development tools for 6809-based computers.
I also plan to use GCC for TI for the TMS9000-based Texas Ti-99/4A, which I intend to support even if it is
a 16 bit system but for the same 8-bit era.
THE GAME
The idea of the game is original.
You are chased by some bad guys. You can kill by luring them into some mines that they do not see.
I was not inspired by anything but I later found out that similar games exist.
The closest one may be Robots (https://wiki.gnome.org/Apps/Robots) as included in Gnome.
The main difference between my game and Robots is that
my game is an action game and Robots is turn-based.
With respect to the gameplay the game has three versions in order to fit into as many different memory (and in some cases video) configurations as possible.
The VERY SAME code (or meta-code) produces all three versions:
- TINY: just you, the bad guys chasing you and the mines;
- LIGHT: same as TINY but: 1. there is an enemy (the skull) who does not die on the mines and 2. you can get some power-ups
including a gun that can kill all including the skull;
- FULL: as as LIGHT but with different enemy types, more power-ups and multiple levels with different walls and missiles.
THE FRAMEWORK
A very important by-product of this project is a C library/framework that I have written
to create an abstraction layer so that the very same code can be used for all systems.
This means that it is already possible to create other universal 8 bit games within the
graphical and sound limitations of the framework.
THE APPLE VERSIONS
The game supports lots of systems (see next section) including the Apple][ and Apple//e systems.
The Apple versions currently only use the text mode and have no sound.
Both sound (through the bit banging technique),
as well as graphics (through the CC65's TGI libraries) are planned.
Nevertheless the game is already fully playable in these versions.
THE SUPPORTED SYSTEMS
The supported systems are in principle ALL 8-bit systems but the game currently only works for just about 70 systems and configurations.
I am actively adding new systems all the time, so I can only provide the partial list:
Partial list of FULL versions:
- Sega SC 3000
- Luxor ABC80 32k
- Jupiter Ace 16k
- Apple //c
- Apple ][e
- Mattel Aquarius 16k
- Atari 5200 (console)
- Atari 400/800 (color low resolution)
- Atari 400/800 (high resolution)
- Tangerine Atmos and Oric 1 48K
- Commodore 128 (native 40 column mode)
- Commodore 128 (native 80 column mode)
- Commodore 16/116/+4 (32k min)
- Commodore 64
- Commodore CBM 510
- Commodore CBM 610
- CoCo 1/2/3 and Dragon 32/64 (multiple versions)
- Amstrad CPC
- Galaksija 22k
- Gamate (console)
- Lambda 8300 16k
- CCE MC-1000 48k
- MicroBee
- MSX 32K (cassette and rom version)
- MTX
- Nascom computer series 32k
- NES (console)
- Ohio Scientific 1P 32k
- Philips P2000
- PC-6001 32K
- Commodore PET 16k
- Sam Coupe
- Sharp MZ series
- Sinclair Spectrum 48K
- Spectravideo SVI 328
- VG-5000 with 16k expansion
- Vic 20 with 16k expansion
- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 32K
- Robotron Z 9001 32k
- Sinclair ZX80 with 16k expansion
- Sinclair ZX81 with 16k expansion
Partial list of LIGHT versions:
- Atari Lynx (handheld)
- Luxor ABC80 16k
- Atari 400/800 (high resolution)
- Commodore 16/116 (unexpanded)
- CCE MC-1000 16k (unexpanded)
- MSX 16k
- Nascom computer series 16k
- Oric 1 16k (unexpanded)
- Philips P2000 16k (unexpanded)
- Spectravideo 318 16k (unexpanded)
- VG-5000 16k (unexpanded)
- Vic 20 with 8k expansion
- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 16K
- Robotron Z 9001 16k
Partial list of TINY versions:
- Mattel Aquarius with 4k expansion
- PCEngine (console) 8k rom version
- Creativision (computer/console hybrid) 8k rom version
- Ohio Scientific 1P 8k
- Commodore PET 8k
- Sinclair Spectrum 16k (unexpanded)
- Commodore Vic 20 with 3k expansion
SAME CODE FOR MORE THAN 100 SYSTEMS
I am using the very same code for all systems.
This is possible because
- I am using ANSI C, which is a universal language,
which is compiled by multiple cross-compilers into executables for the specific systems.
- I have created a universal 8-bit framework for very simple graphics and sounds.
The framework provides an abstraction layer so that hardware-specific code is used for graphics and sounds.
ACKKNOWLEDGEMENTS
This is a personal project but I have been helped and supported by different people.
I have got a lot of support and help from Stefano Bodrato from the Z88DK team.
I have also been supported by some people from the "scene" (Simon Jonassen from the CoCo/Dragon scene)
and from some of the authors of the other toolkits
(Christian Groessler from the CC65 team and Pierre Sarrazin who is the author of the CMOC).
================================================
FILE: docs/articles/articolo_ITA.txt
================================================
CROSS CHASE
Un gioco estremamente multi-sistema di Fabrizio Caruso
# L'autore
Mi chiamo Fabrizio Caruso. Sono uno sviluppatore software e collezionista entusiasta di retro-computer.
Ho circa 80 retrocomputer di svariate marche dai più comuni Commodore 64, Vic 20, Commodore 16, Sinclair ZX Spectrum ad alcuni modelli meno comuni come il Mattel Aquarius, il Commodore 116, Matra-Hachette Alice, etc.
Sono particolarmente interessato all'era 8-bit, cioè il periodo che va dalla fine degli anni 70 e l'inizio degli anni 90.
Mi piace usarli e restaurarli. Ultimamente ho scoperto il piacere di programmare su queste macchine (su tutte!).
# Il progetto
CROSS CHASE è il mio progetto personale il cui scopo è creare un gioco anche con un minimo di grafica e sonoro e che sia soprattutto divertente da giocare e, cosa ancora più importante,
che possa girare su “tutti” i computer 8 bit e buona parte delle console, console-computer ipridi e handheld ad 8 bit dell'epoca 8'bit.
Il termine “tutti” significa qualunque home computer 8-bit tra la fine degli anni 70 e fine anni 80 con abbastanza memoria RAM e per il quale esiste un cross compilatore ANSI C.
Il mio progetto è open source e può esssere seguito sulla pagina GitHub:
https://github.com/Fabrizio-Caruso/CROSS-CHASE
dove, oltre al codice sorgente, metto a disposizione anche i binari già pronti per più di 60 computer (nella sezione release).
# Il framework
Il progetto ha richiesto la scrittura di un framework per la scrittura di giochi 8 bit "universali" che consente la scrittura contemporanea
di un gioco 8 bit su un centinaio di piattaforme 8-bit diverse.
Al momento attuale il framework è ad uno stato molto iniziale ma ha già la proprietà più importante: il suo codice è indipendente dal gioco che sto sviluppando.
Quando questo framework sarà maturo, sarà possibile usarlo per creare rapidamente altri giochi 8-bit universali SENZA dover fare porting o
riscrittura del codice per ogni macchina.
# Cosa mi ha fatto cominciare
L'idea nacque 9 mesi fa con la mia scoperta del toolkit di sviluppo CC65 per sistemi basati su CPU 6502 e suoi derivati (come il Commodore 64, Commodore 16, Commodore Vic 20, Atari 400/800, NES, etc.).
Questo toolkit mette a disposizione un linguaggio comune (ANSI C) e alcune API per diversi computer e console.
Cominciai modificando il classico esempio “hello world” che viene formito con toolkit e dopo più di 1200 commits (modifiche) ho ottenuto con un gioco arcade completo che gira si un centinaio di sistemi totalmente diversi e incompatibili tra loro.
# Tools di sviluppo
Chiaramente CC65 non sarebbe bastato per coprire tutti i sistemi 8 bit.
Ho quindi dovuto usare altri toolkit simili per altri sistemi.
I principali tools di sviluppo che ho usato sono:
- CC65 (https://github.com/cc65/cc65)
- Z88DK (https://github.com/z88dk/z88dk) per i sistemi basati su CPU Z80 (come il Sinclair Spectrum, MSX, Amstrad CPC, etc.) e
- CMOC (https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html) per i sistemi basati su CPU 6809 (come Dragon 32/64 e CoCo 1/2/ 3) e la sua variante WinCMOC.
In totale attualmente uso 5 cross compilatori
- cl65 (CC65),
- sccz80 (Z88DK),
- zsdcc (variante di sdcc in Z88DK),
- CMOC,
- WinCMOC (variante moddata di CMOC).
Sto sperimentando con altri cross compilatori come GCC for TI (per TI99/4A), GCC6809 e sdcc (sia "liscio" sia la versione del toolkit CPCTelera per Amstrad CPC).
Lo scopo è di supportare il più grande numero di sistemi ma con una regola ferrea: nessun porting o riscrittura del codice della logica del gioco.
Lo stesso codice deve essere usato per tutti i computer e console. Il codice specifico è ammesso solo per alcuni dettagli dell'input/output.
# 100 sistemi contemporaneamente supportati con lo stesso codice?
Questo è possibile perché:
1. Uso ANSI C che è un linguaggio universale che è ricompilato da vari cross-compilatori per produrre lo stesso gioco su sistemi diversi.
2. Ho creato dei livelli di astrazione nel mio codice (il framework!) così da poter inserire, in alcuni casi, del codice specifico per vari hardware senza modificare il codice del gioco.
3. Uso meta-codice per selezionare le porzioni di codice che servono per ogni sistema.
# Il Gioco
L'idea del gioco è totalmente originale: sei inseguito da dei nemici che puoi fare fuori facendoli schiantare contro delle mine che vede solo il giocatore o sparando contro loro se riesci ad ottenere una pistola. Esistono 10 diversi power-up che danno poteri speciali. Alcuni dei quali sono nascosti e vanno scoperti compiente specifiche operazioni (esempio: colpire o uccidere il teschio, etc.).
Non mi sono ispirato a nulla ma ho scoperto che esistono giochi simili.
Il più simile è Robots (https://wiki.gnome.org/Apps/Robots) che è incluso in Gnome. La differenza maggiore sta nel fatto che Robots è turn-based mentre il mio gioco è un gioco d'azione. Altra differenza importante è l'uso della pistola nel mio gioco che serve ad distruggere alcuni ostali e nemici speciali.
# Tre versioni
Lo stesso codice del gioco produce 3 diverse varianti del gioco che sono più o meno complete in maniera tale da poter girare su hardware anche molto limitati (anche soli 8k di ram).
Quindi il gioco esiste in versione:
- TINY: nemici semplice e mine
- LIGHT: aggiunta di alcuni power-up ed il teschio (nemico da uccidere con la pistola)
- FULL: versione completa
Sistemi supportati
Il gioco supporta in principio tutti i sistemi a 8 bit comprese svariate configurazioni di memoria e video. Per il momento posso confermare il funzionamento per una settantina. Aggiungo in continuazione nuovi sistemi e qui posso fornire una lista parzionale.
Versione FULL
- Luxor ABC80 32k
- Jupiter Ace 16k
- Apple //c
- Apple ][e
- Mattel Aquarius 16k
- Atari 5200 (console)
- Atari 400/800 (color low resolution)
- Atari 400/800 (high resolution)
- Tangerine Atmos and Oric 1 48K
- Commodore 128 (native 40 column mode)
- Commodore 128 (native 80 column mode)
- Commodore 16/116/+4 (32k min)
- Commodore 64
- Commodore CBM 510
- Commodore CBM 610
- CoCo 1/2/3 and Dragon 32/64 (multiple versions)
- Amstrad CPC
- Galaksija 22k
- Gamate (console)
- Lambda 8300 16k
- CCE MC-1000 48k
- MicroBee
- MSX 32K (cassette and rom version)
- MTX
- Nascom computer series 32k
- NES (console)
- Ohio Scientific 1P 32k
- Philips P2000
- PC-6001 32K
- Commodore PET 16k
- Sam Coupe
- Sharp MZ series
- Sinclair Spectrum 48K
- Spectravideo SVI 328
- VG-5000 with 16k expansion
- Vic 20 with 16k expansion
- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 32K
- Robotron Z 9001 32k
- Sinclair ZX80 with 16k expansion
- Sinclair ZX81 with 16k expansion
Versione LIGHT
- Luxor ABC80 16k
- Atari 400/800 (high resolution)
- Commodore 16/116 (unexpanded)
- CCE MC-1000 16k (unexpanded)
- MSX 16k
- Nascom computer series 16k
- Oric 1 16k (unexpanded)
- Philips P2000 16k (unexpanded)
- Spectravideo 318 16k (unexpanded)
- VG-5000 16k (unexpanded)
- Vic 20 with 8k expansion
- VZ 200 family (Vtech Laser 200/310 and VZ 200/300) with 16K
- Robotron Z 9001 16k
Versione TINY
- Creativision (computer/console hybrid) 8k rom version
- Ohio Scientific 1P 8k
- Commodore PET 8k
- Sinclair Spectrum 16k (unexpanded)
- Commodore Vic 20 with 3k expansion
# Ringraziamenti
Per essendo un progetto personale, sono stato aiutato da diverse persone.
In particolare da Stefano Bodrato che è uno dei principali sviluppatori di Z88DK.
Sono anche stato aiutato da alcuni membri di varie “scene” 8-bit (in particolare da Simon Jonassen che sviluppa per CoCo e Dragon).
Ringrazio anche Christian Groessler (sviluppatore CC65) per avermi dato alcuni consigli su Atari.
================================================
FILE: docs/bbc/chibiakumas.txt
================================================
https://www.chibiakumas.com/6502/bbc.php
================================================
FILE: docs/bbc/putchar.txt
================================================
FYI I have uploaded a new release of vbcc6502. For the bbc target I have
added a function to suppress the conversion of \n. After calling
__vdu_sequence(1);
all the characters should be output without any modifications. Calling
__vdu_sequence(0) will activate the \n conversion again.
void OSWRCHR(__reg("a") char)="\tjsr\t0xffee";
...
OSWRCHR(22);
OSWRCHR(2);
void OSNEWL()="\tjsr\t0xffe7";
void OSWRCHR(__reg("a") char)="\tjsr\t0xffee";
unsigned int __write(int f,const char *p,unsigned int len)
{
unsigned int n=len;
while(n){
char c=*p++;
if(c=='\n')
OSNEWL();
else
OSWRCHR(c);
n--;
}
return len;
}
================================================
FILE: docs/bbc_sounds/bbc.h
================================================
typedef struct {
int channel;
int amplitude;
int pitch;
int duration;
} bbc_sound;
char OSBYTE0(__reg("a") char)="\tjsr\t$fff4\n\ttxa";
char OSBYTE1(__reg("a") char,__reg("r0") char)="\tldx\tr0\n\tjsr\t$fff4\n\ttxa";
char OSBYTE1RI(__reg("a") char,__reg("r0") char)="\tldx\tr0\n\tjsr\t$fff4\n\ttxa\n\tpha\n\ttya\n\ttax\n\tpla";
char OSBYTE2(__reg("a") char,__reg("r0") char,__reg("r1") char)="\tldx\tr0\n\tldy\tr1\n\tjsr\t$fff4\n\ttxa";
char OSBYTE2I(__reg("a") char,__reg("r0/r1") unsigned int)="\tldx\tr0\n\tldy\tr1\n\tjsr\t$fff4\n\ttxa";
void OSBYTE0NR(__reg("a") char)="\tjsr\t$fff4";
void OSBYTE1NR(__reg("a") char,__reg("r0") char)="\tldx\tr0\n\tjsr\t$fff4";
void OSBYTE2NR(__reg("a") char,__reg("r0") char,__reg("r1") char)="\tldx\tr0\n\tldy\tr1\n\tjsr\t$fff4";
#define OSVER() OSBYTE0(0)
#define OSUSRFLG(x,y) OSBYTE2(1,(x),(y))
#define OSSELINPUT(x) OSBYTE1NR(2,(x))
#define OSSELOUTPUT(x) OSBYTE2(3,(x),(y))
#define OSCURSORED(x) OSBYTE2(4,(x),(y))
#define OSSELADC(x) OSBYTE1(16,(x))
#define OSFRCADC(x) OSBYTE1NR(17,(x))
#define OSVSYNC() OSBYTE0(19)
#define OSRDVDU() OSBYTE0(117)
#define OSSCANKEY(x) OSBYTE1(121,(x))
#define OSSCANKEY16() OSBYTE0(122)
#define OSADVAL(x) OSBYTE1RI(128,(x))
#define OSINKEY(x) OSBYTE2I(129,(x))
void OSWORD(__reg("a") char,__reg("r0/r1") void *)="\tldx\tr0\n\tldy\tr1\n\tjsr\t$fff1";
#define OSRDSYSCLK(x) OSWORD(1,x)
#define OSWRSYSCLK(x) OSWORD(2,x)
#define OSRDTIMER(x) OSWORD(3,x)
#define OSWRTIMER(x) OSWORD(4,x)
#define OSRDIO(x) OSWORD(5,x)
#define OSWRIO(x) OSWORD(6,x)
#define OSSOUND(x) OSWORD(7,x)
#define OSENVELOPE(x) OSWORD(8,x)
#define OSRDPIXEL(x) OSWORD(9,x)
#define OSRDCHARDEF(x) OSWORD(10,x)
#define OSRDPALETTE(x) OSWORD(11,x)
#define OSWRPALETTE(x) OSWORD(12,x)
#define OSRDGRCURSOR(x) OSWORD(13,x)
================================================
FILE: docs/bbc_sounds/bbctest.c
================================================
#include
#include "bbc.h"
bbc_sound snd = {1,-15,200,20};
main()
{
unsigned int i=0;
puts("playing sound");
OSSOUND(&snd);
puts("done");
while(1){
printf("k=%03u js=%05u %05u %05u %05u\n",OSSCANKEY16(),OSADVAL(1),OSADVAL(2),OSADVAL(3),OSADVAL(4));
}
}
================================================
FILE: docs/compilation_parameters.txt
================================================
-------------------------------------
NO_MESSAGE
It disables:
- printGameOver
- gameCompleted
- _printScoreOnRow
- _printScore
- printKillTheSkull
- highScoreScreen
-------------------------------------
LESS_TEXT
It disables:
- printLevel
- printVictoryMessage
- printExtraLife
-------------------------------------
================================================
FILE: docs/compiler_install.txt
================================================
(1) TMS9900-GCC
https://github.com/mburkley/tms9900-gcc
Very simple instructions are here: https://github.com/mburkley/tms9900-gcc?tab=readme-ov-file#user-download-and-install
-------------------------------------
(2) ACK
https://github.com/davidgiven/ack
Very simple but *time consuming* compilation explained in the main README file.
-------------------------------------
(3) CC6303 for the Motorola 6803-based targets
https://github.com/zu2/CC6303 (maintained and more recent but not tested yet)
I need to check and see if it works fine.
If the first link fails to build and/or fails to build correct binaries we have this:
https://github.com/EtchedPixels/CC6303 (obsolete and not maintained)
No instructions found but there is a simple Makefile.
So "make all" and probably "make install" (it just copies files to hard-coded locations)
-------------------------------------
(4) VBCC
http://www.compilers.de/vbcc.html
Remark: We need a *multi-target* version. The *multi-target* versions support several targets across different architectures.
I have never built it from source myself. I have always used a pre-built multi-target.
I need to check if it can be easily built.
Source code of the multi-target version is here: http://www.ibaug.de/vbcc/vbcc.tar.gz
================================================
FILE: docs/conio_macros_vs_functions.txt
================================================
xl snake c16_16k_conio
BEFORE (with macros for _XL_CHAR, _XL_PRINT):
ld65: Warning: cross_lib/cfg//cc65/c16-16k.cfg:10: Segment 'BSS' overflows memory area 'MAIN' by 1432 bytes
ld65: Error: Cannot generate most of the files due to memory area overflow
gmake: *** [Makefile_common:486: c16_16k_conio] Error 1
Segment list:
-------------
Name Start End Size Align
----------------------------------------------------
ZEROPAGE 000008 000021 00001A 00001
LOADADDR 000FFF 001000 000002 00001
EXEHDR 001001 00100C 00000C 00001
STARTUP 00100D 00104E 000042 00001
ONCE 00104F 00105A 00000C 00001
CODE 00105B 003AE1 002A87 00001
RODATA 003AE2 003F6E 00048D 00001
DATA 003F6F 003FC0 000052 00001
INIT 003FC1 003FDA 00001A 00001
BSS 003FDB 004577 00059D 00001
-------------------------------------------------------------------------------------------------
AFTER (with functions):
ld65: Warning: cross_lib/cfg//cc65/c16-16k.cfg:10: Segment 'INIT' overflows memory area 'MAIN' by 5 bytes
ld65: Error: Cannot generate most of the files due to memory area overflow
make: *** [Makefile_common:486: c16_16k_conio] Error 1
Segment list:
-------------
Name Start End Size Align
----------------------------------------------------
ZEROPAGE 000008 000021 00001A 00001
LOADADDR 000FFF 001000 000002 00001
EXEHDR 001001 00100C 00000C 00001
STARTUP 00100D 00104E 000042 00001
ONCE 00104F 00105A 00000C 00001
CODE 00105B 003AEB 002A91 00001
RODATA 003AEC 003F78 00048D 00001
DATA 003F79 003FCA 000052 00001
INIT 003FCB 003FE4 00001A 00001
BSS 003FE5 004581 00059D 00001
--------------------------------------------------------------
shoot pet
BEFORE
Segment list:
-------------
Name Start End Size Align
----------------------------------------------------
ZEROPAGE 000055 00006E 00001A 00001
LOADADDR 0003FF 000400 000002 00001
EXEHDR 000401 00040C 00000C 00001
STARTUP 00040D 00044C 000040 00001
ONCE 00044D 000458 00000C 00001
CODE 000459 00474C 0042F4 00001
RODATA 00474D 0049A1 000255 00001
DATA 0049A2 0049F3 000052 00001
INIT 0049F4 004A0D 00001A 00001
BSS 004A0E 004C1A 00020D 00001
----------------------------------
AFTER
Segment list:
-------------
Name Start End Size Align
----------------------------------------------------
ZEROPAGE 000055 00006E 00001A 00001
LOADADDR 0003FF 000400 000002 00001
EXEHDR 000401 00040C 00000C 00001
STARTUP 00040D 00044C 000040 00001
ONCE 00044D 000458 00000C 00001
CODE 000459 004722 0042CA 00001
RODATA 004723 004977 000255 00001
DATA 004978 0049C9 000052 00001
INIT 0049CA 0049E3 00001A 00001
BSS 0049E4 004BF0 00020D 00001
================================================
FILE: docs/docker.txt
================================================
# CROSS-LIB in GitHubCodeSpaces
https://github.com/codespaces/
# CROSS-LIB in a Docker container
## BUILD IMAGE
Enter .devcontainer
docker build . -t crosslib:254
## RUN CONTAINER
docker run -it -v /mnt/c/Retro/CROSS-LIB:/workspaces/crosslib --env-file /mnt/c/Retro/CROSS-LIB/.devcontainer/devcontainer.env crosslib:254 bash
---------------------
sudo docker run -it -v .:/workspaces/crosslib --env-file ./.devcontainer/container.env crosslib:0.1 bash
Push to registry:
docker push docker.io/fabriziocaruso/crosslib:0.1
sudo docker tag crosslib:0.1 crosslib:0.1
sudo docker logout && sudo docker login -u "fabriziocaruso" -p "L1kud1a_33" docker.io
================================================
FILE: docs/games/BOMBER.txt
================================================
BOMBER
Bomber is a mini-game and clone of Air Attack (aka Blitz) that first appeared on the Commodore Pet.
The game is about a rather horrible idea (not mine) but it can be addictive nevertheless.
You need to carpet-bomb an entire city in order to safely land on the road. Let us assume the city has no inhabitants.
You do not control the plane. You can only use fire to drop bombs.
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/games/CHASE.txt
================================================
CHASE
Cross Chase is somehow similar to Daleks / Gnome Robots. You need to lure your pursuers into the mines.
The main difference is that it is a real-time game and that it has several secrets items and power-ups to pick.
Similarly to Shoot, at the end of each level or in boss levels, you are confronted by a boss (a skull), which can only be killed by a few bullets fired by the gun item.
You can complete the level by killing the skull before the last enemy and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
You can move in 4 directions and shoot with fire (if you have collected the gun item).
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/games/HORDE.txt
================================================
HORDE
Horde is a zombie-themed shooter with many power-ups and several different enemies, levels and special items to pick.
You control a bow with a limited number of arrows. You get more arrows as a possible reward for killing some zombies.
If you run out of arrows, you will get a few arrows after a short period.
In each level you are confronted with a horde of zombies that become harder as you progress.
You can move left or right. Use fire to shoot.
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/games/SHOOT.txt
================================================
SHOOT
Shoot is a shooter somehow similar to Robotron. You have to kill a horde of ghosts on each level.
You can kill them by hitting them many times or by hitting them enough times to push them against the walls (mortal only for them).
You can also kill them by placing mines but you need to get the mine item (with 3 mines). A mine kills instantly common enemies.
At the end of each level when only few ghosts are left or if you survive without killing enemies long enough or in boss levels, you are confronted by some hard-to-kill skulls.
Optionally you can complete the level by killing the skulls before the last ghosts and by doing so you unlock extra items and secrets in the next levels.
Destroying the missile bases can also unlock items.
The game has many secrets and items to discover.
You move in the 4 directions and shoot with fire.
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/games/SNAKE.txt
================================================
SNAKE
Snake is my personal interpretation of a hybrid game between Nibbler (arcade game) and the Nokia Snake game to which I have added more game elements.
As in Nibbler the walls do not kill you and can be used to stop you and let you better control your movements.
As in Nokia Snake the main goal is to eat apples. If you do not eat any apple for too long, the snake becomes faster and harder to control and ultimately consume its energy.
In each level you are also confronted with mines that kill you if the snake's head touches them.
As a secondary goal you can collect rings. If you manage to get 3 or more rings without dying on a level, you will be rewarded with bonus items.
Use the fire button to start the game.
You move in the 4 directions and shoot with fire.
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/games/VERBIX.txt
================================================
VERBIX
Verbix is a Scrabble-like game that looks also a bit like Tetris.
In this game you have to form valid 5-letter English words on the bottom row before the tower of letters reaches the top level.
You can rotate the bottom row or any of the columns by moving in the 4 directions. You press fire to confirm the word.
REMARK:
This game is part of Cross-Lib: https://github.com/Fabrizio-Caruso/CROSS-LIB
Go to its GitHub page for updates and new games.
Cross-Lib's licence applies to this game.
------------------------------------------------------------------------------------------------------------------------------------
CROSS-LIB'S LICENCE
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
the use of this software.
Permission is granted to anyone to use this software for non-commercial applications,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software in
a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not
be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
For example I do not authorize selling hardware, software, firmware or any other product that contains any part of Cross-Lib and/or its games (e.g., pre-loaded disks, tapes, cartridges, etc.).
On the other hand I authorize people to load the games in the most convenient way for their personal use.
================================================
FILE: docs/generic_tiles.txt
================================================
GENERIC TILES
NAMES USED IN THE CODE
In the code we use the name tiles for different things:
- tile absolute index [used to display] "_TILE_{index}", i.e., and index in memory that points to the tile data
- tile relative index [used to redefine] "_TILE_{index}_OFFSET", i.e. a relative index in memory (e.g., Atari 8-bit mode 1 characters are repeated 4 times)
- tile data (in template files) "", i.e., this is the data that defines the shape of tiles
- tile data in C code (in header files) "_TILE_{tile #}_UDG" contains ""
LINKED TILES VS TILES BY EXPLICIT REDEFINITION IN C CODE
Cross-Lib supports different ways to enable tiles:
- by to-be-linked Assembly files with the tiles data
- by including header files with tiles definitions
TEMPLATED TILE FILES
Templates cover both cases described above (linked Assembly and header files).
Both to-be-linked Assembly files and tile header files are generated by Python scripts "generate_assets.py" and "copy_assets.py" found in src/assets/.
The scripts use
- the templates in /src/assets/templates with "" tags and
- the game-specific tile data in /src/games//tiles or /src/demos//tiles where
the file "tile_.txt" contains the data the are meant to replace "" in all templates
The result of the execution of the Python scripts is store in /src/games//generated_assets or /src/demos//generated_assets.
SUB-TARGET-SPECIFIC TILES
Tiles are implemented differently on each target and sub-target as this depend on the graphics mode chosen in Cross-Lib.
Each tile is identified by a absolute index (used to display it) "_TILE_{index}" and a relative index (used to redefined it) "_TILE_{index}_OFFSET".
These indices are defined in /src/cross_lib/display/tiles.
TILES DEFINED THROUGH HEADER FILES
For tiles that are defined by included header files (not by linked Assembly), the tile data is defined in "_TILE_{tile #}_UDG".
Each target may use some specific code to redefine characters code.
Most targets use the definitions and code in /src/cross_lib/display/redefined_characters/udg_map.h.
================================================
FILE: docs/hector_sound.txt
================================================
Pour 2HR - CALL 0x07BF
Pour HRX - CALL 0x1A09
Il faut préalablement définir DE pour la longueur
Et BC pour le période.
La fréquence de la note sera égale à 1/(BC), et sa durée à (BC) x (DE).
Si les interruptions sont autorisées, le son sera "vibrato", si les interruptions sont interdites, il sera continu.
voici ce que moi j'utilise pour 2HR
mon code asm:
PUBLIC _TONES
;************************************
; * émet un son *
;************************************
_TONES:
POP IX ; récupère l'adresse de retour
POP DE ; récupère le deuxième argument (longeur)
POP BC ; récupère le premier argument (periode)
PUSH BC ; remet sur la pile
PUSH DE ; remet sur la pile
PUSH IX ; remet l'adresse de retour sur la pile
CALL 0x07BF
RET
dans mon code C:
extern void TONES(unsigned short periode, unsigned short longeur);
TONES(0x1000,10);
================================================
FILE: docs/manual/XSize.txt
================================================
XSize
Number of tiles that can be displayed horizontally on the (usable) screen
================================================
FILE: docs/manual/YSize.txt
================================================
YSize
Number of tiles that can be displayed vertically on the (usable) screen
================================================
FILE: docs/manual/_XL_CHAR.txt
================================================
_XL_CHAR(X,Y,C)
It displays the C character at position X,Y with the color set by _XL_SET_TEXT_COLOR.
================================================
FILE: docs/manual/_XL_CLEAR_SCREEN.txt
================================================
_XL_CLEAR_SCREEN()
It clears the whole screen.
================================================
FILE: docs/manual/_XL_DELETE.txt
================================================
_XL_DELETE(X,Y)
It deletes a tile-sized area of the screen at position (X,Y)
================================================
FILE: docs/manual/_XL_DOWN.txt
================================================
_XL_DOWN(J)
This Boolean function returns 1 (true) if J represents the down movement, and 0 (false) otherwise.
J is supposed to be the output of _XL_INPUT.
================================================
FILE: docs/manual/_XL_DRAW.txt
================================================
_XL_DRAW(X, Y, T, C)
It displays tile T at position (X,Y) with color C if color C is available or its "closest" match when C is not supported by a target.
For targets with no colors (i.e., with _XL_NO_COLOR) you may assume that _XL_DRAW is macro that disregards the C parameter.
================================================
FILE: docs/manual/_XL_EXPLOSION_SOUND.txt
================================================
_XL_EXPLOSION_SOUND()
Short explosion noise
================================================
FILE: docs/manual/_XL_FIRE.txt
================================================
_XL_FIRE(J)
This Boolean function returns 1 (true) if J represents the fire button, and 0 (false) otherwise.
J is supposed to be the output of _XL_INPUT.
================================================
FILE: docs/manual/_XL_INIT_GRAPHICS.txt
================================================
_XL_INIT_GRAPHICS()
It initializes the graphics. Necessary for any build that wants to show anything on the screen.
================================================
FILE: docs/manual/_XL_INIT_INPUT.txt
================================================
_XL_INIT_INPUT()
It initializes the input (joystick/keyboard). Necessary for any program that needs to receive an input
================================================
FILE: docs/manual/_XL_INIT_SOUND.txt
================================================
_XL_INIT_SOUND()
It initializes the sound system. Necessary for any program that produces sound.
================================================
FILE: docs/manual/_XL_INPUT.txt
================================================
_XL_INPUT()
It returns a value J that represents the specific received input or absence of input at the moment of its execution (keyboard may be buffered, though).
The result J is meant to be used with the Boolean functions _XL_UP, _XL_DOWN, _XL_LEFT, _XL_RIGHT, _XL_FIRE.
================================================
FILE: docs/manual/_XL_KEY_PRESSED.txt
================================================
_XL_KEY_PRESSED()
This Boolean function returns 1 (true) if any key or fire button is pressed.
================================================
FILE: docs/manual/_XL_LEFT.txt
================================================
_XL_LEFT(J)
This Boolean function returns 1 (true) if J represents the left movement, and 0 (false) otherwise.
J is supposed to be the output of _XL_INPUT.
================================================
FILE: docs/manual/_XL_PING_SOUND.txt
================================================
_XL_PING_SOUND()
Short high-pitched sound
================================================
FILE: docs/manual/_XL_PRINT.txt
================================================
_XL_PRINT(X,Y,S)
It prints the "Cross-Lib string" S starting a position (X,Y) with the color set by _XL_SET_TEXT_COLOR.
A "Cross-Lib string" is string formed with only the following 37 possible characters
_XL_SPACE, _XL_a, ..., _XL_z, _XL_A, ..., _XL_Z, '0', ..., '9'
where capital/small letter may be displayed as the same character depending on whether the target supports different display for capital vs small letters.
================================================
FILE: docs/manual/_XL_PRINTD.txt
================================================
_XL_PRINTD(X,Y,L,N)
It prints the positive integer number N in L digits (1<=L<=5) starting at position (X,Y) with the color set by _XL_SET_TEXT_COLOR.
================================================
FILE: docs/manual/_XL_RAND.txt
================================================
_XL_RAND()
It generates a pseudo-random number in the range [0,32767]
================================================
FILE: docs/manual/_XL_RIGHT.txt
================================================
_XL_RIGHT(J)
This Boolean function returns 1 (true) if J represents the right movement, and 0 (false) otherwise.
J is supposed to be the output of _XL_INPUT.
================================================
FILE: docs/manual/_XL_SET_TEXT_COLOR.txt
================================================
_XL_SET_TEXT_COLOR(C)
It sets the text color to C. Such color will be used on next _XL_PRINT, _XL_PRINTD, _XL_CHAR for targets that support colored text.
If any other display operation is present (e.g., _XL_DRAW), then there is no guarantee that the color C will be used afterwards.
================================================
FILE: docs/manual/_XL_SHOOT_SOUND.txt
================================================
_XL_SHOOT_SOUND()
Very short shoot noise
================================================
FILE: docs/manual/_XL_SLEEP.txt
================================================
_XL_SLEEP(S)
It waits S seconds or an approximations of S seconds depending on the target
================================================
FILE: docs/manual/_XL_SLOW_DOWN.txt
================================================
_XL_SLOW_DOWN(T)
It waits T loops (0<=T<=65535)
================================================
FILE: docs/manual/_XL_TICK_SOUND.txt
================================================
_XL_TICK_SOUND()
Very short high-pitched sound
================================================
FILE: docs/manual/_XL_TOCK_SOUND.txt
================================================
_XL_TOCK_SOUND()
Very short low-pitched sound
================================================
FILE: docs/manual/_XL_UP.txt
================================================
_XL_UP(J)
This Boolean function returns 1 (true) if J represents the up movement, and 0 (false) otherwise.
J is supposed to be the output of _XL_INPUT.
================================================
FILE: docs/manual/_XL_WAIT_FOR_INPUT.txt
================================================
_XL_WAIT_FOR_INPUT()
It waits for any key or fire button to be pressed.
================================================
FILE: docs/manual/_XL_ZAP_SOUND.txt
================================================
_XL_ZAP_SOUND()
Short rising sound
================================================
FILE: docs/mc10.txt
================================================
Multicolor graphics
Disable Interrupt with SEI
CLI to enable
POKE 49151,36
$4000
================================================
FILE: docs/mc10_2.txt
================================================
; Radio Shack MC-10 Disassembly
; (C) Copyright 1999 Kevin Timmerman
; Additional annotation by Greg D.
; Fixed and modified by James Tamer for use with TASM cross-assembler
; A few handy defines to make TASM more like typcial
; motorola syntax
.MSFIRST ; Most Significant byte first
; .ADDINSTR inst args opcode nbytes rule class shift binor
.ADDINSTR JSRE * BD 3 SWAP 1 shift binor
#define EQU .EQU
#define ORG .ORG
#define RMB .BLOCK
#define FCB .BYTE
#define FCC .TEXT
#define FDB .WORD
#define equ .EQU
#define org .ORG
#define rmb .BLOCK
#define fcb .BYTE
#define fcc .TEXT
#define fdb .WORD
; end a few handy defines
ram00 equ $00 ;Port 1/2 Data Directon Register 1=Output 0=Input
ram01 equ $01
ram02 equ $02 ;Port 1 Data Register
ram03 equ $03 ;Port 2 Data Register
ram08 equ $08 ;Timer control and status register
ram09 equ $09 ;Counter (2 bytes)
ram0B equ $0B ;Output Compare (2 bytes)
ram80 equ $80 ;number build store MSB
ram81 equ $81 ;number build store LSB
ram82 equ $82 ;logic AND/OR function store
ram83 equ $83
ram84 equ $84 ;vartype flag
ram85 equ $85 ;data token flag
ram86 equ $86
ram87 equ $87 ;READ cmd status flag
ram88 equ $88
ram89 equ $89 ;address temp store
ram8B equ $8B
TBL008C equ $8C
TBL008D equ $8D ; DIGIT 4 MSB
ram8E equ $8E ; 3
ram8F equ $8F ; 2
ram90 equ $90 ; 1 LSB
ram91 equ $91 ; stack pointer store
ram93 equ $93 ; start of BASIC memory
ram95 equ $95 ; start of variable space
ram97 equ $97 ; start of dimensioned variable space
ram99 equ $99 ; end of variables.
ram9B equ $9B ; start of string space
ram9D equ $9D ; next free string store
ram9F equ $9F ; address build store
ramA1 equ $A1 ; top of string storage
ramA3 equ $A3
ramA5 equ $A5
ramA7 equ $A7 ; program break address MSB
ramA8 equ $A8 ; program break address LSB
ramA9 equ $A9
ramAB equ $AB
ramAD equ $AD ; DATA pointer
ramAF equ $AF ; LIST command end line no.
ramB1 equ $B1
ramB2 equ $B2
ramB3 equ $B3
ramB5 equ $B5 ; FOR-NEXT var pointer
ramB7 equ $B7
ramB9 equ $B9
TBL00BA equ $BA ; EXPONENT
ramBB equ $BB ; DIGIT 4-3
ramBD equ $BD ; DIGIT 2-1
ramBF equ $BF ; SIGN
ramC0 equ $C0
ramC1 equ $C1
ramC2 equ $C2
TBL00C4 equ $C4
ramC5 equ $C5
ramC7 equ $C7
ramC9 equ $C9 ; EXPONENT [FPA0]
ramCA equ $CA ; DIGIT 4 MSB
ramCB equ $CB ; DIGIT 3
ramCC equ $CC ; DIGIT 2
ramCD equ $CD ; DIGIT 1 LSB
ramCE equ $CE ; SIGN
ramCF equ $CF
ramD0 equ $D0
ramD2 equ $D2
ramD5 equ $D5
ramD6 equ $D6 ; EXPONENT [FPA1]
ramD7 equ $D7 ; DIGIT 4 MSB
ramD8 equ $D8 ; DIGIT 3
ramD9 equ $D9 ; DIGIT 2
ramDA equ $DA ; DIGIT 1 LSB
ramDB equ $DB ; SIGN
ramDC equ $DC ; SIGN
ramDD equ $DD
ramDE equ $DE ; end of string address MSB
ramDF equ $DF ; end of string address LSB
ramE2 equ $E2 ; filename screen pointer
ramE4 equ $E4 ; i/o tab field
ramE5 equ $E5 ; i/o last tab field
ramE6 equ $E6 ; max line length MSB
ramE7 equ $E7 ; max line length LSB
ramE8 equ $E8 ; I/O select 0=screen -1=printer
ramE9 equ $E9
ramEA equ $EA ; warm start setup flag =$55
LBL00EB equ $EB ; bump interpreter pointer
LBL00F3 equ $F3 ; A <- [address ptr]
ramF4 equ $F4 ; address ptr MSB
ramF5 equ $F5 ; address ptr LSB
TBL4000 equ $4000 ; start of screen mem
TBL41FD equ $41FD ; start clearing.
FNC_USR equ $4215 ; USR command address
ram4218 equ $4218 ; random number seed word 1
ram421A equ $421A ; random number seed word 2
ram421C equ $421C ; upcase flag
ram421D equ $421D ; keyboard debounce delay $045E
ram421F equ $421F ; default EXEC address $EC2E
ram4221 equ $4221
ram4223 equ $4223 ; printer baud rate $0080
ram4225 equ $4225 ; cr. delay count $0001
ram4227 equ $4227 ; tab field width 16
ram4229 equ $4229 ; last tab zone 112
ram422A equ $422A ; printer line length max MSB 88
ram422B equ $422B ; printer line length max LSB 132
ram422C equ $422C ; cassette 1200/2400Hz partition 21 ($15)
ram422D equ $422D ; upper limit of 1200 Hz
ram422E equ $422E ; lower limit of 2400 Hz
ram422F equ $422F ; number of 55's in leader MSB
TBL4230 equ $4230 ; number of 55's in leader LSB 128; kyboard scan buff 4231-8.
ram4239 equ $4239 ; keyboard strobe store
ram423A equ $423A ; keyboard control key flag
ram423B equ $423B ; keyboard break flag
ram423C equ $423C
ram423D equ $423D ; string buffer pointer
ram423F equ $423F
TBL4241 equ $4241 ; string buffer
ram4250 equ $4250 ; end of memory pointer
ram4252 equ $4252
ram4253 equ $4253
ram4254 equ $4254 ; random number store 1
ram4255 equ $4255 ; random number store 2
TBL4256 equ $4256 ; file name length
TBL4257 equ $4257 ; SKIP/LOAD file name
TBL425F equ $425F ; TAPE file name block
ram4267 equ $4267 ; file type flag
ram426A equ $426A ; EXEC address offset
ram426C equ $426C ; LOAD address
ram426E equ $426E ; NEW command status flag
ram426F equ $426F
ram4271 equ $4271
ram4273 equ $4273
ram4274 equ $4274
ram4275 equ $4275 ; cass block type flag
ram4276 equ $4276 ; cass block length
ram4278 equ $4278 ; cass buffer address
ram427A equ $427A ; cass sumcheck
ram427B equ $427B ; cass load status flag
ram427C equ $427C ; cass byte load bit counter
ram427D equ $427D ; tone duration counter
ram427E equ $427E ; cass polarity flag
ram427F equ $427F ; last keyboard input char
ram4280 equ $4280 ; cursor address MSB
ram4281 equ $4281 ; cursor address LSB
ram4282 equ $4282 ; cursor color
ram4283 equ $4283 ; break status flag
ram4284 equ $4284 ; LIST command status flag
LBL4285 equ $4285 ; input char command extension
LBL4288 equ $4288 ; output char command extension
LBL428B equ $428B ; output char command extension
LBL428E equ $428E ; NEW command extension
LBL4291 equ $4291 ; build command line extension
LBL4294 equ $4294 ; maths command extension
LBL4297 equ $4297 ; error return extension 1
LBL429A equ $429A ; error return extension 2
LBL429D equ $429D ; fp-acc number transfer extension
LBL42A0 equ $42A0 ; RUN command extension
LBL42A3 equ $42A3 ; command token lookup extension
LBL42A6 equ $42A6 ; LIST command extension
LBL42A9 equ $42A9
LBL42AC equ $42AC
ram42AF equ $42AF
ram42B0 equ $42B0
TBL42B1 equ $42B1
TBL42B2 equ $42B2 ; command line buffer
TBL4333 equ $4333
TBL4334 equ $4334
TBL4335 equ $4335 ; binary-decimal conversion buffer
TBL4346 equ $4346
ioBFFF equ $BFFF
org $E000
; --- Function vector table ---
TBLE000 FDB FNC_SGN ; $F2BA SGN
FDB FNC_INT ; $F335 INT
FDB FNC_ABS ; $F2D5 ABS
FDB FNC_USR ; $4215 USR
FDB FNC_RND ; $F62A RND
FDB FNC_SQR ; $F54D SQR
FDB FNC_LOG ; $F0B9 LOG
FDB FNC_EXP ; $F5C9 EXP
FDB FNC_SIN ; $F68C SIN
FDB FNC_COS ; $F686 COS
FDB FNC_TAN ; $F6D2 TAN
FDB FNC_PEEK ; $EF5F PEEK
FDB FNC_LEN ; $EE82 LEN
FDB FNC_STR ; $ECED STR$
FDB FNC_VAL ; $EF1C VAL
FDB FNC_ASC ; $EEA2 ASC
FDB FNC_CHR ; $EE8E CHR$
FDB FNC_LEFT ; $EEAD LEFT$
FDB FNC_RIGHT ; $EEC8 RIGHT$
FDB FNC_MID ; $EECF MID$
FDB FNC_POINT ; $FB9C POINT
FDB FNC_VARPTR ; $FC11 VARPTR
FDB FNC_INKEY ; $FBED INKEY$
FDB FNC_MEM ; $ECDB MEM
TBLE030 FCB $79
FDB fp_ADD ; $EF80 +
FCB $79
FDB fp_SUB ; $EF75 -
FCB $7B
FDB fp_MUL ; $F0F1 *
FCB $7B
FDB fp_DIV ; $F1C8 /
FCB $7F
FDB fp_POW ; $F556 ^
FCB $50
FDB fp_OR+1 ; $EA8E AND (fp_AND)
FCB $46
FDB fp_OR ; $EA8D OR
;--- Tokens ---
TBLE045 FCB $46,$4F,$D2 ;FOR 80
FCB $47,$4F,$54,$CF ;GOTO 81
FCB $47,$4F,$53,$55,$C2 ;GOSUB 82
FCB $52,$45,$CD ;REM 83
FCB $49,$C6 ;IF 84
FCB $44,$41,$54,$C1 ;DATA 85
FCB $50,$52,$49,$4E,$D4 ;PRINT 86
FCB $4F,$CE ;ON 87
FCB $49,$4E,$50,$55,$D4 ;INPUT 88
FCB $45,$4E,$C4 ;END 89
FCB $4E,$45,$58,$D4 ;NEXT 8A
FCB $44,$49,$CD ;DIM 8B
FCB $52,$45,$41,$C4 ;READ 8C
FCB $4C,$45,$D4 ;LET 8D
FCB $52,$55,$CE ;RUN 8E
FCB $52,$45,$53,$54,$4F,$52,$C5 ;RESTORE 8F
FCB $52,$45,$54,$55,$52,$CE ;RETURN 90
FCB $53,$54,$4F,$D0 ;STOP 91
FCB $50,$4F,$4B,$C5 ;POKE 92
FCB $43,$4F,$4E,$D4 ;CONT 93
FCB $4C,$49,$53,$D4 ;LIST 94
FCB $43,$4C,$45,$41,$D2 ;CLEAR 95
FCB $4E,$45,$D7 ;NEW 96
FCB $43,$4C,$4F,$41,$C4 ;CLOAD 97
FCB $43,$53,$41,$56,$C5 ;CSAVE 98
FCB $4C,$4C,$49,$53,$D4 ;LLIST 99
FCB $4C,$50,$52,$49,$4E,$D4 ;LPRINT 9A
FCB $53,$45,$D4 ;SET 9B
FCB $52,$45,$53,$45,$D4 ;RESET 9C
FCB $43,$4C,$D3 ;CLS 9D
FCB $53,$4F,$55,$4E,$C4 ;SOUND 9E
FCB $45,$58,$45,$C3 ;EXEC 9F
FCB $53,$4B,$49,$50,$C6 ;SKIPF A0
FCB $54,$41,$42,$A8 ;TAB( A1
FCB $54,$CF ;TO A2
FCB $54,$48,$45,$CE ;THEN A3
FCB $4E,$4F,$D4 ;NOT A4
FCB $53,$54,$45,$D0 ;STEP A5
FCB $4F,$46,$C6 ;OFF A6
FCB $AB ;+ A7
FCB $AD ;- A8
FCB $AA ;* A9
FCB $AF ;/ AA
FCB $DE ;^ AB
FCB $41,$4E,$C4 ;AND AC
FCB $4F,$D2 ;OR AD
FCB $BE ;> AE
FCB $BD ;= AF
FCB $BC ;< B0
FCB $53,$47,$CE ;SGN B1
FCB $49,$4E,$D4 ;INT B2
FCB $41,$42,$D3 ;ABS B3
FCB $55,$53,$D2 ;USR B4
FCB $52,$4E,$C4 ;RND B5
FCB $53,$51,$D2 ;SQR B6
FCB $4C,$4F,$C7 ;LOG B7
FCB $45,$58,$D0 ;EXP B8
FCB $53,$49,$CE ;SIN B9
FCB $43,$4F,$D3 ;COS BA
FCB $54,$41,$CE ;TAN BB
FCB $50,$45,$45,$CB ;PEEK BC
FCB $4C,$45,$CE ;LEN BD
FCB $53,$54,$52,$A4 ;STR$ BE
FCB $56,$41,$CC ;VAL BF
FCB $41,$53,$C3 ;ASC C0
FCB $43,$48,$52,$A4 ;CHR$ C1
FCB $4C,$45,$46,$54,$A4 ;LEFT$ C2
FCB $52,$49,$47,$48,$54,$A4 ;RIGHT$ C3
FCB $4D,$49,$44,$A4 ;MID$ C4
FCB $50,$4F,$49,$4E,$D4 ;POINT C5
FCB $56,$41,$52,$50,$54,$D2 ;VARPTR C6
FCB $49,$4E,$4B,$45,$59,$A4 ;INKEY$ C7
FCB $4D,$45,$CD ;MEM C8
FCB $00
; --- Command vector table ---
TBLE148 FDB CMD_FOR ; $E4C4 FOR
FDB CMD_GOTO ; $E61A GOTO
FDB CMD_GOSUB ; $E604 GOSUB
FDB CMD_REM ; $E685 REM
FDB CMD_IF ; $E672 IF
FDB CMD_DATA ; $E651 DATA
FDB CMD_PRINT ; $E71F PRINT
FDB CMD_ON ; $E692 ON
FDB CMD_INPUT ; $E7DE INPUT
FDB CMD_END ; $E57F END
FDB CMD_NEXT ; $E8BB NEXT
FDB CMD_DIM ; $EB12 DIM
FDB CMD_READ ; $E80E READ
FDB CMD_LET ; $E6D3 LET
FDB CMD_RUN ; $E5FA RUN
FDB CMD_RESTORE ; $E560 RESTORE
FDB CMD_RETURN ; $E631 RETURN
FDB CMD_STOP ; $E57E STOP
FDB CMD_POKE ; $EF66 POKE
FDB CMD_CONT ; $E5A6 CONT
FDB CMD_LIST ; $E40D LIST
FDB CMD_CLEAR ; $E5B8 CLEAR
FDB CMD_NEW ; $E3CD NEW
FDB CMD_CLOAD ; $FD5C CLOAD
FDB CMD_CSAVE ; $FC3B CSAVE
FDB CMD_LLIST ; $E40B LLIST
FDB CMD_LPRINT ; $E71C LPRINT
FDB CMD_SET ; $FB25 SET
FDB CMD_RESET ; $FB55 RESET
FDB CMD_CLS ; $FBBF CLS
FDB CMD_SOUND ; $FFA5 SOUND
FDB CMD_EXEC ; $FC04 EXEC
FDB CMD_SKIPF ; $FE2F SKIPF
; --- Errors ---
TBLE18A FCB $4E,$46 ;$00 NF NEXT without FOR
FCB $53,$4E ;$02 SN Syntax Error
FCB $52,$47 ;$04 RG RETURN without GOSUB
FCB $4F,$44 ;$06 OD Out of Data
FCB $46,$43 ;$08 FC Illegal Function Call
FCB $4F,$56 ;$0A OV Overflow
FCB $4F,$4D ;$0C OM Out of Memory
FCB $55,$4C ;$0E UL Undefined Line
FCB $42,$53 ;$20 BS Bad Subscript
FCB $44,$44 ;$22 DD Double Dimensioned Array
FCB $2F,$30 ;$24 /0 Division by 0
FCB $49,$44 ;$26 ID Illegal Direct Statement
FCB $54,$4D ;$28 TM Type Mismatch
FCB $4F,$53 ;$2A OS Out of String Space
FCB $4C,$53 ;$2C LS Long String (exceeds 255 characters)
FCB $53,$54 ;$2E ST String Formula Too Complex ? ""+(""+(""+""))
FCB $43,$4E ;$30 CN Can't Continue
FCB $49,$4F ;$32 IO Input/Output Error
FCB $46,$4D ;$34 FM File Mode Error
TBLE1B0 FCB $20,$45,$52,$52,$4F,$52,$00 ; ERROR
TBLE1B7 FCB $20,$49,$4E,$20,$00 ; IN
TBLE1BC FCB $0D,$4F,$4B,$0D,$00 ; OK
TBLE1C1 FCB $0D,$42,$52,$45,$41,$4B,$00 ; BREAK
LBLE1C8 CMPA #$3A ;Leave if non-numeric. Z=':' or NULL
BHS LBLE1D7 ; C=Numeric
CMPA #$20 ;skip whitespace
BNE LBLE1D3
JMP LBL00EB
LBLE1D3 SUBA #$30
SUBA #$D0 ;Set Carry if numeric.
LBLE1D7 RTS
LBLE1D8 TSX
LDAB #$04
ABX
LBLE1DC LDAB #$12
STX ram89
LDAA ,X ; SP+0==return addr. SP+2==?. SP+4->A
SUBA #$80
BNE LBLE1FA
LDX 1,X
STX ram8B
LDX ramB5
BEQ LBLE1F6
CPX ram8B
BEQ LBLE1FA
BSR LBLE22F
BRA LBLE1DC
LBLE1F6 LDX ram8B
STX ramB5
LBLE1FA LDX ram89
TSTA
RTS
; -- copy [C1:BD]->[bf:BB]
LBLE1FE BSR LBLE21E; see if D bytes fit on stack
LBLE200 TPA
PSHA
STS ram91
SEI
LDS ramBB ; store in [BB]
LDX ramBD ; start at [BD]
INX
LBLE20A DEX
LDAA ,X
PSHA
CPX ramC1 ; stop at [C1]
BNE LBLE20A
INS
STS ramBF ; store end in [BF]
LDS ram91
PULA
TAP
RTS
LBLE21A CLRA ; return with 2*B+#$3A+ram99
ASLB ;
ADDD ram99 ; check if 2*B+3A+ram99>0xffff
LBLE21E ADDD #$003A
BLO LBLE236; ?OM error
STS ram91
SUBD ram91
BHS LBLE236; ?OM if greater than stack
ADDD ram91
RTS
LBLE22C CLRA ; B+X->D,X
LBLE22D STX ram89 ; D+X->D,X (save old X in 89. New X,D in 8B)
LBLE22F ADDD ram89 ; D+ram89->D,X.
STD ram8B
LDX ram8B
RTS
LBLE236 LDAB #$0C ;?OM error
LBLE238 JSR LBL4297 ;error return extension 1
JSR LBL429A ;error return extension 2
JSR LBLFC86
LDAA ram426E
BEQ LBLE249
JSR LBLE3CF
LBLE249 JSR LBLE3EE
CLR ramE8 ;turn off printer
JSR LBLE76A
JSR LBLE7BB+1
LDX #TBLE18A ;Error table
ABX
LDAA ,X
JSR LBLE7BE ;A->SCN
LDAA 1,X
JSR LBLE7BE ;A->SCN
LDX #TBLE1B0-1 ;"ERROR"
LBLE266 JSR LBLE7A8 ;Write string
LDX ramE2
INX
BEQ LBLE271
JSR LBLF412 ;' IN ' line
LBLE271 JSR LBLE76A
LDX #TBLE1BC ;"OK"
JSR LBLE7A8 ;Write string
LBLE27A LDX #$FFFF
STX ramE2
JSR LBLFAA4 ;Get Command Line
BLO LBLE27A ;Try again if carry set (BREAK)
STX ramF4
JSRE LBL00EB
BEQ LBLE27A ;Try again if blank line
BLO LBLE293
JSR LBLE311 ;immediate mode - compile line.
JMP LBLE53D
LBLE293 JSR LBLE6B2 ;get line number->ramA5
LDX ramA5
STX ram42B0 ;store line number
JSR LBLE311 ;compile line
STAB ram82 ;length of line
JSR LBLE3B9 ;find first line greater than line number
BLO LBLE2C1 ; none found, insert at end.
LDD ramC1
SUBD ,X
ADDD ram95
STD ram95
TPA
PSHA
STS ram91
SEI
LDS ,X
DES
LBLE2B5 PULA
STAA ,X
INX
CPX ram95
BNE LBLE2B5
LDS ram91
PULA
TAP
LBLE2C1 LDAA TBL42B2
BEQ LBLE2EB
LDD ram95
STD ramBD
ADDB ram82
ADCA #$00
STD ramBB
JSR LBLE1FE ;copy [C1:BD]->[bf:BB]
TPA
PSHA
STS ram91
SEI
LDS #$42AD
LBLE2DB PULA
STAA ,X
INX
CPX ramBF
BNE LBLE2DB
LDS ram91
PULA
TAP
LDX ramBB
STX ram95
LBLE2EB JSR LBLE3D9 ;reset variables
BSR LBLE2F3 ;adjust next statement pointers
JMP LBLE27A ;get command line
; adjust next statement pointers
LBLE2F3 LDX ram93 ;start of basic
LBLE2F5 LDD ,X ;return if last statement.
BNE LBLE2FA
RTS
LBLE2FA PSHX ;push address of statement
LDAB #$04
ABX
LBLE2FE INX
LDAA ,X
BNE LBLE2FE
INX
PSHX ;push address of next statement
TSX
LDD ,X ;addr of next statement -> D
LDX 2,X ;addr of prev statement -> X
STD ,X ;update addr of prev statment to point to next statement.
PULX
INS
INS
BRA LBLE2F5
LBLE311 CLR ram85 ;clear DATA token flag
LDX ramF4 ;reset pointer back to start of line.
DEX
STX ramF4
LDX #TBL42B1 ;start of command line buffer-1
STX ramDE
STS ram91
TPA ; save interrupt flag
STAA ram87
LBLE323 NOP
SEI ; disable interrupts
LDS ramF4
PULB
CMPB #$20 ; ' '
BEQ LBLE364
STAB ram81
CMPB #$22 ; '"'
BEQ LBLE38D
LDAA ram85
BNE LBLE364
CMPB #$3F ; '?'
BNE LBLE33E
LDAB #$86 ; 'PRINT' code
BRA LBLE364
LBLE33E CMPB #$30 ; '0'
BLO LBLE346
CMPB #$3C ; '<'
BLO LBLE364
LBLE346 TSTB ; use ! for non-printing input chars
BMI LBLE361+1
LDX #TBLE045-1 ; start matching tokens
LDS ramF4
CLRB
LBLE34F INX
LBLE350 PULA
CMPA #$20 ; skip whitespace when matching tokens
BEQ LBLE350
SUBA ,X
BEQ LBLE34F
CMPA #$80
BNE LBLE392
ORAB #$80 ; found match, store token.
LBLE35F LDX ramDE
LBLE361 CPX #$C621 ;LDAB #$21 '!'
LBLE364 STS ramF4
LDS ram91
LDAA ram87 ; restore interrupt
TAP
INX
STX ramDE
STAB ,X
BEQ LBLE3AA
SUBB #$3A ; ':'
BEQ LBLE37A
CMPB #$4B ; 'DATA' encountered
BNE LBLE37C
LBLE37A STAB ram85 ; set DATA token flag
LBLE37C SUBB #$49 ; 'REM'
BNE LBLE323 ; get next char.
STAB ram81 ; 'REM' found, clear ram81
SEI
LDS ramF4
LBLE385 PULB ; copy until 0 or ram81 encountered.
TSTB
BEQ LBLE364
CMPB ram81
BEQ LBLE364
LBLE38D INX
STAB ,X
BRA LBLE385
LBLE392 LDS ramF4 ; token failed match
INCB ; inc token count
LBLE395 LDAA ,X ;
INX
BPL LBLE395
LDAA ,X
BNE LBLE350
STS ramF4 ; no tokens matched.
LDS ram91
JSR LBL42A3
LDS ramF4
PULB
BRA LBLE35F
LBLE3AA STAB 1,X ; clear next two bytes
STAB 2,X
LDD ramDE
SUBD #$42AD ; length of buff in D.
LDX #TBL42B1
STX ramF4
RTS
LBLE3B9 LDX ram93
LBLE3BB LDD ,X
BEQ LBLE3C9
LDD ramA5
SUBD 2,X
BLS LBLE3CA
LDX ,X
BRA LBLE3BB
LBLE3C9 SEC
LBLE3CA STX ramC1
RTS
; --- NEW command ---
CMD_NEW
BNE LBLE3CA ; cause syntax error
LBLE3CF LDX ram93 ; start of BASIC
CLR ,X ; clear line
INX
CLR ,X
INX
STX ram95 ; end of BASIC
LBLE3D9 LDX ram93 ; transfer control to program
DEX
STX ramF4 ; read pointer
LBLE3DE JSR LBL428E ; NEW command extension
LDX ramA1 ; top of string storage
STX ram9D ; avail string storage.
JSR CMD_RESTORE
LDX ram95 ; end of BASIC
STX ram97 ; DATA pointer
STX ram99 ;
LBLE3EE LDX #TBL4241 ; string buff.
STX ram423D ; string ptr.
PULX
LDS ram9B ; bottom of system stack
CLRA
PSHA
STAA ramA7 ; program BREAK address
STAA ramA8 ; program BREAK address
STAA ram86 ; ?
STAA ram426E ; NEW command status flag
JMP ,X ; RTS
LBLE404 LDAB #$FE ; select printer
STAB ramE8 ; turn on printer
LBLE408 JMP LBL00F3
; --- LLIST command ---
CMD_LLIST
BSR LBLE404
; --- LIST command ---
CMD_LIST
TPA
PSHA
BSR LBLE408 ; Get char
JSR LBLE6B2 ; Get line number
BSR LBLE3B9 ; Find line number in program
PULA
TAP
PSHX
BEQ LBLE431
JSRE LBL00F3
BEQ LBLE436
CMPA #$A8 ; '-'
BNE LBLE42E
JSRE LBL00EB
BEQ LBLE431
JSR LBLE6B2
BEQ LBLE436
LBLE42E JMP LBLEA3C ;?SN ERROR
LBLE431 LDX #$FFFF
STX ramA5
LBLE436 PULX
INS
INS
LBLE439 JSR LBLE76A
JSR LBLE566
LDD ,X
BNE LBLE449
LBLE443 CLR ramE8 ; set output to printer
JMP LBLE271
LBLE449 LDD 2,X
SUBD ramA5
BHI LBLE443
LDD 2,X
PSHX
JSR LBLF419
PULX
INX
INX
INX
INX
STX ram89
CLR ram4284
LDAA #$20
LBLE461 CPX #$8621 ;LDAA #$21
LBLE464 LDX ram89
ANDA #$7F
LBLE468 JSR LBLE7BE ;A->SCN
LDAA ,X
INX
TSTA
BEQ LBLE439
LDAB ram4284
CMPA #$22 ; '"'
BNE LBLE47D
EORB #$01
STAB ram4284
LBLE47D CMPA #$3A ; ':'
BNE LBLE48A
BITB #$01
BNE LBLE48A
ANDB #$FD
STAB ram4284
LBLE48A TSTA
BPL LBLE468
TSTB
BNE LBLE468
CMPA #$85 ; 'DATA'
BNE LBLE496
ORAB #$02
LBLE496 CMPA #$83 ; 'REM'
BNE LBLE49C
ORAB #$04
LBLE49C STAB ram4284
JSR LBL42A6
CMPA #$C8 ; 'MEM'
BHI LBLE461+1 ; write ! for unknown print
BSR LBLE4B2
LBLE4A8 LDAA ,X ; write token
BMI LBLE464
INX
JSR LBLE7BE;A->SCN
BRA LBLE4A8
LBLE4B2 SUBA #$7F ;Find address of matching token->X
STX ram89 ;save X into ram89
LDX #TBLE045
LBLE4B9 DECA
BNE LBLE4BD
RTS
LBLE4BD TST ,X
INX
BPL LBLE4BD
BRA LBLE4B9
; --- FOR Command ---
CMD_FOR LDAA #$80
STAA ram86
JSR CMD_LET
JSR LBLE1D8
PULX
BNE LBLE4D5
LDX ram89
ABX
TXS
LBLE4D5 LDAB #$09
JSR LBLE21A ; Verify 9 words will fit on stack
JSR LBLE656 ; ignore rest of line until ':' seen
PSHX
LDX ramE2
PSHX
LDAB #$A2 ;'TO' index
JSR LBLEA31
JSR LBLE90E ; expect numeric
JSR LBLE90C ; Get numeric value
LDAB ramCE
ORAB #$7F
ANDB ramCA
STAB ramCA
LDX #LBLE4FA ; push C9-CA onto stack
JMP LBLE9A4
LBLE4FA LDX #TBLF08B ; 1.0
JSR LBLF251 ;X->C9-E
JSRE LBL00F3
CMPA #$A5 ;'STEP' index
BNE LBLE50D
JSRE LBL00EB
JSR LBLE90C ; Get numeric value
LBLE50D JSR LBLF2AD ;Sign C9-E -> B -1 0 1
JSR LBLE9A2
LDX ramB5
PSHX
LDAA #$80
PSHA
LBLE519 BSR LBLE566 ; check for BREAK or PAUSE
LDX ramF4
STX ramA9
LDAA ,X
BEQ LBLE52A
CMPA #$3A ; ':'
BEQ LBLE53D
LBLE527 JMP LBLEA3C ; ?SN ERROR
LBLE52A INX ; check for next line
LDAA ,X
INX
ORAA ,X
STAA ram4283 ; 0 if at last line number
BEQ LBLE589 ; Implicit END if no next line.
INX
LDD ,X
STD ramE2 ; Otherwise store current line in E2.
INX
STX ramF4
LBLE53D JSRE LBL00EB ; get token
BSR LBLE544
BRA LBLE519 ; continue executing line
LBLE544 BEQ LBLE5B7 ; RTS if 0 encountered.
LBLE546 JSR LBL42A0 ; Run command extension
TSTA
BMI LBLE54F ; Command encountered.
JMP CMD_LET ; otherwise, this must be an assignment.
LBLE54F CMPA #$A0 ; SKIPF is the last valid command.
BHI LBLE527 ; ?SN ERROR
ASLA ; lookup command.
TAB
LDX #TBLE148
ABX
LDX ,X
JSRE LBL00EB ; prefetch next character.
JMP ,X ; GO! [to command]
; --- RESTORE command ---
CMD_RESTORE
LDX ram93
DEX
LBLE563 STX ramAD ;DATA pointer
RTS
LBLE566 JSR LBLF879
BEQ LBLE576
LBLE56B CMPA #$03 ; 'break pressed?
BEQ CMD_STOP
CMPA #$13 ; 'shift+@ pressed (pause)
BEQ LBLE577 ; wait for next key.
STAA ram427F
LBLE576 RTS
LBLE577 JSR LBLF883
BEQ LBLE577
BRA LBLE56B
; --- STOP command ---
CMD_STOP
SEC
; --- END command ---
CMD_END
BNE LBLE5B7
LDX ramF4
STX ramA9
LBLE585 ROR ram4283 ; break status flag
PULX
LBLE589 LDX ramE2
INX
BEQ LBLE595
DEX
STX ramA3
LDX ramA9
STX ramA7
LBLE595 CLR ramE8 ; turn off printing
LDX #TBLE1C1-1 ; 'BREAK'
TST ram4283
BPL LBLE5A3
JMP LBLE266 ; in program
LBLE5A3 JMP LBLE271 ; not in program
; --- CONT command ---
CMD_CONT
BNE LBLE5B7
LDAB #$20 ;?CN error
LDX ramA7
BNE LBLE5B1
JMP LBLE238 ;write ?CN error
LBLE5B1 STX ramF4
LDX ramA3
STX ramE2
LBLE5B7 RTS
; --- CLEAR command ---
CMD_CLEAR
BEQ LBLE5F4
JSR LBLEBBD
PSHB
PSHA
LDX ramA1 ; top of string storage
STX ramCC
JSRE LBL00F3
BEQ LBLE5DA
JSR LBLEA2E+1 ; get ','
JSR LBLEF4C
LDX ramCC
DEX
STX ramCC
LDD ram4250 ; end of memory pointer
SUBD ramCC
BLO LBLE5F7 ; ?OM error
LBLE5DA LDD ramCC
PSHB
PSHA
TSX
SUBD 2,X
BLO LBLE5F7 ; ?OM error
STD 2,X
SUBD #$003A
BLO LBLE5F7 ; ?OM error
SUBD ram95
BLO LBLE5F7 ; ?OM error
PULX
STX ramA1 ; top of string storage
PULX
STX ram9B ; bottom of system stack
LBLE5F4 JMP LBLE3DE ; reset variables
LBLE5F7 JMP LBLE236 ; ?OM ERROR
; --- RUN command ---
CMD_RUN
BNE LBLE5FF
JMP LBLE3D9 ; transfer control to program / reset variables
LBLE5FF JSR LBLE3DE ; reset data variables
BRA LBLE612
; --- GOSUB command ---
CMD_GOSUB
LDAB #$03
JSR LBLE21A ; verify 3 words on stack
LDX ramF4
PSHX
LDX ramE2
PSHX
LDAA #$82
PSHA
LBLE612 JSRE LBL00F3
BSR CMD_GOTO
JMP LBLE519 ; Continue executing line
; --- GOTO command ---
CMD_GOTO
JSR LBLE6B2
BSR LBLE658+1
INX
LDD ramA5
SUBD ramE2
BHI LBLE628
LDX ram93
LBLE628 JSR LBLE3BB
BLO LBLE641+1 ;?UL error
DEX
STX ramF4
LBLE630 RTS
; --- RETURN command ---
CMD_RETURN
BNE LBLE630 ; will ultimately result in ?SN error
LDAA #$FF
STAA ramB5
JSR LBLE1D8
TXS
CMPA #$02
BEQ LBLE64A
LDAB #$04 ;?RG error
LBLE641 CPX #$C60E ;LDAB #$0E ?UL error
JMP LBLE238 ;Write error
LBLE647 JMP LBLEA3C ;?SN error
LBLE64A PULA
PULX
STX ramE2
PULX
STX ramF4
; --- DATA command ---
CMD_DATA
BSR LBLE656 ; ignore rest of line until ':' or 0 reached.
STX ramF4
LBLE655 RTS
LBLE656 LDAB #$3A ; ignore rest of line until ':' or 0 reached.
LBLE658 LDAA #$5F ;CLRB; ignore rest of line
STAB ram80
CLRB
LDX ramF4
LBLE65F TBA
LDAB ram80
STAA ram80
LBLE664 LDAA ,X
BEQ LBLE655
CBA
BEQ LBLE655
INX
CMPA #$22 ; '"'
BEQ LBLE65F
BRA LBLE664
; --- IF command ---
CMD_IF
JSR LBLE90C ; Get numeric value
JSRE LBL00F3
CMPA #$81 ; GOTO
BEQ LBLE681
LDAB #$A3 ; THEN
JSR LBLEA31
LBLE681 LDAA ramC9
BNE LBLE68A
; --- REM command ---
CMD_REM BSR LBLE658+1
STX ramF4
RTS
LBLE68A JSRE LBL00F3
BLO CMD_GOTO
JMP LBLE544
; --- ON command ----
CMD_ON JSR LBLEF0D ; Arg->ramCD
PSHA
CMPA #$82 ; GOSUB
BEQ LBLE69E
CMPA #$81 ; GOTO
LBLE69C BNE LBLE647 ; ?SN ERROR
LBLE69E DEC ramCD
BNE LBLE6A7
PULA
JMP LBLE546
LBLE6A7 JSRE LBL00EB
BSR LBLE6B2 ; get line number->A5
CMPA #$2C ; ','
BEQ LBLE69E
INS
LBLE6B1 RTS ; bug -- "0 ON 2 GOTO 4,#,4,4#" hangs the MC-10 on RUN.
LBLE6B2 LDX #$0000 ; get line number->ramA5
STX ramA5
LBLE6B7 BHS LBLE6B1
SUBA #$30
STAA ram80
LDD ramA5 ; Get line number
CMPA #$18 ; err if > 6399
BHI LBLE69C ; ?SN ERROR
ASLD ; ramA5 = 10*ramA5 + ram80
ASLD
ADDD ramA5
ASLD
ADDB ram80
ADCA #$00
STD ramA5
JSRE LBL00EB
BRA LBLE6B7
; --- LET command ---
CMD_LET
JSR LBLEB1B
STX ramB5
LDAB #$AF
JSR LBLEA31
LDAA ram84 ; vartype flag
PSHA
JSR LBLE91A
PULA
RORA
JSR LBLE910 ;check for ?TM and get next number
BEQ LBLE719
LBLE6EA LDX ramCC
LDD ram9B ; bottom of system stack
SUBD 2,X
BHS LBLE705
LDD ram95
SUBD ramCC
BHI LBLE705
LDAB ,X
JSR LBLECFC
LDX ramC7
JSR LBLEE38
LDX #ramD0
LBLE705 STX ramC7
JSR LBLEE70
LDX ramC7
LDAA ,X
PSHA
LDD 2,X
LDX ramB5
STD 2,X
PULA
STAA ,X
RTS
LBLE719 JMP LBLF26F+1
; --- LPRINT command ---
CMD_LPRINT
JSR LBLE404
; --- PRINT command ---
CMD_PRINT
BSR LBLE725
CLR ramE8 ; turn off printing
RTS
LBLE725 BEQ LBLE766
CMPA #$40 ; '@'
BNE LBLE736
JSR LBLFC29
JSRE LBL00F3
BEQ LBLE766
JSR LBLEA2E+1 ; get ','
LBLE736 BEQ LBLE773
LBLE738 CMPA #$A1
BEQ LBLE78C
CMPA #$2C
BEQ LBLE774
CMPA #$3B
BEQ LBLE7A2
JSR LBLE91A
LDAA ram84 ; vartype flag
PSHA
BNE LBLE752
JSR LBLF426
JSR LBLED05
LBLE752 BSR LBLE7AB
PULB
TSTB
BNE LBLE761
JSRE LBL00F3
CMPA #$2C
BEQ LBLE774
BSR LBLE7B9
LBLE761 JSRE LBL00F3
BNE LBLE738
LBLE766 LDAA #$0D
BRA LBLE7BE ;A->SCN
LBLE76A JSR LBLFA7B
BEQ LBLE766
LDAA ramE6
BNE LBLE766
LBLE773 RTS
LBLE774 JSR LBLFA7B
BEQ LBLE783
LDAB ramE6
CMPB ramE5
BLO LBLE785
BSR LBLE766
BRA LBLE7A2
LBLE783 LDAB ramE6
LBLE785 SUBB ramE4
BHS LBLE785
NEGB
BRA LBLE79D
LBLE78C JSR LBLEF0A
CMPA #$29
BEQ LBLE796
JMP LBLEA3C ;?SN ERROR
LBLE796 JSR LBLFA7B
SUBB ramE6
BLS LBLE7A2
LBLE79D BSR LBLE7B9
DECB
BNE LBLE79D
LBLE7A2 JSRE LBL00EB
JMP LBLE736
; --- Write string to screen ---
LBLE7A8 JSR LBLED06 ;Calc string length
LBLE7AB JSR LBLEE56 ;Get length to B, start address to X
INCB
LBLE7AF DECB ;Dec char count
BEQ LBLE773 ;RTS
LDAA ,X ;Get char
INX ;Inc char ptr
BSR LBLE7BE ;A->SCN Write char
BRA LBLE7AF ;Next char
LBLE7B9 LDAA #$20
LBLE7BB CPX #$863F ;LDAA #$3F
LBLE7BE JMP LBLF9C6 ;A->SCN
TBLE7C1 FCB $3F,$52,$45,$44,$4F,$0D,$00 ;?REDO
LBLE7C8 LDAA ram87
BEQ LBLE7D3
LDX ramAB
STX ramE2
JMP LBLEA3C ;?SN ERROR
LBLE7D3 LDX #TBLE7C1-1
JSR LBLE7A8
LDX ramA9
STX ramF4
LBLE7DD RTS
; --- INPUT command ---
CMD_INPUT
LDAB #$16 ;?ID error
LDX ramE2
INX
BNE LBLE7E8
JMP LBLE238 ;write ?ID error
LBLE7E8 CMPA #$22 ;check for "Prompt";
BNE LBLE7F7
JSR LBLEA07 ; scan string until '"' reached.
LDAB #$3B
JSR LBLEA31 ;expect and skip ';'
JSR LBLE7AB ;write string to screen.
LBLE7F7 BSR LBLE7FF ;"? " and get command line
LDAB #$2C
STAB ,X
BRA LBLE810+1
LBLE7FF JSR LBLE7BB+1 ; "?"->SCN
JSR LBLE7B9 ; " "->SCN
JSR LBLFAA4 ; get command line
BHS LBLE7DD
PULX
JMP LBLE585 ;break pressed - abort prog
; --- READ command ---
CMD_READ
LDX ramAD ;DATA pointer
LBLE810 LDAA #$4F ;CLRA [used during INPUT command]
STAA ram87
STX ramAF
LBLE816 JSR LBLEB1B ; Get Var
STX ramB5
LDX ramF4
STX ramA5
LDX ramAF
LDAA ,X
BNE LBLE82E
LDAA ram87
BNE LBLE877
JSR LBLE7BB+1
BSR LBLE7FF
LBLE82E STX ramF4
JSRE LBL00EB
LDAB ram84 ;vartype flag
BEQ LBLE853
LDX ramF4
STAA ram80
CMPA #$22
BEQ LBLE846
DEX
LDAA #$3A
STAA ram80
LDAA #$2C
LBLE846 STAA ram81
JSR LBLED0C
JSR LBLEF3E
JSR LBLE6EA
BRA LBLE859
LBLE853 JSR LBLF359
JSR LBLF26F+1
LBLE859 JSRE LBL00F3
BEQ LBLE865
CMPA #$2C
BEQ LBLE865
JMP LBLE7C8
LBLE865 LDX ramF4
STX ramAF
LDX ramA5
STX ramF4
JSRE LBL00F3
BEQ LBLE897
JSR LBLEA2E+1 ; get ','
BRA LBLE816
LBLE877 STX ramF4
JSR LBLE656 ; ignore rest of line thru ':'
INX
TSTA
BNE LBLE88F
LDAB #$06
LDAA ,X
ORAA 1,X
BEQ LBLE8CE
LDD 2,X
STD ramAB
LDAB #$04
ABX
LBLE88F LDAA ,X
CMPA #$85
BNE LBLE877
BRA LBLE82E
LBLE897 LDX ramAF
LDAB ram87
BEQ LBLE8A0
JMP LBLE563
LBLE8A0 LDAA ,X
BEQ LBLE8AA
LDX #LBLE8AB-1
JMP LBLE7A8
LBLE8AA RTS
LBLE8AB FCB $3F,$45,$58,$54,$52,$41,$20,$49,$47,$4E,$4F,$52,$45,$44,$0D,$00 ;?EXTRA IGNORED
; --- NEXT command ---
CMD_NEXT
BNE LBLE8C2
LDX #$0000
BRA LBLE8C5
LBLE8C2 JSR LBLEB1B ;Get Var
LBLE8C5 STX ramB5
JSR LBLE1D8
BEQ LBLE8D0
LDAB #$00 ;?NF error
LBLE8CE BRA LBLE917 ;write error
LBLE8D0 TXS
INX
INX
INX
JSR LBLF251 ;X->C9-E
TSX
LDAA $08,X
STAA ramCE
LDX ramB5
JSR LBLEF7D
JSR LBLF26F+1
TSX
LDAB #$09
ABX
JSR LBLF2D9
TSX
SUBB $08,X
BEQ LBLE8FC
LDX $0E,X
STX ramE2
TSX
LDX $10,X
STX ramF4
LBLE8F9 JMP LBLE519 ; continue executing line
LBLE8FC LDAB #$12
ABX
TXS
JSRE LBL00F3
CMPA #$2C ; ','
BNE LBLE8F9 ; continue executing line
JSRE LBL00EB
BSR LBLE8C2
LBLE90C BSR LBLE91A
LBLE90E TST $0D,X ;SEC E-expect numeric? F-expect string?
LBLE910 ROR ram84 ;vartype flag
BVC LBLE8AA ;RTS
LDAB #$18 ;?TM error
LBLE917 JMP LBLE238
LBLE91A LDX ramF4
DEX
STX ramF4
CLRA
LBLE920 LDAB #$37 ;PSHB
PSHA
LDAB #$01
JSR LBLE21A ; see if 1 word fits on stack
JSR LBLE9E5
CLR ramB9
LBLE92E JSRE LBL00F3
LBLE931 SUBA #$AE ; '>' ; + - * / ^ AND OR > = <
BLO LBLE949
CMPA #$03 ; SGN
BHS LBLE949
CMPA #$01
ROLA
EORA ramB9
CMPA ramB9
BLO LBLE99B
STAA ramB9
JSRE LBL00EB
BRA LBLE931
LBLE949 LDAB ramB9
BNE LBLE978
BHS LBLE9B5
ADDA #$07 ; + - * / ^ AND OR > = <
BHS LBLE9B5
ADCA ram84 ; vartype flag
BNE LBLE95A
JMP LBLEE06
LBLE95A ADCA #$FF
TAB ; B = A*3
ASLA
ABA
TAB
LDX #TBLE030
ABX
LBLE964 PULA
CMPA ,X
BHS LBLE9BC
BSR LBLE90E ;expect numeric
LBLE96B PSHA
BSR LBLE991
LDX ramB7
PULA
BNE LBLE98B
TSTA
BEQ LBLE9E2
BRA LBLE9C5
LBLE978 ASL ram84
ROLB
LDX ramF4
DEX
STX ramF4
LDX #TBLE988
STAB ramB9
BRA LBLE964
TBLE988 FCB $64,$EA,$AE
LBLE98B CMPA ,X
BHS LBLE9C5
BRA LBLE96B
LBLE991 LDD 1,X
PSHB ;push binary fp operation onto stack.
PSHA
BSR LBLE99E ;push CE onto stack.
LDAB ramB9
BRA LBLE920+1
LBLE99B JMP LBLEA3C ;?SN ERROR
LBLE99E LDAB ramCE ;push C9-CE onto stack.
LDAA ,X
LBLE9A2 PULX
PSHB
LBLE9A4 LDAB ramCD ;push C9 onto stack and return.
PSHB
LDAB ramCC
PSHB
LDAB ramCB
PSHB
LDAB ramCA
PSHB
LDAB ramC9
PSHB
JMP ,X
LBLE9B5 LDX #$0000
PULA
TSTA
BEQ LBLE9E2
LBLE9BC CMPA #$64
BEQ LBLE9C3
JSR LBLE90E ; expect numeric
LBLE9C3 STX ramB7
LBLE9C5 PULB
CMPA #$5A
BEQ LBLE9E4 ;RTS
CMPA #$7D
BEQ LBLE9E4 ;RTS
LSRB
STAB ram88
PULA
PULB
STD ramD6
PULX
STX ramD8
PULB
STAB ramDA
PULB
STAB ramDB
EORB ramCE
STAB ramDC
LBLE9E2 LDAB ramC9
LBLE9E4 RTS
LBLE9E5 JSR LBL4294 ; maths command extension
CLR ram84 ; vartype flag
BSR LBLEA39 ; get next char
BHS LBLE9F2 ; go if not numeric
LBLE9EF JMP LBLF359 ; get FP number
LBLE9F2 JSR LBLEB76 ; is_alpha()?
BHS LBLEA49 ; go if alpha()
CMPA #$2E ; '.'
BEQ LBLE9EF
CMPA #$A8 ; '-'
BEQ LBLEA41
CMPA #$A7 ; '+'
BEQ LBLE9E5
CMPA #$22 ; '"'
BNE LBLEA0F
LBLEA07 LDX ramF4
JSR LBLED06
JMP LBLEF3E
LBLEA0F CMPA #$A4 ; ? NOT
BNE LBLEA20
LDAA #$5A
JSR LBLE920+1
JSR LBLEBC7 ;get result into D
COMA ;perform bitwise negation
COMB
JMP LBLECE3 ;return D
LBLEA20 SUBA #$B1 ; start of function tokens [SGN()]
BHS LBLEA55 ;go if a function
LBLEA24 BSR LBLEA2B+1 ;otherwise, must be a parenthetical expression
JSR LBLE91A
LBLEA29 LDAB #$29 ; ')' expect and skip char.
LBLEA2B CPX #$C628 ;LDAB #$28 '('
LBLEA2E CPX #$C62C ;LDAB #$2C ','
LBLEA31 PSHX
LDX ramF4
CMPB ,X
PULX
BNE LBLEA3C ;?SN error
LBLEA39 JMP LBL00EB
LBLEA3C LDAB #$02 ;?SN error
JMP LBLE238
LBLEA41 LDAA #$7D
JSR LBLE920+1
JMP LBLF593
LBLEA49 JSR LBLEB1B ; :get/init var
STX ramCC
LDAA ram84 ;vartype flag
BNE LBLE9E4
JMP LBLF251 ;X->C9-E
LBLEA55 TAB
ASLB
BSR LBLEA39 ;get next char
PSHB
CMPB #$22 ;'"'
BLO LBLEA7F
CMPB #$2C ;','
BHS LBLEA81
BSR LBLEA2B+1 ;get '('
PULB
CMPB #$28 ;'('
BHS LBLEA82
PSHB
JSR LBLE91A
BSR LBLEA2E+1 ;get ','
JSR LBLE90E+1 ;expect string
PULA
LDX ramCC
PSHX
PSHA
JSR LBLEF0D
PULA
PSHB
TAB
BRA LBLEA82
LBLEA7F BSR LBLEA24
LBLEA81 PULB
LBLEA82 LDX #TBLE000
ABX
LDX ,X
JSR ,X
JMP LBLE90E ; expect numeric
fp_OR LDAA #$4F ; perform fp OR. CLRA -- perform fp_AND.
STAA ram82
JSR LBLEBC7 ; get result->D
STD ram80
JSR LBLF28B ; copy D6->C9. Clear DD.
JSR LBLEBC7 ; get result->D
TST ram82
BNE LBLEAA7
ANDA ram80 ; perform the AND
ANDB ram81
BRA LBLEAAB
LBLEAA7 ORAA ram80 ; perform the OR
ORAB ram81
LBLEAAB JMP LBLECE3 ; return D.
; probably < = > ??
fp_EAAE JSR LBLE910 ; check for ?TM and get next number
BNE LBLEAC3
LDAA ramDB
ORAA #$7F
ANDA ramD7
STAA ramD7
LDX #ramD6
JSR LBLF2D9
BRA LBLEB03
LBLEAC3 CLR ram84 ; vartype flag
DEC ramB9
JSR LBLEE56
STAB ramD0
STX ramD2
LDX ramD9
JSR LBLEE58
LDAA ramD0
SBA
BEQ LBLEAE1
LDAA #$01
BHS LBLEAE1
LDAB ramD0
NEGA
LBLEAE1 STAA ramCE
TPA
PSHA
STS ram91
SEI
TXS
LDX ramD2
INCB
DEX
LBLEAED DECB
BNE LBLEAF4
LDAB ramCE
BRA LBLEAFF
LBLEAF4 PULA
INX
CMPA ,X
BEQ LBLEAED
LDAB #$FF
BHS LBLEAFF
NEGB
LBLEAFF LDS ram91
PULA
TAP
LBLEB03 ADDB #$01
ROLB
ANDB ram88
BEQ LBLEB0C
LDAB #$FF
LBLEB0C JMP LBLF2BC
LBLEB0F JSR LBLEA2E+1 ; get ','
; --- DIM command ---
CMD_DIM
TAB
BSR LBLEB1F
JSRE LBL00F3
BNE LBLEB0F
RTS
LBLEB1B CLRB
JSRE LBL00F3 ;Get current char
LBLEB1F STAB ram83 ;
STAA ramB1
JSRE LBL00F3
BSR LBLEB76 ;Check for A-Z
BHS LBLEB2D
JMP LBLEA3C ;?SN error
LBLEB2D CLRB
STAB ram84 ; vartype flag
JSRE LBL00EB ; get next char
BLO LBLEB39 ; go if numeric
BSR LBLEB76 ; check for A-Z
BLO LBLEB43 ; go if not
LBLEB39 TAB ; B holds second char (0) if none.
LBLEB3A JSRE LBL00EB ; skip until first non-alphanumeric char
BLO LBLEB3A ; '
BSR LBLEB76 ; '
BHS LBLEB3A ; '
LBLEB43 CMPA #$24 ; check for $
BNE LBLEB4F
COM ram84 ; vartype flag FF=string 00=numeric
ADDB #$80 ; mask second char of B if string
JSRE LBL00EB ; get next char
LBLEB4F STAB ramB2 ; B1-B2 hold varname.
LDAB ram86 ; 01 if in CSAVE* or CLOAD* 80 if in FOR 0 else?
DECB
BNE LBLEB59
JMP LBLEC07
LBLEB59 ADDA ram86
SUBA #$28 ;'('
BNE LBLEB62
JMP LBLEBDE
LBLEB62 CLR ram86
LDX ram95 ; start of variable space
LBLEB67 CPX ram97 ; start of dim variable space
BEQ LBLEB7F ; go if varname not found
LDD ramB1
SUBD ,X
BEQ LBLEBB0 ; go if varname found
LDAB #$07
ABX
BRA LBLEB67 ; try again
LBLEB76 CMPA #$41 ; 'A'
BLO LBLEB7E
SUBA #$5B ; 'Z'
SUBA #$A5 ;-'Z'
LBLEB7E RTS
LBLEB7F PULX ;Varname not found. find caller
PSHX
CPX #$EA4C ;were we called from EA49?
BNE LBLEB8A ;yes, insert variable
LDX #TBLEBB7 ;[X]=0
RTS
LBLEB8A LDD ram99 ;end of arrays
STD ramBD ;
ADDD #$0007 ;length of var
STD ramBB ;
LDX ram97 ;start of arrays
STX ramC1 ;
JSR LBLE1FE ;copy [C1:BD]->[bf:BB]
LDX ramBB ;
STX ram99 ;bump end of arrays
LDX ramBF ;
STX ram97 ;bump start of arrays
LDX ramC1 ;get destination of variable
LDD ramB1 ;get varname
STD ,X ;store varname
CLRA
CLRB
STD 2,X ;initialize variable to zero
STD 4,X
STAA 6,X
LBLEBB0 INX
INX
STX ramB3 ;?start of array data
RTS
TBLEBB5 FCB $90
FCB $80
TBLEBB7 FCB $00
FCB $00
FCB $00
LBLEBBA JSRE LBL00EB
LBLEBBD JSR LBLE90C
LBLEBC0 JSR LBLE90E ;expect numeric
LDAA ramCE
BMI LBLEC2D+1 ;?FC error
LBLEBC7 JSR LBLE90E ;expect numeric
LDAA ramC9
CMPA #$90
BLO LBLEBD8
LDX #TBLEBB5 ; -32768.0
JSR LBLF2D9 ; compare [X] with C9-E.
BNE LBLEC2D+1 ;?FC error
LBLEBD8 JSR LBLF30B ; C9-x -> integer
LDD ramCC
LBLEBDD RTS
LBLEBDE LDX ram83 ; Array detected...
PSHX
CLRB
LBLEBE2 PSHB
LDX ramB1
PSHX
BSR LBLEBBA
PULX
STX ramB1
PULB
INCB
STAB ram82
PULA
PULB
LDX ramCC
PSHX
PSHB
PSHA
LDAB ram82
JSRE LBL00F3
CMPA #$2C
BEQ LBLEBE2
JSR LBLEA29; get ')'
PULX
STX ram83
LDAB #$FF
LBLEC07 PSHB
LDX ram97
LBLEC0A CPX ram99
BEQ LBLEC33 ; go if not found
LDD ramB1 ; get varname
SUBD ,X
BEQ LBLEC1B ; go if found
LDD 2,X ; get length of current var
JSR LBLE22D ; D+X->D,X
BRA LBLEC0A
LBLEC1B LDAB #$12 ;?DD error
PULA
TSTA
BEQ LBLEBDD ; RTS - if found and 0 on stack
LDAA ram83
BNE LBLEC30 ;write error if in a DIM command on a previously alloc'd var.
LDAB ram82
CMPB 4,X
BEQ LBLEC87
LBLEC2B LDAB #$10 ;?BS error
LBLEC2D CPX #$C608 ;LDAB #$08 ?FC error
LBLEC30 JMP LBLE238
LBLEC33 PULA
TSTA
BEQ LBLEC2D+1 ;?FC error
LDD #$0005
STD ramDE
LDD ramB1
STD ,X
LDAB ram82
STAB 4,X
JSR LBLE21A ; see if B words fit on stack
STX ramBB
LBLEC49 LDAB #$0B
CLRA
TST ram83
BEQ LBLEC56
PULA
PULB
ADDD #$0001
LBLEC56 STD 5,X
BSR LBLECB9
STD ramDE
INX
INX
DEC ram82
BNE LBLEC49
JSR LBLE22D ; D+X->D,X
BHS LBLEC6B
JMP LBLE236 ; ?OM ERROR
LBLEC6B JSR LBLE21E ; see if D bytes fit on stack
SUBD #$0035
STD ram99
CLRA
LBLEC74 DEX
STAA 5,X
CPX ram89
BNE LBLEC74
LDX ramBB
LDAA ram99
SUBD ramBB
STD 2,X
LDAA ram83
BNE LBLECB8
LBLEC87 LDAB 4,X
STAB ram82
CLRA
CLRB
LBLEC8D STD ramDE
PULA
PULB
STD ramCC
PSHB
PSHA
SUBD 5,X
BHS LBLECD8
LDD ramDE
PULA
PULB
BEQ LBLECA3
BSR LBLECB9
ADDD ramCC
LBLECA3 INX
INX
DEC ram82
BNE LBLEC8D
STD ram89
ASLD
ASLD
ADDD ram89
ADDD #$0005
JSR LBLE22D ;D+X->D,X
STX ramB3
LBLECB8 RTS
LBLECB9 LDAA #$10
STAA ramBF
LDD 5,X
STD ram91
CLRA
CLRB
LBLECC3 ASLD
BLO LBLECD8
ASL ramDF
ROL ramDE
BHS LBLECD2
ADDD ram91
BLO LBLECD8
LBLECD2 DEC ramBF
BNE LBLECC3
RTS
LBLECD8 JMP LBLEC2B
; --- MEM function ---
FNC_MEM STS ram91
LDD ram91
SUBD ram99
FCB $21 ;"BRN CLRA"
LBLECE2 CLRA ; return value of B.
LBLECE3 CLR ram84 ; vartype flag = 0 (numeric)
STD ramCA
LDAB #$90
JMP LBLF2C3
; --- STR$ function ---
FNC_STR JSR LBLE90E ; expect numeric
LDX #TBL4334
JSR LBLF429
PULX
LDX #TBL4333
BRA LBLED06
LBLECFC STX ramC7
LBLECFE BSR LBLED5F
LBLED00 STX ramD2
STAB ramD0
RTS
LBLED05 DEX
LBLED06 LDAA #$22
STAA ram80 ;String term char #1
STAA ram81 ;String term char #2
LBLED0C INX
STX ramDC
STX ramD2
LDAB #$FF
LBLED13 INCB
LDAA ,X
BEQ LBLED26 ;Null char term
INX
CMPA ram80
BEQ LBLED21
CMPA ram81
BNE LBLED13
LBLED21 CMPA #$22
BEQ LBLED26
DEX
LBLED26 STX ramDE ;Points to non-null, non-" term char.
STAB ramD0 ;stringsize->D0
PSHB
LDD ramDC
SUBD #$4334 ;See if in command buffer
PULB
BHI LBLED3A ;Jump if in program
BSR LBLECFC
LDX ramDC
JSR LBLEE3A
LBLED3A LDX ram423D ;string buff pointer
CPX #$4250 ;end of pointer space
BNE LBLED47
LDAB #$1E ;?ST error
LBLED44 JMP LBLE238
LBLED47 LDAA ramD0 ;stringsize
STAA ,X
LDD ramD2
STD 2,X
LDAA #$FF
STAA ram84 ;vartype flag
STX ram423F ;temp str buff ptr
STX ramCC
LDAB #$05
ABX
STX ram423D ;string buff pointer
RTS
LBLED5F CLR ram85
LBLED62 PSHB
CLRA
STD ram89
LDD ram9D
SUBD ram89
SUBD ram9B ; bottom of system stack
BLO LBLED79
ADDD ram9B ; bottom of system stack
STD ram9D
LDX ram9D
INX
STX ram9F
PULB
RTS
LBLED79 LDAB #$1A ;?OS error
COM ram85
BEQ LBLED44 ;write error
BSR LBLED85
PULB
BRA LBLED62
LBLED85 LDX ramA1
LBLED87 STX ram9D
CLRA
CLRB
STD ramC5
LDX ram9B ; bottom of system stack
STX ramC1
LDX #TBL4241
LBLED94 CPX ram423D ;string buff pointer
BEQ LBLED9D
BSR LBLEDCD
BRA LBLED94
LBLED9D LDX ram95
LBLED9F CPX ram97
BEQ LBLEDA7
BSR LBLEDC7
BRA LBLED9F
LBLEDA7 STX ramBB
LBLEDA9 LDX ramBB
LBLEDAB CPX ram99
BEQ LBLEDE7
LDD 2,X
ADDD ramBB
STD ramBB
LDAA 1,X
BPL LBLEDA9
LDAB 4,X
ASLB
ADDB #$05
ABX
LBLEDBF CPX ramBB
BEQ LBLEDAB
BSR LBLEDCD
BRA LBLEDBF
LBLEDC7 LDAA 1,X
INX
INX
BPL LBLEDE3
LBLEDCD LDAB ,X
BEQ LBLEDE3
LDD 2,X
SUBD ram9D
BHI LBLEDE3
LDD 2,X
SUBD ramC1
BLS LBLEDE3
STX ramC5
LDD 2,X
STD ramC1
LBLEDE3 LDAB #$05
ABX
LBLEDE6 RTS
LBLEDE7 LDX ramC5
BEQ LBLEDE6
CLRA
LDAB ,X
DECB
ADDD ramC1
STD ramBD
LDX ram9D
STX ramBB
JSR LBLE200
LDX ramC5
LDD ramBF
STD 2,X
LDX ramBF
DEX
JMP LBLED87
LBLEE06 LDX ramCC
PSHX
JSR LBLE9E5
JSR LBLE90E+1 ; expect string
PULX
STX ramDC
LDAB ,X
LDX ramCC
ADDB ,X
BHS LBLEE1F
LDAB #$1C ;?LS error
JMP LBLE238
LBLEE1F JSR LBLECFC
LDX ramDC
LDAB ,X
BSR LBLEE38
LDX ramC7
BSR LBLEE58
BSR LBLEE3A
LDX ramDC
BSR LBLEE58
JSR LBLED3A
JMP LBLE92E
LBLEE38 LDX 2,X
LBLEE3A TPA
PSHA
STS ram91
SEI
TXS
LDX ram9F
INCB
BRA LBLEE49
LBLEE45 PULA
STAA ,X
INX
LBLEE49 DECB
BNE LBLEE45
STX ram9F
LDS ram91
PULA
TAP
RTS
LBLEE53 JSR LBLE90E+1 ;expect string
LBLEE56 LDX ramCC
LBLEE58 LDAB ,X
BSR LBLEE70
BNE LBLEE6D
LDX 7,X
DEX
CPX ram9D ; next free string store
BNE LBLEE6B
PSHB
ADDD ram9D
STD ram9D
PULB
LBLEE6B INX
RTS
LBLEE6D LDX 2,X
RTS
LBLEE70 CPX ram423F ;tmp str buff ptr
BNE LBLEE81
STX ram423D ;string buff pointer
DEX
DEX
DEX
DEX
DEX
STX ram423F ;tmp str buff ptr
CLRA
LBLEE81 RTS
; --- LEN function ---
FNC_LEN
BSR LBLEE87 ; stringlen->B
LBLEE84 JMP LBLECE2
LBLEE87 BSR LBLEE53
CLR ram84 ; vartype flag
TSTB
RTS
; --- CHR$ function ---
FNC_CHR
JSR LBLEF10
LBLEE91 LDAB #$01
JSR LBLED5F
LDAA ramCD
JSR LBLED00
STAA ,X
LBLEE9D INS
INS
LBLEE9F JMP LBLED3A
; --- ASC function ---
FNC_ASC
BSR LBLEEA6
BRA LBLEE84
LBLEEA6 BSR LBLEE87
BEQ LBLEF07 ;?FC error
LDAB ,X
RTS
; --- LEFT$ function ---
FNC_LEFT
BSR LBLEEF2
CLRA
LBLEEB0 CMPB ,X
BLS LBLEEB7
LDAB ,X
CLRA
LBLEEB7 PSHB
PSHA
JSR LBLECFE
LDX ramC7
BSR LBLEE58
PULB
ABX
PULB
JSR LBLEE3A
BRA LBLEE9F
; --- RIGHT$ function ---
FNC_RIGHT
BSR LBLEEF2
LDAA ,X
SBA
BRA LBLEEB0
; --- MID$ function ---
FNC_MID
LDAB #$FF
STAB ramCD
BSR LBLEF19
CMPA #$29 ;')'
BEQ LBLEEDC
JSR LBLEF47
LBLEEDC BSR LBLEEF2
BEQ LBLEF07 ;?FC error
CLRB
DECA
CMPA ,X
BHS LBLEEB7
TAB
SUBB ,X
NEGB
CMPB ramCD
BLS LBLEEB7
LDAB ramCD
BRA LBLEEB7
LBLEEF2 JSR LBLEA29; get ')'
TSX
LDD 5,X
STD ramC7
LDD ,X
STD 5,X
INS
INS
INS
INS
PULA
LDX ramC7
TAB
RTS
LBLEF07 JMP LBLEC2D+1 ;?FC error
LBLEF0A JSRE LBL00EB
;get arg -> B
LBLEF0D JSR LBLE90C
LBLEF10 JSR LBLEBC0
LDAA ramCC ; err if result >255
BNE LBLEF07 ;?FC error
LDAB ramCD
LBLEF19 JMP LBL00F3
; --- VAL function ---
FNC_VAL
JSR LBLEE87
BNE LBLEF24
JMP LBLEFF4
LBLEF24 JSR LBLE22C
LDAA ,X
PSHA
CLR ,X
LDX ramF4
STX ramDE
LDX ram89
STX ramF4
BSR LBLEF19
JSR LBLF359 ; get FP number
PULA
LDX ram8B
STAA ,X
LBLEF3E LDX ramDE
STX ramF4
RTS
LBLEF43 BSR LBLEF4C
STX ramA5
LBLEF47 JSR LBLEA2E+1 ;get ','
BRA LBLEF0D ;get arg into B
; get 0-65535 into X
LBLEF4C JSR LBLE90C ;get numeric var.
LBLEF4F LDAA ramCE
BMI LBLEF07 ;?FC error
LDAA ramC9
CMPA #$90
BHI LBLEF07 ;?FC error
JSR LBLF30B ;C9->integer
LDX ramCC
RTS
; --- PEEK function ---
FNC_PEEK
BSR LBLEF4F
LDAB ,X
JMP LBLECE2; return B
; --- POKE function ---
CMD_POKE
BSR LBLEF43
LDX ramA5
STAB ,X
RTS
LBLEF6D LDX #TBLF524
BRA LBLEF7D
LBLEF72 JSR LBLF160
; perform fp -
fp_SUB COM ramCE
COM ramDC
BRA fp_ADD
LBLEF7D JSR LBLF160
; peform fp +
fp_ADD TSTB
BNE LBLEF86
JMP LBLF28B ; copy D6->C9. Clear DD.
LBLEF86 LDX #ramD6
LBLEF89 TAB
BEQ LBLEFF9 ; RTS
SUBB ramC9
BEQ LBLEFFA
BMI LBLEF9C
STAA ramC9
LDAA ramDB
STAA ramCE
LDX #ramC9
NEGB
LBLEF9C CMPB #$F8
BLE LBLEFFA
CLRA
LSR 1,X
JSR LBLF080
LBLEFA6 LDAB ramDC
BPL LBLEFB5
COM 1,X
COM 2,X
COM 3,X
COM 4,X
COMA
ADCA #$00
LBLEFB5 STAA ramDD
LDAA ramCD
ADCA ramDA
STAA ramCD
LDAA ramCC
ADCA ramD9
STAA ramCC
LDAA ramCB
ADCA ramD8
STAA ramCB
LDAA ramCA
ADCA ramD7
STAA ramCA
TBA
BPL LBLF018+1
LBLEFD2 BLO LBLEFD6
BSR LBLF03C ; negate C9-E
LBLEFD6 CLRB
LBLEFD7 LDAA ramCA
BNE LBLF00F
LDAA ramCB ;shift digits left by one byte
STAA ramCA
LDAA ramCC
STAA ramCB
LDAA ramCD
STAA ramCC
LDAA ramDD
STAA ramCD
CLR ramDD
ADDB #$08
CMPB #$28
BLT LBLEFD7
LBLEFF4 CLRA
LBLEFF5 STAA ramC9
LBLEFF7 STAA ramCE
LBLEFF9 RTS
LBLEFFA BSR LBLF074 ;shift digits right by -B bits
CLC
BRA LBLEFA6
LBLEFFF INCB
ASL ramDD
ROL ramCD
ROL ramCC
ROL ramCB
ROL ramCA
LBLF00F BPL LBLEFFF
LDAA ramC9
SBA
STAA ramC9
BLS LBLEFF4
LBLF018 CPX #$2509 ;BLO LBLF024
ASL ramDD
LDAA #$00
STAA ramDD
BRA LBLF035
LBLF024 INC ramC9 ;mul by 2
BEQ LBLF058 ;?OV ERROR
ROR ramCA ;div digits by 2
ROR ramCB
ROR ramCC
ROR ramCD
LBLF035 BHS LBLF03B ; leave if we don't need to round up
BSR LBLF04B ; increment CA-CD
BEQ LBLF024 ; adjust exponenent if we broke the bank
LBLF03B RTS
LBLF03C COM ramCE ; negate C9-E
LBLF03F COM ramCA ; negate C9-D
COM ramCB
COM ramCC
COM ramCD
LBLF04B LDX ramCC
INX
STX ramCC
BNE LBLF057
LDX ramCA
INX
STX ramCA
LBLF057 RTS
LBLF058 LDAB #$0A ;?OV error
JMP LBLE238
LBLF05D LDX #TBL008C
LBLF060 LDAA 4,X ;shift digits right one byte.
STAA ramDD
LDAA 3,X
STAA 4,X
LDAA 2,X
STAA 3,X
LDAA 1,X
STAA 2,X
LDAA ramD5
STAA 1,X
LBLF074 ADDB #$08 ;if B<-8, shift digits right one byte.
BLE LBLF060
LDAA ramDD
SUBB #$08
BEQ LBLF08A
LBLF07E ASR 1,X ;if B<0 shift digits right one bit
LBLF080 ROR 2,X
ROR 3,X
ROR 4,X
RORA
INCB
BNE LBLF07E
LBLF08A RTS
TBLF08B FCB $81,$00,$00,$00,$00 ; 1.0
TBLF090 FCB $03
FCB $7F,$5E,$56,$CB,$79 ;0.43425594
FCB $80,$13,$9B,$0B,$64 ;0.57658454
FCB $80,$76,$38,$93,$16 ;0.96180076
FCB $82,$38,$AA,$3B,$20 ;2.88539007
TBLF0A5 FCB $80,$35,$04,$F3,$34 ;SQR(0.5)
TBLF0AA FCB $81,$35,$04,$F3,$34 ;SQR(2.0)
TBLF0AF FCB $80,$80,$00,$00,$00 ;-0.5
TBLF0B4 FCB $80,$31,$72,$17,$F8 ;LOG(2.0)
; --- LOG function ---
LBLF0B9
FNC_LOG
JSR LBLF2AD ;Test C9-E
BGT LBLF0C1
JMP LBLEC2D+1 ;?FC error
LBLF0C1 LDX #TBLF0A5
LDAA ramC9
SUBA #$80
PSHA
LDAA #$80
STAA ramC9
JSR LBLEF7D
LDX #TBLF0AA
JSR LBLF1C5+1
LDX #TBLF08B ; 1.0
JSR LBLEF72
LDX #TBLF090
JSR LBLF5F8
LDX #TBLF0AF
JSR LBLEF7D
PULB
JSR LBLF3E9
LDX #TBLF0B4
LBLF0EF BSR LBLF160
; perform fp *
fp_MUL BEQ LBLF15F
JSR LBLF179
LBLF0F6 LDAA #$00
STAA TBL008D
STAA ram8E
STAA ram8F
STAA ram90
LDAB ramCD
BSR LBLF12A
LDAB ramDD
STAB ram4255
LDAB ramCC
BSR LBLF12A
LDAB ramDD
STAB ram4254
LDAB ramCB
BSR LBLF12A
LDAB ramDD
STAB ram4253
LDAB ramCA
BSR LBLF12F
LDAB ramDD
STAB ram4252
JSR LBLF248
JMP LBLEFD6
LBLF12A BNE LBLF12F
JMP LBLF05D
LBLF12F SEC
LBLF130 LDAA TBL008D
RORB
BEQ LBLF15F
BHS LBLF14D
LDAA ram90
ADDA ramDA
STAA ram90
LDAA ram8F
ADCA ramD9
STAA ram8F
LDAA ram8E
ADCA ramD8
STAA ram8E
LDAA TBL008D
ADCA ramD7
LBLF14D RORA
STAA TBL008D
ROR ram8E
ROR ram8F
ROR ram90
ROR ramDD
CLC
BRA LBLF130
LBLF15F RTS
LBLF160 LDD 1,X
STAA ramDB
ORAA #$80
STD ramD7
LDAB ramDB
EORB ramCE
STAB ramDC
LDD 3,X
STD ramD9
LDAA ,X
STAA ramD6
LDAB ramC9
RTS
LBLF179 TSTA
BEQ LBLF195
ADDA ramC9
RORA
ROLA
BVC LBLF195
ADDA #$80
STAA ramC9
BNE LBLF18B
JMP LBLEFF7
LBLF18B LDAA ramDC
STAA ramCE
RTS
LBLF190 LDAA ramCE
COMA
BRA LBLF197
LBLF195 PULA
PULA
LBLF197 BMI LBLF19C
JMP LBLEFF4
LBLF19C JMP LBLF058 ; ?OV ERROR
LBLF19F JSR LBLF29F ; copy fp C9->D6
BEQ LBLF1B3 ; RTS
ADDA #$02
BLO LBLF19C ; ?OV ERROR
CLR ramDC
JSR LBLEF89
INC ramC9
BEQ LBLF19C ; ?OV ERROR
LBLF1B3 RTS
TBLF1B4 FCB $84,$20,$00,$00,$00 ; 10.0
LBLF1B9 JSR LBLF29F ;copy fp C9->D6
LDX #TBLF1B4 ;10.0
CLRB
LBLF1C0 STAB ramDC
JSR LBLF251 ;X->C9-E
LBLF1C5 CPX #$8D98 ;BSR LBLF160
; perform fp /
fp_DIV BEQ LBLF243 ; ?/0 error
NEG ramC9
BSR LBLF179
INC ramC9
BEQ LBLF19C
LDX #TBL008D
LDAB #$04
STAB ram82
LDAB #$01
LBLF1DD LDAA ramCA
CMPA ramD7
BNE LBLF1F6
LDAA ramCB
CMPA ramD8
BNE LBLF1F6
LDAA ramCC
CMPA ramD9
BNE LBLF1F6
LDAA ramCD
CMPA ramDA
BNE LBLF1F6
SEC
LBLF1F6 TPA
ROLB
BHS LBLF206
STAB ,X
INX
DEC ram82
BMI LBLF239
BEQ LBLF235
LDAB #$01
LBLF206 TAP
BLO LBLF21B
LBLF209 ASL ramDA
ROL ramD9
ROL ramD8
ROL ramD7
BLO LBLF1F6
BMI LBLF1DD
BRA LBLF1F6
LBLF21B LDAA ramDA
SUBA ramCD
STAA ramDA
LDAA ramD9
SBCA ramCC
STAA ramD9
LDAA ramD8
SBCA ramCB
STAA ramD8
LDAA ramD7
SBCA ramCA
STAA ramD7
BRA LBLF209
LBLF235 LDAB #$40
BRA LBLF206
LBLF239 RORB
RORB
RORB
STAB ramDD
BSR LBLF248
JMP LBLEFD6
LBLF243 LDAB #$14 ;?/0 error
JMP LBLE238
LBLF248 LDX TBL008D
STX ramCA
LDX ram8F
STX ramCC
RTS
LBLF251 PSHA
LDD 1,X
STAA ramCE
ORAA #$80
STD ramCA
CLR ramDD
LDAB ,X
LDX 3,X
STX ramCC
STAB ramC9
PULA
RTS
LBLF267 LDX #ramBF
BRA LBLF272 ;FPA->X
LBLF26C LDX #TBL00BA
LBLF26F CPX #$DEB5 ;LDX ramB5
LBLF272 LDAA ramC9 ; Load floating-point ACOI storage-> X.
STAA ,X
LDAA ramCE
ORAA #$7F
ANDA ramCA
STAA 1,X
LDAA ramCB
STAA 2,X
LDAA ramCC
STAA 3,X
LDAA ramCD
STAA 4,X
RTS
; copy D6->C9. Clear DD.
LBLF28B LDAA ramDB
LBLF28D STAA ramCE
LDX ramD6
STX ramC9
CLR ramDD
LDX ramD8
STX ramCB
LDX ramD9
STX ramCC
RTS
LBLF29F LDD ramC9
STD ramD6
LDX ramCB
STX ramD8
LDX ramCD
STX ramDA
TSTA
RTS
LBLF2AD LDAB ramC9
BEQ LBLF2B9
LBLF2B1 LDAB ramCE
LBLF2B3 ROLB
LDAB #$FF ; return -1 in B.
BLO LBLF2B9
NEGB ; return 1 in B.
LBLF2B9 RTS
; --- SGN function ---
FNC_SGN
BSR LBLF2AD ; Test C9-E. B = -1 0 +1
LBLF2BC STAB ramCA
CLR ramCB
LDAB #$88
LBLF2C3 LDAA ramCA
SUBA #$80
LBLF2C7 STAB ramC9
LDAA #$00
TAB
STD ramCC
STAA ramDD
STAA ramCE
JMP LBLEFD2
; --- ABS function ---
FNC_ABS
CLR ramCE ; clear sign bit
RTS
; Compare C9-E with X, returning in B
; =1 if C>X, =-1 if CB if equal
LBLF306 RORB
EORB ramCE
BRA LBLF2B3
; convert C9-x to integer (contained in CC-D)
LBLF30B LDAB ramC9
BEQ LBLF350
SUBB #$A0
LDAA ramCE ;test sign byte
BPL LBLF31B
COM ramD5
JSR LBLF03F ;negate CA-CD
LBLF31B LDX #ramC9
CMPB #$F8
BGT LBLF329
JSR LBLF074 ;shift digits right by -B bits
CLR ramD5
RTS
LBLF329 CLR ramD5
LDAA ramCE
ROLA
ROR ramCA
JMP LBLF080 ;divide CA-CD by 2^($100-B).
; --- INT function ---
LBLF335
FNC_INT
LDAB ramC9
CMPB #$A0
BHS LBLF358
BSR LBLF30B ; C9-x -> integer
STAB ramDD
LDAA ramCE
STAB ramCE
SUBA #$80
LDAA #$A0
STAA ramC9
LDAA ramCD
STAA ram80
JMP LBLEFD2
LBLF350 STAB ramCA
STAB ramCB
STAB ramCC
STAB ramCD
LBLF358 RTS
LBLF359 JSR LBL429D ;fp-acc number transfer extension
LDX #$0000
STX ramCE ;clear C9
STX ramC9
STX ramCB
STX ramCC
STX ramC1 ;clear C1
STX ramBF
BLO LBLF3D8 ;go if numeric
CMPA #$2D ; '-'
BNE LBLF376
COM ramCF
BRA LBLF37A
LBLF376 CMPA #$2B ; '+'
BNE LBLF37F
LBLF37A JSRE LBL00EB
BLO LBLF3D8
LBLF37F CMPA #$2E ; '.'
BEQ LBLF3B0
CMPA #$45 ; 'E'
BNE LBLF3B5
JSRE LBL00EB
BLO LBLF3F5
CMPA #$A8 ; '-'
BEQ LBLF39E
CMPA #$2D ; '-'
BEQ LBLF39E
CMPA #$A7 ; '+'
BEQ LBLF3A1
CMPA #$2B ; '+'
BEQ LBLF3A1
BRA LBLF3A6
LBLF39E COM ramC2
LBLF3A1 JSRE LBL00EB
BLO LBLF3F5
LBLF3A6 TST ramC2
BEQ LBLF3B5
NEG ramC1
BRA LBLF3B5
LBLF3B0 COM ramC0
BNE LBLF37A
LBLF3B5 LDAA ramC1
SUBA ramBF
STAA ramC1
BEQ LBLF3D1
BPL LBLF3C9
LBLF3BF JSR LBLF1B9
INC ramC1
BNE LBLF3BF
BRA LBLF3D1
LBLF3C9 JSR LBLF19F
DEC ramC1
BNE LBLF3C9
LBLF3D1 LDAA ramCF
BPL LBLF358
JMP LBLF593
LBLF3D8 LDAB ramBF
SUBB ramC0
STAB ramBF
PSHA
JSR LBLF19F
PULB
SUBB #$30
BSR LBLF3E9
BRA LBLF37A
LBLF3E9 JSR LBLF26C ;C9->BA
JSR LBLF2BC
LDX #TBL00BA
JMP LBLEF7D
;ramC1 = 10*ramC1+(A-$30).
LBLF3F5 LDAB ramC1
ASLB
ASLB
ADDB ramC1
ASLB
SUBA #$30
ABA
STAA ramC1
BRA LBLF3A1
TBLF403 FCB $9B,$3E,$BC,$1F,$FD ; 99999999.90625
TBLF408 FCB $9E,$6E,$6B,$27,$FD ; 999999999.25000
TBLF40D FCB $9E,$6E,$6B,$28,$00 ;1000000000.00000
LBLF412 LDX #TBLE1B7-1; ' IN '
BSR LBLF423
LDD ramE2 ; line number
LBLF419 STD ramCA
LDAB #$90
SEC
JSR LBLF2C7
BSR LBLF426
LBLF423 JMP LBLE7A8
LBLF426 LDX #TBL4335
LBLF429 LDAA #$20
LDAB ramCE
BPL LBLF431
LDAA #$2D
LBLF431 STAA ,X
STAA ramCE
STX ramDE
INX
LDAA #$30
LDAB ramC9
BNE LBLF441
JMP LBLF51C
LBLF441 CLRA
CMPB #$80
BHI LBLF44E
LDX #TBLF40D
JSR LBLF0EF
LDAA #$F7
LBLF44E STAA ramBF
LBLF450 LDX #TBLF408
JSR LBLF2E3
BGT LBLF468
LBLF458 LDX #TBLF403
JSR LBLF2E3
BGT LBLF470
JSR LBLF19F
DEC ramBF
BRA LBLF458
LBLF468 JSR LBLF1B9
INC ramBF
BRA LBLF450
LBLF470 JSR LBLEF6D
JSR LBLF30B ;C9-x -> integer
LDAB #$01
LDAA ramBF
ADDA #$0A
BMI LBLF486
CMPA #$0B
BHS LBLF486
DECA
TAB
LDAA #$02
LBLF486 DECA
DECA
STAA ramC1
STAB ramBF
BGT LBLF49F
LDX ramDE
LDAA #$2E
INX
STAA ,X
TSTB
BEQ LBLF49D
LDAA #$30
INX
STAA ,X
LBLF49D STX ramDE
LBLF49F LDX #TBLF529
LDAB #$80
LBLF4A4 LDAA ramCD
ADDA 3,X
STAA ramCD
LDAA ramCC
ADCA 2,X
STAA ramCC
LDAA ramCB
ADCA 1,X
STAA ramCB
LDAA ramCA
ADCA ,X
STAA ramCA
INCB
RORB
ROLB
BVC LBLF4A4
BHS LBLF4C6
SUBB #$0B
NEGB
LBLF4C6 ADDB #$2F
INX
INX
INX
INX
STX ramB3
LDX ramDE
INX
TBA
ANDA #$7F
STAA ,X
DEC ramBF
BNE LBLF4E0
LDAA #$2E
INX
STAA ,X
LBLF4E0 STX ramDE
LDX ramB3
COMB
ANDB #$80
CPX #$F54D
BNE LBLF4A4
LDX ramDE
LBLF4EE LDAA ,X
DEX
CMPA #$30 ; '0'
BEQ LBLF4EE
CMPA #$2E ; '.'
BEQ LBLF4FA
INX
LBLF4FA LDAA #$2B ; '+'
LDAB ramC1
BEQ LBLF51E
BPL LBLF505
LDAA #$2D ; '-'
NEGB
LBLF505 STAA 2,X
LDAA #$45
STAA 1,X
LDAA #$2F
LBLF50D INCA
SUBB #$0A
BHS LBLF50D
ADDB #$3A
STAA 3,X
STAB 4,X
CLR 5,X
BRA LBLF520
LBLF51C STAA ,X
LBLF51E CLR 1,X
LBLF520 LDX #TBL4335
LBLF523 RTS
TBLF524 FCB $80,$00,$00,$00,$00 ; 0.5
TBLF529 FCB $FA,$0A,$1F,$00 ;-100,000,000
FCB $00,$98,$96,$80 ; 10,000,000
FCB $FF,$F0,$BD,$C0 ; -1,000,000
FCB $00,$01,$86,$A0 ; 100,000
FCB $FF,$FF,$D8,$F0 ; -10,000
FCB $00,$00,$03,$E8 ; 1,000
FCB $FF,$FF,$FF,$9C ; -100
FCB $00,$00,$00,$0A ; 10
FCB $FF,$FF,$FF,$FF ; -1
; --- SQR function ---
FNC_SQR
JSR LBLF29F ;copy fp C9->D6
LDX #TBLF524 ;0.5
JSR LBLF251 ;X->C9-E
; perform fp ^
fp_POW BEQ LBLF5C9
TSTA
BNE LBLF565
LDAA ramCE
BPL LBLF562
JMP LBLF243 ; ?/0 error
LBLF562 JMP LBLEFF5
LBLF565 LDX #TBL00C4
JSR LBLF272 ;FPA->X
CLRB
LDAA ramDB
BPL LBLF580
JSR FNC_INT ; LBLF335
LDX #TBL00C4
LDAA ramDB
JSR LBLF2E3
BNE LBLF580
COMA
LDAB ram80 ; TBL0080
LBLF580 JSR LBLF28D
PSHB
JSR FNC_LOG ; LBLF0B9
LDX #TBL00C4
JSR LBLF0EF
BSR LBLF5C9
PULA
RORA
BHS LBLF523
LBLF593 LDAA ramC9
BEQ LBLF59A
COM ramCE
LBLF59A RTS
TBLF59B FCB $81,$38,$AA,$3B,$29 ;1.44269504 (CF) correction factor for EXP function
TBLF5A0 FCB $07 ;eight coeff's... tchebyshev modified taylor series coeffs for exp(x)
FCB $71,$34,$58,$3E,$56 ;0.00002150 1/(7! * CF^7)
FCB $74,$16,$7E,$B3,$1B ;0.00014352 1/(6! * CF^6)
FCB $77,$2F,$EE,$E3,$85 ;0.00134226 1/(5! * CF^5)
FCB $7A,$1D,$84,$1C,$2A ;0.00961402 1/(4! * CF^4)
FCB $7C,$63,$59,$58,$0A ;0.05550513 1/(3! * CF^3)
FCB $7E,$75,$FD,$E7,$C6 ;0.24022638 1/(2! * CF^2)
FCB $80,$31,$72,$18,$10 ;0.69314719 1/(1! * CF^1)
FCB $81,$00,$00,$00,$00 ; 1.0
; --- EXP function ---
LBLF5C9:
FNC_EXP LDX #TBLF59B ;Get correction factor
BSR LBLF604 ;Multiply FPA0 by X
JSR LBLF26C ;pack fpa0 and store in fpa3
LDAA ramC9 ;get exponent of fpa0 and compare to max value
CMPA #$88 ; (128)
BLO LBLF5DA ;br if fpa0 < 128
LBLF5D7 JMP LBLF190 ;set fpa0 = 0 or ?OV ERROR
LBLF5DA JSR FNC_INT ;convert fpa0 to integer
LDAA ram80 ;get least significant byte of integer
ADDA #$81 ; =127?
BEQ LBLF5D7 ; ?OV ERROR
DECA ; adds bias of 80 (since 81 used above)
PSHA ;save exponent on stack
LDX #TBL00BA ;point (x) to FPa3
JSR LBLEF72 ;subtract fpa0 from (x)
LDX #TBLF5A0 ;point x to coeffs
BSR LBLF607 ;eval polynomial for frac part
CLR ramDC ;force mantissa to be positive
PULA
JSR LBLF179 ;calc exp of new fpa0 by adding exps of integer and frac'l parts.
RTS
LBLF5F8 STX ramDE
JSR LBLF26C
BSR LBLF604
BSR LBLF609
LDX #TBL00BA
LBLF604 JMP LBLF0EF
LBLF607 STX ramDE
LBLF609 JSR LBLF267
LDX ramDE
LDAB ,X
STAB ramCF
INX
STX ramDE
LBLF615 BSR LBLF604
LDX ramDE
LDAB #$05
ABX
STX ramDE
JSR LBLEF7D
LDX #ramBF
DEC ramCF
BNE LBLF615
RTS
; --- RND function ---
FNC_RND
JSR LBLF2AD ; Test C9-E
BMI LBLF650
BEQ LBLF646
BSR LBLF643
JSR LBLF26C
BSR LBLF646
LDX #TBL00BA
BSR LBLF604
LDX #TBLF08B ; 1.0
JSR LBLEF7D
LBLF643 JMP FNC_INT
LBLF646 LDX ram4218
STX ramCA
LDX ram421A
STX ramCC
LBLF650 LDX CONF682
STX ramD7
LDX CONF684
STX ramD9
JSR LBLF0F6
LDD ram4254
ADDD #$658B
STD ram421A
STD ramCC
LDD ram4252
ADCB #$B0
ADCA #$05
STD ram4218
STD ramCA
CLR ramCE
LDAA #$80
STAA ramC9
LDAA ram8F
STAA ramDD
JMP LBLEFD6
CONF682 FDB $40E6
CONF684 FDB $4DAB
; --- COS function ---
FNC_COS
LDX #TBLF6F6 ; Pi/2
JSR LBLEF7D
; --- SIN function ---
FNC_SIN
JSR LBLF29F ; copy FPA0 to FPA1
LDX #TBLF6FB ; point X to 2*Pi
LDAB ramDB ; get mantissa sign of fpa1
JSR LBLF1C0 ; divide fpa0 by X
JSR LBLF29F ; copy FPA0 to FPA1
JSR FNC_INT ; convert FPA0 to integer
CLR ramDC ; set result sign to positive
LDAA ramD6 ; get exponent of fpa1
LDAB ramC9 ; get exponent of fpa0
JSR fp_SUB ; subtract fpa0 from fpa1
LDX #TBLF700 ; point X to 0.25
JSR LBLEF72 ; subtract fpa0 from 0.25 (pi/2)
LDAA ramCE ; get mantissa sign of fpa0
PSHA ; save on stack
BPL LBLF6BC ; branch if mantissa positive
JSR LBLEF6D ; add 0.5 (pi) to fpa0
LDAA ramCE ; get sign of fpa0
BMI LBLF6BF ; branch if negative
COM ram88 ; com if 3pi/2 > arg > pi/2 [quadrant flag]
LBLF6BC JSR LBLF593 ; toggle mantissa sign of fpa0
LBLF6BF LDX #TBLF700 ; point X to 0.25
JSR LBLEF7D ; add it to fpa0
PULA ; get the old sign
TSTA ;
BPL LBLF6CC ; branch if old sign was positve
JSR LBLF593 ; toggle mantissa sign
LBLF6CC LDX #TBLF705 ; point x to table of coeff's
JMP LBLF5F8 ; calculate polynomial value
; --- TAN function ---
FNC_TAN
JSR LBLF26C
CLR ram88
BSR FNC_SIN
LDX #TBL00C4
JSR LBLF272 ;FPA->X
LDX #TBL00BA
JSR LBLF251 ;X->C9-E
CLR ramCE
LDAA ram88
BSR LBLF6F3
LDX #TBL00C4
JMP LBLF1C5+1
LBLF6F3 PSHA
BRA LBLF6BC
TBLF6F6 FCB $81,$49,$0F,$DA,$A2 ; 1.57079632 Pi/2
TBLF6FB FCB $83,$49,$0F,$DA,$A2 ; 6.28318531 2*Pi
TBLF700 FCB $7F,$00,$00,$00,$00 ; 0.25 1/4
TBLF705 FCB $05
FCB $84,$E6,$1A,$2D,$1B ;-14.38139067 -(2*Pi)^11/11! should be -15.094642578 ($84,$F1,$83,$A7,$EF)
FCB $86,$28,$07,$FB,$F8 ; 42.00779712 (2*Pi)^9 / 9! should be 42.058693944 ($86,$28,$3C,$1A,$44)
FCB $87,$99,$68,$89,$01 ;-76.70417026 -(2*Pi)^7 / 7! should be -76.705859753 ($87,$99,$69,$66,$73)
FCB $87,$23,$35,$DF,$E1 ; 81.60522369 (2*Pi)^5 / 5! should be 81.605249276 ($87,$23,$35,$E3,$3C)
FCB $86,$A5,$5D,$E7,$28 ;-41.34170210 -(2*Pi)^3 / 3! should be -41.341702240 ($86,$A5,$5D,$E7,$31)
FCB $83,$49,$0F,$DA,$A2 ; 6.28318531 (2*Pi)^1 / 1! should be 6.283185307 ($86,$49,$0F,$DA,$A2)
FCB $A1,$54,$46,$8F,$13 ; 7122787878.0 unused?
FCB $8F,$52,$43,$89,$CD ; 26913.76914 unused?
; --- Reset Vector ---
;Reset I/O
LBLF72E LDAA #$FF
STAA ram00
LDAA #$01
STAA ram01
LDAA #$01
STAA ram03
LDAA ramEA ;Check for warm boot flag
CMPA #$55
BNE LBLF74A ;Not warm boot
LDX ram4221
LDAA ,X
DECA
BNE LBLF74A
JMP ,X ;Warm boot
;Cold boot
LBLF74A LDX #$0080 ;Clear 6803 RAM
LBLF74D CLR ,X
INX
CPX #$0100
BNE LBLF74D
LDX #TBL41FD ;Size and clear external RAM
LBLF758 INX
LDAA 2,X ;Get a byte
COM 2,X ;Complement
LDAB 2,X ;Get the complement
CLR 2,X ;Clear
COMA
CBA ;Complement successful?
BEQ LBLF758 ;Next...
STX ram4250 ;Save top of RAM
STX ramA1
STX ram9D
LDD ram9D
SUBD #100 ;Reserve 100 bytes for string space
STD ram9B ;bottom of system stack
LDS ram9B
LDX #TBLF7CF ;Init 6803 RAM
LDD #$00EB
BSR LBLF7AD
LDX #TBLF7DE ;Init external RAM
LDD #$4200
BSR LBLF7AD
LDAA #$39 ;==RTS
LDX #LBL4285 ;4285 to 42AE set to RTS
LBLF78A STAA ,X
INX
CPX #$42AF
BNE LBLF78A
COM ram42AF ;???
LDX #TBL4346 ;init start of prog mem.
STX ram93
JSR LBLE3CF ;NEW command
JSR LBLFBD3+1 ;Clear screen
LDX #TBLF810-1 ;Copyright message
JSR LBLE7A8
LDAA #$55 ;Flag warm boot
STAA ramEA
LBLF7AA JMP LBLE271
;Copy block of memory from [X+1] to [D], length at [X]
LBLF7AD STD ramBF ;Save destination
LDAB ,X ;Get length
LBLF7B1 INX ;Inc start
;Copy block of memory from [X] to [$00BF], length in B
LBLF7B2 LDAA ,X ;Get byte
STX ramC1 ;Save source
LDX ramBF ;Get dest
STAA ,X ;Put byte
INX ;Inc dest
STX ramBF ;Save dest
LDX ramC1 ;Get source
DECB ;Dec count
BNE LBLF7B1 ;More...
RTS
;DEFAULT RESET WARM-BOOT (F7C3)
NOP
CLR ramE8 ;turn off printing
JSR LBLE3EE
JSR LBLFBD3+1 ;Clear screen
BRA LBLF7AA
;Copied to $00EB
TBLF7CF FCB 14 ;14 bytes to copy
INC ramF5
BNE LBLF7D8
INC ramF4
LBLF7D8 LDAA >ram00
JMP LBLE1C8
;Copied to $4200
TBLF7DE FCB 49 ;49 bytes to copy
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
RTI
FCB $00
FCB $00
JMP LBLEC2D+1 ;?FC error
FCB $4F,$C7,$52,$59,$FF,$04,$5E,$EC,$2E,$F7,$C3,$00,$76,$00,$01,$10
FCB $70,$84,$00,$01,$15,$1A,$0B,$00,$80
TBLF810 FCB $4D,$49,$43,$52,$4F,$43,$4F,$4C,$4F,$52,$20,$42,$41,$53,$49,$43 ;MICROCOLOR BASIC
FCB $20,$31,$2E,$30,$0D ; 1.0
FCB $43,$4F,$50,$59,$52,$49,$47,$48,$54,$20,$31,$39,$38,$32,$20 ;COPYRIGHT 1982
TBLF834 FCB $4D,$49,$43,$52,$4F,$53,$4F,$46,$54,$0D,$00 ;MICROSOFT
; --- Flash cursor ---
LBLF83F DEC ram422B ;cursor flash delay counter
BNE LBLF85E
LDAA ram4282 ;cursor color
EORA #$0F
STAA ram4282
ORAA #$80
LDX ram4280
STAA ,X
LDAB #$16
ANDA #$0F
BEQ LBLF85B
LDAB #$58 ;flash color longer than black.
LBLF85B STAB ram422B
LBLF85E LDX #$03FA
LBLF861 DEX
BNE LBLF861
RTS
; --- Idle loop ---
LBLF865 JSR LBL4285 ;input char command extension
PSHX
PSHB
LBLF86A BSR LBLF83F ;Flash cursor
BSR LBLF883 ;Scan keyboard
BEQ LBLF86A ;Repeat if no key pressed
LDAB #$60
LDX ram4280 ;cursor address
STAB ,X
BRA LBLF8CB
LBLF879 CLRA
BSR LBLF8D0
BNE LBLF883
BSR LBLF8E4
INCA
BEQ LBLF8CD
; --- Scan keyboard ---
LBLF883 JSR LBL42A9 ; Keyscan command extension
PSHX
PSHB
LDAA #$FB ; Port code for BREAK key.
BSR LBLF8D0
TAB
BEQ LBLF892
EORB ram423B ; keyboard BREAK flag.
LBLF892 STAA ram423B
TSTB
BEQ LBLF89E
BSR LBLF8DC ; delay
BSR LBLF8D2 ; still a break?
BNE LBLF8C7+1 ; return BREAK code 03
LBLF89E LDX #TBL4230
CLRB
DECB
STAB ram4239
LBLF8A6 ROLB
BHS LBLF8C6
INC ram4239
BSR LBLF8E2
PSHB
TAB
INX
EORA ,X
ANDA ,X
STAB ,X
PULB
TSTA
SEC
BEQ LBLF8A6
PSHA
BSR LBLF8DC
BSR LBLF8E4
CMPA ,X
PULA
BNE LBLF8EA
LBLF8C6 CLRA
LBLF8C7 CPX #$8603 ;LDAA #$03
LBLF8CA TSTA
LBLF8CB PULB ;Restore clobbered registers
PULX
LBLF8CD RTS ; End Scan Keyboard subroutine
LBLF8CE LDAA #$7F ; Port code for SHIFT key
LBLF8D0 STAA ram02 ; Keyboard port i/o sequence
LBLF8D2 LDAA ram03 ; A=0x00=found
COMA ; A=0xff=not found
ANDA #$02
BEQ LBLF8DB
LDAA #$FF
LBLF8DB RTS
LBLF8DC LDX ram421D ;keyboard debounce delay
JMP LBLF861
LBLF8E2 STAB ram02
LBLF8E4 LDAA ioBFFF
ORAA #$C0
RTS
LBLF8EA LDAB #$F8
LBLF8EC ADDB #$08
LSRA
BHS LBLF8EC
ADDB ram4239 ; keyboard strobe store
LDAA #$FE ; Port code for CONTROL key
BSR LBLF8D0
STAA ram423A ; keyboard control key flag
JSR LBL42AC ; keyboard control extension
BEQ LBLF911
LDX #TBLF97C
CMPB #$20
BNE LBLF92E
LDAA ram4282
ADDA #$10
STAA ram4282
BRA LBLF8C6
LBLF911 TBA
BEQ LBLF918+1
CMPB #$1A
BLS LBLF933
LBLF918 CPX #$C61D ;LDAB #$1D
LDX #TBLF956-$1D
BSR LBLF8CE
BEQ LBLF92E
LDX #TBLF969-$1D
CMPB #$20
BNE LBLF92E
COM ram421C
BRA LBLF8C6
LBLF92E ABX
LDAA ,X
BRA LBLF8CA
LBLF933 BSR LBLF8CE
EORA ram421C
BNE LBLF941
LDAA ram421C
BNE LBLF946
ORAB #$20
LBLF941 TBA
ORAA #$40
LBLF944 BRA LBLF8CA
LBLF946 LDX #TBLF9AB
ABX
LDAA ,X
BPL LBLF944
LDAB ram4282
ANDB #$70
ABA
BRA LBLF944
TBLF956 FCB $40,$0D,$20 ;@-
FCB $30,$31,$32,$33,$34,$35,$36,$37 ;01234567
FCB $38,$39,$3A,$3B,$2C,$2D,$2E,$2F ;89:;,-./
TBLF969 FCB $13,$0D,$20 ;--
FCB $00,$21,$22,$23,$24,$25,$26,$27 ;-!"#$%&'
FCB $28,$29,$2A,$2B,$3C,$3D,$3E,$3F ;()*+<=>?
;Tokens
TBLF97C FCB $88,$08,$B3,$B2,$82,$9B,$90,$84 ;--------
FCB $A3,$8A,$81,$9E,$BC,$BA,$B9,$A5 ;--------
FCB $C7,$15,$9C,$09,$8C,$80,$B5,$5E ;-------^
FCB $B1,$8F,$0A,$00,$00,$00,$0D,$20 ;-------
FCB $00,$8E,$93,$98,$97,$96,$94,$95 ;--------
FCB $9D,$86,$89,$92,$BB,$91,$B7 ;-------
;Graphic chars
TBLF9AB FCB $B6,$89,$80,$82,$87,$8D,$86,$85 ;--------
FCB $48,$49,$4A,$4B,$4C,$4D,$4E,$4F ;HIJKLMNO
FCB $50,$8F,$8C,$88,$8B,$55,$81,$8E ;P----U--
FCB $83,$8A,$84 ;---
LBLF9C6 JSR LBL4288 ; --- Write char to screen ---
PSHX
PSHB
PSHA
LDAB ramE8 ;Ouput device #
BEQ LBLFA1B ;Video...
;Assume printer
TAB
TPA
PSHA
SEI
TBA
LBLF9D5 LDAB ram03 ;Wait for handshake
ANDB #$04
BNE LBLF9D5
BSR LBLFA0A ;Idle bit
CLRB
BSR LBLFA0C ;Start bit
LDAB #$08
LBLF9E2 PSHB
CLRB
LSRA
ROLB
BSR LBLFA0C ;Bit out
PULB
DECB
BNE LBLF9E2 ;Next bit
BSR LBLFA0A ;Stop bit
PULA
TAP
PULA
CMPA #$0D
BEQ LBLFA00
INC ram422A
LDAB ram422A
CMPB ram4229
BLO LBLFA07
LBLFA00 CLR ram422A
BSR LBLFA15
BSR LBLFA15
LBLFA07 PULB
PULX
RTS
LBLFA0A LDAB #$01
LBLFA0C STAB ram03 ;Printer bit output
BSR LBLFA10
LBLFA10 LDX ram4223
BRA LBLFA18
LBLFA15 LDX ram4225
LBLFA18 JMP LBLF861
; A->SCN
LBLFA1B LDX ram4280
CMPA #$08 ; backspace
BNE LBLFA2E
CPX #$4000
BEQ LBLFA77
LDAA #$60
DEX
STAA ,X
BRA LBLFA5C
LBLFA2E CMPA #$0D ; carriage return
BNE LBLFA46
LDX ram4280
LBLFA35 LDAA #$60
STAA ,X
INX
STX ram4280
LDAB ram4281
BITB #$1F
BNE LBLFA35
BRA LBLFA5C
LBLFA46 CMPA #$20
BLO LBLFA77
TSTA
BMI LBLFA59
CMPA #$40
BLO LBLFA57
CMPA #$60
BLO LBLFA59
ANDA #$DF
LBLFA57 EORA #$40
LBLFA59 STAA ,X
INX
LBLFA5C STX ram4280
CPX #$4200
BNE LBLFA77
LDX #$4000 ; scroll up
LBLFA67 LDD $20,X
STD ,X
INX
INX
CPX #$41E0
BNE LBLFA67
LDAB #$60
JSR LBLFBD9
LBLFA77 PULA
PULB
PULX
RTS
LBLFA7B JSR LBL428B ;I/O pointer setup command extenstion
PSHX
PSHB
PSHA
LDAA ramE8 ;Get device output 0=screen, -1 printer
BEQ LBLFA8D ;go if on screen
LDX ram4227 ;tab field width 16/last tab zone 112
LDD ram4229 ;printer line length max
BRA LBLFA97
LBLFA8D LDAB ram4281 ;cursor address lsb
ANDB #$1F
LDX #$1010
LDAA #$20
LBLFA97 STX ramE4 ;i/o tab and last tab field
STAB ramE6 ;max line length msb
STAA ramE7 ;max line length lsb
PULA
PULB
PULX
RTS
LBLFAA1 JSR LBLFBD3+1 ;Clear screen
LBLFAA4 JSR LBL4291 ;build command line extension
LBLFAA7 CLR ram427F ;last keyboard input char
LDX #TBL42B2 ;command line buffer
LDAB #$01
LBLFAAF JSR LBLF865 ;Cursor loop return with KEY->A
TST ramE9 ;Punt if set. (by cmd extension?)
BNE LBLFB04
TST ramE8 ;check output flag
BNE LBLFB00 ;go if printer
TSTA
BPL LBLFADD
TST ram423A ;control key flag
BEQ LBLFADD
JSR LBLE4B2 ;address of token->X (save X->ram89)
LBLFAC7 LDAA ,X
INX
PSHX
PSHA
ANDA #$7F
LDX ram89
BSR LBLFB1A
STX ram89
PULA
PULX
TSTA
BPL LBLFAC7
LDX ram89
BRA LBLFAAF
LBLFADD CMPA #$0C ;unimplemented clearscreen key?
BEQ LBLFAA1
CMPA #$08 ;backspace
BNE LBLFAED
DECB
BEQ LBLFAA7 ;don't go before stop
DEX
BSR LBLFB22 ;A->SCN
BRA LBLFAAF
LBLFAED CMPA #$15 ;L. DEL
BNE LBLFAFB
LBLFAF1 DECB ;keep backspacing until stop
BEQ LBLFAA7
LDAA #$08
JSR LBLF9C6 ;A->SCN
BRA LBLFAF1
LBLFAFB CMPA #$03 ;break
SEC
BEQ LBLFB05
LBLFB00 CMPA #$0D ;ENTER key
BNE LBLFB12
LBLFB04 CLRA ;clear carry flag
LBLFB05 TPA
PSHA
JSR LBLE766 ;#0D->SCN
CLR ,X ;terminate scratch
LDX #TBL42B1 ;command line buff-1
PULA ;carry set if BREAK'd.
TAP
LBLFB11 RTS
LBLFB12 CMPA #$20
BLO LBLFAAF ;ignore any non-printing char's
BSR LBLFB1A
BRA LBLFAAF
LBLFB1A CMPB #$80 ;don't go more than 128 chars.
BHS LBLFB11
STAA ,X ;store char into command line buffer
INX
INCB
LBLFB22 JMP LBLF9C6 ;A->SCN
; --- SET command ---
CMD_SET
BSR LBLFB6A ; get (x,y arg into memloc into X
PSHX
JSR LBLEF47 ; get ,c (B holds color code )
PULX
CMPB #$08
BHI LBLFB67 ; ?FC error if color > 8
DECB
BMI LBLFB38
LDAA #$10 ; LSLB LSLB LSLB LSLB
MUL
BRA LBLFB40
LBLFB38 LDAB ,X ; Get color from screen
BPL LBLFB3F ; Set to zero if text encountered
ANDB #$70
FCB $21 ;"BRN CLRB"
LBLFB3F CLRB
LBLFB40 STAB ram82 ; save color
BSR LBLFBB4 ; get trailing ')'
LDAA ,X
BMI LBLFB49 ; make sure its graphics
CLRA ; clear if a text char
LBLFB49 ANDA #$0F ; ignore color bits
ORAA ram423C ; holds desired bit
ORAA ram82 ; get color
LBLFB50 ORAA #$80 ; make a graphics char
STAA ,X ; write value to screen
RTS
; --- RESET command ---
CMD_RESET
BSR LBLFB6A ; get (x,y arg into memloc into X
BSR LBLFBB4 ; get trailing ')'
CLRA
LDAB ,X
BPL LBLFB50 ; clear if it's a text char
COM ram423C
ANDB ram423C
STAB ,X
RTS
LBLFB67 JMP LBLEC2D+1 ; ?FC error
LBLFB6A JSR LBLEA2B+1 ; get '('
LBLFB6D JSR LBLEF0D ; get x position
CMPB #$3F
BHI LBLFB67 ; ?FC error if > 63
PSHB ; push x on stack
JSR LBLEF47 ; get y position
CMPB #$1F
BHI LBLFB67 ; ?FC error if > 31
PSHB ; push y on stack
LSRB ; y=y/2
LDAA #$20
MUL
ADDD #$4000 ; get address of left side of screen from y
PSHB ; push onto stack
PSHA
TSX
LDAB 3,X ; take x/2 and add to left side of screen
LSRB
PULX
ABX
PULA ; now construct mask for char block and store in 423C
PULB
ANDA #$01
RORB
ROLA ; A holds 2's complement of bit pos
LDAB #$10 ; start B with bit 4
LBLFB94 LSRB ; shift right until A is zero
DECA
BPL LBLFB94
STAB ram423C ; done, store into 423C
RTS
; --- POINT command ---
FNC_POINT
BSR LBLFB6D ; get '(x,y' into X and mask into 423C
LDAB #$FF
LDAA ,X
BPL LBLFBB2 ; need to return -1 if text char
ANDA ram423C
BEQ LBLFBB1 ; not set, return 0
LDAB ,X
LSRB
LSRB
LSRB
LSRB
ANDB #$07
LBLFBB1 INCB
LBLFBB2 BSR LBLFBB7 ; return B (sign extended)
LBLFBB4 JMP LBLEA29 ; get ')'
LBLFBB7 CLRA ; return B (sign extended)
TSTB
BPL LBLFBBC
COMA
LBLFBBC JMP LBLECE3 ; return D
; --- CLS command ---
CMD_CLS
BEQ LBLFBD3+1 ;No args - default clear
JSR LBLEF0D ;Get integer arg into B between 0-255.
CMPB #$08
BHI LBLFBE5 ;If > 8 - Clear screen and print Microsoft message
TSTB
BEQ LBLFBD1 ;CLS 0...
DECB
LDAA #$10
MUL
ORAB #$0F
LBLFBD1 ORAB #$80 ;0=$80, 1=$8F, 2=$9F, 3=$AF, 4=$BF, 5=$CF, 6=$DF, 7=$EF, 8=$FF
LBLFBD3 CPX #$C660 ;==LDAB #$60 - Default clear char
LDX #TBL4000 ;Start of video memory
LBLFBD9 STX ram4280
LBLFBDC STAB ,X ;Set mem
INX ;Next
CPX #$4200 ;Done?
BNE LBLFBDC ;More...
RTS
LBLFBE5 BSR LBLFBD3+1 ;Clear screen
LDX #TBLF834-1 ;Microsoft message
JMP LBLE7A8 ;Write string
; --- INKEY$ function ---
FNC_INKEY
LDAA ram427F ;last keyboard input char
BNE LBLFBF5
JSR LBLF883
LBLFBF5 CLR ram427F
STAA ramCD
BEQ LBLFBFF
JMP LBLEE91
LBLFBFF STAA ramD0
JMP LBLEE9D
; --- EXEC function ---
CMD_EXEC
BEQ LBLFC0C
JSR LBLEF4C ; Get address to X
STX ram421F
LBLFC0C LDX ram421F
JMP ,X
; --- VARPTR function ---
FNC_VARPTR
LDX ram99
PSHX
JSR LBLEB1B
JSR LBLEA29 ; get ')'
STX ram89
PULX
LDD ram89
CPX ram99
BEQ LBLFC26
JMP LBLEC2D+1 ; ?FC error
LBLFC26 JMP LBLECE3 ; return D
; --- PRINT @expression ---
LBLFC29 JSR LBLEBBA
SUBD #$01FF
BLS LBLFC34
JMP LBLEC2D+1 ; ?FC error
LBLFC34 ADDD #$41FF
STD ram4280
RTS
; --- CSAVE command ---
CMD_CSAVE
LDX ram93
STX ram426F ; start
LDX ram95
STX ram4271 ; end
CLRB
CMPA #$A9 ; CSAVE*
BNE LBLFC4F
JSR LBLFDDB
LDAB #$04
LBLFC4F STAB ram4267 ;file type flag
LDD ram4271 ; end
SUBD ram426F ; start
STD ram426C ;LOAD address
BSR LBLFC8B
LDX ram426F ; start
LBLFC60 STX ram4278 ;cass buffer address
LDAA #$FF
STAA ram4276 ;cass block length
LDD ram4271
SUBD ram4278 ;cass buffer address
BLS LBLFC7E
TSTA
BNE LBLFC7A
CMPB #$FF
BEQ LBLFC7A
STAB ram4276 ;cass block length
LBLFC7A BSR LBLFCC0 ;write cassette block
BRA LBLFC60
LBLFC7E NEG ram4275 ;cass block type flag
CLR ram4276 ;cass block length
BSR LBLFCC0 ;write cassette block
LBLFC86 LDAA #$01
STAA ram03
RTS
LBLFC8B JSR LBLFD29
LDX #TBL425F ;tape filename block
STX ram4278 ;cass buffer address
STX ramBF
CLR $09,X ;ram4268
CLR $0A,X ;ram4269
LDX #TBL4257 ;skip/load filename
LDAB #$08
JSR LBLF7B2 ;Copy block of memory from [X] to [$00BF], length in B
CLR ram4275 ;cass block type flag
LDAA #$0F
STAA ram4276 ;cass block length
BSR LBLFCB7 ;write cassette leader
BSR LBLFCC0 ;write cassette block
INC ram4275 ;cass block type flag
LDX #$0000
JSR LBLF861
;Write cassette leader
LBLFCB7 LDX ram422F ; numer of $55's in leader
LBLFCBA BSR LBLFD01
DEX
BNE LBLFCBA
RTS
LBLFCC0 NOP ;Write cassette block
SEI
LDAB ram4276 ;cass block length
STAB ram427B ;cass load status flag
LDAA ram4276 ;cass block length
BEQ LBLFCD6
LDX ram4278 ;cass buffer address
LBLFCD0 ADDA ,X
INX
DECB
BNE LBLFCD0
LBLFCD6 ADDA ram4275 ;cass block type flag
STAA ram427A ;cass sumcheck
LDX ram4278 ;cass buffer address
BSR LBLFD01
LDAA #$3C
BSR LBLFD03
LDAA ram4275
BSR LBLFD03
LDAA ram4276 ;cass block length
BSR LBLFD03
TSTA
BEQ LBLFCFC
LBLFCF2 LDAA ,X
INX
BSR LBLFD03
DEC ram427B ;cass load status flag
BNE LBLFCF2
LBLFCFC LDAA ram427A ;cass sumcheck
BSR LBLFD03
LBLFD01 LDAA #$55
;Write cassette char
LBLFD03 PSHX
PSHA
PSHA
LDAB #$08
LBLFD08 TSX
LSR ,X
LDX #$0020
BLO LBLFD13
LDX #$0040
LBLFD13 PSHX
LDAA #$01
STAA ram03
LBLFD18 DEX
BNE LBLFD18
CLRA
STAA ram03
PULX
LBLFD1F DEX
BNE LBLFD1F
DECB
BNE LBLFD08
PULA
PULA
PULX
LBLFD28 RTS
LBLFD29 BSR LBLFD33
JSRE LBL00F3
BEQ LBLFD28
JMP LBLEA3C;?SN ERROR
LBLFD33 LDX #TBL4256 ; file name length
CLR ,X
LDAA #$20 ; pad filename with space chars
LBLFD3A INX
STAA ,X
CPX #$425F ;tape filename block
BNE LBLFD3A
JSRE LBL00F3 ; load input char
BEQ LBLFD28 ; return if no filename
JSR LBLE91A ; evaulate arg
JSR LBLEE53 ; get string?
STAB TBL4256 ; length of string to filename len.
BEQ LBLFD28 ; RTS
PSHB
LDD #$4257 ;skip/load filename
STD ramBF
PULB
JMP LBLF7B2 ;Copy block of memory from [X] to [$00BF], length in B
; --- CLOAD command ---
CMD_CLOAD
CMPA #$A9 ; CLOAD*
BNE LBLFD63
JMP LBLFDB1
LBLFD63 CMPA #$4D ; CLOADM
BNE LBLFD6A
JMP LBLFE06
LBLFD6A CLRA ; program data
BSR LBLFD8F
JSR LBLE3CF ; NEW command status flag
COM ram426E ; unset new command flag
LDD ram426C ; LOAD address
ADDD ram93
JSR LBLE21E ; see if D bytes fit on stack
LDX ram93
LBLFD7D STX ram4278 ; cass buffer address
BSR LBLFDD0
BPL LBLFD7D
STX ram95
LDX #TBLE1BC-1 ; "OK"
JSR LBLE7A8 ; Write string
JMP LBLE2EB ; adjust next line pointers, and return to command mode
LBLFD8F PSHA ; A: 00=program 02=machine code 04=array data
BSR LBLFDA2
PULA
TST ram4274
BNE LBLFDCF
CMPA ram4267 ;File type flag
BEQ LBLFDCF
LDAB #$24 ;?FM error
JMP LBLE238 ;write error
LBLFDA2 BSR LBLFD33
JSR LBLFE37
BNE LBLFDAC ;?IO error
JMP LBLFF4E ;Read cassette leader
LBLFDAC LDAB #$22 ;?IO error
JMP LBLE238
;CLOAD*
LBLFDB1 BSR LBLFDDB
LDAA #$04 ;array data
BSR LBLFD8F
LDD ram4271 ;end
SUBD ram426F ;start
SUBD ram426C ; LOAD address
BHS LBLFDC5
JMP LBLE236 ;?OM error
LBLFDC5 LDX ram426F
LBLFDC8 STX ram4278 ;cass buffer address
BSR LBLFDD0
BPL LBLFDC8
LBLFDCF RTS
LBLFDD0 JSR LBLFEB5+1 ;disable blocklength limit, enable writing, read block->X
LBLFDD3 BNE LBLFDAC ; ?IO error
LDAA ram4275 ; Cass block type flag
BEQ LBLFDAC ; ?IO error
RTS
;CSAVE*
LBLFDDB JSRE LBL00EB ;get next char
LDAB #$01
STAB ram86
JSR LBLEB1B ;get init/var
CLR ram86
JSR LBLE90E ;expect string
LDD 2,X
JSR LBLE22D ;D+X->D,X
STX ram4271
LDX ram89
LDAB 4,X
ASLB
ADDB #$05
ABX
STX ram426F
JSRE LBL00F3
BEQ LBLFDCF
JMP LBLEA2E+1 ; get ','
;CLOADM
LBLFE06 JSRE LBL00EB ; Get next input char
LDAA #$02 ; machine code
BSR LBLFD8F
LDX #$0000
JSRE LBL00F3
BEQ LBLFE1B
JSR LBLEA2E+1 ; get ','
JSR LBLEF4C ; get address offset to X
LBLFE1B STX ram89
LDD ram426A ;EXEC address offset
ADDD ram89
STD ram421F ;default EXEC address
LDD ram426C ;LOAD address
ADDD ram89
PSHB
PSHA
PULX
BRA LBLFDC8
; --- SKIPF command ---
CMD_SKIPF
JSR LBLFDA2
BSR LBLFE8A
BNE LBLFDD3
RTS
LBLFE37 LDAA ramE2
INCA
BNE LBLFE46
JSR LBLFBD3+1 ;Clear screen
LDAA #$53 ;write 'S' to screen
BSR LBLFE81
JSR LBLE7B9
LBLFE46 BSR LBLFEAA
ORAA ram4275 ; Cass block type flag
BNE LBLFE80
CLRB
PSHB
LBLFE4F LDX #TBL425F ;tape filename block
ABX
LDAA ,X
LDX ramE2
INX
BNE LBLFE5C
BSR LBLFE81
LBLFE5C LDX #TBL4257 ;skip/load filename
ABX
SUBA ,X
TSX
ORAA ,X
STAA ,X
INCB
CMPB #$08
BNE LBLFE4F
PULA
TSTA
BEQ LBLFE7B
TST TBL4256
BEQ LBLFE7B
BSR LBLFE87
BNE LBLFE80
BRA LBLFE37
LBLFE7B LDAA #$46
BSR LBLFEA1
CLRA
LBLFE80 RTS
LBLFE81 CLR ramE8 ;turn off printer
JMP LBLF9C6 ;A->SCN
LBLFE87 JSR LBLFF4E ;Read cassette leader
LBLFE8A LDAA #$FF ;disable blocklength limit
TAB ;disable writing (B=$FF)
BSR LBLFEB9
BNE LBLFE98
LDAA ram4275 ;cass block type flag
NEGA
BMI LBLFE8A
DECA
LBLFE98 STAA ram427B ;cass load status flag
RTS
LBLFE9C LDAA TBL4000
EORA #$40
LBLFEA1 LDAB ramE2
INCB
BNE LBLFEA9
STAA TBL4000
LBLFEA9 RTS
LBLFEAA JSR LBLFF4E ;Read cassette leader
LDX #TBL425F ;tape filename block
STX ram4278 ;cass buffer address
LDAA #$0F ;15 byte block length limit
LBLFEB5 CPX #$86FF ;LDAA #$FF (disable blocklength limit)
CLRB ;enable writing
LBLFEB9 PSHA ;Read cassette block
STAB ram4273
NOP
SEI
BSR LBLFE9C
LDX ram4278 ;cass buffer address
CLRA
LBLFEC5 BSR LBLFF22 ;Read cassette bit
RORA
CMPA #$3C ;00111100
BNE LBLFEC5
BSR LBLFF14 ;Read cassette char
STAA ram4275 ;cass block type flag
BSR LBLFF14 ;Read cassette char
STAA ram4276 ;cass block length
PULB
CBA
BHI LBLFF0A+1
ADDA ram4275 ;cass block type flag
STAA ram427A ;cass sumcheck
LDAA ram4276 ;cass block length
STAA ram427B ;cass load status flag
BEQ LBLFF01
LBLFEE8 BSR LBLFF14 ;Read cassette char
TST ram4273
BNE LBLFEF6 ;don't write if set
STAA ,X
CMPA ,X
BNE LBLFF0D+1
INX
LBLFEF6 ADDA ram427A ;cass sumcheck
STAA ram427A ;cass sumcheck
DEC ram427B ;cass load status flag
BNE LBLFEE8
LBLFF01 BSR LBLFF14 ;Read cassette char
SUBA ram427A ;cass sumcheck
BEQ LBLFF10
LDAA #$01 ; #$01 - bad sumcheck
LBLFF0A CPX #$8603 ;LDAA #$03 - unexpected block length
LBLFF0D CPX #$8602 ;LDAA #$02 - store failed
LBLFF10 STAA ram427B ;cass load status flag
RTS
LBLFF14 LDAA #$08 ;Read cassette char->A
STAA ram427C ;cass byte load bit counter
LBLFF19 BSR LBLFF22 ;read cassette bit
RORA
DEC ram427C ;cass byte load bit counter
BNE LBLFF19
RTS
LBLFF22 BSR LBLFF2C ;Read cassette bit->C
LDAB ram427D ;tone duration counter
DECB
CMPB ram422C ;cassette 1200/2400Hz partition
RTS
LBLFF2C CLR ram427D ;tone duration counter
TST ram427E ;cass polarity flag
BNE LBLFF45 ;get 1->0 transition
;get 0->1 transition
LBLFF34 BSR LBLFF3D ;Inc duration until 0
BNE LBLFF34
LBLFF38 BSR LBLFF3D ;Inc duration until 1
BEQ LBLFF38
RTS
LBLFF3D INC ram427D ;tone duration counter
LDAB ram03
ANDB #$10
RTS
;get 1->0 transition
LBLFF45 BSR LBLFF3D ;Inc duration until 1
BEQ LBLFF45
LBLFF49 BSR LBLFF3D ;Inc duration until 0
BNE LBLFF49
RTS
LBLFF4E NOP ;Read cassette leader
SEI
CLR ram427C ;cass byte load bit counter
LBLFF53 BSR LBLFF34 ;get 0->1 xsition
LBLFF55 BSR LBLFF84 ;clear counter, count until 0, compare counter against limit
BHI LBLFF6B
LBLFF59 BSR LBLFF7D ;clear counter, count until 1, compare counter against limit
BLO LBLFF6F
DEC ram427C ;cass byte load bit counter
LDAA ram427C ;cass byte load bit counter
CMPA #$A0
LBLFF65 BNE LBLFF53
STAA ram427E ;cass polarity flag
RTS
LBLFF6B BSR LBLFF7D ;clear counter, count until 1, compare counter against limit
BHI LBLFF55
LBLFF6F BSR LBLFF84 ;clear counter, count until 0, compare counter against limit
BLO LBLFF59
INC ram427C ;cass byte load bit counter
LDAA ram427C ;cass byte load bit counter
SUBA #$60
BRA LBLFF65
LBLFF7D CLR ram427D ;tone duration counter
BSR LBLFF38 ;incr duration until 1
BRA LBLFF89
LBLFF84 CLR ram427D ;tone duration counter
BSR LBLFF49 ;incr duration until 0
LBLFF89 LDAB ram427D ;tone duration counter
CMPB ram422D ;upper limit of 1200 Hz
BHI LBLFF95
CMPB ram422E ;lower limit of 2400 Hz
RTS
LBLFF95 CLR ram427C ;cass byte load bit counter
RTS
LBLFF99 JSR LBLEA2E+1 ; get ','
LBLFF9C JSR LBLEF0D ; get num->B
TSTB
BNE LBLFFD1
JMP LBLEC2D+1 ;?FC error if B=0
; --- SOUND command ---
CMD_SOUND
BSR LBLFF9C ;get num->B
PSHB
BSR LBLFF99 ;get ,num->B
PULA
LBLFFAB PSHA ;A=PITCH, B=DURATION
PSHB
CLRA
LBLFFAE LDX ram09 ;4; read counter
LDAB ram08 ;3; read timer control and status reg [req'd to clear OCF flag] (ICF OCF TOF EICI EOCI ETOI IEDG OLVL)
STX ram0B ;4; store counter to output compare register
LBLFFB4 EORA #$80 ;2; toggle speaker coil output
STAA ioBFFF ;4;
TSX ;3;
LDAB 1,X ;4; get pitch
LBLFFBC INX ;3; timewaste
INX ;3; timewaste
INCB ;2;
BNE LBLFFBC ;3; (11 cycles per loop)
LDAB ram08 ;3;
ANDB #$40 ;2; get output compare flag
BEQ LBLFFB4 ;3; toggle again if still clear... (freq = 1MHz/(11*(256-PITCH)+21))
TSX ;4;
DEC ,X ;6; dec duration (=DURATION * 65.56ms)
BNE LBLFFAE ;3;
CLRA
STAA ioBFFF
PULX
LBLFFD1 RTS
FCB $6E,$69,$6C,$72,$65,$62,$6D,$61,$68,$43 ; nilrebmahC (spell it backwards)
; --- User ROM routines---
FDB LBLF883 ;Scan keyboard
FDB LBLF9C6 ;Write char to screen
FDB LBLFF4E ;Read cassette leader
FDB LBLFEB9 ;Read cassette block
FDB LBLFCC0 ;Write cassette block
FDB LBLFFAB ;Sound
FDB LBLFCB7 ;Write cassette leader
FDB LBLECE3 ; return D to BASIC
FDB LBLEBC7 ; get result -> D
FCB $00,$C9
; 6803 vectors
FDB $4200 ;SCI (TDRE + RDRF + ORFE)
FDB $4203 ;TOF Timer overflow interrupt
FDB $4206 ;OCF Output compare interrupt
FDB $4209 ;ICF Input capture interrupt
FDB $420C ;IRQ1 Maskable interrupt req 1.
FDB $420F ;SWI Software interrupt
FDB $4212 ;NMI Non-maskable interrupt
FDB LBLF72E ;Reset
.end
; { 0xE000, VECTOR },
; { 0xE030, TABLE },
; { 0xE045, TABLE_ASCII },
; { 0xE148, VECTOR },
; { 0xE18A, TABLE_ASCII },
; { 0xE1C8, CODE },
; { 0xE7C1, TABLE_ASCII },
; { 0xE7C8, CODE },
; { 0xE8AB, TABLE_ASCII },
; { 0xE8BB, CODE },
; { 0xE988, TABLE },
; { 0xE98B, CODE },
; { 0xF08B, TABLE },
; { 0xF0B9, CODE },
; { 0xF403, TABLE },
; { 0xF412, CODE },
; { 0xF524, TABLE },
; { 0xF54D, CODE },
; { 0xF59B, TABLE },
; { 0xF5C9, CODE },
; { 0xF682, TABLE_WORD },
; { 0xF686, CODE },
; { 0xF6F6, TABLE },
; { 0xF72E, CODE },
; { 0xF7F7, TABLE },
; { 0xF810, TABLE_ASCII },
; { 0xF83F, CODE },
; { 0xF956, TABLE_ASCII },
; { 0xF9C6, CODE },
; { 0xFFD2, TABLE_ASCII },
; { 0xFFDC, VECTOR },
; { 0xFFEE, TABLE },
; { 0xFFF0, TABLE_WORD },
; { 0x10000, DISASM_END },
================================================
FILE: docs/mega65.txt
================================================
https://dansanderson.com/mega65/taste-the-rainbow/
================================================
FILE: docs/presentazione.md
================================================
# CROSS-LIB
Una breve presentazione
## COSA E'?
Cross-Lib è una libreria C e alcuni strumenti che permettono di scrivere semplici giochi per computer, consoles 8-bit e
altri dispositivi vintage (calcolatrici scientifiche, board arcade, computer giocattolo, etc.).
Permette di scrivere un gioco *UNA SOLA VOLTA* e poi compilarne il codice per circa 200 sistemi vintage senza bisogno di doverlo adattare manualmente.
Quindi si usa come una normale libreria C che non fa altro che estendere il C con alcune funzioni per l'input, la grafica e per i suoni.
I giochi scritti con Cross-Lib sono quindi scritti in C.
## COMPILAZIONE
Cross-Lib è fatta in modo che il codice del gioco possa essere cross-compilato con più di una dozzina di cross-compilatori diversi per centinaia di sistemi diversi.
In sostanza si usano dei cross-compilatori su PC che producono i binari e eventuali immagini disco/cassetta/cartuccia direttamente da PC.
## FLESSIBILITA'
Cross-Lib supporta pressoché qualsiasi sistema 8-bit tra quelli degli ultimi anni 60 fino a quelli dei primi anni 90. Quindi supporta sia sistemi senza alcuna grafica, senza colori e suoni (come CP/M senza schede grafiche aggiuntive), sia sistemi con grafica, colori e suoni (come il Commodore 64 e la console Sega Master System).
Cross-Lib fa la "magia" di adattare durante la compilazione il gioco alla presenza o meno di grafica, colori, suoni e adatta il gioco anche rispetto alla dimensione dello schermo di ogni sistema.
## LIMITI
Questa enorme flessibilità però impone alcuni vincoli su alcuni aspetti tecnici dei giochi che si possono scrivere con Cross-Lib:
- grafica a tiles,
- poche tiles,
- suoni limitati,
- pochi colori,
- velocità del gioco a volte non sempre costante,
- velocità del gioco non sempre identica tra i diversi sistemi,
- etc.
Il risultato più evidente è che i giochi scritti con C usano poche tiles (cioè qualcosa di simile a dei caratteri ridefiniti).
Nonostante questi limiti è comunque possibile creare delle animazioni più fluide del semplice movimento di un carattere.
I giochi attualmente possibili hanno un aspetto simile a quelli dei primi anni 80 su un Sinclair ZX Spectrum.
## SVILUPPO FUTURO
Cross-Lib NON è un prodotto finito.
In futuro migliorerò diversi aspetti tra cui:
- facilità d'uso come framework di sviluppo,
- possibilità di usare un numero maggiore di tiles,
- maggiore flessibilità dei suoni.
================================================
FILE: docs/presentazione.txt
================================================
CROSS-LIB
Una breve presentazione
COSA E'?
Cross-Lib è una libreria C e alcuni strumenti che permettono di scrivere semplici giochi per computer, consoles 8-bit e
altri dispositivi vintage (calcolatrici scientifiche, board arcade, computer giocattolo, etc.).
Permette di scrivere un gioco UNA SOLA VOLTA e poi compilarlo per circa 200 sistemi vintage senza bisogno di doverlo adattare.
Quindi si usa come una normale libreria C che non fa altro che estendere il C con alcune funzioni per la grafica e per i suoni.
I giochi scritti con Cross-Lib sono quindi scritti in C.
COMPILAZIONE
Cross-Lib è fatta in modo che il codice del gioco possa essere cross-compilato con più di una dozzina di cross-compilatori diversi per centinaia di sistemi diversi.
In sostanza si usano dei cross-compilatori su PC che producono i binari e eventuali immagini disco/cassetta/cartuccia direttamente da PC.
FLESSIBILITA'
Cross-Lib supporta pressoché qualsiasi sistema 8-bit tra quelli degli ultimi anni 60 a quelli più recente. Quindi supporta target senza alcuna grafica, colori e suoni come CP/M senza schede grafiche aggiuntive e sistemi con grafica, colori e suoni come il Commodore 64 e la Game Boy.
Cross-Lib fa la "magia" di adattare durante la compilazione il gioco alla presenza o meno di grafica, colori, suoni e dimensione dello schermo di ogni sistema.
LIMITI
Questa enorme flessibilità però impone alcuni vincoli su alcuni aspetti tecnici dei giochi che si possono scrivere con Cross-Lib:
- grafica a tiles,
- suoni limitati,
- pochi colori,
- velocità del gioco a volte non sempre costante,
- velocità del gioco non sempre identica tra i diversi sistemi,
- etc.
Il risultato è che i giochi scritti con C usano poche tiles (cioè qualcosa di simile a dei caratteri ridefiniti).
Nonostante questi limiti è comunque possibile creare delle animazioni più fluide del semplice movimento di un carattere.
I giochi attualmente possibili hanno un aspetto simile a quelli dei primi anni 80 su un Sinclair ZX Spectrum.
SVILUPPO FUTURO
Cross-Lib NON è un prodotto finito.
In futuro migliorerò diversi aspetti tra cui:
- facilità d'uso come framework di sviluppo,
- possibilità di usare un numero maggiore di tiles,
- maggiore flessibilità dei suoni.
================================================
FILE: docs/requirements.txt
================================================
REQUIREMENTS
In order to build the binaries for all targets, you need the compilers (see README.md) and some additionals tools, such as:
- Java
- Python
================================================
FILE: docs/zzap_issue.txt
================================================
Are PSG sound routines on the Spectrum target suppose to work as on other A&-3-8910 targets?
I am testing with the Spectrum 128 emulated by Fuse and EightyOne emulators.
Fuse: black screen freezze
EightyOne: no freeze but the border flashes when I run the zap function
I am using the following code (which works on CPC):
```
#include
#include
#include
#define A_PERIOD_LOW 0
#define A_PERIOD_HI 1
#define B_PERIOD_LOW 2
#define B_PERIOD_HI 3
#define C_PERIOD_LOW 4
#define C_PERIOD_HI 5
#define NOISE 6
#define CONTROL 7
#define A_VOLUME 8
#define B_VOLUME 9
#define C_VOLUME 10
#define ENV_PERIOD_LOW 11
#define ENV_PERIOD_HI 12
#define ENV_WAVE 13
void _ping_sound(uint8_t freq)
{
uint8_t i;
set_psg(A_VOLUME,15);
set_psg(A_PERIOD_LOW,255);
set_psg(A_PERIOD_HI, 15 - (freq>>4));
set_psg(CONTROL, 0xFF - 0x01);
for(i=0;i<220;++i)
{
}
set_psg(A_VOLUME,0);
}
void _explosion_sound(uint8_t freq)
{
uint8_t i;
uint8_t j;
set_psg(NOISE,15);
set_psg(A_VOLUME,15);
set_psg(A_PERIOD_LOW,0);
set_psg(A_PERIOD_HI, 15 - (freq>>4));
set_psg(CONTROL, 0xFF - 0x08);
for(i=0;i<13;i++)
{
set_psg(A_VOLUME,15-i);
for(j=0;j<253;++j)
{
}
}
set_psg(A_VOLUME,0);
}
void ZAP_SOUND(void) {
uint8_t i;
uint8_t j;
set_psg(A_VOLUME,15);
set_psg(A_PERIOD_LOW,255);
set_psg(A_PERIOD_HI, 15);
set_psg(CONTROL, 0xFF - 0x01);
for(i=0;i<16;i++) {
set_psg(A_PERIOD_HI,15-i);
for(j=0;j<150;++j){}
}
set_psg(A_VOLUME,0);
}
#define PING_SOUND() _ping_sound(0xF0);
#define TOCK_SOUND() _ping_sound(0x02);
#define TICK_SOUND() _ping_sound(0x60);
#define SHOOT_SOUND() _explosion_sound(0xF0);
#define EXPLOSION_SOUND() _explosion_sound(0x80);
int main()
{
while(1) {
clrscr();
printf("press a key\n");
getch();
clrscr();
printf("ping sound");
PING_SOUND();
getch();
clrscr();
printf("explosion");
EXPLOSION_SOUND();
getch();
clrscr();
printf("zzzapp!!\n");
ZAP_SOUND();
getch();
};
return 0;
}
```
which I compile with:
```
$(Z88DK_PATH)$(MYZ88DK) +zx -lndos -create-app -vn $(TEST_PATH)/psg_test.c
```
================================================
FILE: logs/.gitkeep
================================================
================================================
FILE: roms/mame/.keepthisfile.txt
================================================
keep this file
================================================
FILE: roms/vice/c64/.keepthisfile.txt
================================================
keep this file
================================================
FILE: roms/vice/pet/.keepthisfile.txt
================================================
keep this file
================================================
FILE: roms/vice/plus4/.keepthisfile.txt
================================================
keep this file
================================================
FILE: roms/vice/vic20/.keepthisfile.txt
================================================
keep this file
================================================
FILE: src/Makefile_common
================================================
######################################################################
# Common Makefile
SOURCE_PATH := $(PARENT_DIR)/$(GAME_NAME)
#-D_DEFAULT_ASCII
DEFAULT_ASCII=
GLOBAL_OPTS ?= $(DEFAULT_ASCII) $(COMPILER_OPTS) $(PROJECT_OPTS) -D__FORCE_SLOWDOWN=$(SLOWDOWN)
#
#-D_BACKGROUND_COLOR=1
# NCURSES ?= ncursesw
#######################################################################
# Use parameters (env variables) to modify compilation parameters
SCCZ80_OPTS ?= $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)
#-O0
#-O3
SCCZ80_ROM_OPTS ?= $(GLOBAL_OPTS) $(Z88DK_MAKEFILE_COMPILATION_OPTS)
#-O0
#-O3
ZSDCC_OPTS ?= $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)
# -SO2
#-SO0
# -SO3 --max-allocs-per-node200000
ZSDCC_ROM_OPTS ?= $(ZSDCC_MAKEFILE_COMPILATION_OPTS) $(GLOBAL_OPTS)
# -SO3
# -SO3 --max-allocs-per-node200000
Z88DK_MAKE_OPTS ?= $(ZSDCC_MAKEFILE_THREADS_OPTS)
#-j 8
######################################################################
# Cross-Shoot files
#
SCCZ80_OPTS ?= -O0
# Parallel compilation for Z88DK targets
# Z88DK_MAKE_OPTS ?= -j 8
####################################################################################################################
# COMMON INCLUDES
include makefiles.common/auxiliary/Makefile_ALL
#################################################################
# Grouped Targets
ifeq ($(DO_WIN),1)
all: \
gcc_targets \
cc65_targets \
cmoc_targets \
lcc1802_targets \
z88dk_targets
C1541 = ../tools/generic/c1541.exe
LCC1802_HEX=hex
else
all: \
gcc_targets \
cc65_targets \
cmoc_targets \
z88dk_targets
C1541 = c1541
LCC1802_HEX=out
endif
gcc_targets: \
ncurses
#TODO: Atari is currently broken in newest cc65 versions
ifeq ($(DO_WIN),1)
cc65_targets_sequential: \
apple2 \
apple2enh \
atari \
atari_lynx \
atari5200 \
atari7800 \
c16 \
c64 \
cbm510 \
cbm610 \
creativision \
gamate \
oric \
nes \
pet \
pce \
supervision \
vic20
else
cc65_targets_sequential: \
apple2 \
apple2enh \
atari_lynx \
atari5200 \
atari7800 \
atari \
c16 \
c64 \
cbm510 \
cbm610 \
creativision \
gamate \
oric \
nes \
pet \
pce \
supervision \
vic20
endif
cc65_targets:
$(MAKE) $(Z88DK_MAKE_OPTS) cc65_targets_sequential -f ./$(PARENT_DIR)/$(GAME_NAME)/Makefile.$(GAME_NAME)
cmoc_targets: \
mo5_targets \
to7_targets \
coco_targets
ifeq ($(DO_WIN),1)
z88dk_targets_sequential: \
ace \
agon \
aquarius \
cpc \
c128_z80_40col \
camputers_lynx \
coleco \
cpm \
gb \
laser500 \
mc1000 \
bee \
m5 \
msx \
mtx500 \
mtx512 \
mz \
pc88 \
samcoupe \
sc3000 \
sc3000_rom \
sg1000 \
spectrum \
vg5k \
vz200 \
zx81_wrx \
zx81_8x6_wrx128 \
zx81 \
gg \
sms
else
z88dk_targets_sequential: \
aquarius \
ace \
agon \
camputers_lynx \
coleco \
cpc \
cpm \
gb \
laser500 \
mc1000 \
bee \
m5 \
msx \
mtx500 \
mtx512 \
mz \
pc88 \
samcoupe \
sc3000 \
sc3000_rom \
sg1000 \
spectrum \
vg5k \
vz200 \
zx81_wrx \
zx81_8x6_wrx128 \
zx81 \
gg \
sms
endif
z88dk_targets:
$(MAKE) $(Z88DK_MAKE_OPTS) z88dk_targets_sequential -f ./$(PARENT_DIR)/$(GAME_NAME)/Makefile.$(GAME_NAME)
_lcc1802_6x9_targets: \
_comx \
_pecom \
_micro
lcc1802_6x9_targets: \
_lcc1802_6x9_targets \
clean_combo_files
_lcc1802_6x8_targets: \
_comx_ntsc
lcc1802_6x8_targets: \
_lcc1802_6x8_targets \
clean_combo_files
_lcc1802_ascii_targets: \
_tmc600
lcc1802_ascii_targets: \
_lcc1802_ascii_targets \
clean_combo_files
lcc1802_targets: \
_lcc1802_6x9_targets \
_lcc1802_ascii_targets \
clean_combo_files
#################################################################
# CC65
#################################################################
CC65_OPTS = $(GLOBAL_OPTS) $(CC65_MAKEFILE_COMPILATION_OPTS)
apple2: apple2_hgr
apple2_hgr: $(ASSETS_PATH)/7x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \
--config $(CFG_PATH)/cc65/apple2-hgr.cfg \
-D__ALT_SLEEP $(APPLE2_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \
-D__ALT_PRINT \
-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
--code-name LOWCODE \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \
-o $(BUILD_PATH)/aschase.bin
ifdef USE_TOOLS
cp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
java -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/aschase.bin
rm -rf $(BUILD_PATH)/aschase.bin
else
mv $(BUILD_PATH)/aschase.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
AGAT_GFX_OPTS ?= -D__BIT_MAPPED_GRAPHICS -D__BIT_MAPPED_16_GRAPHICS -D_XL_NO_SMALL_LETTERS
agat: $(ASSETS_PATH)/cc65_agat.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \
-D__AGAT__ -D_XL_NO_JOYSTICK -D_XL_JCUKEN_KEYBOARD -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \
$(AGAT_GFX_OPTS) \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \
-o $(BUILD_PATH)/$@.bin
ifdef USE_TOOLS
cp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
java -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin
rm -rf $(BUILD_PATH)/$@.bin
else
mv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
agat_ijkl: $(ASSETS_PATH)/cc65_agat.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \
-D__AGAT__ -D_XL_NO_JOYSTICK -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \
$(AGAT_GFX_OPTS) \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \
-o $(BUILD_PATH)/$@.bin
ifdef USE_TOOLS
cp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
java -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin
rm -rf $(BUILD_PATH)/$@.bin
else
mv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
# TODO: does it work?
agat_cursors: $(ASSETS_PATH)/cc65_agat.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t agat \
-D__AGAT__ -D_XL_NO_JOYSTICK -D_XL_ARROW_KEYS -D__ALT_SLEEP -D__ALT_PRINT -D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGAT_SLOWDOWN) -DXSize=16 -DYSize=16 \
$(AGAT_GFX_OPTS) \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(FULL_FILES) $(ASSETS_PATH)/cc65_agat.s \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/agat/agat_init_graphics.c \
-o $(BUILD_PATH)/$@.bin
ifdef USE_TOOLS
cp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
java -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk xl < $(BUILD_PATH)/$@.bin
rm -rf $(BUILD_PATH)/$@.bin
else
mv $(BUILD_PATH)/$@.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
#################################################################
apple2enh: apple2enh_hgr
apple2enh_hgr: $(ASSETS_PATH)/7x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t apple2 \
--config $(CFG_PATH)/cc65/apple2-hgr.cfg \
-D__ALT_SLEEP $(APPLE2_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_APPLE2ENH_HGR_SLOWDOWN) -DXSize=20 -DYSize=24 \
-D__ALT_PRINT \
-D__APPLE2_HGR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/hgr.s \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
--code-name LOWCODE \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/apple2/apple2_hgr_init_graphics.c \
-o $(BUILD_PATH)/aschase.bin
ifdef USE_TOOLS
cp $(TOOLS_PATH)/cc65/apple2/MASTER_BOOT_ASCHASE.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
java -jar $(TOOLS_PATH)/cc65/apple2/ac.jar -as $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk aschase < $(BUILD_PATH)/aschase.bin
rm -rf $(BUILD_PATH)/aschase.bin
else
mv $(BUILD_PATH)/aschase.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
#################################################################
atari: $(ASSETS_PATH)/8x8_chars.h $(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr$(COMPILEDEXT)
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari \
\
$(5COLOR_PALETTE) \
--config $(CFG_PATH)/cc65/atari_mode1_redefined_chars.cfg \
-D__ANTIC_MODE6_GRAPHICS -D__ALT_SLEEP \
-D__NO_SCREEN_COLOR_INIT \
-D__ALT_PRINT \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/alt_print/atari_mode1_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/disable_setcursor.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari/atari_mode1_redefined_chars_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.xex
$(TOOLS_PATH)/cc65/atari/mkatr-master/mkatr $(BUILD_PATH)/X$(GAME_NAME)_$@.atr -b $(BUILD_PATH)/X$(GAME_NAME)_$@.xex
#################################################################
atari5200: $(ASSETS_PATH)/8x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari5200 \
--config $(CFG_PATH)/cc65/atari5200_redefined_chars_32k.cfg \
-D__ATARI5200__ $(5COLOR_PALETTE) \
-D__ANTIC_MODE6_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI5200_SLOWDOWN) \
$(CROSS_LIB_PATH)/sound/cc65/pokey/pokey_sounds.c \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari5200/atari5200_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom
#################################################################
atari_lynx: $(ASSETS_PATH)/8x6_tiles.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t lynx \
-D__ATARI_LYNX__ -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI_LYNX_SLOWDOWN) \
-D__NO_SCREEN_COLOR_INIT -DXSize=20 -DYSize=17 -D_XL_NUMBER_OF_TILES=27 \
-D__LYNX_TGI_GRAPHICS \
-D__ALT_PRINT \
$(CROSS_LIB_PATH)/display/alt_print/tgi_gfx_print.c \
$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/atari_lynx_sounds.c \
$(CROSS_LIB_PATH)/sound/cc65/atari_lynx/chibisound.asm \
$(ASSETS_PATH)/8x6_tiles.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari_lynx/atari_lynx_gfx_init_graphics.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.lnx
#################################################################
%.o : %.s
$(CC65_PATH)$(CA65) -t atari7800 -o$@ $<
sfxobjects= \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_bling.o \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_explosion.o \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_poof1.o \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_poof2.o \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_powerup.o \
$(TOOLS_PATH)/cc65/atari7800/sfxlib/sfx_quack.o
sfxlib = sfx.lib
# all: $(sfxlib)
$(sfxlib) : $(sfxobjects)
$(AR65) rv $(sfxlib) $(sfxobjects)
$(AR65) t $(sfxlib)
atari7800: $(ASSETS_PATH)/cc65_udc_atari7800_160A.s $(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s $(TOOLS_PATH)/cc65/atari7800/sfx.o $(TOOLS_PATH)/cc65/atari7800/extzp.o $(sfxlib)
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ \
-D__ATARI7800_COLOR_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_SLOWDOWN) \
-DXSize=20 -DYSize=28 -D__DEFAULT_CLEAR_SCREEN $(4COLOR_PALETTE) \
-D__ALT_PRINT \
$(TOOLS_PATH)/cc65/atari7800/extzp.o \
$(TOOLS_PATH)/cc65/atari7800/sfx.o \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari7800/atari7800_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78 -L . sfx.lib
rm sfx.lib
atari7800_no_color:
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ atari7800-mono.o \
--config $(CFG_PATH)/cc65/atari7800_more_ram.cfg -D_XL_NO_UDG -D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP -D_XL_NO_SOUND \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_NO_COLOR_SLOWDOWN) -DXSize=34 -DX_OFFSET=3 -DYSize=28 \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78
atari7800_320A: $(ASSETS_PATH)/cc65_udc_atari7800_160A.s $(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t atari7800 --force-import __EXEHDR__ atari7800-mono.o \
--config $(CFG_PATH)/cc65/atari7800_more_ram.cfg -D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \
-D__ATARI7800_COLOR_GRAPHICS -D__DEFAULT_CLEAR_SCREEN \
-D__CONIO_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D__ALT_SLEEP -D_XL_NO_SOUND \
$(ASSETS_PATH)/formatted_cc65_udc_atari7800_160A.s \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ATARI7800_NO_COLOR_SLOWDOWN) -DXSize=34 -DX_OFFSET=3 -DYSize=28 \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atari7800/atari7800_init_graphics.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.a78
#################################################################
c16: c16_32k
# -m mapfile.txt
# --check-stack
# D__DEFAULT_CLEAR_SCREEN uses _SPACE=$60, which is correct but slow
# D__KERNAL_CLEAR_SCREEN uses a hard-coded $20 character, which is wrong in this case ($60 is needed)
# D__ASSEMBLY_CLEAR_SCREEN uses a hard-coded $60, which is correct
c16_16k: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 \
--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \
-D__NO_SCREEN_COLOR_INIT \
-D__ALT_PRINT \
-D__MEMORY_MAPPED_GRAPHICS \
-D__ASSEMBLY_CLEAR_SCREEN \
-D__ALT_SLEEP \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \
-D__UDG_BASE_FACTOR=15 \
$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c16_16k_double_buffer: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 -m mapfile.txt \
--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30.cfg \
-D__NO_SCREEN_COLOR_INIT -D__USE_WAIT_V_SYNC \
-D__ALT_PRINT \
-D__MEMORY_MAPPED_GRAPHICS -D__DOUBLE_BUFFER \
-D__ASSEMBLY_CLEAR_SCREEN -D__DEFAULT_CLEAR_SCREEN \
-D__ALT_SLEEP \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_DOUBLE_BUFFER_SLOWDOWN) \
-D__UDG_BASE_FACTOR=15 \
$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c16_16k_low_stack: $(ASSETS_PATH)/cc65_udc_arcade_64_chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 \
--config $(CFG_PATH)/cc65/c16-16k_GFX_64chars_stack_0x30_less_hd_stack.cfg \
-D__NO_SCREEN_COLOR_INIT \
-D__ALT_PRINT \
-D__MEMORY_MAPPED_GRAPHICS \
-D__ASSEMBLY_CLEAR_SCREEN \
-D__ALT_SLEEP \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \
-D__UDG_BASE_FACTOR=15 \
$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_udc_arcade_64_chars.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_linked_redefined_chars_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c16_conio: c16_16k_conio
c16_16k_conio: $(ASSETS_PATH)/8x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 --config $(CFG_PATH)/cc65/c16-16k.cfg -m mapfile.txt \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_CONIO_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#c16_32k: c16_32k_conio
c16_32k: $(ASSETS_PATH)/8x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c16 --config $(CFG_PATH)/cc65/c16-32k.cfg \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C16_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c264/c16_redefined_chars_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/c264/c264_sounds.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#################################################################
# c64_Ln: $(ASSETS_PATH)/cc65_udc_arcade.s
# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 -Ln global \
# --config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg \
# -D__MEMORY_MAPPED_GRAPHICS -D__ALT_PRINT \
# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \
# $(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \
# $(ASSETS_PATH)/cc65_udc_arcade.s \
# $(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \
# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
# $(FULL_FILES) \
# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
# -Ln global
c64: $(ASSETS_PATH)/cc65_udc_arcade.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \
--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg \
-D__MEMORY_MAPPED_GRAPHICS -D__ALT_PRINT \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \
$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \
$(ASSETS_PATH)/cc65_udc_arcade.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c64_double_buffer: $(ASSETS_PATH)/cc65_udc_arcade.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \
--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg \
-D__MEMORY_MAPPED_GRAPHICS -D__DOUBLE_BUFFER -D__ALT_PRINT \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \
$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \
$(ASSETS_PATH)/cc65_udc_arcade.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#TODO: Broken
c64_conio: $(ASSETS_PATH)/cc65_udc_arcade_conio.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t c64 \
--config $(CFG_PATH)/cc65/c64_GFXat0xC000.cfg \
-D__CONIO_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C64_SLOWDOWN) \
$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \
$(ASSETS_PATH)/cc65_udc_arcade_conio.s \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c64/c64_init_graphics.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
ifdef USE_TOOLS
c64_exomized: c64 $(TOOLS_PATH)/generic/exomizer/exomizer$(COMPILEDEXT)
$(TOOLS_PATH)/generic/exomizer/exomizer sfx basic $(BUILD_PATH)/X$(GAME_NAME)_$<.prg -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c64_crt: c64_exomized
python $(TOOLS_PATH)/cc65/c64/prg2crt.py $(BUILD_PATH)/X$(GAME_NAME)_$<.prg $(BUILD_PATH)/X$(GAME_NAME)_$@.crt
endif
#######################################################################################
# CBM610
cbm610:
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t cbm610 \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CBM610_SLOWDOWN) \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#######################################################################################
# CBM510
cbm510:
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t cbm510 -DEXTRA_TITLE \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_SOUND -D_XL_NO_UDG \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CBM510_SLOWDOWN) \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#################################################################
ifdef USE_TOOLS
gamate: $(ASSETS_PATH)/cc65_gamate_tiles.s $(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT)
else
gamate: $(ASSETS_PATH)/cc65_gamate_tiles.s
endif
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t gamate --config $(CFG_PATH)/cc65/gamate_reduced_stack.cfg \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAMATE_SLOWDOWN) \
$(GAMATE_GAME_OPTS) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
-D__NO_SCREEN_COLOR_INIT \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_gamate_tiles.s \
$(CROSS_LIB_PATH)/sound/cc65/gamate/gamate_sounds.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin
ifdef USE_TOOLS
$(TOOLS_PATH)/cc65/gamate/gamate-fixcart$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_gamate.bin
endif
#################################################################
nes: $(ASSETS_PATH)/cc65_nes_color_tiles.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t nes \
--config $(CFG_PATH)/cc65/nes_fx.cfg \
-D__NES_CONIO_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NES_SLOWDOWN) \
$(4COLOR_PALETTE) \
-D__DEFAULT_CLEAR_SCREEN \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/nes/nes_init_graphics.c \
$(ASSETS_PATH)/cc65_nes_color_tiles.s \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_nes.nes
#################################################################
pce: pce_32k
pce_16k: $(ASSETS_PATH)/cc65_pce_tiles.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pce \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCE_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
--config $(CFG_PATH)/cc65/pce_16k_less_stack.cfg \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_pce_tiles.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 count=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 skip=8192 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin
cat $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_PCE_SWAPPED.pce
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin
pce_32k: $(ASSETS_PATH)/cc65_pce_tiles.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pce \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PCE_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
--config $(CFG_PATH)/cc65/pce_32k.cfg \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_pce_tiles.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 count=24576 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_PCE.bin ibs=1 skip=24576 of=$(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE.bin
cat $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin > $(BUILD_PATH)/X$(GAME_NAME)_PCE_SWAPPED.pce
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_LOW.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_PCE_HIGH.bin
#################################################################
creativision: $(ASSETS_PATH)/8x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t creativision \
-D__CREATIVISION__ \
-D__ALT_SLEEP $(CREATIVISION_GAME_OPTS) \
-D__VDP_MODE1_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CREATIVISION_SLOWDOWN) \
--config $(CFG_PATH)/cc65/creativision-16k.cfg \
$(CROSS_LIB_PATH)/sound/cc65/creativision/creativision_sounds.c \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/creativision/creativision_color_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k skip=1 > $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin
dd if=$(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin bs=8k count=1 >> $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k_SWAPPED.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_creativision_16k.bin
#################################################################
oric: oric_atmos
atmos: oric_atmos
oric1: oric_atmos
oric1_48k: oric_atmos
oric_atmos: $(ASSETS_PATH)/6x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) \
-t atmos -D_XL_NO_JOYSTICK $(ORIC_COLORS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ORIC_SLOWDOWN) \
--config $(CFG_PATH)/cc65/atmos_better_tap.cfg \
-D__ORIC_COLOR_GRAPHICS \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/atmos/atmos_redefined_characters_init_graphics.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_atmos_and_oric1_48k.tap
#################################################################
pet: pet_16k
pet_16k:
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t pet -m mapfile.txt \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PET_SLOWDOWN) \
-D__NO_INIT_GRAPHICS -D__CONIO_GRAPHICS -D_XL_NO_UDG \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/sound/cc65/pet/pet_sounds.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_pet_16k.prg
#################################################################
supervision: $(ASSETS_PATH)/cc65_udc.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t supervision \
--config $(CFG_PATH)/cc65/supervision-16k_GFX_2.cfg \
$(ASSETS_PATH)/cc65_udc.s \
-D__ALT_PRINT -D__ALT_SLEEP \
-D__BIT_MAPPED_4_GRAPHICS \
-D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SUPERVISION_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/supervision/supervision_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_supervision.sv
#################################################################
vic20: vic20_exp_16k
vic20_exp_16k: $(ASSETS_PATH)/cc65_udc_arcade_v2.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \
--config $(CFG_PATH)/cc65/vic20-16k_CODE2_GFX_V2.cfg \
-D__CONIO_GRAPHICS -D__VIC20_EXP_8K $(VIC_20_EXP_16K_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
\
$(ASSETS_PATH)/cc65_udc_arcade_v2.s \
$(FULL_FILES) \
--code-name CODE2 \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
vic20_exp_8k_conio: $(ASSETS_PATH)/cc65_udc_arcade_v2.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \
--config $(CFG_PATH)/cc65/vic20-8k_CODE2_GFX_V2.cfg \
-D__CONIO_GRAPHICS -D__VIC20_EXP_8K $(VIC_20_EXP_16K_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
$(FULL_FILES) \
--code-name CODE2 \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
$(ASSETS_PATH)/cc65_udc_arcade_v2.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
vic20_exp_8k: $(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \
--config $(CFG_PATH)/cc65/vic20-8k_memory_mapped_GFX.cfg \
-D__ALT_SLEEP $(VIC_20_EXP_16K_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
-D__MEMORY_MAPPED_GRAPHICS -D__VIC20__ -D__VIC20_EXP_8K \
-D__ALT_PRINT \
-D__DEFAULT_CLEAR_SCREEN \
$(FULL_FILES) \
--code-name CODE2 \
$(ASSETS_PATH)/cc65_udc_vic20_27_tiles.s \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
vic20_exp_3k: $(ASSETS_PATH)/cc65_udc_vic20_64_chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \
--config $(CFG_PATH)/cc65/vic20-3k_GFX.cfg \
-D__VIC20_EXP_3K \
-D__MEMORY_MAPPED_GRAPHICS \
$(VIC_20_EXP_3K_GAME_OPTS) \
-D__ALT_PRINT \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
$(FULL_FILES) \
$(ASSETS_PATH)/cc65_udc_vic20_64_chars.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
# Unexpanded VIC 20, with 6 tiles, default ASCII mapped as reverse characters
# vic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s
# $(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \
# -D_XL_NO_TEXT_COLOR \
# -D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \
# -D__NO_SLEEP_SEC -D__ALT_SLEEP \
# -D__NO_COLOR_INIT \
# -D__MEMORY_MAPPED_GRAPHICS \
# -D__ALT_PRINT \
# -D__DEFAULT_CLEAR_SCREEN \
# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
# $(VIC20_UNEXPANDED_GAME_OPTS) \
# --config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg \
# $(FULL_FILES) \
# $(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
# $(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
# $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
# $(ASSETS_PATH)/cc65_udc_6chars.s \
# -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
# Same as above but with just explosion sound
vic20_unexpanded: $(ASSETS_PATH)/cc65_udc_6chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \
-D_XL_NO_TEXT_COLOR \
-D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \
-D__NO_SLEEP_SEC -D__ALT_SLEEP \
-D__NO_COLOR_INIT \
-D__MEMORY_MAPPED_GRAPHICS \
-D__ALT_PRINT \
-D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
$(VIC20_UNEXPANDED_GAME_OPTS) \
--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx.cfg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_explosion_sound.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(ASSETS_PATH)/cc65_udc_6chars.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
vic20_unexpanded2: $(ASSETS_PATH)/cc65_udc_6chars.s
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 -m mapfile.txt \
-D_XL_NO_TEXT_COLOR \
-D__VIC20_UNEXPANDED -D_XL_NUMBER_OF_TILES=6 \
-D__NO_SLEEP_SEC -D__ALT_SLEEP \
-D__NO_COLOR_INIT \
-D__MEMORY_MAPPED_GRAPHICS \
-D__ALT_PRINT \
-D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
$(VIC20_UNEXPANDED_GAME_OPTS) \
--config $(CFG_PATH)/cc65/vic20_unexpanded_gfx_low_stack.cfg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(ASSETS_PATH)/cc65_udc_6chars.s \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
vic20_unexpanded_no_gfx:
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) $(CC65_OPTS) -t vic20 \
-D__MEMORY_MAPPED_GRAPHICS \
-D_XL_NO_TEXT_COLOR \
-D__VIC20_UNEXPANDED \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIC20_SLOWDOWN) \
-D__ALT_SLEEP -D__NO_SLEEP_SEC \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_UDG \
$(VIC20_UNEXPANDED_NO_GFX_GAME_OPTS) \
-D__ALT_PRINT \
--config $(CFG_PATH)/cc65/alt/vic20_unexpanded.cfg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/sound/cc65/vic20/vic20_sounds.c \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/vic20/vic20_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#################################################################
# Z88DK
#################################################################
jupiter_ace: ace
ace: ace_exp_16k
ace_exp_16k: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +ace $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__ACE__ \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ACE_SLOWDOWN) \
-D_XL_NO_JOYSTICK \
-D__CONIO_GRAPHICS \
-clib=default \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@ -Cz--audio -create-app
rm $(BUILD_PATH)/X$(GAME_NAME)_$@
#################################################################
agon: agon_mode2
agon_mode2: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +agon $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__AGON__ -D_XL_NO_JOYSTICK -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__SCREEN_MODE=2 -pragma-define:CRT_ENABLE_COMMANDLINE=0 \
-D__CONIO_GRAPHICS -DXSize=40 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AGON_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
#################################################################
aquarius: aquarius_exp_16k
aquarius_exp_16k:
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ \
-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
aquarius_rom:
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi -subtype=rom $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ \
-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
aquarius_plus_caq: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \
-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
# aqx
aquarius_plus: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus -subtype=aqx $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \
-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
aquarius_plus_rom: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=aqplus -subtype=rom $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ --generic-console -D__SCREEN_MODE=1 \
-lndos -D_XL_NO_JOYSTICK -DY_OFFSET=1 -DYSize=23 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
aquarius_alt:
$(Z88DK_PATH)$(MYZ88DK) +aquarius $(SCCZ80_OPTS) -clib=ansi $(INCLUDE_OPTS) -vn \
-D__AQUARIUS__ \
-lndos -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) -D_XL_NO_UDG \
-D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \
$(FULL_FILES) \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
# experimental
aquarius_exp_4k:
$(Z88DK_PATH)$(MYZ88DK) +aquarius -SO3 -compiler=sdcc -clib=ansi $(INCLUDE_OPTS) -vn \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \
-D__AQUARIUS__ \
-lndos -D_XL_NO_UDG -D_XL_NO_JOYSTICK \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_AQUARIUS_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_aquarius_exp_4k
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_aquarius_exp_4k
#
# -D__BIT_BANG_SOUND
#################################################################
c128: c128_40col
c128_8502_80col: $(ASSETS_PATH)/8x8_chars.h
$(CC65_PATH)$(MYCC65) $(INCLUDE_OPTS) -O -t c128 \
-DXSize=80 \
-D__CONIO_GRAPHICS -D__80COL_UDG -D_XL_NO_SMALL_LETTERS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_8502_80COL_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/cc65/c128/c128_80col_init_graphics.c \
$(CROSS_LIB_PATH)/sound/cc65/sid/sid_sounds.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
c128_zsdcc: c128_z80_40col_zsdcc
c128_40col_zsdcc: c128_z80_40col_zsdcc
c128_40col: c128_z80_40col
c128_z80_40col_alt: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-lndos -subtype=disk -clib=gencon \
-D__C128_Z80__ -DXSize=40 \
\
-D__BIT_BANG_SOUND \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_40COL_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app -o"a40.bin"
ifdef USE_TOOLS
$(C1541) -format "crosschase,0" d64 FULL_$@.d64
$(C1541) -attach FULL_$@.d64 -write a40.ldr
$(C1541) -attach FULL_$@.d64 -write a40
mv FULL_$@.d64 $(BUILD_PATH)/X$(GAME_NAME)_$@.d64
rm a40.bin
else
mv a40.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
rm a40.ldr
rm a40
c128_z80_40col: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/generic/CC1541/cc1541$(COMPILEDEXT)
$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-lndos -subtype=disk -clib=gencon \
-D__C128_Z80__ -DXSize=40 \
\
-D__BIT_BANG_SOUND \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_40COL_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app -o"a40.bin"
../tools/generic/CC1541/cc1541 -f a40.ldr -w a40.ldr X$(GAME_NAME)_$@.d64
../tools/generic/CC1541/cc1541 -f a40 -w a40 X$(GAME_NAME)_$@.d64
mv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/
rm -rf a40.bin
rm -rf a40.ldr
rm -rf a40
c128_80col: c128_8502_80col
c128_z80_80col_alt: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \
$(INCLUDE_OPTS) \
-lndos -subtype=disk \
-D__C128_Z80__ -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \
-D__Z88DK_SPRITES_GRAPHICS \
-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS) \
-D__ALT_PRINT \
-D_XL_NO_COLOR \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \
$(FULL_FILES) \
-create-app -o"a80.bin"
ifdef USE_TOOLS
$(C1541) -format "crosschase,0" d64 X$(GAME_NAME)_$@.d64
$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80.ldr
$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80
mv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/
rm a80.bin
else
mv a80.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
rm a80.ldr
rm a80
c128_z80_80col: $(ASSETS_PATH)/z88dk_sprites_definitions.h $(TOOLS_PATH)/generic/CC1541/cc1541$(COMPILEDEXT)
$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \
$(INCLUDE_OPTS) \
-lndos -subtype=disk \
-D__C128_Z80__ -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 -D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \
-D__Z88DK_SPRITES_GRAPHICS \
-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS) \
-D__ALT_PRINT \
-D_XL_NO_COLOR \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \
$(FULL_FILES) \
-create-app -o"a80.bin"
../tools/generic/CC1541/cc1541 -f a80.ldr -w a80.ldr X$(GAME_NAME)_$@.d64
../tools/generic/CC1541/cc1541 -f a80 -w a80 X$(GAME_NAME)_$@.d64
mv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/
rm -rf a80.bin
rm -rf a80.ldr
rm -rf a80
c128_8x6: c128_8x6_80col
c128_8x6_80col: c128_z80_8x6_80col
c128_z80_8x6_80col: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +c128 $(SCCZ80_OPTS) -lgfx128hr \
$(INCLUDE_OPTS) \
-lndos -subtype=disk \
-D__C128_Z80__ -D__NO_SPRITE_TRANSPARENCY \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 -DYSize=33 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_C128_Z80_80COL_SLOWDOWN) \
-D__BIT_BANG_SOUND $(C128_Z80_80COL_GAME_OPTS) \
-D__ALT_PRINT \
-D_XL_NO_COLOR \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/c128/c128_init_graphics.c \
$(FULL_FILES) \
-create-app -o"a80.bin"
ifdef USE_TOOLS
$(C1541) -format "crosschase,0" d64 X$(GAME_NAME)_$@.d64
$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80.ldr
$(C1541) -attach X$(GAME_NAME)_$@.d64 -write a80
mv X$(GAME_NAME)_$@.d64 $(BUILD_PATH)/
rm a80.bin
else
mv a80.bin $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
endif
rm a80.ldr
rm a80
#################################################################
camputers_lynx: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +lynx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-pragma-redirect:getk=getk_inkey \
-D__CAMPUTERS_LYNX__ -D_XL_NO_JOYSTICK -D__BIT_BANG_SOUND \
-vn \
$(CAMPUTERS_LYNX_GAME_OPTS) \
-D__VT52 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CAMPUTERS_LYNX_SLOWDOWN) \
-lndos \
-D__CONIO_GRAPHICS \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_camputers_lynx.bin
#################################################################
coleco: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +coleco $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__COLECO__ \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COLECO_SLOWDOWN) \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
\
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_coleco.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_DATA.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_coleco_BSS.bin
#################################################################
gx4000: cpc
cpc: cpc_mode0
ifdef USE_TOOLS
cpc_mode0: $(ASSETS_PATH)/z88dk_xchase.asm $(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT)
else
cpc_mode0: $(ASSETS_PATH)/z88dk_xchase.asm
endif
$(Z88DK_PATH)$(MYZ88DK) +cpc -subtype=dsk $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \
-DYSize=25 -DXSize=20 -D__SCREEN_MODE=0 \
$(CPC_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPC_MODE0_SLOWDOWN) \
-D__CPC__ \
-lndos -create-app \
-D__CONIO_GRAPHICS \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-o $(BUILD_PATH)/XBIN \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
ifdef USE_TOOLS
cp $(TOOLS_PATH)/z88dk/cpc/nocart/*.rom .
$(TOOLS_PATH)/z88dk/cpc/nocart/nocart$(COMPILEDEXT) $(BUILD_PATH)/XBIN.dsk $(BUILD_PATH)/XBIN_$@_gx4000.cpr -c 'run"XBIN'
rm os.rom
rm amsdos.rom
rm basic.rom
mv $(BUILD_PATH)/XBIN_$@_gx4000.cpr $(BUILD_PATH)/X$(GAME_NAME)_$@_gx4000.cpr
endif
mv $(BUILD_PATH)/XBIN.dsk $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
rm -rf $(BUILD_PATH)/XBIN.bin
rm -rf $(BUILD_PATH)/XBIN.cpc
rm -rf $(BUILD_PATH)/XBIN
#################################################################
cpm: cpm_z80_adm3a
cpm_adm3a: cpm_z80_adm3a
cpm_8080: cpm_8080_adm3a
cpm_8085: cpm_8085_adm3a
cpm_vt52: cpm_z80_vt52
cpm_targets: cpm_adm3a cpm_vt52
cpm_z80_adm3a:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
cpm_8080_adm3a:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) -clib=8080 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
cpm_8085_adm3a:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) -clib=8085 --generic-console -pragma-define:CONSOLE_COLUMNS=80 -pragma-define:CONSOLE_ROWS=24 -lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT -D_XL_NO_COLOR \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
cpm_z80_vt52:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_Z80_SLOWDOWN) \
-D__VT52 -DXSize=80 -DYSize=24 \
-D__NO_WAIT -D_XL_NO_COLOR \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
cpm_8080_vt52:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -m8080 -clib=8080 \
$(INCLUDE_OPTS) \
-D__VT52 -DXSize=80 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CPM_INTEL8080_SLOWDOWN) \
-D__NO_WAIT -D_XL_NO_COLOR \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__NO_SCREEN_COLOR_INIT \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
#################################################################
gb: $(ASSETS_PATH)/z88dk_gameboy.asm
$(Z88DK_PATH)$(MYZ88DK) +gb $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__GB__ \
-DXSize=20 \
-DYSize=18 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D__SCREEN_MODE=1 \
-D__CONIO_GRAPHICS \
-lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GB_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_gameboy.asm \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/sound/z88dk/gb/gb_sounds.c \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_1F.bin
#################################################################
gal: gal_22k
gal_22k:
$(Z88DK_PATH)$(MYZ88DK) +gal $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-pragma-need=ansiterminal \
-D__GAL__ \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_SLOWDOWN) \
-vn -lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_galaksija.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
gal_plus: gal_plus_gfx
gal_plus_gfx: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +gal -subtype=galaxyp $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
--generic-console -D__SCREEN_MODE=1 -DYSize=26 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GAL_GFX_SLOWDOWN) \
-D__GAL__ -D__GAL_PLUS__ $(GAL_PLUS_GAME_OPTS) \
-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND \
-vn -lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_galaksija_plus.prg \
$(FULL_FILES) $(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#################################################################
gg: gamegear
gamegear: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sms -subtype=gamegear $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__SMS__ -D__GAME_GEAR__ \
-DXSize=20 \
-DYSize=18 \
-D__BIT_BANG_SOUND \
-D__CONIO_GRAPHICS \
-lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_GG_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_DATA.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_gamegear_BANK_1F.bin
#################################################################
laser500: laser500_keyboard
laser500_joy: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(INCLUDE_OPTS) \
-D__LASER500__ -DXSize=40 -DYSize=22 -D__SCREEN_MODE=2 \
-D__BIT_BANG_SOUND \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LASER500_SLOWDOWN) \
-D__CONIO_GRAPHICS \
-lndos \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
laser500_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +laser500 $(SCCZ80_OPTS) -vn -Cz--audio \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(INCLUDE_OPTS) -D_XL_NO_JOYSTICK \
-D__LASER500__ -DXSize=40 -DYSize=22 -D__SCREEN_MODE=2 \
-D__BIT_BANG_SOUND \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_LASER500_SLOWDOWN) \
-D__CONIO_GRAPHICS \
-lndos \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
#################################################################
# -D__NO_BOTTOM
m100:
$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__M100__ \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=39 \
-DYSize=8 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
m10:
$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__M100__ -clib m10 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=39 \
-DYSize=8 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
kc85:
$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__M100__ -clib kc85 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=39 \
-DYSize=8 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
pc8201:
$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__M100__ -clib pc8201 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=39 \
-DYSize=8 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
t200:
$(Z88DK_PATH)$(MYZ88DK) +m100 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__M100__ -clib t200 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=39 \
-DYSize=16 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
mc1000_mono: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:REGISTER_SP=0x3fff \
-subtype=gaming \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC1000_SLOWDOWN) \
-D__SCREEN_MODE=1 \
-D__MC1000__ -D_XL_NO_JOYSTICK \
-D__CONIO_GRAPHICS \
-vn -lndos -Cz--audio \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
mc1000_color: mc1000
# background color white
mc1000: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +mc1000 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -pragma-define:REGISTER_SP=0x3fff \
-subtype=gaming \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC1000_SLOWDOWN) \
-D__SCREEN_MODE=2 -DXSize=16 -D__NO_SCREEN_COLOR_INIT \
-D__MC1000__ -D_XL_NO_JOYSTICK \
-D__CONIO_GRAPHICS \
-vn -lndos -Cz--audio \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
#################################################################
msx: msx_16k
msx_16k: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +msx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-vn -D__MSX__ \
-lndos -subtype=rom \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
-D__CONIO_GRAPHICS -DXSize=32 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
# TODO: BROKEN with only green
# msx2_color: msx2_mode6
msx2: msx2_color
# msx2_color: $(ASSETS_PATH)/z88dk_xchase.asm
# $(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
# -pragma-redirect:fputc_cons=fputc_cons_generic \
# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/msx2_palette.asm \
# -vn -D__MSX__ -D__SCREEN_MODE=6 -D__MSX2_COLOR -pragma-define:CLIB_CONIO_NATIVE_COLOUR=1 \
# -lndos -subtype=rom \
# -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
# -D__CONIO_GRAPHICS -DXSize=64 -DYSize=24 \
# -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \
# $(ASSETS_PATH)/z88dk_xchase.asm \
# $(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
# $(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
# $(FULL_FILES)
# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
# rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
msx2_mono: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic -D_XL_NO_COLOR \
-vn -D__MSX__ -D__SCREEN_MODE=6 \
-lndos -subtype=rom \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
-D__CONIO_GRAPHICS -DXSize=64 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
msx2_color: msx2_mode7
msx2_mode7: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-vn -D__MSX__ -D__SCREEN_MODE=7 \
-lndos -subtype=rom \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
-D__CONIO_GRAPHICS -DXSize=64 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
msx2_mode6: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-vn -D__MSX__ -D__SCREEN_MODE=6 \
-lndos -subtype=rom \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
-D__CONIO_GRAPHICS -DXSize=64 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
msx2_mode7: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +msx -lmsx2 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-vn -D__MSX__ -D__SCREEN_MODE=7 \
-lndos -subtype=rom \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.rom \
-D__CONIO_GRAPHICS -DXSize=64 -DYSize=24 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MSX_SLOWDOWN)*4 \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
#################################################################
interact:
$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-vn -D__INTERACT__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \
-DXSize=28 -DYSize=9 -m8080 $(HECTOR1_GAME_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \
$(FULL_FILES)
hector1:
$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-vn -D__HECTOR__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-DXSize=28 -DYSize=9 $(HECTOR1_GAME_OPTS) \
-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \
$(FULL_FILES)
interact_mono:
$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-vn -D__INTERACT__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \
-DXSize=28 -DYSize=9 -m8080 -D_XL_NO_COLOR $(HECTOR1_GAME_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \
$(FULL_FILES)
hector1_mono:
$(Z88DK_PATH)$(MYZ88DK) +hector $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-vn -D__HECTOR__ -D_XL_NO_SOUND -D_XL_NO_JOYSTICK $(HECTOR1_GAME_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc -pragma-define:CRT_ORG_CODE=0x4B00 \
-pragma-redirect:fputc_cons=fputc_cons_generic -D_XL_NO_COLOR $(HECTOR1_GAME_OPTS) \
-DXSize=28 -DYSize=9 \
-lndos -pragma-redirect:CRT_FONT_64=_font_4x8_default \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTOR1_SLOWDOWN) \
$(FULL_FILES)
# -D__PATCH_HECTORHR_COLORS
hectorhr: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +hector -clib=hectorhr $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-vn -D__HECTORHR__ -D_XL_NO_SOUND $(4COLOR_PALETTE) \
-lndos -pragma-define:CLIB_CONIO_NATIVE_COLOUR=1 \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
-D__CONIO_GRAPHICS -DXSize=30 -DYSize=28 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_HECTORHR_SLOWDOWN) \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(FULL_FILES)
#################################################################
mtx: mtx512
# $(CROSS_LIB_PATH)/sound/z88dk/psg/sn76489a_psg_sounds.c
# -D__PSG_SOUND
mtx512: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) -clib=ansi -startup=2 $(INCLUDE_OPTS) \
-D__MTX__ -D__SCREEN_MODE=2 \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MTX512_SLOWDOWN) \
-D__CONIO_GRAPHICS \
-lndos \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
mtx500: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +mtx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__MTX__ \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin -vn \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MTX500_SLOWDOWN) \
-D__CONIO_GRAPHICS \
-lndos \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
#################################################################
mz:
$(Z88DK_PATH)$(MYZ88DK) +mz $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__MZ__ -clib=ansi -pragma-define:ansicolumns=32 -Cz--audio -vn \
-D_XL_NO_UDG \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MZ_SLOWDOWN) \
-pragma-define:REGISTER_SP=0xd000 \
-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_mz.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_mz.prg
mv $(BUILD_PATH)/X$(GAME_NAME)_mz.mzt $(BUILD_PATH)/X$(GAME_NAME)_mz.mzf
#################################################################
nabu_no_gfx:
$(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__NABU__ \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
-DXSize=32 \
-DYSize=24 \
-D__NO_SCREEN_COLOR_INIT \
-D_XL_NO_COLOR \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D__VT52 \
-D__CONIO_GRAPHICS \
-lndos \
-D__NO_INIT_GRAPHICS \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
nabu: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +nabu $(SCCZ80_OPTS) -Cz--audio $(INCLUDE_OPTS) -vn \
-D__NABU__ \
-lndos -DXSize=32 -DYSize=24 -D_XL_NO_JOYSTICK \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__CONIO_GRAPHICS -D_XL_NO_SOUND -D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_M100_SLOWDOWN) \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin
rm $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
#################################################################
pc88: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -vn \
-D__PC88__ -subtype=disk \
-lndos -DXSize=80 -DYSize=25 -D_XL_NO_JOYSTICK \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC88_SLOWDOWN) \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-create-app \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm $(BUILD_PATH)/X$(GAME_NAME)_$@
# mv FULL_pc88.d88 $(BUILD_PATH)/X$(GAME_NAME)_$@.d88
rm $(BUILD_PATH)/X$(GAME_NAME)_$@_BOOTSTRAP.bin
$(Z88DK_PATH)$(MYZ88DK) +pc88 $(SCCZ80_OPTS) -Cz--audio $(INCLUDE_OPTS) -vn \
-D__PC88__ \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PC88_SLOWDOWN) \
-lndos -DXSize=80 -DYSize=25 \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND -D__DEFAULT_CLEAR_SCREEN \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-create-app \
-o FULL_$@
rm FULL_$@
mv FULL_$@.wav $(BUILD_PATH)/X$(GAME_NAME)_$@.wav
mv FULL_$@.t88 $(BUILD_PATH)/X$(GAME_NAME)_$@.t88
#################################################################
samcoupe: sam
sam: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sam $(SCCZ80_OPTS) $(INCLUDE_OPTS) -create-app \
-D__SAM__ -D_XL_NO_JOYSTICK \
-D__CONIO_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SAMCOUPE_SLOWDOWN) \
-clib=ansi -pragma-define:ansicolumns=32 -vn \
-D__BIT_BANG_SOUND -o $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).bin -lndos \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm
rm $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).bin
mv $(BUILD_PATH)/FULL_samcoupe_$(GAME_NAME).mgt $(BUILD_PATH)/X$(GAME_NAME)_$@.mgt
#################################################################
#############################
# SC3000
sc3000: sc3000_32k
sc3000_32k: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-D__SC3000__ \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \
-D__BIT_BANG_SOUND \
\
-DZ88DK_JOYSTICK \
-D__CONIO_GRAPHICS \
-vn -lndos -create-app -Cz--audio \
-pragma-define:CRT_ORG_BSS=0x8000 \
-pragma-define:REGISTER_SP=0xFFFF \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.tap
sc3000_rom: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \
$(INCLUDE_OPTS) \
-D__SC3000__ \
-DZ88DK_JOYSTICK \
-pragma-define:REGISTER_SP=0xC7FF \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \
-D__BIT_BANG_SOUND \
-D__CONIO_GRAPHICS \
-vn -lndos -create-app \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
#############################
# SG1000
sg1000: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sc3000 $(SCCZ80_ROM_OPTS) -subtype=rom \
$(INCLUDE_OPTS) -pragma-define:REGISTER_SP=0xC7FF \
-D__SC3000__ \
-DZ88DK_JOYSTICK \
-DGHOSTS_NUMBER=6 -DBULLETS_NUMBER=3 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SC3000_SLOWDOWN) \
-D__BIT_BANG_SOUND \
\
-D__CONIO_GRAPHICS \
-vn -lndos -create-app \
\
\
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_DATA.bin
#################################################################
sms: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +sms $(SCCZ80_ROM_OPTS) $(INCLUDE_OPTS) -pragma-redirect:fputc_cons=fputc_cons_generic \
-D__SMS__ \
-DXSize=32 \
-DYSize=24 \
-D__BIT_BANG_SOUND \
-D__CONIO_GRAPHICS \
-lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SMS_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_sms.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BSS.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_DATA.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_sms_BANK_1F.bin
#################################################################
zx : spectrum
spectrum_48k : spectrum
spectrum: spectrum_48k_keyboard
spectrum_keyboard: spectrum_48k_keyboard
spectrum_48k_joystick: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \
-D__SPECTRUM__ \
-lndos -create-app \
-D__CONIO_GRAPHICS \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin
spectrum_48k_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \
-D__SPECTRUM__ -D_XL_NO_JOYSTICK \
-lndos -create-app \
-D__CONIO_GRAPHICS \
-pragma-redirect:fputc_cons=fputc_cons_generic \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin
spectrum_128k: spectrum_128k_keyboard
spectrum_128k_keyboard: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +zx $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib.inc \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_SPECTRUM_SLOWDOWN) \
-D__SPECTRUM__ -D_XL_NO_JOYSTICK -D__PSG_SOUND \
-lndos -create-app \
-D__CONIO_GRAPHICS \
-pragma-redirect:fputc_cons=fputc_cons_generic \
$(CROSS_LIB_PATH)/sound/z88dk/psg/ay-3-8910_psg_sounds.c \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@_BANK_7.bin
#################################################################
trs80_gfx: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \
$(INCLUDE_OPTS) \
-pragma-redirect:getk=getk_inkey \
-pragma-define:REGISTER_SP=0xffb5 \
-D__TRS80__ \
-D_XL_NO_JOYSTICK \
-vn -lndos \
-D__ALT_PRINT -D__BIT_BANG_SOUND \
\
-D__Z88DK_SPRITES_GRAPHICS -D__NO_INIT_GRAPHICS \
\
-DLESS_TEXT \
-create-app \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \
-o$(BUILD_PATH)/X$(GAME_NAME)_$@S.bin \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
trs80:
$(Z88DK_PATH)$(MYZ88DK) +trs80 $(SCCZ80_OPTS) -lndos -subtype=disk \
$(INCLUDE_OPTS) \
-lm -create-app \
-D__TRS80__ \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \
-D__VT52 \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND \
-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
trs80_model2: trs80_model2_lifeboat
trs80_model2_lifeboat:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=lifeboat -lgfxtrs80m2 \
$(INCLUDE_OPTS) --generic-console \
-lm -create-app \
-DXSize=80 -DYSize=24 \
-D__TRS80__ \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND \
-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
trs80_model2_ptcpm:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=ptcpm \
$(INCLUDE_OPTS) \
-lm -create-app \
-D__TRS80__ \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \
--generic-console \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND \
-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
trs80_model2_fmgcpm:
$(Z88DK_PATH)$(MYZ88DK) +cpm $(SCCZ80_OPTS) -lndos -subtype=fmgcpm \
$(INCLUDE_OPTS) \
-lm -create-app \
-D__TRS80__ \
-D_XL_NO_JOYSTICK -D_XL_NO_UDG \
-pragma-redirect:getk=getk_inkey \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TRS80_SLOWDOWN) \
--generic-console \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND \
-o$(BUILD_PATH)/X$(GAME_NAME)_$@.bin \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.bin
#################################################################
vg5k: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +vg5k $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
-vn -D__VG5K__ \
-D__CONIO_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VG5K_SLOWDOWN) \
-clib=default --generic-console \
-D_XL_NO_JOYSTICK \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_vg5k.prg
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_vg5k.prg
#################################################################
vz200_no_gfx: vz200_no_gfx_24k
vz_no_gfx: vz200_no_gfx_24k
vz200_no_gfx_24k:
$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \
--hardware-keyboard --generic-console -D__HARDWARE_KEYBOARD \
$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII \
-D__VZ__ -D_XL_NO_JOYSTICK \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \
-D__CONIO_GRAPHICS -D_XL_NO_UDG \
-lndos \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/vz200/vz200_init_graphics.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
vz200: vz200_24k
vz: vz200_24k
vz200_24k: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \
--hardware-keyboard --generic-console -D__HARDWARE_KEYBOARD \
$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII \
-D__VZ__ -D_XL_NO_JOYSTICK \
-DXSize=16 -DYSize=8 \
-D__SCREEN_MODE=1 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \
-D__CONIO_GRAPHICS \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-lndos \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
vz200_target_specific:
$(Z88DK_PATH)$(MYZ88DK) +vz $(SCCZ80_OPTS) -vn \
--hardware-keyboard --generic-console -D__HARDWARE_KEYBOARD \
$(INCLUDE_OPTS) -D__TARGET_SPECIFIC_ASCII -D_XL_NO_JOYSTICK \
-D__VZ__ -D_XL_NO_COLOR -D__ALT_PRINT \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VZ200_SLOWDOWN) \
-D__MEMORY_MAPPED_GRAPHICS -D_XL_NO_UDG \
-lndos \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.vz \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/vz200/vz200_init_graphics.c \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.cas
#################################################################
zx81_no_gfx: zx81_no_gfx_16k
# -pragma-define:ZX_CHAR_XLATE_MODE=1
zx81_no_gfx_16k:
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) \
$(INCLUDE_OPTS) \
--opt-code-size -pragma-define:ZX_CHAR_XLATE_MODE=1 \
-vn -D__TARGET_SPECIFIC_ASCII \
-D__ZX81__ \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_SLOWDOWN) $(ZX81_NO_GFX_GAME_OPTS) \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK \
-lndos \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES)
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81: zx81_no_gfx
zx81_wrx: zx81_32k_wrx
zx81_16k_wrx: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=22 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_wrx: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=22 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_8x6: zx81_8x6_wrx
zx81_8x6_wrx: zx81_32k_8x6_wrx
zx81_16k_8x6_wrx: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=32 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_8x6_wrx: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=32 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_wrx64: zx81_32k_wrx64
zx81_16k_wrx64: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx64 -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=8 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_wrx64: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx64 -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=8 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_wrx128: zx81_32k_wrx128
zx81_16k_wrx128: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx128 -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=16 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_wrx128: $(ASSETS_PATH)/z88dk_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx128 -clib=wrx \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=16 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=8 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_8x6_wrx128: zx81_32k_8x6_wrx128
zx81_16k_8x6_wrx128: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx128 \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=21 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_8x6_wrx128: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx128 \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX128_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=21 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_8x6_wrx64: zx81_32k_8x6_wrx64
zx81_16k_8x6_wrx64: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx64 \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=11 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
zx81_32k_8x6_wrx64: $(ASSETS_PATH)/z88dk_8x6_sprites_definitions.h
$(Z88DK_PATH)$(MYZ88DK) +zx81 $(SCCZ80_OPTS) -subtype=wrx -clib=wrx64 \
$(INCLUDE_OPTS) \
-pragma-include:$(CFG_PATH)/z88dk/zpragma_clib_no_printf.inc \
-pragma-define:hrgpage=36096 \
-D__NO_SPRITE_TRANSPARENCY \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_ZX81_8X6_WRX64_SLOWDOWN) $(ZX81_GFX_GAME_OPTS) \
-DXSize=32 \
-DYSize=11 \
-vn \
-D__ZX81__ \
-D__Z88DK_SPRITES_GRAPHICS -D__SPRITE_X_STEP=8 -D__SPRITE_Y_STEP=6 -DSPRITE_Y_SIZE=6 \
-lndos \
-D_XL_NO_COLOR \
-D__NO_SCREEN_COLOR_INIT -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
-D__FEWER_SPRITES \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.prg \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/zx81/zx81_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.prg
#################################################################
z1013:
$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) -clib=ansi \
-vn -lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z1013_SLOWDOWN) \
-D__Z1013__ \
-D__CONIO_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_JOYSTICK -D_XL_NO_UDG \
$(FULL_FILES) \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
z1013_krt: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +z1013 $(SCCZ80_OPTS) $(INCLUDE_OPTS) --generic-console \
-vn -lndos \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z1013_SLOWDOWN) \
-D__Z1013__ -D__SCREEN_MODE=1 \
-D__CONIO_GRAPHICS -D_XL_NO_JOYSTICK \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
-create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@
#############################
# Z9001
# --generic-console
z9001_krt: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__Z9001__ -vn -D__SCREEN_MODE=1 -D_XL_NO_JOYSTICK \
-D__CONIO_GRAPHICS -D__BIT_BANG_SOUND --generic-console \
-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z9001_SLOWDOWN) \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm
z9001:
$(Z88DK_PATH)$(MYZ88DK) +z9001 $(SCCZ80_OPTS) $(INCLUDE_OPTS) \
-D__Z9001__ -vn -D__SCREEN_MODE=1 -D_XL_NO_JOYSTICK \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_Z9001_SLOWDOWN) \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D__NO_INIT_GRAPHICS -D__BIT_BANG_SOUND --generic-console \
-lndos -create-app -o $(BUILD_PATH)/X$(GAME_NAME)_$@.z80 \
$(FULL_FILES) \
$(ASSETS_PATH)/z88dk_xchase.asm
#############################
# KC
kc: $(ASSETS_PATH)/z88dk_xchase.asm
$(Z88DK_PATH)$(MYZ88DK) +kc $(SCCZ80_OPTS) -subtype=tap $(INCLUDE_OPTS) \
-D__KC__ \
-D__VT52 \
-D__CONIO_GRAPHICS -D_XL_NO_JOYSTICK \
-lndos \
-clib=default -pragma-redirect:fputc_cons=fputc_cons_generic \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_KC_SLOWDOWN) \
$(CROSS_LIB_PATH)/display/init_graphics/z88dk/udg/udg_init_graphics.c \
$(ASSETS_PATH)/z88dk_xchase.asm \
$(FULL_FILES) \
-create-app -o$(BUILD_PATH)/X$(GAME_NAME)_kc.bin
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_kc.bin
#################################################################
# CMOC
#################################################################
CMOC_NO_UDG_OPTS ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const -D__ALT_SLEEP -D__DEFAULT_CLEAR_SCREEN -D__CMOC__
NO_UDG_OPS ?= $(CMOC_NO_UDG_OPTS) -D__MEMORY_MAPPED_GRAPHICS -D__NO_INIT_GRAPHICS -D_XL_NO_UDG -D__ALT_PRINT -D_XL_SLOW_DOWN_FACTOR=4000
COCO_OPTS ?= -D__COCO__ $(NO_UDG_OPS) -D_XL_NO_COLOR -D_XL_NO_JOYSTICK
DRAGON_OPTS ?= --dragon -D__COCO__ $(NO_UDG_OPS) -D_XL_NO_COLOR -D_XL_NO_JOYSTICK
COCO_COMPILE_OPTS ?= $(COCO_OPTS)
DRAGON_COMPILE_OPTS ?= $(DRAGON_OPTS)
DRAGON_GFX_OPTS ?= --dragon -D__DRAGON__ $(GFX_OPTS) -D_XL_NO_JOYSTICK
DRAGON_GFX_COMPILE_OPTS ?= $(DRAGON_GFX_OPTS)
CMOC_OPTS ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -Wno-const -D__ALT_SLEEP -D__DEFAULT_CLEAR_SCREEN -D__CMOC__
GFX_OPTS ?= $(CMOC_OPTS) -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO_SLOWDOWN)
COCO_GFX_OPTS ?= -D__COCO__ $(GFX_OPTS) -D_XL_NO_COLOR -D_XL_NO_JOYSTICK
COCO_GFX_COMPILE_OPTS ?= $(COCO_GFX_OPTS)
# ? BACKGROUND_COLOR white
GFX_COLOR_OPTS ?= $(CMOC_OPTS) -D_XL_NO_JOYSTICK -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT
COCO_COLOR_GFX_OPTS ?= -D__COCO__ $(GFX_COLOR_OPTS) -D__BIT_MAPPED_4_GRAPHICS $(COCO_COLOR_GFX_GAME_OPTS) -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO_SLOWDOWN)
COCO_COLOR_GFX_COMPILE_OPTS ?= $(COCO_COLOR_GFX_OPTS)
COCO3_COLOR_GFX_OPTS ?= -D__COCO3__ $(GFX_COLOR_OPTS) -D__BIT_MAPPED_16_GRAPHICS $(COCO3_COLOR_GFX_GAME_OPTS) -DXSize=32 -DYSize=24 -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COCO3_SLOWDOWN)
COCO3_COLOR_GFX_COMPILE_OPTS ?= $(COCO3_COLOR_GFX_OPTS)
THOMSON_OPTS ?= $(CMOC_MAKEFILE_COMPILATION_OPTS) -D__ALT_SLEEP -Wno-const -D__CMOC__ -D__BIT_MAPPED_GRAPHICS -D__ALT_PRINT
MO5_OPTS ?= $(THOMSON_OPTS) -DXSize=39 -D_XL_NO_JOYSTICK -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MO5_SLOWDOWN) -D__MO5__
TO7_OPTS ?= $(THOMSON_OPTS) -DXSize=39 -D_XL_NO_JOYSTICK -D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TO7_SLOWDOWN) -D__TO7__
TO7_ORG_DATA ?= --org=a000
#############################################################################################
dragon: coco
dragon_mono: coco_mono
ifdef USE_TOOLS
coco_mono: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)
else
coco_mono: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s
endif
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/display_macros.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/input/input_macros.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(SOURCE_PATH)/main.c
$(CMOC) -o $(BUILD_PATH)/XBIN.BIN \
$(COCO_GFX_OPTS) $(INCLUDE_OPTS) \
main.o coco_init_graphics.o \
display_macros.o dac_sounds.o \
memory_mapped_alt_print.o sleep_macros.o \
cmoc_udc_tiles_and_fonts.o \
input_macros.o
rm main.o dac_sounds.o coco_init_graphics.o display_macros.o sleep_macros.o \
cmoc_udc_tiles_and_fonts.o \
memory_mapped_alt_print.o \
input_macros.o
ifdef USE_TOOLS
mv $(BUILD_PATH)/XBIN.BIN XBIN.BIN
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN
mv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_coco_dragon_mono.cas -C XBIN.BIN -A
else
mv $(BUILD_PATH)/XBIN.BIN $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin
endif
ifeq ($(DO_WIN),1)
ifdef USE_TOOLS
$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/XBIN.BIN
mv $(BUILD_PATH)/XBIN.BIN.vdk $(BUILD_PATH)/X$(GAME_NAME)_dragon_mono.vdk
endif
endif
rm -rf $(BUILD_PATH)/XBIN.BIN
rm -rf XBIN.BIN
rm -rf A80
rm -rf A80.LDR
coco_targets: \
coco coco_mono coco3
coco_color: coco
dragon_color: dragon
ifdef USE_TOOLS
coco: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)
else
coco: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s
endif
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/display_macros.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco/coco_init_graphics.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/input/input_macros.c
$(CMOC) \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(SOURCE_PATH)/main.c
$(CMOC) -o $(BUILD_PATH)/XBIN.BIN \
$(COCO_COLOR_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
main.o coco_init_graphics.o \
display_macros.o dac_sounds.o \
memory_mapped_alt_print.o sleep_macros.o \
cmoc_udc_tiles_and_fonts.o \
input_macros.o
rm main.o dac_sounds.o coco_init_graphics.o display_macros.o sleep_macros.o \
cmoc_udc_tiles_and_fonts.o \
memory_mapped_alt_print.o \
input_macros.o
ifdef USE_TOOLS
mv $(BUILD_PATH)/XBIN.BIN XBIN.BIN
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN
mv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_coco_dragon.cas -C XBIN.BIN -A
else
mv $(BUILD_PATH)/XBIN.BIN $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin
endif
ifeq ($(DO_WIN),1)
ifdef USE_TOOLS
$(TOOLS_PATH)/cmoc/dragon/File2VDK.exe $(BUILD_PATH)/XBIN.BIN
mv $(BUILD_PATH)/XBIN.BIN.vdk $(BUILD_PATH)/X$(GAME_NAME)_dragon.vdk
endif
endif
rm -rf $(BUILD_PATH)/XBIN.BIN
rm -rf XBIN.BIN
rm -rf A80
rm -rf A80.LDR
# coco3: coco3_gfx
coco3: $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s $(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT)
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(ASSETS_PATH)/cmoc_udc_tiles_and_fonts.s
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/display_macros.c
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/coco3/coco3_init_graphics.c
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/input/input_macros.c
$(CMOC) \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c
$(CMOC) -o $(BUILD_PATH)/xbin.bin \
$(COCO3_COLOR_GFX_OPTS) $(INCLUDE_OPTS) \
$(SOURCE_PATH)/main.c \
display_macros.o dac_sounds.o sleep_macros.o \
coco3_init_graphics.o \
memory_mapped_alt_print.o \
input_macros.o cmoc_udc_tiles_and_fonts.o
rm -rf \
display_macros.o dac_sounds.o sleep_macros.o \
coco3_init_graphics.o \
memory_mapped_alt_print.o \
input_macros.o cmoc_udc_tiles_and_fonts.o
ifdef USE_TOOLS
mv $(BUILD_PATH)/xbin.bin XBIN.BIN
rm -rf $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/coco/file2dsk/file2dsk$(COMPILEDEXT) XBIN.BIN
mv XBIN.DSK $(BUILD_PATH)/X$(GAME_NAME)_$@.dsk
$(TOOLS_PATH)/cmoc/dragon/bin2cas.pl -o $(BUILD_PATH)/X$(GAME_NAME)_$@.cas -C XBIN.BIN -A
rm XBIN.BIN
else
mv $(BUILD_PATH)/xbin.bin $(BUILD_PATH)/X$(GAME_NAME)_$@_dragon.bin
endif
coco3_targets: \
coco3_gfx
########################################
ifdef USE_TOOLS
mo5: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)
else
mo5: $(ASSETS_PATH)/cmoc_udc_tiles.s
endif
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/display_macros.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/input/input_macros.c
$(CMOC) \
$(MO5_OPTS) $(INCLUDE_OPTS) \
-c $(ASSETS_PATH)/cmoc_udc_tiles.s
$(CMOC) -o $(BUILD_PATH)/FULL_MO5.bin \
$(MO5_OPTS) $(INCLUDE_OPTS) \
$(SOURCE_PATH)/main.c \
mo5_alt_print.o dac_sounds.o \
mo5_init_graphics.o \
display_macros.o \
cmoc_udc_tiles.o \
sleep_macros.o \
input_macros.o
rm \
mo5_alt_print.o dac_sounds.o \
cmoc_udc_tiles.o \
mo5_init_graphics.o \
display_macros.o \
\
input_macros.o sleep_macros.o
ifdef USE_TOOLS
$(TOOLS_PATH)/cmoc/mo5/f2k5$(COMPILEDEXT) $(BUILD_PATH)/FULL_MO5.bin
mv $(BUILD_PATH)/FULL_MO5.bin .
$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c X$(GAME_NAME)_MO5.sap
$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add X$(GAME_NAME)_MO5.sap FULL_MO5.bin
mv ./X$(GAME_NAME)_MO5.sap $(BUILD_PATH)
mv ./FILE.K5 $(BUILD_PATH)/X$(GAME_NAME)_MO5.k5
rm ./FULL_MO5.bin
else
mv $(BUILD_PATH)/FULL_MO5.bin $(BUILD_PATH)/X$(GAME_NAME)_MO5.bin
endif
mo5_targets: \
mo5
ifdef USE_TOOLS
to7: $(ASSETS_PATH)/cmoc_udc_tiles.s $(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT)
else
to7: $(ASSETS_PATH)/cmoc_udc_tiles.s
endif
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sound/generic/dac_sounds.c
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/alt_print/mo5_alt_print.c
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/init_graphics/cmoc/mo5/mo5_init_graphics.c
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/display/display_macros.c
$(CMOC) \
$(COCO_GFX_COMPILE_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/sleep/sleep_macros.c
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(CROSS_LIB_PATH)/input/input_macros.c
$(CMOC) \
$(TO7_OPTS) $(INCLUDE_OPTS) \
-c $(ASSETS_PATH)/cmoc_udc_tiles.s
$(CMOC) $(TO7_ORG_DATA) -o $(BUILD_PATH)/XLIB.bin \
$(TO7_OPTS) $(INCLUDE_OPTS) \
$(SOURCE_PATH)/main.c \
mo5_alt_print.o dac_sounds.o \
mo5_init_graphics.o \
display_macros.o \
cmoc_udc_tiles.o \
\
input_macros.o sleep_macros.o
rm \
mo5_alt_print.o dac_sounds.o \
cmoc_udc_tiles.o \
mo5_init_graphics.o \
display_macros.o \
\
input_macros.o sleep_macros.o
ifdef USE_TOOLS
mv $(BUILD_PATH)/XLIB.bin .
$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) -c X$(GAME_NAME)_TO7.sap
$(TOOLS_PATH)/cmoc/mo5/sapfs$(COMPILEDEXT) --add X$(GAME_NAME)_TO7.sap XLIB.bin
mv ./X$(GAME_NAME)_TO7.sap $(BUILD_PATH)
rm ./XLIB.bin
else
mv $(BUILD_PATH)/XLIB.bin $(BUILD_PATH)/X$(GAME_NAME)_TO7.bin
endif
to7_targets: \
to7
#################################################################
# LCC1802
#################################################################
full_combo_rand.c:
cat $(FULL_FILES) > $(SOURCE_PATH)/../full_combo_rand.c
# ------------------------------------------------------------------------------------------
# LCC1802
# -target=xr18CX
# https://sites.google.com/site/lcc1802/downloads/Quarrantine.zip?attredirects=0&d=1
ifeq ($(DO_WIN),1)
LCC1802_OPTS ?= -target=xr18CX $(LCC1802_MAKEFILE_COMPILATION_OPTS)
BASIC_OPTS ?= $(LCC1802_OPTS) "-Wa-D LCCCX=1" "-Wa-D LCCNOLONG"
COMX_OPTS ?= $(BASIC_OPTS) "-Wa-D CODELOC=0x4401"
PECOM_OPTS ?= $(BASIC_OPTS) "-Wa-D CODELOC=0x201"
TMC600_OPTS ?= $(BASIC_OPTS) "-Wa-D CODELOC=0x6300"
CIDELSA_OPTS ?= $(LCC1802_OPTS) "-Wa-D CODELOC=0" "-Wa-D NOFILLBSS=1"
DRACO_32K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x8000" "-Wa-D STACKLOC=0x83ff"
DRACO_16K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x4000" "-Wa-D STACKLOC=0x43ff"
ALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x6000" "-Wa-D STACKLOC=0x60ff"
ALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x3000" "-Wa-D STACKLOC=0x30ff"
DESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x3000" "-Wa-D STACKLOC=0x30ff"
DESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x2000" "-Wa-D STACKLOC=0x20ff"
PIXIE_4K_OPTS ?= "-Wa-D LCCCX=1" -D__VIP__ -DRES=64 -DVIDMEM=0xF00 "-Wa-D STACKLOC=0xDFF"
MICROBOARD_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x8000" "-Wa-D STACKLOC=0x9fff"
MICROBOARD_PAL_1_OPTS ?= $(MICROBOARD_OPTS) "-DPAL=1"
MICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) "-DPAL=2"
MICROBOARD_NTSC_1_OPTS ?= $(CIDELSA_OPTS) "-DNTSC=1"
MICROBOARD_NTSC_3_OPTS ?= $(CIDELSA_OPTS) "-DNTSC=3"
else
# LCC under Linux:
# "-Wa-D CODELOC=0x2000" becomes "-Wa-D" "-WaCODELOC=0x2000" However, multiple symbols can still be combined as "-Wa-D" "-WaCODELOC=0x2000,STACKLOC=7fff"
#/cygdrive/c/lcc42/bat/caCX.bat
#/cygdrive/c/lcc42/bin/lcc.exe
LCC1802_OPTS ?= -target=xr18CX $(LCC1802_MAKEFILE_COMPILATION_OPTS)
BASIC_OPTS ?= $(LCC1802_OPTS) "-Wa-D" "-WaLCCCX=1" "-Wa-D" "-WaLCCNOLONG"
COMX_OPTS ?= $(BASIC_OPTS) "-Wa-D" "-WaCODELOC=0x4401"
PECOM_OPTS ?= $(BASIC_OPTS) "-Wa-D" "-WaCODELOC=0x201"
TMC600_OPTS ?= $(BASIC_OPTS) "-Wa-D" "-WaCODELOC=0x6300"
CIDELSA_OPTS ?= $(LCC1802_OPTS) "-Wa-D" "-WaCODELOC=0,NOFILLBSS=1"
DRACO_32K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x8000,STACKLOC=0x83ff"
DRACO_16K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x4000,STACKLOC=0x43ff"
ALTAIR_24K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x6000,STACKLOC=0x60ff"
ALTAIR_12K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x3000,STACKLOC=0x30ff"
DESTROYER_12K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x3000,STACKLOC=0x30ff"
DESTROYER_8K_OPTS ?= $(CIDELSA_OPTS) "-Wa-D" "-WaDATALOC=0x2000,STACKLOC=0x20ff"
PIXIE_4K_OPTS ?= "-Wa-D" "-WaLCCCX=1" -D__VIP__ -DRES=64 -DVIDMEM=0xF00,STACKLOC=0xDFF"
MICROBOARD_OPTS ?= $(CIDELSA_OPTS) "-Wa-D DATALOC=0x8000,STACKLOC=0x9fff"
MICROBOARD_PAL_1_OPTS ?= $(MICROBOARD_OPTS) "-DPAL=1"
MICROBOARD_PAL_2_OPTS ?= $(MICROBOARD_OPTS) "-DPAL=2"
MICROBOARD_NTSC_1_OPTS ?= $(CIDELSA_OPTS) "-DNTSC=1"
MICROBOARD_NTSC_3_OPTS ?= $(CIDELSA_OPTS) "-DNTSC=3"
endif
# @c:\lcc42\bin\lcc.exe "-target=xr18CX" "-Wf-g,;" "-Wf-volatile" -O "-Wp-D nofloats" "-Wa-D LCCNOLONG" -D__MICRO__ -DNTSC=1 -S %2 %3 %4 %5 %6 %1.c
# @IF ERRORLEVEL 1 GOTO quit
# @c:\lcc42\bin\copt c:\lcc42\include\lcc1806.opt -I %1.asm -O %1.oasm
# @c:\lcc42\bin\asw -cpu 1802 -quiet -D NOFILLBSS=1 -D DATALOC=0x8000 -D CODELOC=0 -D STACKLOC=0x9fff -P -x -i ..\..\..\include -L %1.oasm
# @c:\lcc42\bin\p2hex -r $-$ %1 %1_microboard_ntsc1_4_8 | more +2
# @:quit
# @c:\lcc42\bin\lcc.exe "-target=xr18CX" "-Wf-g,;" "-Wf-volatile" -O "-Wp-D nofloats" "-Wa-D LCCNOLONG" -D__MICRO__ -DNTSC=3 -S %2 %3 %4 %5 %6 %1.c
# @IF ERRORLEVEL 1 GOTO quit
# @c:\lcc42\bin\copt c:\lcc42\include\lcc1806.opt -I %1.asm -O %1.oasm
# @c:\lcc42\bin\asw -cpu 1802 -quiet -D NOFILLBSS=1 -D DATALOC=0x8000 -D CODELOC=0 -D STACKLOC=0x9fff -P -x -i ..\..\..\include -L %1.oasm
# @c:\lcc42\bin\p2hex -r $-$ %1 %1_microboard_ntsc3 | more +2
# @:quit
################################################################################
COMX_REDUCED_EXTRA_FILES ?= \
$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c
COMX_COLOR_GRAPHICS_REDUCED_EXTRA_FILES ?= \
$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/comx_color_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c
COMX_EXTRA_FILES ?= \
$(COMX_REDUCED_EXTRA_FILES) \
$(CROSS_LIB_PATH)/rand/rand.c \
$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c
COMX_COLOR_GRAPHICS_EXTRA_FILES ?= \
$(COMX_COLOR_GRAPHICS_REDUCED_EXTRA_FILES) \
$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c
COMX_EXTRA_FILES_WTIH_END_SCREEN ?= \
$(COMX_EXTRA_FILES)
COMX_COLOR_GRAPHICS_EXTRA_FILES_WTIH_END_SCREEN ?= \
$(COMX_COLOR_GRAPHICS_EXTRA_FILES)
reduced_full_lcc1802_combo.c: full_combo_rand.c
cat \
$(COMX_REDUCED_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \
$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c
reduced_full_lcc1802_color_combo.c: full_combo_rand.c
cat \
$(COMX_COLOR_GRAPHICS_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \
$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
full_lcc1802_combo.c: full_combo_rand.c
cat \
$(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \
$(COMX_EXTRA_FILES_WTIH_END_SCREEN) \
$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../full_lcc1802_combo.c
reduced_full_lcc1802_micro_combo.c: full_combo_rand.c
cat \
$(MICRO_COLOR_REDUCED_EXTRA_FILES) $(CROSS_LIB_PATH)/rand/rand_lcc1802_devkit_include.c \
$(SOURCE_PATH)/../full_combo_rand.c > $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
clean_combo_files:
rm -rf $(SOURCE_PATH)/../full_combo_rand.c
rm -rf $(SOURCE_PATH)/../full_lcc1802_combo.c
rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_combo.c
rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
LCC1802_COLOR_BASIC_C_OPTS ?= \
-D__LCC1802__ \
-D__NO_SCREEN_COLOR_INIT \
-D__COMX_COLOR_GRAPHICS \
-D__ALT_PRINT
LCC1802_BASIC_C_OPTS ?= \
-D__LCC1802__ \
-D__NO_SCREEN_COLOR_INIT \
-D__MEMORY_MAPPED_GRAPHICS \
-D__ALT_PRINT
LCC1802_C_OPTS ?= \
$(LCC1802_BASIC_C_OPTS) \
\
-D__ALT_SLEEP \
LCC1802_C_OPTS_NO_SOUNDS ?= \
$(LCC1802_BASIC_C_OPTS) \
-D__ALT_SLEEP \
REDUCED_LCC1802_C_OPTS ?= \
$(LCC1802_BASIC_C_OPTS) \
-D_XL_NO_SLEEP
PIXIE_C_OPTS ?= \
-D__LCC1802__ \
-D__NO_SCREEN_COLOR_INIT \
-D__NO_PRINT \
-D__NO_SLEEP
LCC1802_COLOR_C_OPTS ?= \
$(LCC1802_COLOR_BASIC_C_OPTS) \
-D__ALT_SLEEP
LCC1802_COLOR_C_OPTS_NO_SOUNDS ?= \
$(LCC1802_COLOR_BASIC_C_OPTS) \
-D__ALT_SLEEP
REDUCED_LCC1802_COLOR_C_OPTS ?= \
$(LCC1802_COLOR_BASIC_C_OPTS) \
-D_XL_NO_SLEEP
MICRO_COLOR_REDUCED_EXTRA_FILES ?= \
$(CROSS_LIB_PATH)/display/init_graphics/lcc1802/comx/micro_color_init_graphics.c \
$(CROSS_LIB_PATH)/display/alt_print/comx_alt_print.c
MICRO_COLOR_EXTRA_FILES ?= \
$(MICRO_COLOR_REDUCED_EXTRA_FILES) \
$(CROSS_LIB_PATH)/sound/lcc1802/comx/comx_sounds.c
MICRO_COLOR_EXTRA_FILES_WTIH_END_SCREEN ?= \
$(MICRO_COLOR_EXTRA_FILES)
###############################################################################
# COMX
_full_comx: _comx
_comx_buffered: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) \
-D__COMX__ $(COMX_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
comx_buffered: \
_comx_buffered \
clean_combo_files
# -D__LCC1802_UNBUFFERED
_comx: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -D__LCC1802_UNBUFFERED \
-D__COMX__ $(COMX_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
comx: \
_comx \
clean_combo_files
# Interrupt-driver graphics
_comx_int: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) -DVIS_INT \
-D__COMX__ \
$(COMX_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
comx_int: \
_comx_int \
clean_combo_files
_comx_ntsc: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x8_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(COMX_OPTS) \
-D__COMX__ -DNTSC $(COMX_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_COMX_SLOWDOWN) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
comx_ntsc: \
_comx_ntsc \
clean_combo_files
# VIP
_vip: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/4x4_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PIXIE_4K_OPTS) \
-D__VIP__ $(VIP_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_VIP_SLOWDOWN) \
$(PIXIE_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
vip: \
_vip \
clean_combo_files
###############################################################################
# MICRO
_micro_pal2: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x9_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_2_OPTS) \
-D__MICRO__ \
-D__COMX_COLOR_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MICRO_SLOWDOWN) \
$(MICRO_GAME_OPTS) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
_micro_pal1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_PAL_1_OPTS) \
-D__MICRO__ \
-D__COMX_COLOR_GRAPHICS \
$(MICRO_GAME_OPTS) \
\
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
_micro_ntsc1: reduced_full_lcc1802_micro_combo.c $(ASSETS_PATH)/6x8_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(MICROBOARD_NTSC1_OPTS) \
-D__MICRO__ -DNTSC \
-D__COMX_COLOR_GRAPHICS \
$(MICRO_GAME_OPTS) \
\
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_micro_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
micro_pal1: \
_micro_pal1 \
clean_combo_files
micro_ntsc1: \
_micro_ntsc1 \
clean_combo_files
micro_pal2: \
_micro_pal2 \
clean_combo_files
_micro: _micro_pal2
micro: \
_micro \
clean_combo_files
###############################################################################
# PECOM
_full_pecom: _pecom
_pecom: reduced_full_lcc1802_color_combo.c $(ASSETS_PATH)/6x9_chars.h
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(PECOM_OPTS) \
-D__PECOM__ $(PECOM_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_PECOM_SLOWDOWN) \
$(PECOM_GAME_OPTS) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
# rm -rf $(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
pecom: \
_pecom \
clean_combo_files
###############################################################################
# TMC600
_full_tmc600: _tmc600_37k
_tmc600: _tmc600_37k
# -savetemps -S
_tmc600_37k: full_lcc1802_combo.c
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(TMC600_OPTS) \
-D__TMC600__ $(TMC600_GAME_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TMC600_SLOWDOWN) \
-D_XL_NO_UDG \
$(LCC1802_C_OPTS) \
$(SOURCE_PATH)/../full_lcc1802_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_tmc600_37k.hex
tmc600: \
_tmc600 \
clean_combo_files
###############################################################################
# CIDELSA DRACO
_cidelsa: _cidelsa_draco
_cidelsa_draco: _cidelsa_draco_32k
_cidelsa_draco_32k: reduced_full_lcc1802_color_combo.c
$(LCC1802) $(INCLUDE_OPTS) -I$(SOURCE_PATH) $(DRACO_32K_OPTS) \
-D__CIDELSA__ -D__DRACO__ \
-D_XL_NO_COLOR -D_XL_NO_UDG \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_CIDELSA_SLOWDOWN) \
$(LCC1802_COLOR_C_OPTS) \
$(SOURCE_PATH)/../reduced_full_lcc1802_color_combo.c
mv $(SOURCE_PATH)/../../a.$(LCC1802_HEX) $(BUILD_PATH)/X$(GAME_NAME)_$@.hex
cidelsa: \
_cidelsa \
clean_combo_files
###############################################################################
comx_targets: comx comx_ntsc
pecom_targets: pecom
tmc600_targets: tmc600_37k
cidelsa_targets: $(MAKE) cidelsa_draco_32k
###############################################################################################
mc10:
cc68 -tmc10 $(CC6303_MC10_OPTS) $(INCLUDE_OPTS) $(GLOBAL_OPTS) \
-D__MC10__ \
$(MC10_COLORS) \
-DXSize=32 \
-DYSize=16 \
-D__MEMORY_MAPPED_GRAPHICS -D_XL_NO_JOYSTICK \
-D_XL_NO_COLOR -D__TARGET_SPECIFIC_ASCII \
-D__ALT_SLEEP -D__ALT_RAND \
-D__NO_INIT_GRAPHICS \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_MC10_SLOWDOWN) \
-D__DEFAULT_CLEAR_SCREEN -D__ALT_PRINT \
$(CROSS_LIB_PATH)/sound/generic/bit_bang_sounds.c \
$(FULL_FILES) \
$(CROSS_LIB_PATH)/rand/rand.c \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
-o xbin
rm xbin
mv xbin.c10 $(BUILD_PATH)/X$(GAME_NAME)_$@.c10
###############################################################################################
# GCC
#
ncurses_targets: \
ncurses
GCC_OPTS = $(GLOBAL_OPTS) $(NATIVE_MAKEFILE_COMPILATION_OPTS)
###############################################################################################
ncurses_sized:
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES)
mv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_ncurses_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
ncurses:
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) -D__NCURSES__ \
\
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_NCURSES_SLOWDOWN) \
-D__CONIO_GRAPHICS -D_XL_NO_UDG -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/ncurses_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/ncurses_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_ncurses$(COMPILEDEXT)
terminal8x8_sized: $(ASSETS_PATH)/8x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_terminal8x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
terminal: terminal8x8
terminal8x8: $(ASSETS_PATH)/8x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -DXSize=20 -DYSize=18 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
terminal8x6_sized: $(ASSETS_PATH)/8x6_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -D_XL_TILE_X_SIZE=8 -D_XL_TILE_Y_SIZE=6 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_terminal8x6_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
terminal8x6: $(ASSETS_PATH)/8x6_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -DXSize=20 -DYSize=17 -D_XL_TILE_X_SIZE=8 -D_XL_TILE_Y_SIZE=6 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
terminal7x8_sized: $(ASSETS_PATH)/7x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -D_XL_TILE_X_SIZE=7 -D_XL_TILE_Y_SIZE=8 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_terminal7x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
terminal7x8: $(ASSETS_PATH)/7x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -DXSize=20 -DYSize=24 -D_XL_TILE_X_SIZE=7 -D_XL_TILE_Y_SIZE=8 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
terminal6x8_sized: $(ASSETS_PATH)/6x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=8 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_terminal6x8_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
terminal6x8: $(ASSETS_PATH)/6x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -DXSize=40 -DYSize=24 -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=8 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
terminal6x9_sized: $(ASSETS_PATH)/6x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=9 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_terminal6x9_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
terminal6x9: $(ASSETS_PATH)/6x8_chars.h
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D_XL_SLOW_DOWN_FACTOR=$(_COMMON_SLOWDOWN_FACTOR)*$(_TERMINAL_SLOWDOWN) \
-D__TERMINAL__ -D_XL_NO_JOYSTICK \
-D__ALT_PRINT -DXSize=40 -DYSize=24 -D_XL_TILE_X_SIZE=6 -D_XL_TILE_Y_SIZE=9 \
$(NCURSES_GAME_OPTS) \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(CROSS_LIB_PATH)/display/init_graphics/gcc/terminal_init_graphics.c \
$(FULL_FILES) \
-l$(NCURSES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
##
stdio_buffered: stdio
#
stdio:
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-D__STDIO $(STDIO_GAME_OPTS) \
-D_XL_NO_JOYSTICK \
-DXSize=32 -DYSize=24 \
-D_XL_NO_COLOR \
$(NCURSES_GAME_OPTS) \
-D_XL_TURN_BASED \
-D__BUFFERED_GRAPHICS \
-D__NO_INIT_GRAPHICS \
-D__ALT_PRINT \
-D__DEFAULT_CLEAR_SCREEN \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES) \
-o $(BUILD_PATH)/X$(GAME_NAME)_$@$(COMPILEDEXT)
stdio_sized:
$(NATIVE_CC) $(GCC_OPTS) $(INCLUDE_OPTS) \
-DXSize=$(XSIZE) -DYSize=$(YSIZE) \
-D__STDIO $(STDIO_GAME_OPTS) \
-D_XL_NO_JOYSTICK \
-D_XL_NO_COLOR \
$(NCURSES_GAME_OPTS) \
-D_XL_TURN_BASED \
-D__BUFFERED_GRAPHICS \
-D__NO_INIT_GRAPHICS \
-D__ALT_PRINT \
-D__DEFAULT_CLEAR_SCREEN \
$(CROSS_LIB_PATH)/display/alt_print/memory_mapped_alt_print.c \
$(FULL_FILES)
mv a$(COMPILEDEXT) $(BUILD_PATH)/X$(GAME_NAME)_stdio_$(XSIZE)X$(YSIZE)$(COMPILEDEXT)
################
# Experimental targets
# CC65
include makefiles.common/targets/cc65/Makefile_c128_8502
include makefiles.common/targets/cc65/Makefile_cx16
include makefiles.common/targets/cc65/Makefile_c65
include makefiles.common/targets/cc65/Makefile_osic1p
include makefiles.common/targets/cc65/Makefile_telestrat
include makefiles.common/targets/cc65/Makefile_kim1
include makefiles.common/targets/cc65/Makefile_sym1
# Z88DK
include makefiles.common/targets/z88dk/Makefile_abc80
include makefiles.common/targets/z88dk/Makefile_abc800
include makefiles.common/targets/z88dk/Makefile_alphatro
include makefiles.common/targets/z88dk/Makefile_altair8800
include makefiles.common/targets/z88dk/Makefile_attache
include makefiles.common/targets/z88dk/Makefile_aussie
include makefiles.common/targets/z88dk/Makefile_bee
include makefiles.common/targets/z88dk/Makefile_bic
include makefiles.common/targets/z88dk/Makefile_bit90
include makefiles.common/targets/z88dk/Makefile_bondwell
include makefiles.common/targets/z88dk/Makefile_bondwell2
include makefiles.common/targets/z88dk/Makefile_c7420
include makefiles.common/targets/z88dk/Makefile_coleco_adam
include makefiles.common/targets/z88dk/Makefile_corvette
include makefiles.common/targets/z88dk/Makefile_dai
include makefiles.common/targets/z88dk/Makefile_dmv
include makefiles.common/targets/z88dk/Makefile_eg2k
include makefiles.common/targets/z88dk/Makefile_einstein
include makefiles.common/targets/z88dk/Makefile_enterprise
include makefiles.common/targets/z88dk/Makefile_excalibur64
include makefiles.common/targets/z88dk/Makefile_fp1100
include makefiles.common/targets/z88dk/Makefile_g800
include makefiles.common/targets/z88dk/Makefile_gemini
include makefiles.common/targets/z88dk/Makefile_gl4000
include makefiles.common/targets/z88dk/Makefile_gl6000sl
include makefiles.common/targets/z88dk/Makefile_hemc
include makefiles.common/targets/z88dk/Makefile_hgmc
include makefiles.common/targets/z88dk/Makefile_homelab
include makefiles.common/targets/z88dk/Makefile_homelab2
include makefiles.common/targets/z88dk/Makefile_kaypro
include makefiles.common/targets/z88dk/Makefile_kaypro83
include makefiles.common/targets/z88dk/Makefile_kramermc
include makefiles.common/targets/z88dk/Makefile_krokha
include makefiles.common/targets/z88dk/Makefile_lambda
include makefiles.common/targets/z88dk/Makefile_lm80c
include makefiles.common/targets/z88dk/Makefile_lviv
include makefiles.common/targets/z88dk/Makefile_m5
include makefiles.common/targets/z88dk/Makefile_mbc200
include makefiles.common/targets/z88dk/Makefile_micro8085
include makefiles.common/targets/z88dk/Makefile_mikro80
include makefiles.common/targets/z88dk/Makefile_multi8
include makefiles.common/targets/z88dk/Makefile_myvision
include makefiles.common/targets/z88dk/Makefile_mz2500
include makefiles.common/targets/z88dk/Makefile_nascom
include makefiles.common/targets/z88dk/Makefile_nc100
include makefiles.common/targets/z88dk/Makefile_nc200
include makefiles.common/targets/z88dk/Makefile_newbrain
include makefiles.common/targets/z88dk/Makefile_ondra
include makefiles.common/targets/z88dk/Makefile_osborne1
include makefiles.common/targets/z88dk/Makefile_osca
include makefiles.common/targets/z88dk/Makefile_oz
include makefiles.common/targets/z88dk/Makefile_p2000
include makefiles.common/targets/z88dk/Makefile_pasopia7
include makefiles.common/targets/z88dk/Makefile_pc6001
include makefiles.common/targets/z88dk/Makefile_pcw40
include makefiles.common/targets/z88dk/Makefile_pcw80
include makefiles.common/targets/z88dk/Makefile_pencil2
include makefiles.common/targets/z88dk/Makefile_phc25
include makefiles.common/targets/z88dk/Makefile_pmd85
include makefiles.common/targets/z88dk/Makefile_pps
include makefiles.common/targets/z88dk/Makefile_primo
include makefiles.common/targets/z88dk/Makefile_pv1000
include makefiles.common/targets/z88dk/Makefile_pv2000
include makefiles.common/targets/z88dk/Makefile_px4
include makefiles.common/targets/z88dk/Makefile_px8
include makefiles.common/targets/z88dk/Makefile_radio86
include makefiles.common/targets/z88dk/Makefile_rc700
include makefiles.common/targets/z88dk/Makefile_rx78
include makefiles.common/targets/z88dk/Makefile_smc777
include makefiles.common/targets/z88dk/Makefile_sol20
include makefiles.common/targets/z88dk/Makefile_sos
include makefiles.common/targets/z88dk/Makefile_spc1000
include makefiles.common/targets/z88dk/Makefile_special
include makefiles.common/targets/z88dk/Makefile_srr
include makefiles.common/targets/z88dk/Makefile_super80
include makefiles.common/targets/z88dk/Makefile_super80r
include makefiles.common/targets/z88dk/Makefile_sv8000
include makefiles.common/targets/z88dk/Makefile_svi
include makefiles.common/targets/z88dk/Makefile_ti82
include makefiles.common/targets/z88dk/Makefile_ti83
include makefiles.common/targets/z88dk/Makefile_ti85
include makefiles.common/targets/z88dk/Makefile_ti86
include makefiles.common/targets/z88dk/Makefile_ti83p
include makefiles.common/targets/z88dk/Makefile_tiki100
include makefiles.common/targets/z88dk/Makefile_tim011
include makefiles.common/targets/z88dk/Makefile_ts2068
include makefiles.common/targets/z88dk/Makefile_tvc
include makefiles.common/targets/z88dk/Makefile_v1050
include makefiles.common/targets/z88dk/Makefile_vector06c
include makefiles.common/targets/z88dk/Makefile_x07
include makefiles.common/targets/z88dk/Makefile_x1
include makefiles.common/targets/z88dk/Makefile_x820
include makefiles.common/targets/z88dk/Makefile_z80tvgame
include makefiles.common/targets/z88dk/Makefile_z88
include makefiles.common/targets/z88dk/Makefile_zx80
include makefiles.common/targets/z88dk/Makefile_zxn
include makefiles.common/targets/z88dk/Makefile_misc_cpm
# GCC4TI
include makefiles.common/targets/gcc4ti/Makefile_ti99
# VBCC
include makefiles.common/targets/vbcc/Makefile_amiga
include makefiles.common/targets/vbcc/Makefile_atari_jaguar
include makefiles.common/targets/vbcc/Makefile_bbc
include makefiles.common/targets/vbcc/Makefile_m65
# ATARI_MINT_GCC
include makefiles.common/targets/atari_mint_gcc/Makefile_atari_st
# TODO: Fix and improve these targets
# ACK
include makefiles.common/targets/ack/Makefile.ack_targets
########################################################################
# Extras
# Z88DK Extras
include makefiles.common/targets/z88dk/extras/Makefile_agon
include makefiles.common/targets/z88dk/extras/Makefile_camputers_lynx
include makefiles.common/targets/z88dk/extras/Makefile_gal
include makefiles.common/targets/z88dk/extras/Makefile_gal_plus
include makefiles.common/targets/z88dk/extras/Makefile_c128
include makefiles.common/targets/z88dk/extras/Makefile_cpc
include makefiles.common/targets/z88dk/extras/Makefile_pc88
z88dk_experimental_targets: \
abc80 \
abc800 \
alphatro \
altair8800 \
attache \
aussie \
bic \
bit90 \
bondwell \
bondwell2 \
coleco_adam \
corvette \
dai \
dmv \
eg2k \
enterprise \
excalibur64 \
fp1100 \
g800 \
gemini \
gl4000 \
gl6000sl \
hemc \
hgmc \
homelab \
homelab2 \
kaypro \
kaypro83 \
kramermc \
krokha \
lambda \
lm80c \
m5 \
mbc200 \
micro8085 \
mikro80 \
multi8 \
myvision \
mz2500 \
nascom \
nc100 \
nc200 \
newbrain \
ondra \
osborne1 \
osca \
oz \
p2000 \
pasopia7 \
pc6001 \
pc88 \
pcw40 \
pcw80 \
pencil2 \
pmd85 \
pps \
primo \
pv1000 \
pv2000 \
px4 \
px8 \
qc10 \
radio86 \
rc700 \
rx78 \
smc777 \
sol20 \
sos \
spc1000 \
special \
srr \
super80 \
super80r \
sv8000 \
svi \
ti82 \
ti83 \
ti85 \
ti86 \
ti83p \
tiki100 \
tim011 \
ts2068 \
tvc \
v1050 \
vector06c \
x1 \
x820 \
z80tvgame \
z88 \
zx80 \
zxn
================================================
FILE: src/assets/LoggerSingleton.py
================================================
import logging
import datetime
# global logger
# logger = None
class LoggerSingleton:
@staticmethod
def initLogger(name, path):
if name in logging.Logger.manager.loggerDict:
logger = logging.getLogger(name)
# print("Logger already exists")
# print(str(logging.Logger.manager.loggerDict))
else:
# print("Logger does not exists, yet")
# print(str(logging.Logger.manager.loggerDict))
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
if not logger.handlers:
# file_name='/cygdrive/c/Retro/CROSS-LIB/logs/log_'+datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+'.log'
# file_name=path+'/log_'+name+'_'+datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+'.log'
file_name=path+'/log.log'
file_handler = logging.FileHandler(file_name,mode='a+', encoding="utf-8")
formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
# @staticmethod
# def initConsoleLogger(name):
# if name in logging.Logger.manager.loggerDict:
# logger = logging.getLogger(name)
# else:
# logger = logging.getLogger(name)
# logger.setLevel(logging.DEBUG)
# if not logger.handlers:
# console_handler = logging.StreamHandler()
# formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(message)s')
# console_handler.setFormatter(formatter)
# logger.addHandler(console_handler)
# return logger
================================================
FILE: src/assets/__init__.py
================================================
================================================
FILE: src/assets/copy_assets.py
================================================
#!/bin/python
import shutil
import os,sys
if len(sys.argv)<2:
game_dir = "chase"
else:
game_dir = sys.argv[1]
if len(sys.argv)<3:
parent_dir = "games"
else:
parent_dir = sys.argv[2]
file_names = os.listdir("./generated_assets/"+game_dir)
print("Files to copy: "+str(file_names))
for file_name in file_names:
print("Copying: ", file_name)
source_path = "./generated_assets/"+game_dir+"/"+file_name
print("from: " + source_path)
dest_path = "../"+parent_dir+"/"+game_dir+"/generated_assets"
if not os.path.exists(dest_path):
print("creating: " + dest_path)
os.makedirs(dest_path)
print("to: " + dest_path)
shutil.copy(source_path, dest_path )
================================================
FILE: src/assets/examples/README.txt
================================================
Some of the sample BASIC programs and code excerpts are taken from
https://gkanold.wixsite.com/homeputerium
================================================
FILE: src/assets/examples/single_tiles/tile_shape0.txt
================================================
...##...
..#..#..
...##...
.##..##.
#.####.#
# ####.#
..#..#..
..#..#..
================================================
FILE: src/assets/examples/single_tiles/tile_shape1.txt
================================================
...#.... 16
..###... 56
..#.###. 46
.##...## 99
##...##. 198
.###.#.. 116
...###.. 28
....#... 8
================================================
FILE: src/assets/examples/tile_sets/asm/8x6_cidelsa_digits.s
================================================
!byte $1E, $21, $21, $21, $1E, $00, $00, $00
!byte $01, $3F, $21, $11, $01, $00, $00, $00
!byte $11, $29, $25, $25, $13, $00, $00, $00
!byte $16, $29, $29, $21, $21, $00, $00, $00
!byte $04, $3F, $24, $14, $0C, $00, $00, $00
!byte $26, $29, $29, $29, $32, $00, $00, $00
!byte $26, $29, $29, $29, $1E, $00, $00, $00
!byte $30, $28, $24, $23, $20, $00, $00, $00
!byte $16, $29, $29, $29, $16, $00, $00, $00
!byte $1E, $29, $29, $29, $11, $00, $00, $00
!byte $00, $00, $00, $00, $00, $00, $00, $00
================================================
FILE: src/assets/examples/tile_sets/asm/8x6_cidelsa_fonts.s
================================================
!byte $00, $1F, $28, $28, $28, $3F, $1F, $00
!byte $00, $16, $29, $29, $29, $3F, $3F, $00
!byte $00, $12, $21, $21, $21, $3F, $1E, $00
!byte $00, $1E, $21, $21, $21, $3F, $3F, $00
!byte $00, $21, $21, $29, $29, $3F, $3F, $00
!byte $00, $20, $20, $28, $28, $3F, $3F, $00
!byte $00, $16, $25, $21, $21, $3F, $1E, $00
!byte $00, $3F, $08, $08, $08, $3F, $3F, $00
!byte $00, $00, $21, $3F, $3F, $21, $00, $00
!byte $00, $3E, $3F, $01, $01, $01, $02, $00
!byte $00, $00, $21, $12, $0C, $3F, $3F, $00
!byte $00, $00, $01, $01, $01, $3F, $3F, $00
!byte $00, $3F, $10, $08, $10, $3F, $3F, $00
!byte $00, $3F, $04, $08, $10, $3F, $3F, $00
!byte $00, $1E, $21, $21, $21, $3F, $1E, $00
!byte $00, $10, $28, $28, $28, $3F, $3F, $00
!byte $00, $1E, $21, $27, $21, $3F, $1E, $00
!byte $00, $11, $2A, $2C, $28, $3F, $3F, $00
!byte $00, $26, $2F, $29, $29, $39, $11, $00
!byte $00, $20, $20, $3F, $3F, $20, $20, $00
!byte $00, $3E, $01, $01, $01, $3F, $3E, $00
!byte $00, $30, $0C, $03, $0F, $3C, $30, $00
!byte $30, $0C, $03, $0C, $03, $0F, $3C, $30
!byte $00, $33, $14, $08, $14, $33, $33, $00
!byte $00, $20, $10, $0F, $1F, $30, $20, $00
!byte $00, $31, $31, $29, $25, $23, $23, $00
================================================
FILE: src/assets/examples/tile_sets/asm/Antiriad_Chars.asm
================================================
; CHARSET IMAGE DATA...
; 48 images, 8 bytes per image, total size is 384 ($180) bytes.
charset_data
.byte $00,$00,$00,$00,$00,$00,$00,$00,$7C,$EE,$C6,$C6,$FE,$C6,$C6,$00
.byte $FC,$C6,$C6,$FC,$C6,$C6,$FE,$00,$7E,$E6,$C0,$C0,$C0,$E6,$7E,$00
.byte $FC,$CE,$C6,$C6,$C6,$CE,$FC,$00,$FE,$C6,$C0,$F8,$C0,$C6,$FE,$00
.byte $FE,$C6,$C0,$F8,$C0,$C0,$C0,$00,$7E,$E6,$C0,$CE,$C6,$E6,$7E,$00
.byte $C6,$C6,$C6,$C6,$FE,$C6,$C6,$00,$3C,$18,$18,$18,$18,$18,$3C,$00
.byte $06,$06,$06,$06,$C6,$EE,$7C,$00,$CE,$DC,$F8,$F8,$DC,$CE,$C6,$00
.byte $C0,$C0,$C0,$C0,$C0,$C6,$FE,$00,$C6,$EE,$FE,$FE,$C6,$C6,$C6,$00
.byte $C6,$E6,$F6,$FE,$DE,$CE,$C6,$00,$FC,$CE,$C6,$C6,$C6,$E6,$7E,$00
.byte $FC,$CE,$C6,$C6,$FE,$C0,$C0,$00,$FC,$CE,$C6,$C6,$E6,$7C,$0E,$00
.byte $FC,$CE,$C6,$C6,$FE,$DC,$CE,$00,$FE,$C6,$C0,$7C,$06,$C6,$FE,$00
.byte $FE,$36,$30,$30,$30,$30,$30,$00,$C6,$C6,$C6,$C6,$C6,$EE,$7C,$00
.byte $C6,$C6,$C6,$EE,$7C,$38,$10,$00,$C6,$C6,$C6,$C6,$FE,$EE,$C6,$00
.byte $C6,$6C,$38,$38,$6C,$C6,$C6,$00,$C6,$EC,$78,$30,$30,$30,$30,$00
.byte $FE,$CE,$1C,$38,$70,$E6,$FE,$00,$7C,$EE,$C6,$C6,$C6,$EE,$7C,$00
.byte $38,$18,$18,$18,$18,$18,$18,$00,$FC,$C6,$06,$1C,$70,$E0,$FE,$00
.byte $FC,$C6,$06,$3C,$06,$C6,$FC,$00,$C0,$C0,$C0,$D8,$FE,$18,$18,$00
.byte $FE,$C6,$C0,$FE,$06,$C6,$7C,$00,$1C,$38,$70,$EC,$C6,$E6,$7E,$00
.byte $FE,$C6,$0C,$18,$30,$30,$30,$00,$7C,$C6,$C6,$7C,$C6,$C6,$7C,$00
.byte $7E,$67,$63,$37,$0E,$1C,$38,$00,$00,$00,$00,$00,$00,$30,$30,$00
.byte $00,$00,$00,$00,$00,$18,$30,$00,$7E,$66,$06,$1C,$18,$00,$18,$00
.byte $18,$18,$18,$18,$18,$00,$18,$00,$18,$18,$18,$00,$00,$00,$00,$00
.byte $6C,$6C,$6C,$00,$00,$00,$00,$00,$18,$30,$30,$30,$30,$30,$18,$00
.byte $18,$0C,$0C,$0C,$0C,$0C,$18,$00,$00,$00,$FC,$7E,$00,$00,$00,$00
.byte $00,$18,$18,$7E,$18,$18,$00,$00,$00,$00,$18,$00,$00,$18,$00,$00
; CHARSET IMAGE ATTRIBUTE DATA...
; 48 attributes, 1 attribute per image, 8 bits per attribute, total size is 48 ($30) bytes.
; nb. Upper nybbles = material, lower nybbles = colour.
charset_attrib_data
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
================================================
FILE: src/assets/examples/tile_sets/asm/test_vchar-charset.s
================================================
; Exported using VChar64 v0.2.4
; Total bytes: 2048
charset:
foo .byte $3c,$66,$6e,$6e,$60,$62,$3c
.byte $00,$18,$3c,$66,$7e,$66,$66,$66,$00 ; 0
bar .byte $7c,$66,$66,$7c,$66,$66,$7c,$00,$3c,$66,$60,$60,$60,$66,$3c,$00 ; 16
toto .byte $78,$6c,$66,$66,$66,$6c,$78,$00,$7e,$60,$60,$78,$60,$60,$7e,$00 ; 32
.byte $7e,$60,$60,$78,$60,$60,$60,$00,$3c,$66,$60,$6e,$66,$66,$3c,$00 ; 48
.byte $66,$66,$66,$7e,$66,$66,$66,$00,$3c,$18,$18,$18,$18,$18,$3c,$00 ; 64
.byte $1e,$0c,$0c,$0c,$0c,$6c,$38,$00,$66,$6c,$78,$70,$78,$6c,$66,$00 ; 80
.byte $60,$60,$60,$60,$60,$60,$7e,$00,$63,$77,$7f,$6b,$63,$63,$63,$00 ; 96
.byte $66,$76,$7e,$7e,$6e,$66,$66,$00,$3c,$66,$66,$66,$66,$66,$3c,$00 ; 112
.byte $7c,$66,$66,$7c,$60,$60,$60,$00,$3c,$66,$66,$66,$66,$3c,$0e,$00 ; 128
.byte $7c,$66,$66,$7c,$78,$6c,$66,$00,$3c,$66,$60,$3c,$06,$66,$3c,$00 ; 144
.byte $7e,$18,$18,$18,$18,$18,$18,$00,$66,$66,$66,$66,$66,$66,$3c,$00 ; 160
.byte $66,$66,$66,$66,$66,$3c,$18,$00,$63,$63,$63,$6b,$7f,$77,$63,$00 ; 176
.byte $66,$66,$3c,$18,$3c,$66,$66,$00,$66,$66,$66,$3c,$18,$18,$18,$00 ; 192
.byte $7e,$06,$0c,$18,$30,$60,$7e,$00,$3c,$30,$30,$30,$30,$30,$3c,$00 ; 208
.byte $0c,$12,$30,$7c,$30,$62,$fc,$00,$3c,$0c,$0c,$0c,$0c,$0c,$3c,$00 ; 224
.byte $00,$18,$3c,$7e,$18,$18,$18,$18,$00,$10,$30,$7f,$7f,$30,$10,$00 ; 240
.byte $00,$00,$00,$00,$00,$00,$00,$00,$18,$18,$18,$18,$00,$00,$18,$00 ; 256
.byte $66,$66,$66,$00,$00,$00,$00,$00,$66,$66,$ff,$66,$ff,$66,$66,$00 ; 272
.byte $18,$3e,$60,$3c,$06,$7c,$18,$00,$62,$66,$0c,$18,$30,$66,$46,$00 ; 288
.byte $3c,$66,$3c,$38,$67,$66,$3f,$00,$06,$0c,$18,$00,$00,$00,$00,$00 ; 304
.byte $0c,$18,$30,$30,$30,$18,$0c,$00,$30,$18,$0c,$0c,$0c,$18,$30,$00 ; 320
.byte $00,$66,$3c,$ff,$3c,$66,$00,$00,$00,$18,$18,$7e,$18,$18,$00,$00 ; 336
.byte $00,$00,$00,$00,$00,$18,$18,$30,$00,$00,$00,$7e,$00,$00,$00,$00 ; 352
.byte $00,$00,$00,$00,$00,$18,$18,$00,$00,$03,$06,$0c,$18,$30,$60,$00 ; 368
.byte $3c,$66,$6e,$76,$66,$66,$3c,$00,$18,$18,$38,$18,$18,$18,$7e,$00 ; 384
.byte $3c,$66,$06,$0c,$30,$60,$7e,$00,$3c,$66,$06,$1c,$06,$66,$3c,$00 ; 400
.byte $06,$0e,$1e,$66,$7f,$06,$06,$00,$7e,$60,$7c,$06,$06,$66,$3c,$00 ; 416
.byte $3c,$66,$60,$7c,$66,$66,$3c,$00,$7e,$66,$0c,$18,$18,$18,$18,$00 ; 432
.byte $3c,$66,$66,$3c,$66,$66,$3c,$00,$3c,$66,$66,$3e,$06,$66,$3c,$00 ; 448
.byte $00,$00,$18,$00,$00,$18,$00,$00,$00,$00,$18,$00,$00,$18,$18,$30 ; 464
.byte $0e,$18,$30,$60,$30,$18,$0e,$00,$00,$00,$7e,$00,$7e,$00,$00,$00 ; 480
.byte $70,$18,$0c,$06,$0c,$18,$70,$00,$3c,$66,$06,$0c,$18,$00,$18,$00 ; 496
.byte $00,$00,$00,$ff,$ff,$00,$00,$00,$08,$1c,$3e,$7f,$7f,$1c,$3e,$00 ; 512
.byte $18,$18,$18,$18,$18,$18,$18,$18,$00,$00,$00,$ff,$ff,$00,$00,$00 ; 528
.byte $00,$00,$ff,$ff,$00,$00,$00,$00,$00,$ff,$ff,$00,$00,$00,$00,$00 ; 544
.byte $00,$00,$00,$00,$ff,$ff,$00,$00,$30,$30,$30,$30,$30,$30,$30,$30 ; 560
.byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$00,$00,$00,$e0,$f0,$38,$18,$18 ; 576
.byte $18,$18,$1c,$0f,$07,$00,$00,$00,$18,$18,$38,$f0,$e0,$00,$00,$00 ; 592
.byte $c0,$c0,$c0,$c0,$c0,$c0,$ff,$ff,$c0,$e0,$70,$38,$1c,$0e,$07,$03 ; 608
.byte $03,$07,$0e,$1c,$38,$70,$e0,$c0,$ff,$ff,$c0,$c0,$c0,$c0,$c0,$c0 ; 624
.byte $ff,$ff,$03,$03,$03,$03,$03,$03,$00,$3c,$7e,$7e,$7e,$7e,$3c,$00 ; 640
.byte $00,$00,$00,$00,$00,$ff,$ff,$00,$36,$7f,$7f,$7f,$3e,$1c,$08,$00 ; 656
.byte $60,$60,$60,$60,$60,$60,$60,$60,$00,$00,$00,$07,$0f,$1c,$18,$18 ; 672
.byte $c3,$e7,$7e,$3c,$3c,$7e,$e7,$c3,$00,$3c,$7e,$66,$66,$7e,$3c,$00 ; 688
.byte $18,$18,$66,$66,$18,$18,$3c,$00,$06,$06,$06,$06,$06,$06,$06,$06 ; 704
.byte $08,$1c,$3e,$7f,$3e,$1c,$08,$00,$18,$18,$18,$ff,$ff,$18,$18,$18 ; 720
.byte $c0,$c0,$30,$30,$c0,$c0,$30,$30,$18,$18,$18,$18,$18,$18,$18,$18 ; 736
.byte $00,$00,$03,$3e,$76,$36,$36,$00,$ff,$7f,$3f,$1f,$0f,$07,$03,$01 ; 752
.byte $00,$00,$00,$00,$00,$00,$00,$00,$f0,$f0,$f0,$f0,$f0,$f0,$f0,$f0 ; 768
.byte $00,$00,$00,$00,$ff,$ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00 ; 784
.byte $00,$00,$00,$00,$00,$00,$00,$ff,$c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0 ; 800
.byte $cc,$cc,$33,$33,$cc,$cc,$33,$33,$03,$03,$03,$03,$03,$03,$03,$03 ; 816
.byte $00,$00,$00,$00,$cc,$cc,$33,$33,$ff,$fe,$fc,$f8,$f0,$e0,$c0,$80 ; 832
.byte $03,$03,$03,$03,$03,$03,$03,$03,$18,$18,$18,$1f,$1f,$18,$18,$18 ; 848
.byte $00,$00,$00,$00,$0f,$0f,$0f,$0f,$18,$18,$18,$1f,$1f,$00,$00,$00 ; 864
.byte $00,$00,$00,$f8,$f8,$18,$18,$18,$00,$00,$00,$00,$00,$00,$ff,$ff ; 880
.byte $00,$00,$00,$1f,$1f,$18,$18,$18,$18,$18,$18,$ff,$ff,$00,$00,$00 ; 896
.byte $00,$00,$00,$ff,$ff,$18,$18,$18,$18,$18,$18,$f8,$f8,$18,$18,$18 ; 912
.byte $c0,$c0,$c0,$c0,$c0,$c0,$c0,$c0,$e0,$e0,$e0,$e0,$e0,$e0,$e0,$e0 ; 928
.byte $07,$07,$07,$07,$07,$07,$07,$07,$ff,$ff,$00,$00,$00,$00,$00,$00 ; 944
.byte $ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$ff,$ff ; 960
.byte $03,$03,$03,$03,$03,$03,$ff,$ff,$00,$00,$00,$00,$f0,$f0,$f0,$f0 ; 976
.byte $0f,$0f,$0f,$0f,$00,$00,$00,$00,$18,$18,$18,$f8,$f8,$00,$00,$00 ; 992
.byte $f0,$f0,$f0,$f0,$00,$00,$00,$00,$f0,$f0,$f0,$f0,$0f,$0f,$0f,$0f ; 1008
.byte $c3,$99,$91,$91,$9f,$99,$c3,$ff,$e7,$c3,$99,$81,$99,$99,$99,$ff ; 1024
.byte $83,$99,$99,$83,$99,$99,$83,$ff,$c3,$99,$9f,$9f,$9f,$99,$c3,$ff ; 1040
.byte $87,$93,$99,$99,$99,$93,$87,$ff,$81,$9f,$9f,$87,$9f,$9f,$81,$ff ; 1056
.byte $81,$9f,$9f,$87,$9f,$9f,$9f,$ff,$c3,$99,$9f,$91,$99,$99,$c3,$ff ; 1072
.byte $99,$99,$99,$81,$99,$99,$99,$ff,$c3,$e7,$e7,$e7,$e7,$e7,$c3,$ff ; 1088
.byte $e1,$f3,$f3,$f3,$f3,$93,$c7,$ff,$99,$93,$87,$8f,$87,$93,$99,$ff ; 1104
.byte $9f,$9f,$9f,$9f,$9f,$9f,$81,$ff,$9c,$88,$80,$94,$9c,$9c,$9c,$ff ; 1120
.byte $99,$89,$81,$81,$91,$99,$99,$ff,$c3,$99,$99,$99,$99,$99,$c3,$ff ; 1136
.byte $83,$99,$99,$83,$9f,$9f,$9f,$ff,$c3,$99,$99,$99,$99,$c3,$f1,$ff ; 1152
.byte $83,$99,$99,$83,$87,$93,$99,$ff,$c3,$99,$9f,$c3,$f9,$99,$c3,$ff ; 1168
.byte $81,$e7,$e7,$e7,$e7,$e7,$e7,$ff,$99,$99,$99,$99,$99,$99,$c3,$ff ; 1184
.byte $99,$99,$99,$99,$99,$c3,$e7,$ff,$9c,$9c,$9c,$94,$80,$88,$9c,$ff ; 1200
.byte $99,$99,$c3,$e7,$c3,$99,$99,$ff,$99,$99,$99,$c3,$e7,$e7,$e7,$ff ; 1216
.byte $81,$f9,$f3,$e7,$cf,$9f,$81,$ff,$c3,$cf,$cf,$cf,$cf,$cf,$c3,$ff ; 1232
.byte $f3,$ed,$cf,$83,$cf,$9d,$03,$ff,$c3,$f3,$f3,$f3,$f3,$f3,$c3,$ff ; 1248
.byte $ff,$e7,$c3,$81,$e7,$e7,$e7,$e7,$ff,$ef,$cf,$80,$80,$cf,$ef,$ff ; 1264
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$e7,$e7,$e7,$e7,$ff,$ff,$e7,$ff ; 1280
.byte $99,$99,$99,$ff,$ff,$ff,$ff,$ff,$99,$99,$00,$99,$00,$99,$99,$ff ; 1296
.byte $e7,$c1,$9f,$c3,$f9,$83,$e7,$ff,$9d,$99,$f3,$e7,$cf,$99,$b9,$ff ; 1312
.byte $c3,$99,$c3,$c7,$98,$99,$c0,$ff,$f9,$f3,$e7,$ff,$ff,$ff,$ff,$ff ; 1328
.byte $f3,$e7,$cf,$cf,$cf,$e7,$f3,$ff,$cf,$e7,$f3,$f3,$f3,$e7,$cf,$ff ; 1344
.byte $ff,$99,$c3,$00,$c3,$99,$ff,$ff,$ff,$e7,$e7,$81,$e7,$e7,$ff,$ff ; 1360
.byte $ff,$ff,$ff,$ff,$ff,$e7,$e7,$cf,$ff,$ff,$ff,$81,$ff,$ff,$ff,$ff ; 1376
.byte $ff,$ff,$ff,$ff,$ff,$e7,$e7,$ff,$ff,$fc,$f9,$f3,$e7,$cf,$9f,$ff ; 1392
.byte $c3,$99,$91,$89,$99,$99,$c3,$ff,$e7,$e7,$c7,$e7,$e7,$e7,$81,$ff ; 1408
.byte $c3,$99,$f9,$f3,$cf,$9f,$81,$ff,$c3,$99,$f9,$e3,$f9,$99,$c3,$ff ; 1424
.byte $f9,$f1,$e1,$99,$80,$f9,$f9,$ff,$81,$9f,$83,$f9,$f9,$99,$c3,$ff ; 1440
.byte $c3,$99,$9f,$83,$99,$99,$c3,$ff,$81,$99,$f3,$e7,$e7,$e7,$e7,$ff ; 1456
.byte $c3,$99,$99,$c3,$99,$99,$c3,$ff,$c3,$99,$99,$c1,$f9,$99,$c3,$ff ; 1472
.byte $ff,$ff,$e7,$ff,$ff,$e7,$ff,$ff,$ff,$ff,$e7,$ff,$ff,$e7,$e7,$cf ; 1488
.byte $f1,$e7,$cf,$9f,$cf,$e7,$f1,$ff,$ff,$ff,$81,$ff,$81,$ff,$ff,$ff ; 1504
.byte $8f,$e7,$f3,$f9,$f3,$e7,$8f,$ff,$c3,$99,$f9,$f3,$e7,$ff,$e7,$ff ; 1520
.byte $ff,$ff,$ff,$00,$00,$ff,$ff,$ff,$f7,$e3,$c1,$80,$80,$e3,$c1,$ff ; 1536
.byte $e7,$e7,$e7,$e7,$e7,$e7,$e7,$e7,$ff,$ff,$ff,$00,$00,$ff,$ff,$ff ; 1552
.byte $ff,$ff,$00,$00,$ff,$ff,$ff,$ff,$ff,$00,$00,$ff,$ff,$ff,$ff,$ff ; 1568
.byte $ff,$ff,$ff,$ff,$00,$00,$ff,$ff,$cf,$cf,$cf,$cf,$cf,$cf,$cf,$cf ; 1584
.byte $f3,$f3,$f3,$f3,$f3,$f3,$f3,$f3,$ff,$ff,$ff,$1f,$0f,$c7,$e7,$e7 ; 1600
.byte $e7,$e7,$e3,$f0,$f8,$ff,$ff,$ff,$e7,$e7,$c7,$0f,$1f,$ff,$ff,$ff ; 1616
.byte $3f,$3f,$3f,$3f,$3f,$3f,$00,$00,$3f,$1f,$8f,$c7,$e3,$f1,$f8,$fc ; 1632
.byte $fc,$f8,$f1,$e3,$c7,$8f,$1f,$3f,$00,$00,$3f,$3f,$3f,$3f,$3f,$3f ; 1648
.byte $00,$00,$fc,$fc,$fc,$fc,$fc,$fc,$ff,$c3,$81,$81,$81,$81,$c3,$ff ; 1664
.byte $ff,$ff,$ff,$ff,$ff,$00,$00,$ff,$c9,$80,$80,$80,$c1,$e3,$f7,$ff ; 1680
.byte $9f,$9f,$9f,$9f,$9f,$9f,$9f,$9f,$ff,$ff,$ff,$f8,$f0,$e3,$e7,$e7 ; 1696
.byte $3c,$18,$81,$c3,$c3,$81,$18,$3c,$ff,$c3,$81,$99,$99,$81,$c3,$ff ; 1712
.byte $e7,$e7,$99,$99,$e7,$e7,$c3,$ff,$f9,$f9,$f9,$f9,$f9,$f9,$f9,$f9 ; 1728
.byte $f7,$e3,$c1,$80,$c1,$e3,$f7,$ff,$e7,$e7,$e7,$00,$00,$e7,$e7,$e7 ; 1744
.byte $3f,$3f,$cf,$cf,$3f,$3f,$cf,$cf,$e7,$e7,$e7,$e7,$e7,$e7,$e7,$e7 ; 1760
.byte $ff,$ff,$fc,$c1,$89,$c9,$c9,$ff,$00,$80,$c0,$e0,$f0,$f8,$fc,$fe ; 1776
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f ; 1792
.byte $ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff ; 1808
.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$00,$3f,$3f,$3f,$3f,$3f,$3f,$3f,$3f ; 1824
.byte $33,$33,$cc,$cc,$33,$33,$cc,$cc,$fc,$fc,$fc,$fc,$fc,$fc,$fc,$fc ; 1840
.byte $ff,$ff,$ff,$ff,$33,$33,$cc,$cc,$00,$01,$03,$07,$0f,$1f,$3f,$7f ; 1856
.byte $fc,$fc,$fc,$fc,$fc,$fc,$fc,$fc,$e7,$e7,$e7,$e0,$e0,$e7,$e7,$e7 ; 1872
.byte $ff,$ff,$ff,$ff,$f0,$f0,$f0,$f0,$e7,$e7,$e7,$e0,$e0,$ff,$ff,$ff ; 1888
.byte $ff,$ff,$ff,$07,$07,$e7,$e7,$e7,$ff,$ff,$ff,$ff,$ff,$ff,$00,$00 ; 1904
.byte $ff,$ff,$ff,$e0,$e0,$e7,$e7,$e7,$e7,$e7,$e7,$00,$00,$ff,$ff,$ff ; 1920
.byte $ff,$ff,$ff,$00,$00,$e7,$e7,$e7,$e7,$e7,$e7,$07,$07,$e7,$e7,$e7 ; 1936
.byte $3f,$3f,$3f,$3f,$3f,$3f,$3f,$3f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f ; 1952
.byte $f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff ; 1968
.byte $00,$00,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$00,$00,$00 ; 1984
.byte $fc,$fc,$fc,$fc,$fc,$fc,$00,$00,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f ; 2000
.byte $f0,$f0,$f0,$f0,$ff,$ff,$ff,$ff,$e7,$e7,$e7,$07,$07,$ff,$ff,$ff ; 2016
.byte $0f,$0f,$0f,$0f,$ff,$ff,$ff,$ff,$0f,$0f,$0f,$0f,$f0,$f0,$f0,$f0 ; 2032
CHARSET_COUNT = 2048
================================================
FILE: src/assets/examples/tile_sets/asm/tile_8x6_shapeA.txt
================================================
!byte 0x00, 0x1F, 0x28, 0x28, 0x28, 0x3F, 0x1F, 0x00
================================================
FILE: src/assets/examples/tile_sets/asm/tile_8x6_shapeA_rotated.txt
================================================
!byte 0,0,60,98,126,98,98,98
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_all.asm
================================================
Charset_00_data:
!byte $18, $24, $18, $66, $BD, $3C, $24, $24
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_all_2.asm
================================================
; Generated by CharPad 2.7, assemble with 64TASS or similar.
; Character display mode : Multi-colour (MCM).
; Character colouring method : Per-Map.
; Colour values...
COLR_SCREEN = 9
COLR_CHAR_DEF = 3
COLR_CHAR_MC1 = 0
COLR_CHAR_MC2 = 1
; Quantities and dimensions...
CHAR_COUNT = 256
MAP_WID = 40
MAP_HEI = 25
; Data block sizes (in bytes)...
SZ_CHARSET_DATA = 2048
SZ_CHARSET_ATTRIB_DATA = 256
SZ_MAP_DATA = 1000
; Data block addresses (dummy values)...
ADDR_CHARSET_DATA = $1000 ; block size = $0800, label = 'charset_data'.
ADDR_CHARSET_ATTRIB_DATA = $2000 ; block size = $0100, label = 'charset_attrib_data'.
ADDR_MAP_DATA = $5000 ; block size = $03e8, label = 'map_data'.
; * INSERT EXAMPLE PROGRAM HERE! * (Or just include this file in your project).
; CHARSET IMAGE DATA...
; 256 images, 8 bytes per image, total size is 2048 ($800) bytes.
charset_data
bar .byte $18,$24,$18
foo .byte $66,$bd,$3c,$24,$24, $11,$22,$33,$44,$55,$66,$77,$88
.byte $99,$AA,$BB,$CC,$DD,$EE,$FF,$10
.byte $20,$30,$40,$50,$60,$70,$80,$90,$00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
; CHARSET IMAGE ATTRIBUTE DATA...
; 256 attributes, 1 attribute per image, 8 bits per attribute, total size is 256 ($100) bytes.
; nb. Upper nybbles = material, lower nybbles = colour.
charset_attrib_data
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
; MAP DATA...
; 40x25 (1000) cells, 8 bits per cell, total size is 1000 ($3e8) bytes.
map_data
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_bin.asm
================================================
.byte %01010101
.byte %11111111
.byte %10101010
.byte %00110011
.byte %11001100
.byte %01010101
.byte %10101010
.byte %11111111
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_charPad.asm
================================================
; CHARSET IMAGE DATA...
; 256 images, 8 bytes per image, total size is 2048 ($800) bytes.
charset_data
.byte $18,$24,$18,$66,$bd,$3c,$24,$24,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
; CHARSET IMAGE ATTRIBUTE DATA...
; 256 attributes, 1 attribute per image, 8 bits per attribute, total size is 256 ($100) bytes.
; nb. Upper nybbles = material, lower nybbles = colour.
charset_attrib_data
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_magellan.a99
================================================
PAT0 DATA >1824,>1866,>BD3C,>2424
PAT1 DATA >0000,>0000,>0000,>0000
================================================
FILE: src/assets/examples/tile_sets/asm/tiles_magellan_2.a99
================================================
CLRNUM DATA 256
CLRSET BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
BYTE >10,>10,>10,>10
PAT0 DATA >0000,>0000,>0000,>0000
PAT1 DATA >0000,>0000,>0000,>0000
MCOUNT DATA 1
MC0 DATA 0
MS0 DATA >0020,>0018,>0300
MD0 DATA >8083,>8283,>8485,>8687
DATA >8889,>8A8B,>8C8D,>8E20
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>8520,>2080,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >8520,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>8020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >8020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
DATA >2020,>2020,>2020,>2020
================================================
FILE: src/assets/examples/tile_sets/basic/test.txt
================================================
20 SYMBOL AFTER 32
30 REM Upper case chars
40 SYMBOL 65,126,66,66,126,98,98,98,0
50 SYMBOL 66,126,66,66,126,98,98,126,0
60 SYMBOL 67,126,64,64,96,96,96,126,0
70 SYMBOL 68,254,66,66,98,98,98,254,0
80 SYMBOL 69,126,64,64, 120,96,96,126,0
90 SYMBOL 70,126,64,64,120,96,96,96,0
100 SYMBOL 71,126,64,64,102,98,98,126,0
110 SYMBOL 72,66,66,66,126,98,98,98,0
120 SYMBOL 73,60,16,16,24,24,24,60,0
130 SYMBOL 74,126,8,8,24,24,24,120,0
140 SYMBOL 75,68,68,68, 120,100,100,100,0
150 SYMBOL 76,64,64,64,96,96,96, 126,0
160 SYMBOL 77,126,74,74,98,98,98,98,0
170 SYMBOL 78,98,82,74,102,98,98,98,0
180 SYMBOL 79,126,66,66,98,98,98,126,0
190 SYMBOL 80,126,66,66,126,96,96,96,0
200 SYMBOL 81,126,66,66,98,98,106,126,4
210 SYMBOL 82,126,66,66,126,106,100,98,0
220 SYMBOL 83,126,64,64,126,6,6,126,0
230 SYMBOL 84,126,16,16,24,24,24,24,0
240 SYMBOL 85,66,66,66,98,98,98,126,0
250 SYMBOL 86,66,66,66,66,66,36,24,0
260 SYMBOL 87,66,66,66,98,106,106,126,0
270 SYMBOL 88,102,102,36,24,36,102,102,0
280 SYMBOL 89,66,66,126,16,24,24,24,0
290 SYMBOL 90,126,4,8,16,32,64,126,0
295 REM Lower case chars
300 SYMBOL 97,0,0,126,6,126,70,126,0
310 SYMBOL 98,96,96,96,126,98,98,126,0
320 SYMBOL 99,0,0,126,96,96,96,126,0
330 SYMBOL 100,6,6,6,126,70,70,126,0
340 SYMBOL 101,0,0,126,98,126,96,126,0
350 SYMBOL 102,60,48,48,120,48,48,48,0
360 SYMBOL 103,0,0,126,70,70,126,6,126
370 SYMBOL 104,96,96,96,126,98,98,98,0
380 SYMBOL 105,24,0,24,24,24,24,24,0
390 SYMBOL 106,6,0,6,6,6,6,6,126
400 SYMBOL 107,96,96,102,108,120,108, 102,0
410 SYMBOL 108,24,24,24,24,24,24,24,0
420 SYMBOL 109,0,0,126,90,90,66,66,0
430 SYMBOL 110,0,0,108,114,98,98,98,0
440 SYMBOL 111,0,0,126,102,102,102,126,0
450 SYMBOL 112,0,0,126,98,98,126,96,96
460 SYMBOL 113,8,0,126,70,70,126,6,6
470 SYMBOL 114,0,0,108,114,96,96,96,0
480 SYMBOL 115,0,0,126,96,126,6,126,0
490 SYMBOL 116,24,62,24,24,24,24,30,0
500 SYMBOL 117,0,0,102,102,102,102,126,0
510 SYMBOL 118,0,0,102,102,102,60,24,0
520 SYMBOL 119,0,0,66,66,90,90,126,0
530 SYMBOL 120,0,0,198,104,16,104,198,0
540 SYMBOL 121,0,0,102,102,102,126,6,126
550 SYMBOL 122,0,0,126,12,24,48,126,0
555 REM Numbers
560 SYMBOL 48,126,102,110,118,102,102,126,0
570 SYMBOL 49,24,56,24,24,24,24,126,0
580 SYMBOL 50,126,2,2,126,96,96,126,0
590 SYMBOL 51,126,2,2,30,6,6,126,0
600 SYMBOL 52,96,96,96,96,104,126,8,8
610 SYMBOL 53,126,64,126,6,6,6,126,0
620 SYMBOL 54,126,64,64,126,98,98,126,0
630 SYMBOL 55,126,2,4,62,16,32,64,0
640 SYMBOL 56,126,66,66,126,66,66,126,0
650 SYMBOL 57,126,66,66,126,6,6,6,0
680 SYMBOL 95,0,255,0,0,0,0,0,0
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_atari.bas
================================================
1560 DATA 0,6,15,249,239,6,0,0
1570 DATA 34,148,65,58,124,62,122,60
1580 DATA 251,251,251,0,223,223,223,223
1590 DATA 255,0,118,118,0,94,94,94
1600 DATA 195,195,255,255,195,195,255,255
1610 DATA 15,27,55,0,55,54,55,55
1620 DATA 248,108,118,0,118,54,118,118
1630 DATA 1,3,7,11,10,11,11,11
1640 DATA 128,192,224,208,80,208,208,208
1650 DATA 62,123,251,255,110,26,114,67
1660 DATA 62,123,251,254,244,100,12,8
1670 DATA 124,222,223,255,118,88,78,194
1680 DATA 124,222,222,127,47,38,48,16
1690 DATA 126,219,219,254,232,92,22,48
1700 DATA 126,219,219,127,23,58,104,12
1710 DATA 12,30,181,127,59,63,126,212
1720 DATA 12,30,53,127,191,63,126,170
1730 DATA 48,120,173,254,220,252,126,39
1740 DATA 48,120,172,254,253,252,126,101
1750 DATA 0,6,15,249,239,6,0,0
1760 DATA 68,41,130,92,62,116,126,60
1770 DATA 251,251,251,0,223,223,223,223
1780 DATA 255,0,118,118,0,94,94,94
1790 DATA 195,195,255,255,195,195,255,255
1800 DATA 15,27,55,0,55,54,55,55
1810 DATA 248,108,118,0,118,54,118,118
1820 DATA 1,3,7,11,10,11,11,11
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_atari_2.bas
================================================
0A=PEEK(106)-4:POK.106,A:GR.17:U=256*A:F.I=28TO432:POK.U+I,PEEK(57344+I):N.I:F.I=64TO79:REA.J:POK.U+I,J:N.I:H=400
1DIMN(255):POK.756,A:M=47:F.I=0TO4:REA.L:POK.708+I,L:N.I:B=PEEK(88)+PEEK(89)*256:O=B+59:Z=125:D=B+460:T=B+210:E=10
2P=T:L=26:?#6;CHR$(Z);"USE IJKL SPC":K=1:Q=.9:G=B:U=3:J=0:F.I=0TO127:N(I)=0:N(I+128)=0:POK.O+1+INT(RND(0)*H),M:N.I
3N(0)=1:N(5)=20:N(13)=-20:N(1)=-1:W=132:POS.6,1:?#6;" MINES+ ":F.I=0TO19:POK.O-I,73:POK.D+I,73:N.I:D.0,60,126,126
4R=J*(J>R)+R*(J<=R):POS.1,0:?#6;9-F;" ";CHR$(136);U;" ";J;" hi ";R:IFPEEK(P)=W THENJ=J+9:F=F-(F>0):SO.0,Z,E,E
5SE.4,0,0:Y=0:IFQ=K*500 THENU=U+(U<9):K=K+1:F=0:L=74
6POK.P,200:S=PEEK(764):SO.0,0,0,0:IFS<>9THENPOK.764,9:IFN(S)THENPOK.P,M:P=P+N(S):J=J+1:Y=1:Q=Q-.0005:SO.0,99,E,E
7POK.G,W:G=B:POK.729,0:IFY*(INT(J/4)=J/4)THENG=O+1+INT(RND(1)*H):POK.G,68:D.126,126,60,0,0,170,85,170,85,170,85
8U=(P>O)*(PM)*(U>0))GOTO4:SO.0,99,8,9:POK.P,138:U=U-1:F=0:ON(U>0)GOTO4:SO.0,0,0,0:F.I=0TO2600:N.I:G.2
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_bbc.bas
================================================
10 REM Walking alien
20 MODE 6
30 VDU 23,240,153,189,219,126,36,60,36,36
40 PRINT TAB(0,10);CHR$(240)
50 FOR I%=1 TO 19
60 PRINT TAB(I%-1,10);" "
70 PRINT TAB(I%,10);CHR$(240)
80 FOR J%=1 TO 500: NEXT J%
90 NEXT I%
100 END
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm.bas
================================================
000 REM ** USER DEFINED GRAPHICS **
001 REM ** BY SHANE JOLLY **
100 PRINT "♥": PRINT TAB(12)"PLEASE WAIT..."
110 PRINT CHR$(142)
120 POKE 52, 48: POKE 56, 48
130 POKE UG=12288;CG=53248
140 POKE 56334, PEEK(56334) AND 254
150 POKE 1, PEEK(1) AND 251
160 FOR K=1 TO 2047
170 POKE UG+K, PEEK(CG+K)
180 NEXT
190 POKE 1, PEEK(1) OR 4
200 POKE 56334, PEEK(6334) OR 1
210 POKE 53272, (PEEK(53272) AND 240)+12
220 FOR CC=1 TO 9
230 FOR J=0 TO 7
240 READ A: POKE UG+8*CC+J, A
250 NEXT J
260 NEXT CC
270 FOR N=65 TO 90
280 PRINT CHR$(N);" ";
290 NEXT N
300 DATA 000, 016, 040, 068, 124, 068, 068, 000
310 DATA 000, 120, 072, 124, 068, 068, 124, 000
320 DATA 000, 124, 068, 064, 064, 068, 124, 000
330 DATA 000, 120, 068, 068, 068, 068, 120, 000
340 DATA 000, 124, 068, 112, 112, 068, 124, 000
350 DATA 000, 124, 068, 112, 064, 064, 064, 000
360 DATA 000, 124, 068, 064, 064, 078, 124, 000
370 DATA 000, 068, 068, 124, 124, 068, 068, 000
380 DATA 000, 056, 016, 016, 016, 016, 056, 000
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm_10_liner.bas
================================================
0l=32:v=36878:fOk=.to4:rEb$:fOi=1to8:pO7167+i+k*8,aS(mI(b$,i)):pO7421+i,.:nE:nE
1pO52,26:pO56,26:n=1:t=30720:pOv-9,255:pOv+1,8:?"{clear}{reverse on}{yellow}ijkl":x=3:p=7955:ifj>rtHr=j
2wA198,1:g(0)=211:g(1)=209:g(2)=215:g(3)=218:pO650,128:u=22:k=7745:y=7732:z=y-8
3gEa$:b=z+rN(.)*464:q=rN(1)*4:pOb,g(q):pOb+t,q+2:ifj>=100*ntHx=x-(x<9):n=n+1
4pOk+i,l:pOy+i*u,l:i=i+1:ifi<=utHpOk+i,4:pOk+i+t,6:pOy+i*u,4:pOy+i*u+t,7:m=pE(p)
5g=.:x=x+(m=4):e=saN1:c=s-1+e:ifi>utHi=.:y=z+rN(.)*u-1:k=z+u*int((p-z)/u)-1
6ifc=sG(c)tHg=1:h=s+1:pOp,l:p=p+c*21*e+c:d=pE(p):ifd=ftHw=w-(d>l):j=j-(w>1)*w
7pOp+t,7:?"{home}{reverse on}{red}g{green}e{cyan}m{purple}s{white}"j" {blue}hi{cyan}"r" {yellow}{reverse off}b{green}{reverse on}"x:ifd>ltHifgtHpOv,9:pOv,.:dA"{24}{60}{24}{102}{153}{24}{36}{102}"
8pOp,h:w=-w*(d=f):s=aS(a$+"@")-74:dA"{24}{44}{152}{110}{25}{24}{40}{40}","{24}{36}{24}{102}{153}{24}{36}{102}","{24}{52}{25}{118}{152}{24}{40}{40}","{ 24}{ 36}{ 90}{189}{189}{ 90}{ 36}{ 24}"
9f=d:on-(x>.aNp<8186aNp>=z)gO3:?sP7)"{reverse on}{red}game over":fOa=.tov/9:nE:pO198,0:j=.:gO1
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_2.bas
================================================
0pO56,26:pO52,26:v=36878:x=132:pOv-9,255:fOp=.to39:rEb:pO7168+p,b:pO7421+p,.:nE
1e=22:z=218:o=4:y=3:b=7:p=8174:pO650,z:?"{clear}{black}{reverse on}jl":l$="{green}{68*2}{black}{66}":r$="{black}{67}{green}{68*2}":ifi>rtHr=i
2n=v+1:t=30720:pOn,59:wA198,1:?"{clear}":fOi=3toe:?tA4)"{green}{68}{black}{reverse on}{230}{191}"sP8)"{191}{230}{reverse off}{green}{68}":nE:d=1:i=.
3b=b+f:i=i+1:if(iaNy)=ytHd=int(rN(.)*3):ifb<4tHifo<6tHb=4:y=7:dA24,189,255,165
4s=int(rN(.)*(b+1)):ifpE(p-e)<>32tHpOn,42:pOv,15:pOv,.:l=l+1:fOf=-9tox:nE:pOn,59
5c$=" ":gEa$:ifiaN1tHc$="{31}@":ifl<.tHl=.:dA36,189,255,165,90,102,90,60,36,219,255
6?"{home}{down}{left}{148}":pOz,x:pOp+t,2:pOp,1:ifpE(p-e)=4tHl=9:dA195,93,114,101,66,93,114,101,66
7?sPo)l$sPs)c$sPb-s)r$:ifa$<>""tHk=aS(a$):p=p+(k=74)-(k=76):dA93,39,83,33,93,39
8?"{home}{red}a{reverse on}"l" {purple}"i" {black}"r:f=(iaN127)=.:l=l+f:ifo>1-dtHifo+d+b<17tHo=o-1+d:dA83,33,8,28
9on-(l<9)gO3:?"{home}{down*2}"sP8)"{black}{reverse on}{191} {red}end {black}{191}":fOs=ttov:nE:l=.:pO198,0:gO1:dA62,28,62,8,8,
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_3.bas
================================================
0pO56,28:pO52,28:n=36879:w=49:rEb$:fOk=1to48:pO7559+k,aS(mI(b$,k)):pO7421+k,.:nE
1v=n-1:pOv-9,255:g=198:u=22:z=8186:t=30720:h=52:pOn,8:?"{clear}{reverse on}{green}ijkl":wAg,1:pO650,128
2l=.:x=5:y=44:m=9:o=7723:?"{clear}":p=7933:fOa=.to9:fOd=.to9+j/2:goS9:pOf+t,5:pOf,w:nE
3b=54:pOf,b:pOf+t,1:goS9:pOf+t,2:pOf,211:nE:pOg,.:wAg,1:fOq=.to439:pOo+q+t,.:nE
4pOn,8:?"{home}"sP6)"{reverse on}{red}S{cyan}"j" {red}{reverse off}4{cyan}{reverse on}"m-xaN15:ifpE(p)=211tHpOn,90:j=j+1:l=l+1:x=x+(x>1)
5pOp+t,2:pOp,h:gEa$:s=aS(a$+"@"):ifl>mtH?sP7)"{purple}{reverse on}completed":fOi=tton:nE:pOn,8:gO2
6e=saN1:c=s-75+e:ifc=sG(c)tHx=x+.1:h=s-23:pOp,160:q=p+c*21*e+c:if(pE(q)<>w)gO8
7on-(xoaNpE(p)<>b)gO4:pOn,109:?sPm)"{yellow}{reverse on}end":fOi=tton:nE:j=.:pOg,.:gO1
8p=q:pOv,m:pOv,.:fOa=-2to2:q=p+t+a:pOq-y,1:pOq-u,1:pOq,1:pOq+u,1:pOq+y,1:nE:gO7
9f=2+o+2*a*u+rN(.)*20:reT:dA"{16}{56}{124}{56}{124}{16}{16}{16}{24}{60}{24}{102}{153}{24}{36}{102}{24}{44}{152}{110}{25}{24}{40}{40}{24}{36}{24}{102}{153}{24}{36}{102}{24}{52}{25}{118}{152}{24}{40}{40}{62}{127}{73}{127}{119}{62}{42}{42}"
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm_10_liner_4.bas
================================================
0v=36878:t=30720:pokev+1,110:b=7816:c=b+12:z=65:q=.:g=160:dimc(g):pokev-9,255:data17,85
1fori=1to16:reade:poke7167+i,255-e:next:s$="{home}{down*3}{reverse on} {white}step{yellow}":data17,,254,,,70,136
2s=3:fori=.to3:p(i)=1:p(6-i)=0:next:c(0)=3:c(1)=5:print"{clear}{reverse on} {cyan}{reverse off}@{green}a{reverse on} {white}vic {green}fruzzle {cyan}{reverse off}@{green}a"
3h=42:q=.:p(s)=g:print"{down*18}{reverse on}{yellow} use {white}abcdefg{down}"spc(11)"{yellow}reset with {white}x"
4e=22:fori=.to6:poke8036+i*2,i+129:forj=1to8:pokeb+e*j+i*2,230:pokeb+e*j+i*2+t,7:next:next
5fori=.to6:pokeb+t+i*2,c(p(i)):pokeb+i*2,p(i):next:prints$;q;:d$="{down}done!":data170,136,,127,,
6geta$:on-(a$="")goto6:f=asc(a$)-z:on-(f=23)goto2:on-(f<.orf>6orf=sors<.ors>6)goto6:data98
7x=peek(b+f*2):on-((x=1)and(((s-f)>2)or(f>s)))goto6:on-((x=0)and(((f-s)>2)or(s>f)))goto6
8pokeb+f*2,g:q=q+1:j=b+f*2-22-sgn(f-s):pokej+t,c(x):pokej,x:pokev,9:pokev,0:p(s)=x:p(f)=g
9k=tan(9.9):s=f:pokej,g:on-(p(4)*p(5)*p(6)<>1orp(3)<2)goto5:print"{home}"spc(9)d$:pokev+1,h:goto5
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cbm_2.bas
================================================
1 goto800
2 poke53280,6:poke53281,1
5 s=1304:ex=1:l=3:sc=0:so=54272
10 pokeso+24,15:pokeso+5,17:pokeso+6,16:pokeso,100
20 tc=27:poke251,112:poke831,0:poke832,6:poke829,20
30 tb(1)=112
40 tb(2)=197
50 ss$="{right*19}{space*3}{down}{left*4}{space*5}{down}{left*3} "
60 sc$="{right*19}{green}###{down}{left*4}{blue}#####{down}{left*3}$"
70 poke53272,(peek(53272)and240)+12
80 t(1)=38:t(2)=40
90 print"{clear}{down*2}{red}########################################";
91 print"{green}###################{space*3}##################";
92 print"{blue}##################{space*5}#################";
100 fori=16to1step-1
110 print"{home}{down*3}";:fort=1toi:print"{down}";:next:printsc$
120 fory=1to75:next
130 print"{home}{down*3}";:fort=1toi:print"{down}";:next:printss$
140 next
150 print"{clear}{down*2}{red}########################################";
151 print"{green}########################################";
152 print"{blue}########################################";
160 print"{home}{down}++++++++++++++++++++++++++++++++++++++++"
170 print"{home}{down*23},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
180 tt=1:d=-1:ao=40:mp=1244:mc=55516:tp=19:ba=121:z=0:poke834,tp
185 w=int(rnd(1)*39)+1104
190 poke251,tb(tt):sys49152
200 print"{home}{down*16}-------{space*26}-------"
210 print"{home}{space*6}punti=";sc:print"{home}{right*25}clown=";l
220 pokemp,36:pokemc,0
230 gosub750:iffbthen240
235 goto230
240 u=int(rnd(1)*10)
244 ifz=0andu>8thenz=7:goto248
246 ifz=7andu>7thenz=0:goto248
248 ifpeek(w)=35thenpokew+so,z
290 poke251,tb(tt):sys49434:tp=peek(834)
310 ifd=-1then330
320 ifd=1then410
325 goto310
330 op=mp:mp=mp+ao:mc=mp+so:pm=peek(mp)
335 if((op-1023)/40=int((op-1023)/40))andao=41thenmp=mp-40:pm=peek(mp):mc=mp+so
340 ifpm=32thengoto406
350 ifpm=35thengosub560:goto406
370 ifpm=t(tt)then460
380 ifpm=43orpm=45thenmp=op:d=1:ao=int(rnd(1)*3)+39:goto240
400 l=l-1:ifl<=0then630
404 goto180
406 pokeop,32:pokemp,36:pokemc,0:goto240
410 op=mp:mp=mp-ao:mc=mp+so:pm=peek(mp)
415 if((op-1024)/40=int((op-1024)/40))andao=41thenmp=mp+40:pm=peek(mp):mc=mp+so
420 ifpm=32then450
430 ifpm=35thend=-1:gosub560:goto450
435 ifpm=45thenpokeop,32:mp=mp-ao:mc=mp+so
440 ifpm=43thenmp=op:d=-1:ao=int(rnd(1)*3)+39:goto240
450 pokeop,32:pokemp,36:pokemc,0:goto240
460 sc=sc+5:pokeop,32
480 pokeso+1,10:pokeso+4,33
490 poke251,tc:sys49152
500 pokeso+4,32:iftt=1thenmp=1787+tp:mc=mp+so
510 iftt=2thenmp=1785+tp:mc=mp+so
520 tt=tt+1:iftt>2thentt=1
530 d=1
540 poke251,tb(tt):sys49152
550 ao=int(rnd(1)*3)+39
555 print"{home}{space*6}punti=";sc:print"{home}{right*25}clown=";l:goto240
560 pokeso+1,10:pokeso+4,129:fori=1to10:next:pokeso+4,128
563 ifmp=wandc=0thenl=l-1:goto180
566 ifmp=wandc=7thensc=sc+250:goto600
570 ifmp>1103andmp<1144thensc=sc+100
580 ifmp>1143andmp<1184thensc=sc+75
590 ifmp>1183andmp<1224thensc=sc+50
600 ifsc>ex*2000thenl=l+1:ex=ex+1
605 ba=ba-1:ifba=1then180
610 ao=int(rnd(1)*3)+39
620 print"{home}{space*6}punti=";sc:print"{home}{right*25}clown=";l:return
630 g$=" p a r t i t a c o n c l u s a "
640 fori=2to34step2
650 print"{home}{down*9}";tab(i+2);mid$(g$,i,1)
660 fort=1to100:next:next
670 fori=1to250:next
680 print"{space*2}premi il pulsante per giocare ancora"
690 print"{space*3}spingi il joystick verso il basso"
695 print"{space*4}per terminare"
700 gosub750
710 iffbthenclr:goto2
720 ifj1thensys2048:end
730 goto700
750 p=peek(56320)and15
760 j1=-(p=13)
770 fb=-((peek(56320)and16)=0):return
800 poke53280,6:poke53281,1
810 print"{clear}{down*12}{space*17}{red}c{cyan}i{purple}r{green}c{blue}o{black}":c=0
820 print"{down}{space*12}attendere prego...":goto1310
830 gosub10000:poke53272,(peek(53272)and240)+12
840 print"{clear}{down*12}{right*17}{black}circo"
850 print"{home}{down*10}{right*15}#########"
855 print"{down*3}{right*15}#########"
860 print"{home}{down*11}{right*15}#{down}{left}#{down}{left}#{up*2}{right*7}#{down}{left}#{down}{left}#"
880 fort=1to3:forp=1to7:s=p
890 fori=55711to55720:pokei,s
900 s=s+1:ifs=1thens=2
910 ifs>7thens=0
920 next
930 fori=55760to55840step40:pokei,s
940 s=s+1:ifs=1thens=2
950 ifs>7thens=0
960 next
970 fori=55880to55871step-1:pokei,s
980 s=s+1:ifs=1thens=2
990 ifs>7thens=0
1000 next
1010 fori=55831to55751step-40:pokei,s
1020 s=s+1:ifs-1thens=2
1030 ifs>7thens=0
1040 next
1050 nextp,t
1060 poke53272,21:print"{clear}{down*12}";
1070 print"{space*5}vuoi le istruzioni? (s/n)"
1080 geta$:ifa$=""then1080
1090 ifa$="s"then1120
1100 ifa$="n"then1500
1110 goto1080
1120 printchr$(14);"{clear}{down}questo e' il gioco del circo."
1130 print"{down}lo scopo del gioco consiste nel far"
1135 print"scoppiare tutti i palloncini."
1140 print"{down}cio' e' possibile muovendo il joystick"
1145 print"a sinistra e a destra in modo da pren-"
1150 print"dere al volo il clown"
1153 print"{down}all'inizio premere il pulsarte di sparo"
1155 print"per dare il via al gioco."
1160 print"{home}{down*20} premi qualsiasi tasto"
1170 geta$:ifa$=""then1170
1180 print"{clear}{down}tutti i blocchi a scacchi fanno rimbal- zare il vostro giocatore"
1190 print"{down}ogni 2000 punti verra' concesso un uomo in piu'."
1200 print"{down}anche il blocco mobile permettera' al {space*3}vostro giocatore di";
1205 print" rimbalzare."
1210 print"{home}{down*22} premi qualsiasi tasto"
1220 geta$:ifa$=""then1220
1230 print"{clear}{down}dovete far attenzione al palloncino"
1235 print"di diverso colore della riga superiore."
1240 print"{down}quando il palloncino e' nero, scoppiera'"
1250 print"{up}in faccia al vostro giocatore, quando e'"
1260 print"{up}giallo vi dara' 250 punti"
1270 print"{down*2}buona fortuna!!!"
1280 print"{home}{down*22} premi qualsiasi tasto"
1290 geta$:ifa$=""then1290
1300 goto1500
1310 poke52,48:poke56,48:clr
1320 cs=12288:poke56334,peek(56334)and254:poke1,peek(1)and251
1330 fori=cstocs+511:pokei,peek(i+40960):next
1340 poke1,peek(1)or4:poke56334,peek(56334)or1
1360 fori=cs+35*8tocs+46*8-1:readj:pokei,j:a=a+j:next
1365 ifa<>6897thenprint"errore nei dati alle righe 1380-1480":end
1370 goto830
1380 data28,62,47,63,63,126,96,0
1390 data58,58,18,124,16,56,68,68
1400 data128,64,32,16,24,28,38,37
1410 data128,64,32,16,8,4,2,1
1420 data1,2,4,8,24,56,100,164
1430 data1,2,4,8,16,32,64,128
1440 data0,0,0,255,24,24,36,36
1450 data0,0,0,255,0,0,0,0
1460 data170,85,170,85,170,85,170,85
1470 data255,255,255,255,255,255,255,255
1480 data170,85,170,85,170,85,170,85
1500 print"{clear}":printchr$(17):goto2
10000 i=49152
10010 reada:ifa=256thengoto10025
10020 pokei,a:i=i+1:c=c+a:goto10010
10025 ifc<>21810thenprint"errore nei dati alle righe 10030-10580":end
10028 return
10030 data172,66,3,174,61,3,24
10040 data32,240,255,169,192,133,252
10050 data160,0,177,251,32,210,255
10060 data200,192,85,208,246,96,32
10070 data36,32,36,32,32,32,32
10080 data32,32,32,32,32,32,32
10090 data32,32,32,32,32,32,32
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_cpc.bas
================================================
20 SYMBOL AFTER 32
30 REM Upper case chars
40 SYMBOL 65,126,66,66,126,98,98,98,0
50 SYMBOL 66,126,66,66,126,98,98,126,0
60 SYMBOL 67,126,64,64,96,96,96,126,0
70 SYMBOL 68,254,66,66,98,98,98,254,0
80 SYMBOL 69,126,64,64, 120,96,96,126,0
90 SYMBOL 70,126,64,64,120,96,96,96,0
100 SYMBOL 71,126,64,64,102,98,98,126,0
110 SYMBOL 72,66,66,66,126,98,98,98,0
120 SYMBOL 73,60,16,16,24,24,24,60,0
130 SYMBOL 74,126,8,8,24,24,24,120,0
140 SYMBOL 75,68,68,68, 120,100,100,100,0
150 SYMBOL 76,64,64,64,96,96,96, 126,0
160 SYMBOL 77,126,74,74,98,98,98,98,0
170 SYMBOL 78,98,82,74,102,98,98,98,0
180 SYMBOL 79,126,66,66,98,98,98,126,0
190 SYMBOL 80,126,66,66,126,96,96,96,0
200 SYMBOL 81,126,66,66,98,98,106,126,4
210 SYMBOL 82,126,66,66,126,106,100,98,0
220 SYMBOL 83,126,64,64,126,6,6,126,0
230 SYMBOL 84,126,16,16,24,24,24,24,0
240 SYMBOL 85,66,66,66,98,98,98,126,0
250 SYMBOL 86,66,66,66,66,66,36,24,0
260 SYMBOL 87,66,66,66,98,106,106,126,0
270 SYMBOL 88,102,102,36,24,36,102,102,0
280 SYMBOL 89,66,66,126,16,24,24,24,0
290 SYMBOL 90,126,4,8,16,32,64,126,0
295 REM Lower case chars
300 SYMBOL 97,0,0,126,6,126,70,126,0
310 SYMBOL 98,96,96,96,126,98,98,126,0
320 SYMBOL 99,0,0,126,96,96,96,126,0
330 SYMBOL 100,6,6,6,126,70,70,126,0
340 SYMBOL 101,0,0,126,98,126,96,126,0
350 SYMBOL 102,60,48,48,120,48,48,48,0
360 SYMBOL 103,0,0,126,70,70,126,6,126
370 SYMBOL 104,96,96,96,126,98,98,98,0
380 SYMBOL 105,24,0,24,24,24,24,24,0
390 SYMBOL 106,6,0,6,6,6,6,6,126
400 SYMBOL 107,96,96,102,108,120,108, 102,0
410 SYMBOL 108,24,24,24,24,24,24,24,0
420 SYMBOL 109,0,0,126,90,90,66,66,0
430 SYMBOL 110,0,0,108,114,98,98,98,0
440 SYMBOL 111,0,0,126,102,102,102,126,0
450 SYMBOL 112,0,0,126,98,98,126,96,96
460 SYMBOL 113,8,0,126,70,70,126,6,6
470 SYMBOL 114,0,0,108,114,96,96,96,0
480 SYMBOL 115,0,0,126,96,126,6,126,0
490 SYMBOL 116,24,62,24,24,24,24,30,0
500 SYMBOL 117,0,0,102,102,102,102,126,0
510 SYMBOL 118,0,0,102,102,102,60,24,0
520 SYMBOL 119,0,0,66,66,90,90,126,0
530 SYMBOL 120,0,0,198,104,16,104,198,0
540 SYMBOL 121,0,0,102,102,102,126,6,126
550 SYMBOL 122,0,0,126,12,24,48,126,0
555 REM Numbers
560 SYMBOL 48,126,102,110,118,102,102,126,0
570 SYMBOL 49,24,56,24,24,24,24,126,0
580 SYMBOL 50,126,2,2,126,96,96,126,0
590 SYMBOL 51,126,2,2,30,6,6,126,0
600 SYMBOL 52,96,96,96,96,104,126,8,8
610 SYMBOL 53,126,64,126,6,6,6,126,0
620 SYMBOL 54,126,64,64,126,98,98,126,0
630 SYMBOL 55,126,2,4,62,16,32,64,0
640 SYMBOL 56,126,66,66,126,66,66,126,0
650 SYMBOL 57,126,66,66,126,6,6,6,0
680 SYMBOL 95,0,255,0,0,0,0,0,0
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_msx_headless_hex.bas
================================================
490 DATA 22,63,F7,B7,FF,7E,3C,3C ' a
491 DATA 38,6C,FF,3F,0F,3F,FC,38 ' b
492 DATA 3C,3C,7E,FF,ED,EF,C6,44 ' c
493 DATA 1C,36,FF,FC,F0,FC,3F,1C ' d
494 DATA 3C,7E,FF,FF,FF,FF,7E,3C ' e
495 DATA 08,10,54,FE,FE,FE,FE,7C ' f
496 DATA 06,08,10,10,38,7C,7C,38 ' g
497 DATA 00,28,FE,AA,FE,54,38,10 ' h
500 DATA 08,1C,2A,7F,77,3E,36,63 ' i
501 DATA FF,D5,AB,D5,AB,D5,AB,FF ' j
502 DATA 00,00,00,18,18,00,00,00 ' k
503 DATA 00,00,18,24,24,18,00,00 ' l
504 DATA 00,18,3C,66,66,3C,18,00 ' m
505 DATA 3C,7E,E7,C3,C3,E7,7E,3C ' n
510 DATA 00,01,06,1D,2A,2A,2A,1F ' o
511 DATA 1B,8F,65,11,C9,A9,B1,F3 ' p
512 DATA 4C,F7,F0,18,07,02,3E,FE ' q
513 DATA 7F,9F,31,41,81,81,F9,FD ' r
515 DATA 7E,C3,9F,9F,9F,C3,7E,00 ' s
520 FORF%=&H2000+ASC("a")*8TO&H2097+ASC("a")*8:READA$:VPOKEF%,VAL("&H"+A$):NEXTF%:F%=USR2(0):F%=USR3(0)
530 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' a
531 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' b
532 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' c
533 DATA C1,C1,C1,C1,C1,C1,C1,C1 ' d
534 DATA D1,D1,41,71,71,41,D1,D1 ' e
535 DATA A1,A1,A1,A1,A1,A1,A1,A1 ' f
536 DATA F1,F1,F1,F1,D1,D1,D1,D1 ' g
537 DATA D1,D1,D1,D1,D1,D1,D1,D1 ' h
540 DATA D1,D1,21,21,21,21,41,41 ' i
541 DATA 31,31,D1,D1,81,81,51,51 ' j
542 DATA F1,F1,F1,21,21,F1,F1,F1 ' k
543 DATA F1,F1,F1,F1,F1,F1,F1,F1 ' l
544 DATA F1,41,41,F1,F1,41,41,F1 ' m
545 DATA D1,D1,81,81,81,81,D1,D1 ' n
546 DATA 21,21,21,21,21,21,21,21 ' o
547 DATA 21,21,21,21,21,21,21,21 ' p
548 DATA 21,21,21,21,21,21,21,21 ' q
550 DATA 21,21,21,21,21,21,21,21 ' r
551 DATA 90,90,90,90,90,90,90,00 ' s
552 DATA 91,91,91,91,91,91,91,91 ' t
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_oric.bas
================================================
10 REM Golf
20 CH=46080
30 FOR Q=1 TO 3
40 READ C
50 FOR I=0 TO 7
60 READ D
70 POKE CH+C+I,D
80 NEXT I
90 NEXT Q
100 DATA 264,8,12,14,8,8,8,8,62
110 DATA 512,12,30,45,30,12,18,18,33
120 DATA 280,12,30,31,46,62,60,28,24
130 DIM T(9)
140 XH =0:XC=0
150 YH=0:HT=0:YC=0
170 FOR H=1 TO 9
180 HIRES
190 PAPER 2: INK 7
200 PRINT "Hole Number ";H
220 FOR Z=1 TO 8
230 XB=INT(RND(1)*80)+80
240 YB=INT(RND(1)*40)+50
250 CURSET XB,YB,0
260 CHAR 35,0,1
270 NEXT Z
300 X=INT(RND(1)*20)+20
310 Y=INT(RND(1)*30)+120
320 XT=INT(RND(1)*50)+150
330 YT=INT(RND(1)*10)+20
340 D=SGN(XT-X)*SQR((XT-X)*(XT-X)+(YT-Y)*(YT-Y))
350 CURSET XT,YT,0
360 CHAR 33,0,1
370 CURSET X,Y,0
380 CHAR 64,0,1
400 PRINT "Distance to next hole is ";INT(D)
410 INPUT "Which club (1 to 8)";C
420 IF C<1 OR C>8 THEN GOTO 420
430 C=(9-C)
440 GOSUB 1160
480 GOSUB 800
490 B=1
500 D=SGN(XT-X1)*SQR((XT-X1)*(XT-X1)+(YT-Y1)*(YT-Y1))
510 IF D<-15 THEN PRINT "You overshot-try another hole":WAIT 100:GOTO 180
520 IF D<12 THEN PRINT "ON THE GREEN":WAIT 200:GOTO 1320
530 CURSET X1,Y1,0
540 CHAR 46,0,0
550 CURSET X,Y,0
560 CHAR 64,0,0
570 X=X1
580 Y=Y1
590 GOTO 350
640 PRINT "You took ";T(H);" strokes"
650 WAIT 200:PRINT CHR$(17)
660 NEXT H
670 CLS
680 PRINT:PRINT
690 PRINT SPC(15);"This Round"
700 COL=1:R0W=5:GOSUB 1700
720 FOR I=1 TO 9
730 PRINT SPC(10);"Hole ";I;
740 IF T(I)=-1 THEN PRINT " lost ball":GOTO 760
750 PRINT " ";T(I);" strokes"
760 NEXT I
765 ROW=20:COL=5:GOSUB 1700
770 INPUT "Another round Y/N";A$
775 PRINT CHR$(17)
780 IF A$ = "Y" THEN RUN
790 CLS : STOP
800 VT=C*(1+RND(1)*.01)
810 HT=0
820 XH=0
840 Q=(Y-YT)/(XT-X)
850 VV=-VT*(SIN(45*PI/180))
860 XC=X+3
870 YC=Y+3
880 VH=VT*(COS(45*PI/180))
890 HT=HT+VV
900 YH=Q*XH
910 VV=VV+1
920 XH=XH+VH
930 YH=-Q*XH
940 IF XH+XC>250 THEN GOTO 1100
950 IF YH+HT+YC<0 THEN GOTO 1100
960 IF HT>=0 THEN GOTO 1040
970 CURSET XH+XC,YH+HT+YC,0
980 CHAR 46,0,1
1000 WAIT 3
1010 CURSET XH+XC,YH+HT+YC,0
1020 CHAR 46,0,0
1030 GOTO 890
1040 X1=XH+XC
1050 Y1=YH+HT+YC
1070 CURSET X1,Y1,O
1080 CHAR 46,0,1
1090 RETURN
1100 YH=0:YT=0:YC=0:XH=0:XC=0
1110 PRINT "You've lost your ball "
1120 PING
1130 T(H)=-1
1140 WAIT 300
1150 POP:GOTO 660
1160 T(H)=T(H)+1
1170 XS=X+4
1180 YS=Y+4
1190 FOR S=-5 TO -40 STEP -5
1200 A=S/30*PI
1210 SX=10*SIN(A)
1220 SY=-10*COS(A)
1230 CURSET XS,YS,0
1240 DRAW SX,SY,2
1250 IF SO<>-30 THEN WAIT 10
1260 IF S=-30 THEN PING
1270 CURSET XS,YS,0
1280 DRAW SX,SY,2
1300 NEXT S
1310 RETURN
1320 TEXT:PRINT CHR$(17)
1330 PAPER 2
1340 XG=INT(RND(1)*5)+1
1350 YG=15
1360 XH=INT(RND(1)*15)+10
1370 YH=15
1380 D=XH-XG
1390 IF D<0 THEN D=ABS(D)
1400 PLOT XH,YH,"O"
1410 PLOT XG,YG,"@"
1420 R0W=22:C0L=1:GOSUB 1700
1440 PRINT "Distance to hole is ";D;" "
1450 INPUT "Which club (1 to 8)";C
1460 IF C<1 OR C>8 THEN GOTO 1450
1470 T(H)=T(H)+1
1480 H1=8-C+INT(RND(1)*2)
1485 IF D=1 AND C=8 THEN H1=1
1490 D=D-H1
1500 FOR Z=XG+1 TO XG+H1
1510 PLOT Z,YH,"."
1520 WAIT 10
1530 PLOT Z,YH," "
1540 NEXT Z
1550 PLOT XG,YG," "
1560 XG=XG+H1
1570 IF XG=XH THEN GOTO 640
1580 IF D<0 THEN CLS:XG=XH+D:GOTO 1380
1590 GOTO 1400
1700 DOKE #12,48040+R0W*40+COL-1
1710 POKE #268,ROW+1
1720 POKE #269,COL/2
1730 RETURN
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_oric_2.bas
================================================
0DATA,12,,30,45,12,18,51,63,63,45,30,12,12,18,51,,61,61,61,,47,47,47,18,12,30'
1DIME(40):DEFFNR(X)=INT(RND(1)*36)+2:FORA=0TO39:READV:POKE47368+A,V:NEXT:G=2''
2POKE#26A,10:LORES1:INK6:FORY=5TO20:FORX=2TO37:PLOTX,Y,163:NEXTX,Y:POKE#BBA8,6
3B=163:N=20:X=20:P=34:V=175:REPEAT:PLOTX,4,P:IFX=ZANDP=33THENP=34:DATA45,12,30
4U=U+1:K=PEEK(#208):IFK>100THENPLOTX,4,32:X=X-((K=172)*(X>2))+((K=188)*(X<37))
5IFK=132ANDP=34THENE(X)=0:FORI=6TON:PLOTX,I,V:PLOTX,I-1,B:NEXT:P=33:Z=1:O=O+10
6IFZ=1THENZ=FNR(0):PLOTZ,4,92ELSEIFX=ZTHENP=34:IFU>999THENL=L+1:U=0:DATA45,,''
7S=S+1:IFS>4THENS=L:GOSUB9ELSE:PRINT@6,0;"Man:"G" Lvl:"L" Scr:"O:UNTILE(E)>15'
8IFGTHENG=G-1:SHOOT:FORI=0TO40:E(I)=0:NEXT:GOTO2ELSEEND:DATA54,58,54,,59,55,59
9E=FNR(0):PLOTE,N-E(E),165:E(E)=E(E)+1:PLOTE,N-E(E),36:PLAY0,1,1,99:RETURN''''
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_oric_3.bas
================================================
0PAPER0:INK7:FORA=0TO15:READV:POKE47368+A,V:NEXT:DATA0,28,56,63,63,56,28,0,54
1HIRES:POKE#26A,10:Q=14:P=-14:X=231:Y=100:M=0:L=0:W=200:H=200:DATA0,25,45,14
2REPEAT:CURSETX,Y,3:CHAR33,1,0:K$=KEY$:Y=Y+(K$="A")-(K$="Z"):X=X+1:GOSUB6
3IFX=232THENX=12:Y=RND(1)*160+20:INKRND(1)*7+1:GOSUB8:L=L+1:CLS:PRINT"Level:"L
4CURSETX,Y,3:CHAR33,1,1:IFK$=" "THENZAP:M=1:GOSUB7:M=0:GOSUB7:DATA32,29,0
5T=X+6:UNTILPOINT(T,Y+2)ORPOINT(T,Y+3)ORPOINT(T,Y+4)ORPOINT(T,Y+5):EXPLODE:END
6IFRND(1)*100<3THENCURSETRND(1)*W+30,RND(1)*190,3:CHAR34,1,1:RETURNELSERETURN
7CURSETX+6,Y+3,M:T=60+(X>170)*(X-170):DRAWT,0,M:DRAW1,1,3:DRAW-T,0,M:RETURN
8PING:CURSET10,0,3:FORA=0TO7:DRAWQ,Q,1:DRAWQ,P,1:NEXT:DRAW0,199,1:FORA=0TO7:
9DRAWP,P,1:DRAWP,Q,1:NEXT:FORA=0TO99:CURSETRND(1)*W+30,RND(1)*H,1:NEXT:RETURN
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_oric_4.bas
================================================
0PAPER0:INK7:TEXT:FORI=0TO15:READA:POKE#B908+I,A:NEXT:DEFFNR(X)=RND(1)*X:G=.1
1HIRES:Y=150:M=3:FORI=12TO230STEP6:R=FNR(14)-7:IFY+R<190ANDY+R>120THENY=Y+R
2CURSETI+6,Y,3:T=FNR(60)+35:CHART,1,1:CURSETI,Y,3:CHART,1,1:DRAW0,6,3
3FILL193-Y,2,255:CURSETFNR(239),FNR(110),1:NEXT:Y=5:X=FNR(220)+12:PRINT"LVL:"S
4POKE#26A,10:INK3:REPEAT:K=PEEK(#208):Y=Y+V:V=V+G:IFX+E>12ANDX+E<225THENX=X+E
5IFK=156THENV=V-.3-G:ELSEIFK=172THENE=E-FNR(1)ELSEIFK=188THENE=E+FNR(1)
6IFY<0THENY=0ELSE:CURSETQ,W,3:CHAR33,1,M:M=2:CURSETX,Y,3:CHAR33,1,M:Q=X:W=Y'''
7L=Y+8:O=POINT(X,L):P=POINT(X+2,L):L=POINT(X+5,L):Z=Y>115AND(OORPORL):UNTILZ''
8G=G+0.03:CURSETX+7,Y,3:S=S+1:DATA0,12,22,47,30,12,30,51,,,48,62,60,56,32,32
9IFOANDPANDLANDV<2THENCHAR34,1,1:PING:WAIT200:GETA$:GOTO1ELSEEXPLODE
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_oric_5.bas
================================================
0 U=520:W=34:X=20:Y=25:P=X:DIMJ(40):M=123:B=32:A=125:Z=124:O=24:GOSUB7:REPEAT
1 K=PEEK(U):PLOTX,Y,B:X=X+(K=170ANDX>2):X=X-(K=176ANDX<37):PLOTX,Y,M:PLOTP,Q,B
2 F=-(K=159ANDQ<2):G=-(F=0):P=P*G+X*F:Q=(Q+(Q>1))*G+(Y-1)*F:V=RND(1)-.3<(L/20)
3 H=-(Q>1ANDSCRN(P,Q)=A):PLOTP,Q,Z:ONHGOSUB6:IFFTHENPLOT1,O,7:ZAP:PLOT1,O,4
4 L=L+H:I=-(I=W):J=J(I):PLOTI,J,B:J=(J-V)*-(J1ANDSCRN(I,J)=Z):PLOTI,J,A:ONHGOSUB6:L=L+H:UNTILJ=Y:EXPLODE:END
6 SHOOT:PLOTP,Q,42:S=S+Q:PLOT18,0,STR$(S):J(P)=1+L/2:WAIT7:PLOTP,Q,B:Q=1:RETURN
7 INK4:CLS:POKE#26A,10:FORG=0TO26:F=2*-(G>0ANDG<9)-(G>8ANDG<18)*3-(G>17ANDG<=Y)
8 PLOT0,G,F+16:NEXT:FORG=47064TO47087:READD:POKEG,D:NEXT:PLOT1,1,2:PLOT1,0,7
9 Q=1:RETURN:DATA0,12,12,45,45,63,63,30,0,8,4,8,4,8,4,0,33,18,30,45,45,63,18,33
================================================
FILE: src/assets/examples/tile_sets/basic/tiles_sinclair.bas
================================================
5 POKE USR "a"+0,BIN 0000000
10 POKE USR "a"+1,BIN 0001000
20 POKE USR "a"+2,BIN 0011100
30 POKE USR "a"+3,BIN 0111110
40 POKE USR "a"+4,BIN 1111111
50 POKE USR "a"+5,BIN 0111110
60 POKE USR "a"+6,BIN 0011100
70 POKE USR "a"+7,BIN 0001000
================================================
FILE: src/assets/generate_assets.py
================================================
#!/bin/python
import os
import sys
# sys.path.append("..")
from LoggerSingleton import *
global logger
if len(sys.argv)<2:
game_dir = "chase"
else:
game_dir = sys.argv[1]
if len(sys.argv)<3:
parent_dir = "games"
else:
parent_dir = sys.argv[2]
# TODO: Maybe we should have more
MAX_NUMBER_OF_TILES = 91
ATARI7800_FILE = "cc65_udc_atari7800_160A.s"
ATARI7800_HEADER = \
".export _conio_font\n" \
".rodata\n" \
".align 256\n" \
"_conio_font:\n\n"
PMD85_FILE = "z88dk_6x8_pmd85.asm"
VERBOSE = False
tile=[]
# Read tile files from a given directory and store them into the tile variable
def read_tiles_from_dir(dir_name):
logger.info("read_tiles_from_dir")
global tile
tile = []
for i in range(MAX_NUMBER_OF_TILES):
file_to_open = "../"+parent_dir+"/"+game_dir+"/tiles/"+dir_name+"/tile"+str(i)+".txt"
if not os.path.exists(file_to_open):
file_to_open = "../"+parent_dir+"/"+game_dir+"/tiles/"+dir_name+"/tile_"+format(i,"03d")+".txt"
if VERBOSE:
print("tile file to open: " + file_to_open)
if os.path.exists(file_to_open):
with open(file_to_open, 'r') as myfile:
if VERBOSE:
print("Opening file tile"+file_to_open)
tile.append(myfile.read().replace('\n',''))
else:
if VERBOSE:
print("Tile file NOT found")
y = int(dir_name[2])
zerolist = str([0]*y)
tile.append(zerolist[1:len(zerolist)-1])
def read_templates_from_dir(dir_name):
global stripped_template_file_names
template_file_names = os.listdir("./templates/"+dir_name)
stripped_template_file_names = []
for template_file_name in template_file_names:
if template_file_name.endswith(".template"):
stripped_template_file_name = template_file_name[:-9]
print("template_file_name: "+template_file_name)
print("stripped file name: "+stripped_template_file_name)
stripped_template_file_names.append(stripped_template_file_name)
print("Templates found: "+str(len(stripped_template_file_names)))
print("")
# Input : 4 bits
# Output: 8 bits with double bits, e.g. 1010 -> 11001100
double_bit_map = {
0x0:0x00, 0x1:0x03, 0x2:0x0C, 0x3:0x0F, 0x4:0x30, 0x5:0x33, 0x6:0x3C, 0x7:0x3F,
0x8:0xC0, 0x9:0xC3, 0xA:0xCC, 0xB:0xCF, 0xC:0xF0, 0xD:0xF3, 0xE:0xFC, 0xF:0xFF
}
# COCO
# 0x00, 0x03, 0x0C, 0x0F, 0x30, 0x33, 0x3C, 0x3F,
# 0xC0, 0xC3, 0xCC, 0xCF, 0xF0, 0xF3, 0xFC, 0xFF
color_1 = 0x55 # red
color_2 = 0xAA # green
color_3 = 0xFF # white
# color = 0x00, 0x55, 0xAA, 0xFF
# Input : 4 bits, color
# Output: 8 bits encoding 4 pixels in 4 color mode in a given color
def four_colored(four_bit, color):
return double_bit_map[four_bit]&color
# Input : 1 byte, color
# Output: 2 bytes encoding 8 pixels in 4 color mode in a given color
def one_to_two(source, color):
return [four_colored(source>>4,color), four_colored(source&0x0F,color)]
# INPUT: 64 monochromatic tiles (64 x 8 bytes)
# OUTPUT:
# First 37 -> Converted in 37 4-color tiles in color 3
# Second 27 -> Converted in 3 groups of 27 4-color tiles in color 1, 2, 3
def generate_two_bit_asset(abstract_asset):
two_bit_asset = []
# space, alphabet, digits (1+26+10=37)
for i in range(0,37):
for j in range(0,8):
two_bit_block = one_to_two(abstract_asset[i*8+j],color_3)
# two_bit_asset.extend(two_bit_block)
two_bit_asset.append(two_bit_block)
# 27 tiles in color 0
for i in range(37,64):
for j in range(0,8):
two_bit_block = one_to_two(abstract_asset[i*8+j],color_1)
# two_bit_asset.extend(two_bit_block)
two_bit_asset.append(two_bit_block)
# 27 tiles in color 1
for i in range(37,64):
for j in range(0,8):
two_bit_block = one_to_two(abstract_asset[i*8+j],color_2)
# two_bit_asset.extend(two_bit_block)
two_bit_asset.append(two_bit_block)
# 27 tiles in color 2
for i in range(37,64):
for j in range(0,8):
two_bit_block = one_to_two(abstract_asset[i*8+j],color_3)
# two_bit_asset.extend(two_bit_block)
two_bit_asset.append(two_bit_block)
# padding to get to 128
for i in range(0,10):
for j in range(0,8):
two_bit_asset.append([255,255])
return two_bit_asset
# def generate_160A_asset(two_bit_asset, two_bit_160A_asset):
def generate_160A_asset(two_bit_assets):
row_map = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[]}
two_bit_160A_asset = []
counter = 0
for byte_couple in two_bit_assets:
row_map[counter&7].extend(byte_couple)
counter+=1
for i in range(0,8):
two_bit_160A_asset.extend(row_map[7-i])
return two_bit_160A_asset
def process_a7800_160A_file():
parent_path = "./generated_assets/"
dest_path = parent_path+game_dir
fin = open(dest_path+"/"+ATARI7800_FILE, "rt")
res = []
source = []
for line in fin:
words = line.split(",")
for word in words:
word = word.strip()
if word != '' and word != "\n" and word != "\t\n" and word != "\r\n" and word != "\r":
trimmed_word = word.replace("\n","").replace(" ","").replace("$","0x")
# print(trimmed_word)
source.append(trimmed_word)
base = 16 if trimmed_word.startswith("0x") else 10
res.append(int(trimmed_word, base))
fin.close()
# print(res)
if len(res)==512:
print("Asset has correct length (512 bytes)")
else:
print("Asset has wrong length: " + str(len(res)))
two_bit_assets = generate_two_bit_asset(res)
# print("two_bit_assets: \n" + str(two_bit_assets))
a7800_assets = generate_160A_asset(two_bit_assets)
print("length of a7800_assets: " + str(len(a7800_assets)))
formatted_assets = ATARI7800_HEADER + format_asset(a7800_assets)
# print(formatted_assets)
return formatted_assets
# while(1):
# pass
# --------------------------------------------------------------------------------------
def format_asset(assets):
res = ""
counter = 0
for asset in assets:
# print("[format_asset] asset: " + str(asset))
if counter==0:
line = ".byte "
line = line + str(asset)
counter=counter+1
if counter<8:
line = line + ", "
else:
res = res + line + "\n"
# print("line: " + line)
# print("res: " + res)
counter = 0
if counter>0:
res = res + line + "\n"
# print("line: " + line)
# print("res: " + res)
# if res.endswith(', '):
res = res[:-3] + "\n"
return res
def generate_asset_from_template(dir_name, stripped_template_file_name):
matches = 0
print("")
print("Handling "+stripped_template_file_name)
print("")
fin = open("./templates/"+dir_name+"/"+stripped_template_file_name+".template", "rt")
parent_path = "./generated_assets/"
if not os.path.exists(parent_path):
print("creating: " + parent_path)
os.makedirs(parent_path)
dest_path = parent_path+game_dir
if not os.path.exists(dest_path):
print("creating: " + dest_path)
os.makedirs(dest_path)
fout = open(dest_path+"/"+stripped_template_file_name, "wt")
for line in fin:
newline = line
for i in range(len(tile)):
if stripped_template_file_name==PMD85_FILE:
digits_string = tile[i].split(",")
normalized_digits_string = ""
for digit_string in digits_string:
normalized_digit_string = str(int(digit_string)*4)
normalized_digits_string += normalized_digit_string + ","
normalized_digits_string = normalized_digits_string[:-1]
tile_data=normalized_digits_string
elif stripped_template_file_name.startswith("cmoc"):
tile_data = tile[i].replace(","," \n FCB ")
else:
if stripped_template_file_name.endswith(".h"):
tile_data = tile[i].replace("$","0x")
else:
tile_data = tile[i]
if stripped_template_file_name.startswith("cmoc"):
tile_data = tile_data + "\n"
newline = newline.replace('', tile_data)
fout.write(newline)
if line != newline:
matches = matches+1
if VERBOSE:
print("Changing \n"+line+"with\n"+newline)
if VERBOSE:
print("Number of tiles found: "+str(matches))
print("")
print("")
#close input and output files
fin.close()
fout.close()
if stripped_template_file_name==ATARI7800_FILE:
formatted_assets = process_a7800_160A_file()
fout = open(dest_path+"/formatted_"+ATARI7800_FILE, "wt")
fout.write(formatted_assets)
fout.close()
def generate_assets_from_dir(dir_name):
for stripped_template_file_name in stripped_template_file_names:
generate_asset_from_template(dir_name, stripped_template_file_name)
def main():
for dir_name in ["8x8", "7x8", "6x8", "6x9", "8x6"]:
print("dir name: " + dir_name)
read_tiles_from_dir(dir_name)
read_templates_from_dir(dir_name)
generate_assets_from_dir(dir_name)
if __name__ == "__main__":
# execute only if run as a script
logger = LoggerSingleton.initLogger('xl','../../logs')
# logger.setLevel(logging.DEBUG)
# logging.basicConfig(filename='../logs/log_'+datetime.datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+'.log', level = logging.DEBUG)
# logging.basicConfig(filename='../../logs/xl_log_.log', level = logging.DEBUG)
logger.info("Started generate_assets")
main()
logger.error("Finished generate_assets")
================================================
FILE: src/assets/templates/4x4/4x4_chars.h.template
================================================
#ifndef _4X4_CHARS
#define _4X4_CHARS
#define _TILE_0_UDG { }
#define _TILE_1_UDG { }
#define _TILE_3_UDG { }
#define _TILE_2_UDG { }
#define _TILE_4_UDG {}
#define _TILE_7_UDG { }
#define _TILE_9_UDG { }
#define _TILE_8_UDG { }
#define _TILE_11_UDG { }
#define _TILE_5_UDG { }
#define _TILE_16_UDG { }
#define _TILE_15_UDG { }
#define _TILE_14_UDG { }
#define _TILE_6_UDG {}
#define _TILE_12_UDG { }
#define _TILE_13_UDG { }
#define _TILE_10_UDG { }
#define _TILE_17_UDG { }
#define _TILE_18_UDG { }
#define _TILE_19_UDG { }
#define _TILE_20_UDG { }
#define _TILE_21_UDG { }
#define _TILE_22_UDG { }
#define _TILE_23_UDG { }
#define _TILE_24_UDG { }
#define _TILE_25_UDG { }
#define _TILE_26_UDG { }
#endif // _4x4_CHARS
================================================
FILE: src/assets/templates/6x8/6x8_chars.h.template
================================================
#ifndef _6X8_CHARS
#define _6X8_CHARS
// A - Z
#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }
#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }
#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }
#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }
#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }
#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }
#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }
#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }
#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }
#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }
#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }
// 0 - 9
#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }
#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }
#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }
#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }
#define _TILE_0_UDG {}
#define _TILE_1_UDG {}
#define _TILE_2_UDG {}
#define _TILE_3_UDG {}
#define _TILE_4_UDG {}
#define _TILE_7_UDG {}
#define _TILE_9_UDG {}
#define _TILE_8_UDG {}
#define _TILE_11_UDG {}
#define _TILE_5_UDG {}
#define _TILE_6_UDG {}
#define _TILE_16_UDG {}
#define _TILE_14_UDG {}
#define _TILE_15_UDG {}
#define _TILE_10_UDG {}
#define _TILE_12_UDG {}
#define _TILE_13_UDG {}
#define _TILE_17_UDG {}
#define _TILE_18_UDG {}
#define _TILE_19_UDG {}
#define _TILE_20_UDG {}
#define _TILE_21_UDG {}
#define _TILE_22_UDG {}
#define _TILE_23_UDG {}
#define _TILE_24_UDG {}
#define _TILE_25_UDG {}
#define _TILE_26_UDG {}
#endif // _6x8_CHARS
================================================
FILE: src/assets/templates/6x8/z88dk_6x8_pmd85.asm.template
================================================
SECTION rodata_font
SECTION rodata_font_6x8
PUBLIC _udgs
PUBLIC _udgs_end
_udgs:
defb %"------"
defb %"------"
defb %"------"
defb %"------"
defb %"------"
defb %"------"
defb %"------"
defb %"------"
; invincibility
defb
; left missile
defb
; bullet
defb
; dollar
defb
; power-up F
defb
; vertical brick
defb
; skull
defb
; ghost
defb
; bomb
defb
; player down
defb
; horizontal brick
defb
; power-up S
defb
defb
; right missile
defb
; rocket
defb
defb %"------"
defb %"--###-"
defb %"-#--##"
defb %"-#-#-#"
defb %"-#-#-#"
defb %"-##--#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"---#--"
defb %"--##--"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"--###-"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-----#"
defb %"--###-"
defb %"-#----"
defb %"-#####"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"---##-"
defb %"-----#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"----#-"
defb %"---##-"
defb %"--#-#-"
defb %"-#--#-"
defb %"-#####"
defb %"----#-"
defb %"------"
defb %"------"
defb %"-#####"
defb %"-#----"
defb %"-####-"
defb %"-----#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#----"
defb %"-####-"
defb %"-#---#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-#####"
defb %"-----#"
defb %"----#-"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"--###-"
defb %"-#---#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#---#"
defb %"--####"
defb %"-----#"
defb %"--###-"
defb %"------"
defb
; power-up H
defb
; player up
defb
; player right
defb
; player left
defb
; gun
defb
defb
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#---#"
defb %"-#####"
defb %"-#---#"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"-####-"
defb %"-#---#"
defb %"-####-"
defb %"-#---#"
defb %"-#---#"
defb %"-####-"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#----"
defb %"-#----"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-###--"
defb %"-#--#-"
defb %"-#---#"
defb %"-#---#"
defb %"-#--#-"
defb %"-###--"
defb %"------"
defb %"------"
defb %"-#####"
defb %"-#----"
defb %"-####-"
defb %"-#----"
defb %"-#----"
defb %"-#####"
defb %"------"
defb %"------"
defb %"-#####"
defb %"-#----"
defb %"-####-"
defb %"-#----"
defb %"-#----"
defb %"-#----"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#----"
defb %"-#-###"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"-#####"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"--###-"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-----#"
defb %"-----#"
defb %"-----#"
defb %"-#---#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-#--#-"
defb %"-#-#--"
defb %"-##---"
defb %"-#-#--"
defb %"-#--#-"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"-#----"
defb %"-#----"
defb %"-#----"
defb %"-#----"
defb %"-#----"
defb %"-#####"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-##-##"
defb %"-#-#-#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"-##--#"
defb %"-#-#-#"
defb %"-#--##"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-####-"
defb %"-#---#"
defb %"-#---#"
defb %"-####-"
defb %"-#----"
defb %"-#----"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#---#"
defb %"-#---#"
defb %"-#-#-#"
defb %"-#--##"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-####-"
defb %"-#---#"
defb %"-#---#"
defb %"-####-"
defb %"-#--#-"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"--###-"
defb %"-#----"
defb %"--###-"
defb %"-----#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-#####"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"--###-"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"--#-#-"
defb %"---#--"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#---#"
defb %"-#-#-#"
defb %"--#-#-"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"--#-#-"
defb %"---#--"
defb %"---#--"
defb %"--#-#-"
defb %"-#---#"
defb %"------"
defb %"------"
defb %"-#---#"
defb %"-#---#"
defb %"--#-#-"
defb %"---#--"
defb %"---#--"
defb %"---#--"
defb %"------"
defb %"------"
defb %"-#####"
defb %"----#-"
defb %"---#--"
defb %"--#---"
defb %"-#----"
defb %"-#####"
defb %"------"
; dead ghost
defb
defb
defb
defb
defb
_udgs_end:
================================================
FILE: src/assets/templates/6x9/6x9_chars.h.template
================================================
#ifndef _6X9_CHARS
#define _6X9_CHARS
// A - Z
#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }
#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }
#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }
#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }
#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }
#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }
#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }
#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }
#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }
#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }
#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }
// 0 - 9
#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }
#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }
#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }
#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }
#define _TILE_0_UDG {}
#define _TILE_1_UDG {}
#define _TILE_2_UDG {}
#define _TILE_3_UDG {}
#define _TILE_4_UDG {}
#define _TILE_7_UDG {}
#define _TILE_9_UDG {}
#define _TILE_8_UDG {}
#define _TILE_11_UDG {}
#define _TILE_5_UDG {}
#define _TILE_6_UDG {}
#define _TILE_16_UDG {}
#define _TILE_14_UDG {}
#define _TILE_15_UDG {}
#define _TILE_10_UDG {}
#define _TILE_12_UDG {}
#define _TILE_13_UDG {}
#define _TILE_17_UDG {}
#define _TILE_18_UDG {}
#define _TILE_19_UDG {}
#define _TILE_20_UDG {}
#define _TILE_21_UDG {}
#define _TILE_22_UDG {}
#define _TILE_23_UDG {}
#define _TILE_24_UDG {}
#define _TILE_25_UDG {}
#define _TILE_26_UDG {}
#endif // _6x9_CHARS
================================================
FILE: src/assets/templates/7x8/7x8_chars.h.template
================================================
#ifndef _7X8_CHARS
#define _7X8_CHARS
// A - Z
#define _TILE_A { 0x08, 0x1C, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00 }
#define _TILE_B { 0x3C, 0x12, 0x12, 0x1C, 0x12, 0x12, 0x3C, 0x00 }
#define _TILE_C { 0x1C, 0x22, 0x20, 0x20, 0x20, 0x22, 0x1C, 0x00 }
#define _TILE_D { 0x38, 0x24, 0x22, 0x22, 0x22, 0x24, 0x38, 0x00 }
#define _TILE_E { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_F { 0x3E, 0x20, 0x20, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_G { 0x1C, 0x20, 0x20, 0x2E, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_H { 0x22, 0x22, 0x22, 0x3E, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_I { 0x1C, 0x08, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_J { 0x0E, 0x04, 0x04, 0x04, 0x04, 0x24, 0x18, 0x00 }
#define _TILE_K { 0x22, 0x24, 0x28, 0x30, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_L { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3E, 0x00 }
#define _TILE_M { 0x22, 0x36, 0x2A, 0x2A, 0x22, 0x22, 0x22, 0x00 }
#define _TILE_N { 0x22, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x22, 0x00 }
#define _TILE_O { 0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_P { 0x3C, 0x22, 0x22, 0x3C, 0x20, 0x20, 0x20, 0x00 }
#define _TILE_Q { 0x1C, 0x22, 0x22, 0x22, 0x2A, 0x24, 0x1A, 0x00 }
#define _TILE_R { 0x3C, 0x22, 0x22, 0x3C, 0x28, 0x24, 0x22, 0x00 }
#define _TILE_S { 0x1C, 0x22, 0x20, 0x1C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_T { 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_U { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_V { 0x22, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x00 }
#define _TILE_W { 0x22, 0x22, 0x22, 0x2A, 0x2A, 0x36, 0x22, 0x00 }
#define _TILE_X { 0x22, 0x22, 0x14, 0x08, 0x14, 0x22, 0x22, 0x00 }
#define _TILE_Y { 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x00 }
#define _TILE_Z { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3E, 0x00 }
// 0 - 9
#define _TILE_DIGIT_0 { 0x1C, 0x22, 0x26, 0x2A, 0x32, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_1 { 0x08, 0x18, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00 }
#define _TILE_DIGIT_2 { 0x1C, 0x22, 0x22, 0x0C, 0x10, 0x20, 0x3E, 0x00 }
#define _TILE_DIGIT_3 { 0x1C, 0x22, 0x02, 0x0C, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_4 { 0x04, 0x0C, 0x14, 0x24, 0x3E, 0x04, 0x04, 0x00 }
#define _TILE_DIGIT_5 { 0x3E, 0x30, 0x3C, 0x02, 0x02, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_6 { 0x0C, 0x10, 0x20, 0x3C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_7 { 0x3E, 0x02, 0x04, 0x08, 0x10, 0x10, 0x10, 0x00 }
#define _TILE_DIGIT_8 { 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00 }
#define _TILE_DIGIT_9 { 0x1C, 0x22, 0x22, 0x1E, 0x02, 0x04, 0x08, 0x00 }
#define _TILE_0_UDG {}
#define _TILE_1_UDG {}
#define _TILE_2_UDG {}
#define _TILE_3_UDG {}
#define _TILE_4_UDG {}
#define _TILE_7_UDG {}
#define _TILE_9_UDG {}
#define _TILE_8_UDG {}
#define _TILE_11_UDG {}
#define _TILE_5_UDG {}
#define _TILE_6_UDG {}
#define _TILE_16_UDG {}
#define _TILE_14_UDG {}
#define _TILE_15_UDG {}
#define _TILE_10_UDG {}
#define _TILE_12_UDG {}
#define _TILE_13_UDG {}
#define _TILE_17_UDG {}
#define _TILE_18_UDG {}
#define _TILE_19_UDG {}
#define _TILE_20_UDG {}
#define _TILE_21_UDG {}
#define _TILE_22_UDG {}
#define _TILE_23_UDG {}
#define _TILE_24_UDG {}
#define _TILE_25_UDG {