├── .gitignore ├── LICENSE.txt ├── Makefile ├── README - TI99.md ├── README.md ├── compile_with_warnings.sh ├── contrib ├── ScrollTest.bas └── ScrollTest.bmp ├── cpu6502.c ├── cpu6502.h ├── cpu9900.c ├── cpu9900.h ├── cpuz80.c ├── cpuz80.h ├── cvbasic.c ├── cvbasic.h ├── cvbasic_6502_epilogue.asm ├── cvbasic_6502_prologue.asm ├── cvbasic_9900_epilogue.asm ├── cvbasic_9900_prologue.asm ├── cvbasic_epilogue.asm ├── cvbasic_prologue.asm ├── driver.c ├── driver.h ├── e.sh ├── examples ├── bank.bas ├── bank_sms.bas ├── brinquitos.bas ├── brinquitos_sms.bas ├── cats_sms.bas ├── controller.bas ├── demo.bas ├── demo_sms.bas ├── face_joystick.bas ├── face_joystick_sms.bas ├── happy_face.bas ├── happy_face_sms.bas ├── music.bas ├── oscar.bas ├── oscar_compressed.bas ├── oscar_compressed_sms.bas ├── oscar_sms.bas ├── plot.bas ├── portrait.bas ├── portrait_sms.bas ├── space_attack.bas ├── space_attack_sms.bas ├── strings.bas ├── test1.bas ├── test2.bas ├── test3.bas ├── test3_sms.bas ├── varptr.bas ├── varptr_sms.bas ├── vgm.bas ├── vgm_ay3.bas ├── viboritas.bas ├── viboritas_sms.bas ├── vramcopy.bas └── vramcopy_sms.bas ├── gasm80 ├── linkticart.py ├── manual.txt ├── node.c ├── node.h ├── old ├── boingbasic_0.c ├── boingbasic_1.c ├── boingbasic_epilogue.asm ├── boingbasic_prologue.asm ├── cvbasic.c ├── cvbasic_epilogue.asm ├── cvbasic_prologue.asm ├── example.bas ├── viboritas_opt_v0.asm └── viboritas_opt_v1.asm └── utility ├── Try.c ├── notes.c └── switch.c /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | cvbasic 3 | utility/notes 4 | utility/switch 5 | *.o 6 | 7 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | CVBasic - Colecovision BASIC Compiler 2 | Copyright (c) 2024 Oscar Toledo G. http://nanochess.org/ 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 2. Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 15 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 18 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Ultra simple makefile for CVBasic 2 | # by Oscar Toledo G. 3 | # https://github.com/nanochess/CVBasic 4 | # 5 | CFLAGS = -O 6 | 7 | cvbasic: cvbasic.o node.o driver.o cpuz80.o cpu6502.o cpu9900.o 8 | @$(CC) cvbasic.o node.o driver.o cpuz80.o cpu6502.o cpu9900.o -o $@ 9 | 10 | check: build 11 | @./cvbasic examples/viboritas.bas /tmp/viboritas.asm 12 | 13 | clean: 14 | @rm cvbasic cvbasic.o node.o driver.o cpuz80.o cpu6502.o cpu9900.o 15 | 16 | love: 17 | @echo "...not war" 18 | -------------------------------------------------------------------------------- /README - TI99.md: -------------------------------------------------------------------------------- 1 | The TI99 support is still experimental and in development. 2 | 3 | Currently the following demos work: 4 | test1, happy_face, example, face_joystick, vgm, test2, demo, music, portrait, oscar, space_attack, viboritas, oscar_compressed, bank 5 | 6 | The current build creates an assembly language file intended to be assembled with xas99 from the xdt99 tool suite: 7 | https://github.com/endlos99/xdt99 8 | 9 | Other assemblers are unlikely to work as it makes use of some of xdt99's features. 10 | 11 | The target is a stock TI-99/4A system with 32k memory expansion and joysticks. Both joysticks are supported with a single button. The second button is simulated on the keyboard with control for player 1 and fctn for player 2. CONT1.KEY will also return uppercase ASCII characters from the keyboard in addition to the stock 0-9, #, * for compatibility with Coleco programs. No keypad is implemented for controller 2 - only the joystick. 12 | 13 | The program supports FCTN-= (Alt-= on PC emulation) to reset. 14 | 15 | The program is targeted to run from a bank-switched, non-inverted cartridge ROM. A cartridge and boot header is present in every bank to ensure clean resets, and the main program is copied to the 24k RAM bank at >A000 at startup. The 8k RAM block at >2000 is used for variables and stack. (This is significantly more than most projects require.) A further 125 8k ROM banks are available for a total space of 1MB (minus the runtime and the cartridge headers). 16 | 17 | cvbasic --ti994a test2.bas test2.a99 18 | 19 | The output of the compiler is an assembly file, it can be assembled like so: 20 | 21 | xas99.py -b -R test2.a99 -L test2.txt 22 | 23 | Consult the xas99 manual for details, but in short you need the -b switch to generate binary output files and -R switch to define registers for this code. The optional -L provides a listing file if the assembly was successful. 24 | 25 | The output of xas is one or more binary object files with a .bin extension. If your program does not use bank switching, there will be a single file. However, if it does, there will be multiple files generated - three for the fixed area and one for each additional bank you used. 26 | 27 | For instance, the above program will create "test2.bin" if not banking, or "test2_b0.bin", "test2_b1.bin", "test2_b2.bin", "test2_b3.bin" and "test2_b4.bin" if the program uses two banks above 0. (Note that because 3 banks are reserved for the fixed space, "bank 1" in your program becomes "b3" in the output files). 28 | 29 | Run the included python program "linkticart.py" to package these files up into a padded ROM file. 30 | 31 | linkticart.py test2.bin test2_8.bin << non-banked 32 | linkticart.py test2_b0.bin test2_8.bin << is banked 33 | 34 | linkticart will automatically detect the other files if the name ends in "0.bin". Note that in both cases it is recommended the name end with "_8.bin". While this is not mandated by emulation, it is a convention that makes it clear what the file type is. If you don't there is a possibility that the letter before the '.bin' will be recognized as another tag and cause loading issues. 35 | 36 | You can also pass a name for the cartridge for the selection screen, up to 20 characters long (uppercase ASCII only): 37 | 38 | linkticart.py test2.bin test2_8.bin "TEST2" 39 | 40 | The resulting cartridge can be used directly on Classic99 and js99er. For MAME, it is necessary to create an "RPK" image. This is a zip file containing the ROM and a 'layout.xml'. The layout.xml contents are below (update with the correct romimage filename). Pack both files into a zip and rename from .zip to .rpk and it should work in MAME. 41 | 42 | --------- 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | --------- 55 | 56 | The programs will no longer work from disk. If you have a need for that, let me know, we can add a configuration switch, but it is much more limited. 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CVBasic compiler v0.8.0 2 | *(c) Copyright 2024-2025 Óscar Toledo Gutiérrez* 3 | *https://nanochess.org/* 4 | 5 | CVBasic is a BASIC language cross-compiler with a syntax alike to QBasic originally written for the Colecovision video game console. 6 | 7 | The CVBasic compiler can create programs up to 1 MB using the BANK statements (using 16K bank switching on most platforms, 8k on TI-99/4A). 8 | 9 | Later it was extended to support the following platforms: 10 | 11 | * Sega SG-1000 / SC-3000 (supporting bank switching with Sega mapper) 12 | * MSX 1 (supporting bank switching with ASCII16 mapper) 13 | * Texas Instruments TI-99/4A (courtesy of @tursilion, supporting bank switching) 14 | * Spectravideo SVI-318 / 328. 15 | * Sord M5. 16 | * Memotech MTX. 17 | * Vtech Creativision (Dick Smith's Wizzard / Laser 2001). 18 | * Tatung Einstein. 19 | * Casio PV2000. 20 | * Hanimex/Soundic Pencil II. 21 | * NABU PC. 22 | * Sega Master System (supporting bank switching with Sega mapper) 23 | 24 | One of the advantages of using CVBasic is that all the programs can be compiled for all the platforms with mostly no modifications at all. Although the compiler started supporting only Z80, now this includes the 6502 based Creativision, and TMS9900 based TI-99/4A. This way it achieves a truly portable BASIC across the common theme: the video processor Texas Instruments TMS9128/9129. 25 | 26 | The only difference currently is the Sega Master System, although the compiler shares the core, the sprites are 8x16 and each pixel can have a different color, so the games aren't directly portable, but very easily translated. The examples include SMS versions for every game so you can see what's required to change. 27 | 28 | The following files compose the compiler: 29 | 30 | cvbasic.h The CVBasic compiler global definitions. 31 | cvbasic.c The CVBasic compiler C language source code. 32 | cpu6502.h 6502 code headers. 33 | cpu6502.c 6502 code generation. 34 | cpu9900.h TMS9900 code headers. 35 | cpu9900.c TMS9900 code generation. 36 | cpuz80.h Z80 code headers. 37 | cpuz80.c Z80 code generation. 38 | driver.h Driver headers. 39 | driver.c Driver for all processors. 40 | node.h Tree node headers. 41 | node.c Tree node creation and optimization. 42 | LICENSE.txt Source code license 43 | 44 | cvbasic_prologue.asm Prologue file needed for compiled programs. 45 | cvbasic_epilogue.asm Epilogue file needed for compiled programs. 46 | cvbasic_6502_prologue.asm Prologue file needed for 6502 compiled programs. 47 | cvbasic_6502_epilogue.asm Epilogue file needed for 6502 compiled programs. 48 | cvbasic_9900_prologue.asm Prologue file needed for TMS9900 compiled programs. 49 | cvbasic_9900_epilogue.asm Epilogue file needed for TMS9900 compiled programs. 50 | 51 | manual.txt English manual for CVBasic 52 | 53 | README.md This file 54 | 55 | examples/bank.bas Bank-switching example. 56 | examples/brinquitos.bas Jumping game. 57 | examples/brinquitos_sms.bas Jumping game (Sega Master System) 58 | examples/controller.bas Controller test. 59 | examples/cats_sms.bas Cats example (Sega Master System) 60 | examples/demo.bas Demo of graphics. 61 | examples/demo_sms.bas Demo of graphics (Sega Master System) 62 | examples/face_joystick.bas Moving face with joystick. 63 | examples/face_joystick_sms.bas Moving face with joystick (Sega Master System) 64 | examples/happy_face.bas Bouncing face. 65 | examples/happy_face_sms.bas Bouncing face (Sega Master System). 66 | examples/music.bas Music example. 67 | examples/oscar_compressed.bas High-resolution graphics example compressed with Pletter. 68 | examples/oscar_compressed_sms.bas High-resolution graphics example compressed with Pletter (Sega Master System) 69 | examples/oscar.bas High-resolution graphics example. 70 | examples/oscar_sms.bas High-resolution graphics example (Sega Master System) 71 | examples/portrait.bas Data used by demo.bas 72 | examples/portrait_sms.bas Data used by demo_sms.bas 73 | examples/space_attack.bas Game example. 74 | examples/space_attack_sms.bas Game example (Sega Master System) 75 | examples/test1.bas Moving stars. 76 | examples/test2.bas Arithmetic test. 77 | examples/test3.bas Shows usage of SELECT CASE / END CASE 78 | examples/test3_sms.bas Shows usage of SELECT CASE / END CASE (Sega Master System) 79 | examples/varptr.bas VARPTR example for redefining graphics. 80 | examples/varptr_sms.bas VARPTR example for redefining graphics (Sega Master System) 81 | examples/vgm.bas VGM audio player for SN76489. 82 | examples/vgm_ay.bas VGM audio player for AY-3-8910. 83 | examples/viboritas.bas Game example. 84 | examples/viboritas_sms.bas Game example (Sega Master System) 85 | examples/vramcopy.bas VRAM copy example. 86 | examples/vramcopy_sms.bas VRAM copy example (Sega Master System) 87 | 88 | 89 | ### Usage guide 90 | 91 | Using CVBasic to compile a Colecovision program: 92 | 93 | cvbasic game.bas game.asm 94 | gasm80 game.asm -o game.rom -l game.lst 95 | 96 | You need to assemble the output file using Gasm80 available from [http://github.com/nanochess/gasm80](http://github.com/nanochess/gasm80) (this assembler serves for all the platforms, including Creativision based on 6502 CPU) 97 | 98 | Using CVBasic to compile a Sega SG1000/SC3000 program: 99 | 100 | cvbasic --sg1000 game.bas game.asm 101 | gasm80 game.asm -o game.rom 102 | 103 | Using CVBasic to compile a MSX program for 8K RAM (wider compatibility) and 16K RAM: 104 | 105 | cvbasic --msx game.bas game.asm 106 | gasm80 game.asm -o game.rom 107 | 108 | cvbasic --msx -ram16 game.bas game.asm 109 | gasm80 game.asm -o game.rom 110 | 111 | Using CVBasic to compile a Colecovision Super Game Module program: 112 | 113 | cvbasic --sgm game.bas game.asm 114 | gasm80 game.asm -o game.rom 115 | 116 | Using CVBasic to compile a Spectravideo SVI-318/328 program: 117 | 118 | cvbasic --svi game.bas game.asm 119 | gasm80 game.asm -o game.rom 120 | 121 | Using CVBasic to compile a Sord M5 program: 122 | 123 | cvbasic --sord game.bas game.asm 124 | gasm80 game.asm -o game.rom 125 | 126 | Using CVBasic to compile a Memotech MTX program: 127 | 128 | cvbasic --memotech game.bas game.asm 129 | gasm80 game.asm -o game.run 130 | 131 | cvbasic --memotech -cpm game.bas game.asm 132 | gasm80 game.asm -o game.com 133 | 134 | Using CVBasic to compile a VTech Creativision (Dick Smith's Wizzard / Vtech Laser 2001) program: 135 | 136 | cvbasic --creativision game.bas game.asm 137 | gasm80 game.asm -o game.rom 138 | 139 | You can use the -rom16 option to generate a 16K ROM instead of a 32K ROM, and it is provided utility/switch.c to switch the two 8K banks in a 16K ROM and run it with MAME, as MAME doesn't yet support 32K ROM. For 32K ROM you can use the Creativision emulator. 140 | 141 | Using CVBasic to compile a Hanimex/Soundic Pencil II program (almost exactly like a Colecovision, but with 2K of RAM and different cartridge header): 142 | 143 | cvbasic --pencil game.bas game.asm 144 | gasm80 game.asm -o game.rom 145 | 146 | Using CVBasic to compile a Tatung Einstein program: 147 | 148 | cvbasic --einstein game.bas game.asm 149 | gasm80 game.asm -o game.com 150 | 151 | Using CVBasic to compile a Casio PV-2000 program: 152 | 153 | cvbasic --pv2000 game.bas game.asm 154 | gasm80 game.asm -o game.rom 155 | 156 | Using CVBasic to compile a Texas Instruments TI-99/4A program: 157 | 158 | cvbasic --ti994a game.bas game.a99 159 | xas99.py -b -R game.a99 160 | linkticart.py game.bin game_8.bin "CARTNAME" 161 | 162 | You require Python3 and the utilities from the xdt99 tool suite: [https://github.com/endlos99/xdt99](https://github.com/endlos99/xdt99) 163 | 164 | The target is a stock TI-99/4A system with 32k memory expansion and joysticks. The cartridge binary can be used directly with the online emulator [js99er.net](js99er.net) or Classic99, and can be packed into an RPK for MAME (see README - TI99.md). 165 | 166 | Using CVBasic to compile a NABU PC program: 167 | 168 | cvbasic --nabu game.bas game.asm 169 | gasm80 game.asm -o 000001.nabu 170 | zip game.npz 000001.nabu 171 | 172 | cvbasic --nabu -cpm game.bas game.asm 173 | gasm80 game.asm -o game.com 174 | 175 | The .npz file is directlty usable by [MAME NABU port](https://github.com/ontheslab/nabu-mame-builds/releases) (put it in the nabu directory). The 000001.nabu name is important or it doesn't work. I've used the script _boot-built-in-adapter-local.sh_ 176 | 177 | I don't have tested the COM files for NABU CP/M yet. 178 | 179 | Using CVBasic to compile a Sega Master System program: 180 | 181 | cvbasic --sms game.bas game.asm 182 | gasm80 game.asm -o game.sms -sms 183 | 184 | The -sms option of gasm80 will generate automatically a valid checksum so the game can run on a real console. 185 | 186 | ### Notes 187 | 188 | The current official version is v0.8.0. 189 | 190 | All platforms have been tested in emulation. 191 | 192 | * Colecovision and MSX have been tested in real hardware by myself. 193 | * Sega SG1000/SC3000 tested in real hardware by aotta. 194 | * Spectravideo SVI-318/328 tested in real hardware by Tony Cruise. 195 | * Creativision / Dick Smith's Wizzard tested in real hardware by Scouter3d. 196 | * NABU tested in real hardware by Sektor. 197 | * Sega Master System tested in real hardware and Sega Genesis/Megadrive by myself. 198 | 199 | Untested: 200 | 201 | * DEFINE VRAM READ is only tested for Colecovision/MSX, please test in your real hardware to check that the timing is right. 202 | 203 | MSX controller support only handles the two joysticks and keyboard arrows (plus Space and M for buttons). The keys 0-9, Backspace and Return emulate the Colecovision keypad (CONT1.KEY only). 204 | 205 | The Sega SG1000 and Sega Master System doesn't have any keypad, so CONT1.KEY and CONT2.KEY aren't operative, but the support includes compatibility with Sega SC3000 computer, and the keyboard can be used as first controller (code contributed by SiRioKD) and for CONT1.KEY using the keys 0-9, Delete and CR. 206 | 207 | The Spectravideo SVI-328 only has one button in the joystick. The keyboard can be used for the second button (letter M) and to have keypad (CONT1.KEY only) using the keys 0-9, Backspace and Return. 208 | 209 | The Sord M5 can only use binaries up to 16 kb, both joysticks are handled as controllers, and the keyboard emulate the Colecovision keypad (CONT1.KEY only) using the keys 0-9, Backslash/Del and Return. 210 | 211 | The Tatung Einstein can only use binaries up to 32 kb, keyboard is handled as controller 1 (joystick not used), and it can also emulate the Colecovision keypad (CONT1.KEY only) using the keys 0-9, Del/Ins and Enter. 212 | 213 | The Casio PV-2000 can only use binaries up to 16 kb, the keyboard and joystick are controller 1, and it can emulate the Colecovision keypad (CONT1.KEY only) using the keys 0-9, Home/Cls and Return. 214 | 215 | The Creativision can only use binaries up to 32 kb, the joysticks are controller 1 and controller 2, and it can emulate the Coleocovision keypad (CONT1.KEY only) using the keys 0-9, Left and RETN. 216 | 217 | The TI-99/4A can only generate non-banked binaries up to 24 kb. When banking, the fixed space is 24k and pages are 8k. Both joysticks are supported with a single button. The second button is simulated on the keyboard with control for player 1 and fctn for player 2. CONT1.KEY will also return uppercase ASCII characters from the keyboard in addition to the stock 0-9, #, * for compatibility with Coleco programs. No keypad is implemented for controller 2 - only the joystick. The program supports FCTN-= (Alt-= on PC emulation) to reset. 218 | 219 | The NABU PC can only use binaries up to 32 kb, joysticks can be used for both controllers, keyboard arrows are handled as controller 1, and it can also emulate the Colecovision keypad (CONT1.KEY only) using the keys 0-9, Del and Enter. 220 | 221 | Many people is developing games using CVBasic, feel free to check some of these examples at the [AtariAge Colecovision Programming forum](https://forums.atariage.com/forum/55-colecovision-programming/) 222 | 223 | 224 | ### People using CVBasic 225 | 226 | There are some very good examples of games developed with CVBasic. 227 | 228 | * Airlock II game by OriginalJohn. Demo available from [https://forums.atariage.com/topic/379104-cvbasic-airlock-ii-in-progress/](https://forums.atariage.com/topic/379104-cvbasic-airlock-ii-in-progress/) 229 | 230 | * Beachhead by Eric Damain. Demo screenshots [https://forums.atariage.com/topic/373822-beach-head-dev-log-cvbasic/](https://forums.atariage.com/topic/373822-beach-head-dev-log-cvbasic/) 231 | 232 | * Camelot Knights by nanochess. Available from [https://forums.atariage.com/topic/363252-camelot-knights-game/](https://forums.atariage.com/topic/363252-camelot-knights-game/) 233 | 234 | * Colecovania demo by Skywaffle. Video at [https://www.youtube.com/watch?v=ixlAEZ0GSis&ab_channel=MatthewKiehl](https://www.youtube.com/watch?v=ixlAEZ0GSis&ab_channel=MatthewKiehl) 235 | 236 | * Donkey.BAS by Claus Bækkel. Available for purchase from [https://forums.atariage.com/topic/366153-donkeybas-game-coded-in-cvbasic-0500/](https://forums.atariage.com/topic/366153-donkeybas-game-coded-in-cvbasic-0500/) 237 | 238 | * Duocide by Jess Ragan. Demo available from [https://forums.atariage.com/topic/379738-duocide-the-side-switching-shooter/](https://forums.atariage.com/topic/379738-duocide-the-side-switching-shooter/) 239 | 240 | * Gorilla.BAS by nanochess. Available from [https://forums.atariage.com/topic/370716-gorillabas-for-colecovision/](https://forums.atariage.com/topic/370716-gorillabas-for-colecovision/) 241 | 242 | * Gun Fight by Eric Damain. Video at [https://forums.atariage.com/topic/379102-gun-fight-dev-log-cvbasic/](https://forums.atariage.com/topic/379102-gun-fight-dev-log-cvbasic/) 243 | 244 | * Manhole by Eric Damain. Available from [https://electric-dreams.itch.io/manhole-for-colecovision](https://electric-dreams.itch.io/manhole-for-colecovision) 245 | 246 | * Monkey Moon by nanochess, example from the book **Programming Games for Colecovision**. Available from [https://forums.atariage.com/topic/365456-the-mystery-of-monkey-moon/#findComment-5478249](https://forums.atariage.com/topic/365456-the-mystery-of-monkey-moon/#findComment-5478249) 247 | 248 | * Rogue-like Wip by Skywaffle. Available from [https://forums.atariage.com/topic/372717-colecovision-rogue-like-wip/](https://forums.atariage.com/topic/372717-colecovision-rogue-like-wip/) 249 | 250 | * Sub Hunt by Eric Damain. Demo videos [https://forums.atariage.com/topic/374259-sub-hunt-dev-log-cvbasic/](https://forums.atariage.com/topic/374259-sub-hunt-dev-log-cvbasic/) 251 | 252 | * Whack'em Smack'em Byron by Jess Ragan. Available from [https://forums.atariage.com/topic/364885-whack-em-smack-em-byron-dev-log/page/3/#findComment-5483961](https://forums.atariage.com/topic/364885-whack-em-smack-em-byron-dev-log/page/3/#findComment-5483961) 253 | 254 | ### Supporting the developer 255 | 256 | If you find CVBasic useful, please show your appreciation making a donation via Paypal ($9 USD suggested) to b-i+y-u+b-i (at) gmail.com 257 | 258 | If you find a bug, please report it to the same email address, and I'll try to look into it. Because lack of time I cannot guarantee it will be corrected. 259 | 260 | You can also get my book **Programming Games for Colecovision** including an introductory course to game programming with CVBasic and full examples with source code: Game of Ball, Monkey Moon, Space Raider, Bouncy Cube, and Dungeon Warrior. 261 | 262 | The foreword is written by the legendary David R. Megarry, programmer of Zaxxon™ for Colecovision, and creator of the Dungeon!™ Board game. 263 | 264 | All the games in the book will compile for **all** the platforms (exception of Dungeon Warrior for Casio PV2000 because the small 16KB ROM size) 265 | 266 | * [Programming Games for Colecovision, paperback, 250 pages](https://www.lulu.com/shop/oscar-toledo-gutierrez/programming-games-for-colecovision/paperback/product-95qvzj8.html?page=1&pageSize=4) 267 | * [Programming Games for Colecovision, hardcover, 250 pages](https://www.lulu.com/shop/oscar-toledo-gutierrez/programming-games-for-colecovision/hardcover/product-84nm767.html?page=1&pageSize=4) 268 | * [Programming Games for Colecovision, PDF ebook, 250 pages](https://nanochess.org/store.html) 269 | 270 | 271 | ### Acknowledgments 272 | 273 | Thanks to the following members of Atariage for contributing valuable suggestions: abeker, aotta, ARTRAG, atari2600land, carlsson, chalkyw64, CrazyBoss, drfloyd, gemintronic, Jess Ragan, Kamshaft, Kiwi, pixelboy, SiRioKD, Tarzilla, Tony Cruise, tursilion, visrealm, wavemotion, and youki. 274 | -------------------------------------------------------------------------------- /compile_with_warnings.sh: -------------------------------------------------------------------------------- 1 | # Compile CVBasic with Clang warnings, except some too twisted 2 | gcc -Weverything -Wno-sign-conversion -Wno-implicit-int-conversion -Wno-switch-enum -Wno-padded -Wno-poison-system-directories -Wno-shadow cvbasic.c node.c driver.c cpu6502.c cpuz80.c cpu9900.c -o cvbasic 3 | -------------------------------------------------------------------------------- /contrib/ScrollTest.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nanochess/CVBasic/bb37d91c478d85b9acce86b631288791c5f1a4c0/contrib/ScrollTest.bmp -------------------------------------------------------------------------------- /cpu6502.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** 6502 assembler output routines for CVBasic (headers) 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** Creation date: Aug/04/2024. Separated from CVBasic.c 7 | */ 8 | 9 | extern void cpu6502_dump(void); 10 | extern void cpu6502_label(char *); 11 | extern void cpu6502_empty(void); 12 | extern void cpu6502_noop(char *); 13 | extern void cpu6502_1op(char *, char *); 14 | 15 | extern void cpu6502_node_label(struct node *); 16 | extern void cpu6502_node_generate(struct node *, int); 17 | -------------------------------------------------------------------------------- /cpu9900.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** 9900 assembler output routines for CVBasic (headers) 3 | ** 4 | ** by Tursi, based on cpu6502.h by Oscar Toledo G. 5 | ** 6 | ** Creation date: Aug/20/2024. Separated from CVBasic.c 7 | */ 8 | 9 | extern void cpu9900_dump(void); 10 | extern void cpu9900_label(char *); 11 | extern void cpu9900_empty(void); 12 | extern void cpu9900_noop(char *); 13 | extern void cpu9900_1op(char *, char *); 14 | extern void cpu9900_2op(char *, char *, char *); 15 | 16 | extern void cpu9900_node_label(struct node *); 17 | extern void cpu9900_node_generate(struct node *, int); 18 | -------------------------------------------------------------------------------- /cpuz80.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** Z80 assembler output routines for CVBasic (headers) 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** Creation date: Jul/31/2024. Separated from CVBasic.c 7 | */ 8 | 9 | extern void cpuz80_dump(void); 10 | extern void cpuz80_label(char *); 11 | extern void cpuz80_empty(void); 12 | extern void cpuz80_noop(char *); 13 | extern void cpuz80_1op(char *, char *); 14 | extern void cpuz80_2op(char *, char *, char *); 15 | 16 | extern void cpuz80_node_label(struct node *); 17 | extern void cpuz80_node_generate(struct node *, int); 18 | -------------------------------------------------------------------------------- /cvbasic.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** CVBasic - Global definitions 3 | ** by Oscar Toledo G. 4 | ** 5 | ** © Copyright 2024 Óscar Toledo G. 6 | ** https://nanochess.org/ 7 | ** 8 | ** Creation date: Jun/21/2024. 9 | */ 10 | 11 | #define CONST_PREFIX "const_" 12 | #define ARRAY_PREFIX "array_" 13 | #define LABEL_PREFIX "cvb_" 14 | #define INTERNAL_PREFIX "cv" 15 | 16 | #define MAX_LINE_SIZE 1024 17 | 18 | /* 19 | ** Supported platforms. 20 | */ 21 | enum supported_machine { 22 | COLECOVISION, 23 | SG1000, 24 | MSX, 25 | COLECOVISION_SGM, 26 | SVI, 27 | SORD, 28 | MEMOTECH, 29 | CREATIVISION, 30 | PENCIL, 31 | EINSTEIN, 32 | PV2000, 33 | TI994A, 34 | NABU, 35 | SMS, 36 | TOTAL_TARGETS 37 | }; 38 | 39 | extern enum supported_machine machine; 40 | 41 | /* 42 | ** Supported target CPUs 43 | */ 44 | enum cpu_target { 45 | CPU_Z80, 46 | CPU_6502, 47 | CPU_9900 48 | }; 49 | 50 | extern enum cpu_target target; 51 | 52 | /* 53 | ** Information about supported machines 54 | */ 55 | struct console { 56 | char *name; /* Machine name */ 57 | char *options; /* Options */ 58 | char *description; /* Description (for usage guide) */ 59 | char *canonical; /* Canonical name */ 60 | int base_ram; /* Where the RAM starts */ 61 | int stack; /* Where the stack will start */ 62 | int memory_size; /* Memory available */ 63 | int vdp_port_write; /* VDP port for writing */ 64 | int vdp_port_read; /* VDP port for reading (needed for SVI-318/328, sigh) */ 65 | int psg_port; /* PSG port (SN76489) */ 66 | int int_pin; /* Indicates if it uses the INT pin for video frame interrupt */ 67 | enum cpu_target target; 68 | }; 69 | 70 | extern struct console consoles[TOTAL_TARGETS]; 71 | 72 | extern char temp[MAX_LINE_SIZE]; 73 | extern int optimized; 74 | extern FILE *output; 75 | extern int next_local; 76 | 77 | #define HASH_PRIME 1103 /* A prime number */ 78 | 79 | struct label { 80 | struct label *next; 81 | int used; 82 | int length; /* For arrays */ 83 | char name[1]; 84 | }; 85 | 86 | /* 87 | ** These flags are used to keep types when evaluating expressions, but also 88 | ** for variables (TYPE_SIGNED isn't keep in variables or arrays, instead in 89 | ** a separate signedness definition table). 90 | */ 91 | #define MAIN_TYPE 0x03 92 | #define TYPE_8 0x00 93 | #define TYPE_16 0x01 94 | #define TYPE_SIGNED 0x04 95 | 96 | /* 97 | ** These flags are used in labels 98 | */ 99 | #define LABEL_USED 0x10 100 | #define LABEL_DEFINED 0x20 101 | #define LABEL_CALLED_BY_GOTO 0x40 102 | #define LABEL_CALLED_BY_GOSUB 0x80 103 | #define LABEL_IS_PROCEDURE 0x100 104 | #define LABEL_IS_VARIABLE 0x200 105 | #define LABEL_IS_ARRAY 0x400 106 | 107 | #define LABEL_VAR_READ 0x0800 108 | #define LABEL_VAR_WRITE 0x1000 109 | #define LABEL_VAR_ACCESS (LABEL_VAR_READ | LABEL_VAR_WRITE) 110 | 111 | extern void emit_error(char *); 112 | -------------------------------------------------------------------------------- /cvbasic_6502_epilogue.asm: -------------------------------------------------------------------------------- 1 | rom_end: 2 | times $bfe8-$ db $ff 3 | 4 | dw START 5 | dw 0 ; IRQ2 handler. 6 | 7 | dw 0 8 | dw 0 9 | 10 | ; Initial VDP registers 11 | db $02 12 | db $82 13 | db $06 14 | db $ff 15 | db $00 16 | db $36 17 | db $07 18 | db $01 19 | 20 | dw 0 21 | dw 0 22 | dw BIOS_NMI_RESET_ADDR ; Handler for reset. 23 | dw int_handler ; IRQ1 handler. 24 | -------------------------------------------------------------------------------- /cvbasic_9900_epilogue.asm: -------------------------------------------------------------------------------- 1 | SLAST 2 | 3 | ;;; CV BASIC Epilogue 4 | 5 | ; data in low RAM 6 | dorg >2000 7 | 8 | ; must be even aligned 9 | ; mirror for sprite table 10 | sprites bss 128 11 | 12 | ; Vars can start at >2080 13 | dorg >2080 14 | 15 | -------------------------------------------------------------------------------- /cvbasic_epilogue.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; CVBasic epilogue (BASIC compiler for Colecovision) 3 | ; 4 | ; by Oscar Toledo G. 5 | ; https://nanochess.org/ 6 | ; 7 | ; Creation date: Feb/27/2024. 8 | ; Revision date: Feb/29/2024. Added joystick, keypad, frame, random, and 9 | ; read_pointer variables. 10 | ; Revision date: Mar/04/2024. Added music player. 11 | ; Revision date: Mar/05/2024. Added support for Sega SG1000. 12 | ; Revision date: Mar/12/2024. Added support for MSX. 13 | ; Revision date: Mar/13/2024. Added Pletter decompressor. 14 | ; Revision date: Mar/19/2024. Added support for sprite flicker. 15 | ; Revision date: Apr/11/2024. Added support for Super Game Module. 16 | ; Revision date: Apr/13/2024. Updates LFSR in interruption handler. 17 | ; Revision date: Apr/26/2024. All code moved to cvbasic_prologue.asm so it 18 | ; can remain accessible in bank 0 (bank switching). 19 | ; Revision date: Aug/02/2024. Added rom_end label for Memotech. 20 | ; Revision date: Aug/15/2024. Added support for Tatung Einstein. 21 | ; Revision date: Nov/12/2024. Added vdp_status. 22 | ; Revision date: Feb/03/2025. Round final ROM size to 8K multiples. 23 | ; 24 | 25 | rom_end: 26 | 27 | ; ROM final size rounding 28 | if MSX+COLECO+SG1000+SMS+SVI+SORD 29 | TIMES (($+$1FFF)&$1e000)-$ DB $ff 30 | endif 31 | if MEMOTECH+EINSTEIN+NABU 32 | ; Align following data to a 256-byte page. 33 | TIMES $100-($&$ff) DB $4f 34 | endif 35 | if PV2000 36 | TIMES $10000-$ DB $ff 37 | endif 38 | if SG1000+SMS 39 | if CVBASIC_BANK_SWITCHING 40 | forg CVBASIC_BANK_ROM_SIZE*1024-1 ; Force final ROM size 41 | db $ff 42 | endif 43 | forg $7FF0 44 | org $7FF0 45 | db "TMR SEGA" 46 | db 0,0 47 | db 0,0 ; Checksum 48 | db $11,$78 ; Product code 49 | db $00 ; Version 50 | db $4c ; SMS Export + 32KB for checksum 51 | endif 52 | if COLECO+SG1000+SMS+MSX+SVI+SORD+PV2000 53 | org BASE_RAM 54 | endif 55 | ram_start: 56 | 57 | sprites: 58 | if SMS 59 | rb 256 60 | else 61 | rb 128 62 | endif 63 | sprite_data: 64 | rb 4 65 | frame: 66 | rb 2 67 | read_pointer: 68 | rb 2 69 | cursor: 70 | rb 2 71 | lfsr: 72 | rb 2 73 | mode: 74 | rb 1 75 | flicker: 76 | rb 1 77 | joy1_data: 78 | rb 1 79 | joy2_data: 80 | rb 1 81 | key1_data: 82 | rb 1 83 | key2_data: 84 | rb 1 85 | ntsc: 86 | rb 1 87 | vdp_status: 88 | rb 1 89 | if NABU 90 | nabu_data0: rb 1 91 | nabu_data1: rb 1 92 | nabu_data2: rb 1 93 | endif 94 | 95 | if CVBASIC_MUSIC_PLAYER 96 | music_tick: rb 1 97 | music_mode: rb 1 98 | 99 | if CVBASIC_BANK_SWITCHING 100 | music_bank: rb 1 101 | endif 102 | music_start: rb 2 103 | music_pointer: rb 2 104 | music_playing: rb 1 105 | music_timing: rb 1 106 | music_note_counter: rb 1 107 | music_instrument_1: rb 1 108 | music_counter_1: rb 1 109 | music_note_1: rb 1 110 | music_instrument_2: rb 1 111 | music_counter_2: rb 1 112 | music_note_2: rb 1 113 | music_instrument_3: rb 1 114 | music_counter_3: rb 1 115 | music_note_3: rb 1 116 | music_counter_4: rb 1 117 | music_drum: rb 1 118 | 119 | audio_freq1: rb 2 120 | audio_freq2: rb 2 121 | audio_freq3: rb 2 122 | audio_noise: rb 1 123 | audio_mix: rb 1 124 | audio_vol1: rb 1 125 | audio_vol2: rb 1 126 | audio_vol3: rb 1 127 | 128 | audio_control: rb 1 129 | audio_vol4hw: rb 1 130 | endif 131 | 132 | if SGM 133 | org $2000 ; Start for variables. 134 | endif 135 | -------------------------------------------------------------------------------- /driver.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** Driver for backend 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** Creation date: Aug/04/2024. 7 | */ 8 | 9 | #include 10 | #include 11 | #include "cvbasic.h" 12 | #include "node.h" 13 | #include "cpuz80.h" 14 | #include "cpu6502.h" 15 | #include "cpu9900.h" 16 | 17 | static char driver_temp[MAX_LINE_SIZE]; 18 | 19 | /* 20 | ** Dump peephole optimization 21 | */ 22 | void generic_dump(void) 23 | { 24 | if (target == CPU_Z80) 25 | cpuz80_dump(); 26 | } 27 | 28 | /* 29 | ** 8-bit test 30 | */ 31 | void generic_test_8(void) 32 | { 33 | if (target == CPU_6502) 34 | cpu6502_1op("CMP", "#0"); 35 | if (target == CPU_9900) 36 | cpu9900_2op("movb", "r0", "r0"); 37 | if (target == CPU_Z80) 38 | cpuz80_1op("OR", "A"); 39 | } 40 | 41 | /* 42 | ** 16-bit test 43 | */ 44 | void generic_test_16(void) 45 | { 46 | if (target == CPU_6502) { 47 | cpu6502_1op("STY", "temp"); 48 | cpu6502_1op("ORA", "temp"); 49 | } 50 | if (target == CPU_9900) { 51 | cpu9900_2op("mov", "r0", "r0"); 52 | } 53 | if (target == CPU_Z80) { 54 | cpuz80_2op("LD", "A", "H"); 55 | cpuz80_1op("OR", "L"); 56 | } 57 | } 58 | 59 | /* 60 | ** Label 61 | */ 62 | void generic_label(char *label) 63 | { 64 | if (target == CPU_6502) 65 | cpu6502_label(label); 66 | if (target == CPU_9900) 67 | cpu9900_label(label); 68 | if (target == CPU_Z80) 69 | cpuz80_label(label); 70 | } 71 | 72 | /* 73 | ** Call 74 | */ 75 | void generic_call(char *label) 76 | { 77 | if (target == CPU_6502) 78 | cpu6502_1op("JSR", label); 79 | if (target == CPU_9900) { 80 | cpu9900_1op("bl", "@jsr"); 81 | cpu9900_1op("data", label); 82 | } 83 | if (target == CPU_Z80) 84 | cpuz80_1op("CALL", label); 85 | } 86 | 87 | /* 88 | ** Return 89 | */ 90 | void generic_return(void) 91 | { 92 | if (target == CPU_6502) 93 | cpu6502_noop("RTS"); 94 | if (target == CPU_9900) { 95 | /* we don't presume r11 was preserved - it probably wasn't! */ 96 | cpu9900_2op("mov", "*r10+", "r0"); 97 | cpu9900_1op("b", "*r0"); 98 | } 99 | if (target == CPU_Z80) 100 | cpuz80_noop("RET"); 101 | } 102 | 103 | /* 104 | ** Jump 105 | */ 106 | void generic_jump(char *label) 107 | { 108 | if (target == CPU_6502) 109 | cpu6502_1op("JMP", label); 110 | if (target == CPU_9900) { 111 | char temp[256]; 112 | 113 | sprintf(temp, "@%s", label); 114 | cpu9900_1op("b", temp); 115 | } 116 | if (target == CPU_Z80) 117 | cpuz80_1op("JP", label); 118 | } 119 | 120 | /* 121 | ** Jump if zero 122 | */ 123 | void generic_jump_zero(char *label) 124 | { 125 | if (target == CPU_6502) 126 | cpu6502_1op("BEQ.L", label); 127 | if (target == CPU_9900) { 128 | char internal_label[256], internal_label2[256]; 129 | int number = next_local++; 130 | 131 | sprintf(internal_label, INTERNAL_PREFIX "%d", number); 132 | sprintf(internal_label2, "@%s", label); 133 | 134 | cpu9900_1op("jne", internal_label); 135 | cpu9900_1op("b", internal_label2); 136 | cpu9900_label(internal_label); 137 | } 138 | if (target == CPU_Z80) 139 | cpuz80_2op("JP", "Z", label); 140 | } 141 | 142 | /* 143 | ** Generic range comparison (8-bit) 144 | */ 145 | void generic_comparison_8bit(int min, int max, char *label) 146 | { 147 | char value[256]; 148 | 149 | if (min == max) { 150 | if (target == CPU_Z80) { 151 | sprintf(value, "%d", min); 152 | cpuz80_1op("CP", value); 153 | cpuz80_2op("JP", "NZ", label); 154 | } 155 | if (target == CPU_6502) { 156 | sprintf(value, "#%d", min); 157 | cpu6502_1op("CMP", value); 158 | cpu6502_1op("BNE.L", label); 159 | } 160 | if (target == CPU_9900) { 161 | sprintf(value, "%d", min * 256); 162 | cpu9900_2op("ci", "r0", value); 163 | cpu9900_1op("jne", label); 164 | } 165 | return; 166 | } 167 | if (target == CPU_Z80) { 168 | sprintf(value, "%d", min); 169 | cpuz80_1op("CP", value); 170 | cpuz80_2op("JP", "C", label); 171 | sprintf(value, "%d", max + 1); 172 | cpuz80_1op("CP", value); 173 | cpuz80_2op("JP", "NC", label); 174 | } 175 | if (target == CPU_6502) { 176 | sprintf(value, "#%d", min); 177 | cpu6502_1op("CMP", value); 178 | cpu6502_1op("BCC.L", label); 179 | sprintf(value, "#%d", max + 1); 180 | cpu6502_1op("CMP", value); 181 | cpu6502_1op("BCS.L", label); 182 | } 183 | if (target == CPU_9900) { 184 | sprintf(value, "%d", min * 256); 185 | cpu9900_2op("ci", "r0", value); 186 | cpu9900_1op("jl", label); 187 | sprintf(value, "%d", max * 256); 188 | cpu9900_2op("ci", "r0", value); 189 | cpu9900_1op("jh", label); 190 | } 191 | } 192 | 193 | /* 194 | ** Generic range comparison (16-bit) 195 | */ 196 | void generic_comparison_16bit(int min, int max, char *label) 197 | { 198 | char value[256]; 199 | 200 | if (min == max) { 201 | if (target == CPU_Z80) { 202 | sprintf(value, "%d", min); 203 | cpuz80_2op("LD", "DE", value); 204 | cpuz80_1op("OR", "A"); 205 | cpuz80_2op("SBC", "HL", "DE"); 206 | cpuz80_2op("ADD", "HL", "DE"); 207 | cpuz80_2op("JP", "NZ", label); 208 | } 209 | if (target == CPU_6502) { 210 | sprintf(value, "#%d", min & 0xff); 211 | cpu6502_1op("CMP", value); 212 | cpu6502_1op("BNE.L", label); 213 | sprintf(value, "#%d", (min >> 8) & 0xff); 214 | cpu6502_1op("CPY", value); 215 | cpu6502_1op("BNE.L", label); 216 | } 217 | if (target == CPU_9900) { 218 | sprintf(value, "%d", min); 219 | cpu9900_2op("ci", "r0", value); 220 | cpu9900_1op("jne", label); 221 | } 222 | return; 223 | } 224 | if (target == CPU_Z80) { 225 | sprintf(value, "%d", min); 226 | cpuz80_2op("LD", "DE", value); 227 | cpuz80_1op("OR", "A"); 228 | cpuz80_2op("SBC", "HL", "DE"); 229 | cpuz80_2op("ADD", "HL", "DE"); 230 | cpuz80_2op("JP", "C", label); 231 | sprintf(value, "%d", max + 1); 232 | cpuz80_2op("LD", "DE", value); 233 | /* cpuz80_1op("OR", "A"); */ /* Guaranteed */ 234 | cpuz80_2op("SBC", "HL", "DE"); 235 | cpuz80_2op("ADD", "HL", "DE"); 236 | cpuz80_2op("JP", "NC", label); 237 | } 238 | if (target == CPU_6502) { 239 | cpu6502_noop("PHA"); 240 | cpu6502_noop("SEC"); 241 | sprintf(value, "#%d", min & 0xff); 242 | cpu6502_1op("SBC", value); 243 | cpu6502_noop("TYA"); 244 | sprintf(value, "#%d", (min >> 8) & 0xff); 245 | cpu6502_1op("SBC", value); 246 | cpu6502_noop("PLA"); 247 | cpu6502_1op("BCC.L", label); 248 | cpu6502_noop("PHA"); 249 | /* cpu6502_noop("SEC"); */ /* Guaranteed */ 250 | sprintf(value, "#%d", (max + 1) & 0xff); 251 | cpu6502_1op("SBC", value); 252 | cpu6502_noop("TYA"); 253 | sprintf(value, "#%d", ((max + 1) >> 8) & 0xff); 254 | cpu6502_1op("SBC", value); 255 | cpu6502_noop("PLA"); 256 | cpu6502_1op("BCS.L", label); 257 | } 258 | if (target == CPU_9900) { 259 | sprintf(value, "%d", min); 260 | cpu9900_2op("ci", "r0", value); 261 | cpu9900_1op("jl", label); 262 | sprintf(value, "%d", max); 263 | cpu9900_2op("ci", "r0", value); 264 | cpu9900_1op("jh", label); 265 | } 266 | } 267 | 268 | /* 269 | ** Generic disable interrupt 270 | */ 271 | void generic_interrupt_disable(void) 272 | { 273 | if (consoles[machine].int_pin == 0) { 274 | generic_call("nmi_off"); 275 | } else { 276 | if (target == CPU_Z80) 277 | cpuz80_noop("DI"); 278 | else if (target == CPU_6502) 279 | cpu6502_noop("SEI"); 280 | else if (target == CPU_9900) 281 | cpu9900_1op("limi", "0"); 282 | } 283 | } 284 | 285 | /* 286 | ** Generic enable interrupt 287 | */ 288 | void generic_interrupt_enable(void) 289 | { 290 | if (consoles[machine].int_pin == 0) { 291 | generic_call("nmi_on"); 292 | } else { 293 | if (target == CPU_Z80) 294 | cpuz80_noop("EI"); 295 | else if (target == CPU_6502) 296 | cpu6502_noop("CLI"); 297 | else if (target == CPU_9900) 298 | cpu9900_1op("limi", "2"); 299 | } 300 | } 301 | -------------------------------------------------------------------------------- /driver.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** Driver for CVBasic's backends (headers) 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** Creation date: Aug/04/2024. Separated from CVBasic.c 7 | */ 8 | 9 | extern void generic_dump(void); 10 | extern void generic_test_8(void); 11 | extern void generic_test_16(void); 12 | extern void generic_label(char *); 13 | extern void generic_call(char *); 14 | extern void generic_return(void); 15 | extern void generic_jump(char *); 16 | extern void generic_jump_zero(char *); 17 | extern void generic_comparison_8bit(int, int, char *); 18 | extern void generic_comparison_16bit(int, int, char *); 19 | extern void generic_interrupt_disable(void); 20 | extern void generic_interrupt_enable(void); 21 | -------------------------------------------------------------------------------- /e.sh: -------------------------------------------------------------------------------- 1 | ./cvbasic --ti994a $1.bas $1.a99 2 | ../../xdt99/xas99.py -R $1.a99 -L $1.lst 3 | ../../xdt99/xdm99.py -X sssd work.dsk -a $1.obj -f df80 4 | -------------------------------------------------------------------------------- /examples/brinquitos.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Brinquitos: Demo game 3 | ' 4 | ' by Oscar Toledo Gutiérrez 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Oct/06/2024. 8 | ' 9 | 10 | CONST MAX_CLOUDS = 4 11 | 12 | ' 13 | ' Cloud information 14 | ' 15 | DIM cloud_x(MAX_CLOUDS) ' X-coordinate 16 | DIM cloud_y(MAX_CLOUDS) ' Y-coordinate 17 | DIM cloud_e(MAX_CLOUDS) ' State 18 | 19 | ' 20 | ' Restart game 21 | ' 22 | restart_game: 23 | ' Clear the screen 24 | CLS 25 | MODE 2 26 | ' Blue background, green foreground 27 | FOR c = 0 TO 31 28 | VPOKE $2000 + c, $34 29 | NEXT c 30 | ' Turquoise numbers. 31 | VPOKE $2006, $74 32 | VPOKE $2007, $74 33 | 34 | ' Define sprites 35 | DEFINE SPRITE 0,4,sprites_bitmaps 36 | 37 | #puntos = 0 38 | 39 | ' Setup initial clouds 40 | cloud_y(3) = 176 41 | cloud_y(2) = 126 42 | cloud_y(1) = 76 43 | cloud_y(0) = 26 44 | 45 | cloud_x(3) = 128 46 | cloud_e(3) = 0 47 | 48 | c = 2 49 | GOSUB setup_cloud 50 | c = 1 51 | GOSUB setup_cloud 52 | c = 0 53 | GOSUB setup_cloud 54 | 55 | ' Setup player 56 | x = 128 ' X-coordinate 57 | y = 160 ' Y-coordinate 58 | jump_state = 0 ' Jump state 59 | standing_on = 3 ' Standing on cloud 3 60 | 61 | PLAY SIMPLE 62 | PLAY music_gladiators 63 | 64 | ' 65 | ' Main loop 66 | ' 67 | main_loop: 68 | 69 | ' 70 | ' Jump sound effect. 71 | ' 72 | IF jump_state >= 33 THEN ' Jumping 73 | f = 4 74 | SOUND 2, y, 12 75 | SOUND 7, y, 12 76 | ELSEIF jump_state THEN ' Falling 77 | f = 8 78 | SOUND 2, y, 12 79 | SOUND 7, y, 12 80 | ELSE ' Standing 81 | f = 0 82 | SOUND 2, , 0 83 | SOUND 7, , 0 84 | END IF 85 | 86 | ' Show the player sprite 87 | SPRITE 0, y - 1, x - 8, f, 10 88 | 89 | ' Show sprites for clouds 90 | FOR c = 0 TO 3 91 | SPRITE c + 1, cloud_y(c) - 1, cloud_x(c) - 8, 12, 15 92 | NEXT c 93 | 94 | ' Video synchronization 95 | WAIT 96 | 97 | ' Update score 98 | PRINT AT 1,<>#puntos 99 | 100 | ' Detect if it should do vertical displacement... 101 | ' ...of the screen. 102 | IF y < 110 AND jump_state = 0 THEN 103 | y = y + 1 104 | FOR c = 0 TO MAX_CLOUDS - 1 105 | cloud_y(c) = cloud_y(c) + 1 106 | IF cloud_y(c) = 192 THEN 107 | cloud_y(c) = -8 108 | GOSUB setup_cloud 109 | END IF 110 | NEXT c 111 | END IF 112 | 113 | ' Detect if the player stands on a cloud 114 | IF jump_state <> 0 AND jump_state < 33 AND standing_on = 255 THEN 115 | FOR c = 0 TO MAX_CLOUDS - 1 116 | IF ABS(cloud_x(c) + 1 - x) < 8 AND ABS(cloud_y(c) - 16 - y) < 3 THEN 117 | jump_state = 0 118 | y = cloud_y(c) - 16 119 | standing_on = c 120 | IF was_on <> standing_on THEN 121 | #puntos = #puntos + 1 122 | END IF 123 | END IF 124 | NEXT c 125 | END IF 126 | 127 | ' Move the clouds 128 | FOR c = 0 TO MAX_CLOUDS - 1 129 | IF cloud_e(c) = 1 THEN ' 1- Left 130 | IF standing_on = c THEN x = x - 2 131 | cloud_x(c) = cloud_x(c) - 2 132 | IF cloud_x(c) < 18 THEN cloud_e(c) = 2 133 | ELSEIF cloud_e(c) = 2 THEN ' 2- Right 134 | IF standing_on = c THEN x = x + 2 135 | cloud_x(c) = cloud_x(c) + 2 136 | IF cloud_x(c) > 238 THEN cloud_e(c) = 1 137 | END IF 138 | NEXT c 139 | 140 | ' Handle jumping. 141 | IF jump_state THEN 142 | IF jump_state >= 33 THEN 143 | jump_state = jump_state - 1 144 | y = y - 2 145 | ELSE 146 | y = y + 2 147 | IF y = 200 OR y = 201 THEN GOTO end_of_game 148 | END IF 149 | END IF 150 | 151 | ' Jump if button pressed 152 | IF cont.button THEN 153 | IF jump_state = 0 THEN 154 | jump_state = 64 155 | was_on = standing_on 156 | standing_on = 255 157 | END IF 158 | END IF 159 | 160 | GOTO main_loop 161 | 162 | ' 163 | ' End of game 164 | ' 165 | end_of_game: 166 | ' Turn off jumping sound effect 167 | SOUND 2, , 0 168 | SOUND 7, , 0 169 | 170 | ' Final music 171 | PLAY music_end 172 | 173 | PRINT AT 135,"G A M E O V E R" 174 | 175 | FOR c = 1 TO 240 176 | WAIT 177 | NEXT c 178 | 179 | GOTO restart_game 180 | 181 | ' 182 | ' Setup a cloud 183 | ' 184 | setup_cloud: PROCEDURE 185 | 186 | ' 187 | ' Choose a position with margin of 32 pixels at each side. 188 | ' Make sure the minimum distance of 64 pixels... 189 | ' ...against the next cloud so the jump is possible. 190 | ' 191 | DO 192 | cloud_x(c) = RANDOM(96) * 2 + 32 193 | LOOP WHILE ABS(cloud_x(c) + 1 - cloud_x((c + 1) % MAX_CLOUDS)) < 64 194 | 195 | ' Assign a movement direction. 196 | cloud_e(c) = RANDOM(2) + 1 197 | END 198 | 199 | ' 200 | ' Game sprites 201 | ' 202 | sprites_bitmaps: 203 | BITMAP "................" ' Standing 204 | BITMAP "................" 205 | BITMAP "................" 206 | BITMAP "......XXXX......" 207 | BITMAP ".....XXXXXX....." 208 | BITMAP "....XXXXXXXXX..." 209 | BITMAP "...XX..XX..XX..." 210 | BITMAP "...XX..XX..XX..." 211 | BITMAP "..XXXXXXXXXXXX.." 212 | BITMAP ".XXXXX.XX.XXXXX." 213 | BITMAP "XX.X..XXXX..X.XX" 214 | BITMAP "XX.XX......XX.XX" 215 | BITMAP "XX.XXXXXXXXXX.XX" 216 | BITMAP "XXX..XX..XX..XXX" 217 | BITMAP "....XXX..XXX...." 218 | BITMAP "...XXXX..XXXX..." 219 | 220 | BITMAP ".XX..........XX." ' Jumping 221 | BITMAP "XXX..........XXX" 222 | BITMAP "XXX...XXXX...XXX" 223 | BITMAP ".XX..XXXXXX..XX." 224 | BITMAP ".XX.X..XX..X.XX." 225 | BITMAP ".X.XX..XX..XX.X." 226 | BITMAP ".X.XXXXXXXXXX.X." 227 | BITMAP "..XXXX.XX.XXXX.." 228 | BITMAP "...X..XXXX..X..." 229 | BITMAP "...XX..XX..XX..." 230 | BITMAP "...XXX....XXX..." 231 | BITMAP "...XXXXXXXXXX..." 232 | BITMAP ".....XX..XX....." 233 | BITMAP ".....XX..XX....." 234 | BITMAP ".....XX..XX....." 235 | BITMAP "....XXX..XXX...." 236 | 237 | BITMAP ".XX..........XX." ' Falling 238 | BITMAP "XXX...XXXX...XXX" 239 | BITMAP ".XX..XXXXXX..XX." 240 | BITMAP ".XX.X..XX..X.XX." 241 | BITMAP ".X.XX..XX..XX.X." 242 | BITMAP ".X.XXXXXXXXXX.X." 243 | BITMAP "..XXXX.XX.XXXX.." 244 | BITMAP "...XXXX..XXXX..." 245 | BITMAP "...XX......XX..." 246 | BITMAP "...XXX....XXX..." 247 | BITMAP "...XXXXXXXXXX..." 248 | BITMAP ".....XX..XX....." 249 | BITMAP ".....XX..XX....." 250 | BITMAP ".....XX..XX....." 251 | BITMAP ".....XX..XX....." 252 | BITMAP "....XXX..XXX...." 253 | 254 | BITMAP "..XXX.XXX.X....." ' Cloud 255 | BITMAP ".XXXXX.XXX.XX..." 256 | BITMAP ".XXXXXX.XXX.XX.." 257 | BITMAP "XXX..XX.XXX.XX.." 258 | BITMAP "XX.XXX..XXX..X.." 259 | BITMAP "..XXX.XX...XX..." 260 | BITMAP ".XXXX.XXX.XXXX.." 261 | BITMAP ".XXXX.XXX.XXXXX." 262 | BITMAP "..XXXX..XX..XX.." 263 | BITMAP "................" 264 | BITMAP "................" 265 | BITMAP "................" 266 | BITMAP "................" 267 | BITMAP "................" 268 | BITMAP "................" 269 | BITMAP "................" 270 | 271 | ' 272 | ' Gladiators music (circus entry) 273 | ' 274 | music_gladiators: 275 | DATA BYTE 7 276 | MUSIC C5,C3,-,- 277 | MUSIC S,S,-,- 278 | MUSIC B4,G3,-,- 279 | MUSIC S,S,-,- 280 | MUSIC A4#,G2,-,- 281 | MUSIC B4,S,-,- 282 | MUSIC A4#,G3,-,- 283 | MUSIC A4,S,-,- 284 | 285 | MUSIC G4#,C3,-,- 286 | MUSIC S,S,-,- 287 | MUSIC G4,G3,-,- 288 | MUSIC S,S,-,- 289 | MUSIC F4#,G2,-,- 290 | MUSIC S,S,-,- 291 | MUSIC G4,G3,-,- 292 | MUSIC S,S,-,- 293 | 294 | MUSIC A4,C3,-,- 295 | MUSIC S,S,-,- 296 | MUSIC G4#,G3,-,- 297 | MUSIC S,S,-,- 298 | MUSIC G4,G2,-,- 299 | MUSIC G4#,S,-,- 300 | MUSIC G4,G3,-,- 301 | MUSIC F4#,S,-,- 302 | 303 | MUSIC F4,C3,-,- 304 | MUSIC S,S,-,- 305 | MUSIC E4,G3,-,- 306 | MUSIC S,S,-,- 307 | MUSIC D4#,G2,-,- 308 | MUSIC S,S,-,- 309 | MUSIC E4,G3,-,- 310 | MUSIC S,S,-,- 311 | 312 | MUSIC G4,B2,-,- 313 | MUSIC S,S,-,- 314 | MUSIC F4,G3,-,- 315 | MUSIC F4,S,-,- 316 | MUSIC C4#,G2,-,- 317 | MUSIC S,S,-,- 318 | MUSIC D4,G3,-,- 319 | MUSIC S,S,-,- 320 | 321 | MUSIC G4,B2,-,- 322 | MUSIC S,S,-,- 323 | MUSIC F4,G3,-,- 324 | MUSIC F4,S,-,- 325 | MUSIC C4#,G2,-,- 326 | MUSIC S,S,-,- 327 | MUSIC D4,G3,-,- 328 | MUSIC S,S,-,- 329 | 330 | MUSIC B3,B2,-,- 331 | MUSIC C4,S,-,- 332 | MUSIC C4S,G3,-,- 333 | MUSIC D4,S,-,- 334 | MUSIC D4S,G2,-,- 335 | MUSIC E4,S,-,- 336 | MUSIC F4,G3,-,- 337 | MUSIC F4S,S,-,- 338 | 339 | MUSIC G4,B2,-,- 340 | MUSIC G4S,S,-,- 341 | MUSIC A4,G3,-,- 342 | MUSIC B4,S,-,- 343 | MUSIC A4,G2,-,- 344 | MUSIC S,S,-,- 345 | MUSIC G4,G3,-,- 346 | MUSIC S,S,-,- 347 | 348 | MUSIC REPEAT 349 | 350 | ' 351 | ' Music for end of game. 352 | ' 353 | music_end: 354 | DATA BYTE 20 355 | MUSIC C4,-,-,- 356 | MUSIC G3,-,-,- 357 | MUSIC C3,-,-,- 358 | MUSIC S,-,-,- 359 | MUSIC S,-,-,- 360 | MUSIC S,-,-,- 361 | MUSIC STOP 362 | 363 | -------------------------------------------------------------------------------- /examples/brinquitos_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Brinquitos: Demo game 3 | ' 4 | ' by Oscar Toledo Gutiérrez 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Oct/06/2024. 8 | ' Revision date: Apr/26/2025. Adapted to Sega Master System. 9 | ' 10 | 11 | CONST MAX_CLOUDS = 4 12 | 13 | ' 14 | ' Cloud information 15 | ' 16 | DIM cloud_x(MAX_CLOUDS) ' X-coordinate 17 | DIM cloud_y(MAX_CLOUDS) ' Y-coordinate 18 | DIM cloud_e(MAX_CLOUDS) ' State 19 | 20 | ' 21 | ' Restart game 22 | ' 23 | restart_game: 24 | ' Clear the screen 25 | CLS 26 | ' Turquoise numbers 27 | FOR #c = $0603 TO $07FF STEP 4 28 | VPOKE #c, 0 29 | NEXT #c 30 | ' Blue background 31 | FOR #c = $0402 TO $0FFE STEP 4 32 | VPOKE #c, VPEEK(#c) OR $FF 33 | NEXT #c 34 | 35 | ' Define sprites 36 | DEFINE SPRITE 0,8,sprites_bitmaps 37 | 38 | #puntos = 0 39 | 40 | ' Setup initial clouds 41 | cloud_y(3) = 176 42 | cloud_y(2) = 126 43 | cloud_y(1) = 76 44 | cloud_y(0) = 26 45 | 46 | cloud_x(3) = 128 47 | cloud_e(3) = 0 48 | 49 | c = 2 50 | GOSUB setup_cloud 51 | c = 1 52 | GOSUB setup_cloud 53 | c = 0 54 | GOSUB setup_cloud 55 | 56 | ' Setup player 57 | x = 128 ' X-coordinate 58 | y = 160 ' Y-coordinate 59 | jump_state = 0 ' Jump state 60 | standing_on = 3 ' Standing on cloud 3 61 | 62 | PLAY SIMPLE 63 | PLAY music_gladiators 64 | 65 | ' 66 | ' Main loop 67 | ' 68 | main_loop: 69 | 70 | ' 71 | ' Jump sound effect. 72 | ' 73 | IF jump_state >= 33 THEN ' Jumping 74 | f = 4 75 | SOUND 2, y, 12 76 | ELSEIF jump_state THEN ' Falling 77 | f = 8 78 | SOUND 2, y, 12 79 | ELSE ' Standing 80 | f = 0 81 | SOUND 2, , 0 82 | END IF 83 | 84 | ' Show the player sprite 85 | SPRITE 0, y - 1, x - 8, f 86 | SPRITE 1, y - 1, x, f + 2 87 | 88 | ' Show sprites for clouds 89 | FOR c = 0 TO 3 90 | SPRITE c * 2 + 2, cloud_y(c) - 1, cloud_x(c) - 8, 12 91 | SPRITE c * 2 + 3, cloud_y(c) - 1, cloud_x(c), 14 92 | NEXT c 93 | 94 | ' Video synchronization 95 | WAIT 96 | 97 | ' Update score 98 | PRINT AT 1,<>#puntos 99 | 100 | ' Detect if it should do vertical displacement... 101 | ' ...of the screen. 102 | IF y < 110 AND jump_state = 0 THEN 103 | y = y + 1 104 | FOR c = 0 TO MAX_CLOUDS - 1 105 | cloud_y(c) = cloud_y(c) + 1 106 | IF cloud_y(c) = 192 THEN 107 | cloud_y(c) = -8 108 | GOSUB setup_cloud 109 | END IF 110 | NEXT c 111 | END IF 112 | 113 | ' Detect if the player stands on a cloud 114 | IF jump_state <> 0 AND jump_state < 33 AND standing_on = 255 THEN 115 | FOR c = 0 TO MAX_CLOUDS - 1 116 | IF ABS(cloud_x(c) + 1 - x) < 8 AND ABS(cloud_y(c) - 16 - y) < 3 THEN 117 | jump_state = 0 118 | y = cloud_y(c) - 16 119 | standing_on = c 120 | IF was_on <> standing_on THEN 121 | #puntos = #puntos + 1 122 | END IF 123 | END IF 124 | NEXT c 125 | END IF 126 | 127 | ' Move the clouds 128 | FOR c = 0 TO MAX_CLOUDS - 1 129 | IF cloud_e(c) = 1 THEN ' 1- Left 130 | IF standing_on = c THEN x = x - 2 131 | cloud_x(c) = cloud_x(c) - 2 132 | IF cloud_x(c) < 18 THEN cloud_e(c) = 2 133 | ELSEIF cloud_e(c) = 2 THEN ' 2- Right 134 | IF standing_on = c THEN x = x + 2 135 | cloud_x(c) = cloud_x(c) + 2 136 | IF cloud_x(c) > 238 THEN cloud_e(c) = 1 137 | END IF 138 | NEXT c 139 | 140 | ' Handle jumping. 141 | IF jump_state THEN 142 | IF jump_state >= 33 THEN 143 | jump_state = jump_state - 1 144 | y = y - 2 145 | ELSE 146 | y = y + 2 147 | IF y = 200 OR y = 201 THEN GOTO end_of_game 148 | END IF 149 | END IF 150 | 151 | ' Jump if button pressed 152 | IF cont.button THEN 153 | IF jump_state = 0 THEN 154 | jump_state = 64 155 | was_on = standing_on 156 | standing_on = 255 157 | END IF 158 | END IF 159 | 160 | GOTO main_loop 161 | 162 | ' 163 | ' End of game 164 | ' 165 | end_of_game: 166 | ' Turn off jumping sound effect 167 | SOUND 2, , 0 168 | 169 | ' Final music 170 | PLAY music_end 171 | 172 | PRINT AT 135,"G A M E O V E R" 173 | 174 | FOR c = 1 TO 240 175 | WAIT 176 | NEXT c 177 | 178 | GOTO restart_game 179 | 180 | ' 181 | ' Setup a cloud 182 | ' 183 | setup_cloud: PROCEDURE 184 | 185 | ' 186 | ' Choose a position with margin of 32 pixels at each side. 187 | ' Make sure the minimum distance of 64 pixels... 188 | ' ...against the next cloud so the jump is possible. 189 | ' 190 | DO 191 | cloud_x(c) = RANDOM(96) * 2 + 32 192 | LOOP WHILE ABS(cloud_x(c) + 1 - cloud_x((c + 1) % MAX_CLOUDS)) < 64 193 | 194 | ' Assign a movement direction. 195 | cloud_e(c) = RANDOM(2) + 1 196 | END 197 | 198 | ' 199 | ' Game sprites 200 | ' 201 | sprites_bitmaps: 202 | BITMAP "................" ' Standing 203 | BITMAP "................" 204 | BITMAP "................" 205 | BITMAP "......AAAA......" 206 | BITMAP ".....AAAAAA....." 207 | BITMAP "....AAAAAAAAA..." 208 | BITMAP "...AA44AA44AA..." 209 | BITMAP "...AA44AA44AA..." 210 | BITMAP "..AAAAAAAAAAAA.." 211 | BITMAP ".AAAAAFAAFAAAAA." 212 | BITMAP "AA.A66AAAA66A.AA" 213 | BITMAP "AA.AA666666AA.AA" 214 | BITMAP "AA.AAAAAAAAAA.AA" 215 | BITMAP "999..AA..AA..999" 216 | BITMAP "....555..555...." 217 | BITMAP "...5555..5555..." 218 | 219 | BITMAP ".99..........99." ' Jumping 220 | BITMAP "999..........999" 221 | BITMAP "AAA...AAAA...AAA" 222 | BITMAP ".AA..AAAAAA..AA." 223 | BITMAP ".AA.A44AA44A.AA." 224 | BITMAP ".A.AA44AA44AA.A." 225 | BITMAP ".A.AAAAAAAAAA.A." 226 | BITMAP "..AAAAFAAFAAAA.." 227 | BITMAP "...A66AAAA66A..." 228 | BITMAP "...AA66AA66AA..." 229 | BITMAP "...AAA6666AAA..." 230 | BITMAP "...AAAAAAAAAA..." 231 | BITMAP ".....AA..AA....." 232 | BITMAP ".....AA..AA....." 233 | BITMAP ".....55..55....." 234 | BITMAP "....555..555...." 235 | 236 | BITMAP ".99..........99." ' Falling 237 | BITMAP "999...AAAA...999" 238 | BITMAP ".AA..AAAAAA..AA." 239 | BITMAP ".AA.A44AA44A.AA." 240 | BITMAP ".A.AA44AA44AA.A." 241 | BITMAP ".A.AAAAAAAAAA.A." 242 | BITMAP "..AAAAFAAFAAAA.." 243 | BITMAP "...AAAAFFAAAA..." 244 | BITMAP "...AA666666AA..." 245 | BITMAP "...AAA6666AAA..." 246 | BITMAP "...AAAAAAAAAA..." 247 | BITMAP ".....AA..AA....." 248 | BITMAP ".....AA..AA....." 249 | BITMAP ".....55..55....." 250 | BITMAP ".....55..55....." 251 | BITMAP "....555..555...." 252 | 253 | BITMAP "..FFF1FFF1F....." ' Cloud 254 | BITMAP ".FFFFE1FFE1FE..." 255 | BITMAP ".FFEEFF1FFE1FE.." 256 | BITMAP "FFE11FF1FFE1FE.." 257 | BITMAP "EE1FFF11EEF11E.." 258 | BITMAP ".1FFF1FF111FE..." 259 | BITMAP ".FFFF1FFE1FFFE.." 260 | BITMAP ".FFFF1FFE1FFFFE." 261 | BITMAP "..EEEE..EE..EE.." 262 | BITMAP "................" 263 | BITMAP "................" 264 | BITMAP "................" 265 | BITMAP "................" 266 | BITMAP "................" 267 | BITMAP "................" 268 | BITMAP "................" 269 | 270 | ' 271 | ' Gladiators music (circus entry) 272 | ' 273 | music_gladiators: 274 | DATA BYTE 7 275 | MUSIC C5,C3,-,- 276 | MUSIC S,S,-,- 277 | MUSIC B4,G3,-,- 278 | MUSIC S,S,-,- 279 | MUSIC A4#,G2,-,- 280 | MUSIC B4,S,-,- 281 | MUSIC A4#,G3,-,- 282 | MUSIC A4,S,-,- 283 | 284 | MUSIC G4#,C3,-,- 285 | MUSIC S,S,-,- 286 | MUSIC G4,G3,-,- 287 | MUSIC S,S,-,- 288 | MUSIC F4#,G2,-,- 289 | MUSIC S,S,-,- 290 | MUSIC G4,G3,-,- 291 | MUSIC S,S,-,- 292 | 293 | MUSIC A4,C3,-,- 294 | MUSIC S,S,-,- 295 | MUSIC G4#,G3,-,- 296 | MUSIC S,S,-,- 297 | MUSIC G4,G2,-,- 298 | MUSIC G4#,S,-,- 299 | MUSIC G4,G3,-,- 300 | MUSIC F4#,S,-,- 301 | 302 | MUSIC F4,C3,-,- 303 | MUSIC S,S,-,- 304 | MUSIC E4,G3,-,- 305 | MUSIC S,S,-,- 306 | MUSIC D4#,G2,-,- 307 | MUSIC S,S,-,- 308 | MUSIC E4,G3,-,- 309 | MUSIC S,S,-,- 310 | 311 | MUSIC G4,B2,-,- 312 | MUSIC S,S,-,- 313 | MUSIC F4,G3,-,- 314 | MUSIC F4,S,-,- 315 | MUSIC C4#,G2,-,- 316 | MUSIC S,S,-,- 317 | MUSIC D4,G3,-,- 318 | MUSIC S,S,-,- 319 | 320 | MUSIC G4,B2,-,- 321 | MUSIC S,S,-,- 322 | MUSIC F4,G3,-,- 323 | MUSIC F4,S,-,- 324 | MUSIC C4#,G2,-,- 325 | MUSIC S,S,-,- 326 | MUSIC D4,G3,-,- 327 | MUSIC S,S,-,- 328 | 329 | MUSIC B3,B2,-,- 330 | MUSIC C4,S,-,- 331 | MUSIC C4S,G3,-,- 332 | MUSIC D4,S,-,- 333 | MUSIC D4S,G2,-,- 334 | MUSIC E4,S,-,- 335 | MUSIC F4,G3,-,- 336 | MUSIC F4S,S,-,- 337 | 338 | MUSIC G4,B2,-,- 339 | MUSIC G4S,S,-,- 340 | MUSIC A4,G3,-,- 341 | MUSIC B4,S,-,- 342 | MUSIC A4,G2,-,- 343 | MUSIC S,S,-,- 344 | MUSIC G4,G3,-,- 345 | MUSIC S,S,-,- 346 | 347 | MUSIC REPEAT 348 | 349 | ' 350 | ' Music for end of game. 351 | ' 352 | music_end: 353 | DATA BYTE 20 354 | MUSIC C4,-,-,- 355 | MUSIC G3,-,-,- 356 | MUSIC C3,-,-,- 357 | MUSIC S,-,-,- 358 | MUSIC S,-,-,- 359 | MUSIC S,-,-,- 360 | MUSIC STOP 361 | 362 | -------------------------------------------------------------------------------- /examples/cats_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Animation of cats 3 | ' by Oscar Toledo G. 4 | ' Example for CVBasic 5 | ' 6 | ' Creation date: Apr/27/2025. For Sega Master System. 7 | ' 8 | 9 | DIM x(8),y(8),f(8) 10 | 11 | FOR c = 0 TO 7 12 | x(c) = RANDOM(176) + 32 13 | y(c) = RANDOM(112) + 32 14 | IF c AND 1 THEN f(c) = 4 ELSE f(c) = 0 15 | NEXT c 16 | 17 | DEFINE SPRITE 0,16,cat_sprites 18 | 19 | main_loop: 20 | WAIT 21 | FOR c = 0 TO 7 22 | SPRITE c * 2 + 0, y(c), x(c), f(c) * 4 23 | SPRITE c * 2 + 1, y(c), x(c) + 8, f(c) * 4 + 2 24 | NEXT c 25 | 26 | IF (FRAME AND 7) = 0 THEN 27 | FOR c = 0 TO 7 28 | f(c) = f(c) + 1 29 | IF f(c) = 4 THEN f(c) = 0 30 | IF f(c) = 8 THEN f(c) = 4 31 | NEXT c 32 | END IF 33 | 34 | GOTO main_loop 35 | 36 | ' TMSColor 3.0 Apr/27/2025 37 | ' Command: ../tmscolor/tmscolor -sms -sb -b -i cats_sprites.bmp cats_sprites_sms.bas cat_sprites 38 | ' Created: Sun Apr 27 13:34:22 2025 39 | 40 | ' 41 | ' Sample code: 42 | ' DEFINE SPRITE 0,16,cat_sprites 43 | ' 44 | cat_sprites: 45 | BITMAP "00000000" 46 | BITMAP "00000000" 47 | BITMAP "00000000" 48 | BITMAP "00000000" 49 | BITMAP "00000000" 50 | BITMAP "EE0000EE" 51 | BITMAP "EE00000E" 52 | BITMAP "EE00000F" 53 | 54 | BITMAP "EE00000E" 55 | BITMAP "0EE00000" 56 | BITMAP "0EE0EEEE" 57 | BITMAP "00EEEEEE" 58 | BITMAP "00EEEEEE" 59 | BITMAP "0EEEEEEE" 60 | BITMAP "0E555EE0" 61 | BITMAP "EEEEE0E0" 62 | 63 | 64 | BITMAP "00000000" 65 | BITMAP "E000E000" 66 | BITMAP "E500E000" 67 | BITMAP "EE5EE000" 68 | BITMAP "EE555000" 69 | BITMAP "52252EE0" 70 | BITMAP "52252E00" 71 | BITMAP "FFE5EFFF" 72 | 73 | BITMAP "5EEEEE00" 74 | BITMAP "FFEEFFF0" 75 | BITMAP "E5EEE000" 76 | BITMAP "EEE0E500" 77 | BITMAP "EEE0E500" 78 | BITMAP "05E0E500" 79 | BITMAP "05E0E500" 80 | BITMAP "0EE0EE00" 81 | 82 | 83 | BITMAP "00000000" 84 | BITMAP "0000000E" 85 | BITMAP "0000000E" 86 | BITMAP "0000000E" 87 | BITMAP "0000000E" 88 | BITMAP "EE000EE5" 89 | BITMAP "EE0000E5" 90 | BITMAP "EE0000FF" 91 | 92 | BITMAP "EE0000E5" 93 | BITMAP "0EE0000F" 94 | BITMAP "0EE0EEEE" 95 | BITMAP "00EEEEEE" 96 | BITMAP "00EEEEEE" 97 | BITMAP "0EEEEEEE" 98 | BITMAP "0E555EE0" 99 | BITMAP "EEEEE0E0" 100 | 101 | 102 | BITMAP "00000000" 103 | BITMAP "000E0000" 104 | BITMAP "500E0000" 105 | BITMAP "E5EE0000" 106 | BITMAP "E5550000" 107 | BITMAP "2522EE00" 108 | BITMAP "2522E000" 109 | BITMAP "FE5EFFF0" 110 | 111 | BITMAP "EEEEE000" 112 | BITMAP "FEEFFF00" 113 | BITMAP "5EEE0000" 114 | BITMAP "EEE0E500" 115 | BITMAP "EEE0E500" 116 | BITMAP "05E0E500" 117 | BITMAP "05E0E500" 118 | BITMAP "0EE0EE00" 119 | 120 | 121 | BITMAP "0000000E" 122 | BITMAP "0000000E" 123 | BITMAP "0000000E" 124 | BITMAP "0000000E" 125 | BITMAP "00000EE5" 126 | BITMAP "EE0000E5" 127 | BITMAP "EE0000FF" 128 | BITMAP "EE0000E5" 129 | 130 | BITMAP "EE00000F" 131 | BITMAP "0EE00EEE" 132 | BITMAP "0EE0EEEE" 133 | BITMAP "00EEEEEE" 134 | BITMAP "00EEEEEE" 135 | BITMAP "0EEEEEEE" 136 | BITMAP "0E555EE0" 137 | BITMAP "EEEEE0E0" 138 | 139 | 140 | BITMAP "00000000" 141 | BITMAP "5000E000" 142 | BITMAP "E5EEE000" 143 | BITMAP "E5EE0000" 144 | BITMAP "2555EE00" 145 | BITMAP "2522E000" 146 | BITMAP "FE22FFF0" 147 | BITMAP "EEEEE000" 148 | 149 | BITMAP "FEEFFF00" 150 | BITMAP "5EEE0000" 151 | BITMAP "5EEE0000" 152 | BITMAP "EEE0E500" 153 | BITMAP "EEE0E500" 154 | BITMAP "05E0E500" 155 | BITMAP "05E0E500" 156 | BITMAP "0EE0EE00" 157 | 158 | 159 | BITMAP "00000000" 160 | BITMAP "00000000" 161 | BITMAP "0000000E" 162 | BITMAP "0000000E" 163 | BITMAP "0000000E" 164 | BITMAP "EE000EE5" 165 | BITMAP "EE0000E5" 166 | BITMAP "EE0000E5" 167 | 168 | BITMAP "EE0000FF" 169 | BITMAP "0EE0000E" 170 | BITMAP "0EE0EEEF" 171 | BITMAP "00EEEEEE" 172 | BITMAP "00EEEEEE" 173 | BITMAP "0EEEEEEE" 174 | BITMAP "0E555EE0" 175 | BITMAP "EEEEE0E0" 176 | 177 | 178 | BITMAP "00000000" 179 | BITMAP "00000000" 180 | BITMAP "000E0000" 181 | BITMAP "55EE0000" 182 | BITMAP "E5550000" 183 | BITMAP "5555EE00" 184 | BITMAP "2522E000" 185 | BITMAP "2E22E000" 186 | 187 | BITMAP "EEEEFFF0" 188 | BITMAP "EEEEE000" 189 | BITMAP "FEEFFF00" 190 | BITMAP "EEE0E500" 191 | BITMAP "EEE0E500" 192 | BITMAP "05E0E500" 193 | BITMAP "05E0E500" 194 | BITMAP "0EE0EE00" 195 | 196 | 197 | BITMAP "00000000" 198 | BITMAP "00000000" 199 | BITMAP "00008000" 200 | BITMAP "00008855" 201 | BITMAP "00005558" 202 | BITMAP "00885555" 203 | BITMAP "00082252" 204 | BITMAP "00082282" 205 | 206 | BITMAP "0FFF8888" 207 | BITMAP "00088888" 208 | BITMAP "00FFF88F" 209 | BITMAP "00580888" 210 | BITMAP "00580888" 211 | BITMAP "00580850" 212 | BITMAP "00580850" 213 | BITMAP "00880880" 214 | 215 | 216 | BITMAP "00000000" 217 | BITMAP "00000000" 218 | BITMAP "80000000" 219 | BITMAP "80000000" 220 | BITMAP "80000000" 221 | BITMAP "58800088" 222 | BITMAP "58000088" 223 | BITMAP "58000088" 224 | 225 | BITMAP "FF000088" 226 | BITMAP "80000880" 227 | BITMAP "F8880880" 228 | BITMAP "88888800" 229 | BITMAP "88888800" 230 | BITMAP "88888880" 231 | BITMAP "08855580" 232 | BITMAP "08088888" 233 | 234 | 235 | BITMAP "00000000" 236 | BITMAP "00080005" 237 | BITMAP "00088858" 238 | BITMAP "00008858" 239 | BITMAP "00885552" 240 | BITMAP "00082252" 241 | BITMAP "0FFF228F" 242 | BITMAP "00088888" 243 | 244 | BITMAP "00FFF88F" 245 | BITMAP "00008885" 246 | BITMAP "00008885" 247 | BITMAP "00580888" 248 | BITMAP "00580888" 249 | BITMAP "00580850" 250 | BITMAP "00580850" 251 | BITMAP "00880880" 252 | 253 | 254 | BITMAP "80000000" 255 | BITMAP "80000000" 256 | BITMAP "80000000" 257 | BITMAP "80000000" 258 | BITMAP "58800000" 259 | BITMAP "58000088" 260 | BITMAP "FF000088" 261 | BITMAP "58000088" 262 | 263 | BITMAP "F0000088" 264 | BITMAP "88800880" 265 | BITMAP "88880880" 266 | BITMAP "88888800" 267 | BITMAP "88888800" 268 | BITMAP "88888880" 269 | BITMAP "08855580" 270 | BITMAP "08088888" 271 | 272 | 273 | BITMAP "00000000" 274 | BITMAP "00008000" 275 | BITMAP "00008005" 276 | BITMAP "00008858" 277 | BITMAP "00005558" 278 | BITMAP "00882252" 279 | BITMAP "00082252" 280 | BITMAP "0FFF858F" 281 | 282 | BITMAP "00088888" 283 | BITMAP "00FFF88F" 284 | BITMAP "00008885" 285 | BITMAP "00580888" 286 | BITMAP "00580888" 287 | BITMAP "00580850" 288 | BITMAP "00580850" 289 | BITMAP "00880880" 290 | 291 | 292 | BITMAP "00000000" 293 | BITMAP "80000000" 294 | BITMAP "80000000" 295 | BITMAP "80000000" 296 | BITMAP "80000000" 297 | BITMAP "58800088" 298 | BITMAP "58000088" 299 | BITMAP "FF000088" 300 | 301 | BITMAP "58000088" 302 | BITMAP "F0000880" 303 | BITMAP "88880880" 304 | BITMAP "88888800" 305 | BITMAP "88888800" 306 | BITMAP "88888880" 307 | BITMAP "08855580" 308 | BITMAP "08088888" 309 | 310 | 311 | BITMAP "00000000" 312 | BITMAP "00080008" 313 | BITMAP "00080058" 314 | BITMAP "00088588" 315 | BITMAP "00055588" 316 | BITMAP "08825225" 317 | BITMAP "00825225" 318 | BITMAP "FFF858FF" 319 | 320 | BITMAP "00888885" 321 | BITMAP "0FFF88FF" 322 | BITMAP "00088858" 323 | BITMAP "00580888" 324 | BITMAP "00580888" 325 | BITMAP "00580850" 326 | BITMAP "00580850" 327 | BITMAP "00880880" 328 | 329 | 330 | BITMAP "00000000" 331 | BITMAP "00000000" 332 | BITMAP "00000000" 333 | BITMAP "00000000" 334 | BITMAP "00000000" 335 | BITMAP "88000088" 336 | BITMAP "80000088" 337 | BITMAP "F0000088" 338 | 339 | BITMAP "80000088" 340 | BITMAP "00000880" 341 | BITMAP "88880880" 342 | BITMAP "88888800" 343 | BITMAP "88888800" 344 | BITMAP "88888880" 345 | BITMAP "08855580" 346 | BITMAP "08088888" 347 | 348 | 349 | -------------------------------------------------------------------------------- /examples/controller.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Controller test 3 | ' 4 | ' by Oscar Toledo G. 5 | ' 6 | ' Creation date: Aug/21/2024. 7 | ' Revision date: Oct/15/2024. Solved wrong display for number key in 2nd controller. 8 | ' 9 | 10 | CONST left_x = 56 11 | CONST left_y = 40 12 | CONST right_x = 160 13 | CONST right_y = 40 14 | 15 | DEF FN CHAR_XY(x, y) = ((y) / 8 * 32 + (x) / 8) 16 | 17 | MODE 2 ' Color for sets of 8 characters. 18 | 19 | DEFINE CHAR 27,7,extra_bitmaps 20 | 21 | VPOKE $2003, $E1 ' Color for characters $18-$1f 22 | VPOKE $2004, $14 ' $20-$27 23 | VPOKE $2005, $1F ' $28-$29 24 | VPOKE $2006, $1F ' $30-$37 25 | VPOKE $2007, $1F ' $38-$3f 26 | VPOKE $2008, $F4 ' $40-$47 27 | VPOKE $2009, $F4 ' $48-$4f 28 | VPOKE $200A, $F4 ' $50-$57 29 | VPOKE $200B, $F4 ' $58-$5f 30 | VPOKE $200C, $F4 ' $60-$67 31 | VPOKE $200D, $F4 ' $68-$6f 32 | VPOKE $200E, $F4 ' $70-$77 33 | VPOKE $200F, $F4 ' $78-$7f 34 | 35 | ' Center numbers bitmaps 36 | FOR #c = $0150 TO $01CF 37 | d = VPEEK(#c) 38 | VPOKE #c, (d / 2) OR (d / 4) 39 | NEXT #c 40 | DEFINE CHAR 42,2,number_bitmap 41 | 42 | VDP(1) = $E0 ' 8x8 sprites 43 | VDP(6) = $00 ' Sprites use character bitmaps. 44 | 45 | PRINT AT 36,"CVBasic controller test" 46 | 47 | #c = CHAR_XY(left_x, left_y) 48 | GOSUB draw_controller 49 | #c = CHAR_XY(right_x, right_y) 50 | GOSUB draw_controller 51 | 52 | main_loop: 53 | WHILE 1 54 | IF cont1.up THEN 55 | SPRITE 0, left_y - 1, left_x + 16, 27, 9 56 | ELSE 57 | SPRITE 0, $d1, 0, 0, 0 58 | END IF 59 | IF cont1.left THEN 60 | SPRITE 1, left_y + 15, left_x, 30, 9 61 | ELSE 62 | SPRITE 1, $d1, 0, 0, 0 63 | END IF 64 | IF cont1.right THEN 65 | SPRITE 2, left_y + 15, left_x + 32, 28, 9 66 | ELSE 67 | SPRITE 2, $d1, 0, 0, 0 68 | END IF 69 | IF cont1.down THEN 70 | SPRITE 3, left_y + 31, left_x + 16, 29, 9 71 | ELSE 72 | SPRITE 3, $d1, 0, 0, 0 73 | END IF 74 | IF cont1.button THEN 75 | SPRITE 4, left_y + 47, left_x - 8, 31, 9 76 | ELSE 77 | SPRITE 4, $d1, 0, 0, 0 78 | END IF 79 | IF cont1.button2 THEN 80 | SPRITE 5, left_y + 47, left_x + 40, 31, 9 81 | ELSE 82 | SPRITE 5, $d1, 0, 0, 0 83 | END IF 84 | c = cont1.key 85 | IF c = 15 THEN 86 | SPRITE 6, $d1, 0, 0, 0 87 | ELSE 88 | GOSUB prepare_key 89 | SPRITE 6, left_y + y, left_x + x, c, 9 90 | END IF 91 | IF cont2.up THEN 92 | SPRITE 7, right_y - 1, right_x + 16, 27, 9 93 | ELSE 94 | SPRITE 7, $d1, 0, 0, 0 95 | END IF 96 | IF cont2.left THEN 97 | SPRITE 8, right_y + 15, right_x, 30, 9 98 | ELSE 99 | SPRITE 8, $d1, 0, 0, 0 100 | END IF 101 | IF cont2.right THEN 102 | SPRITE 9, right_y + 15, right_x + 32, 28, 9 103 | ELSE 104 | SPRITE 9, $d1, 0, 0, 0 105 | END IF 106 | IF cont2.down THEN 107 | SPRITE 10, right_y + 31, right_x + 16, 29, 9 108 | ELSE 109 | SPRITE 10, $d1, 0, 0, 0 110 | END IF 111 | IF cont2.button THEN 112 | SPRITE 11, right_y + 47, right_x - 8, 31, 9 113 | ELSE 114 | SPRITE 11, $d1, 0, 0, 0 115 | END IF 116 | IF cont2.button2 THEN 117 | SPRITE 12, right_y + 47, right_x + 40, 31, 9 118 | ELSE 119 | SPRITE 12, $d1, 0, 0, 0 120 | END IF 121 | c = cont2.key 122 | IF c = 15 THEN 123 | SPRITE 14, $d1, 0, 0, 0 124 | ELSE 125 | GOSUB prepare_key 126 | SPRITE 14, right_y + y, right_x + x, c, 9 127 | END IF 128 | 129 | WAIT 130 | 131 | WEND 132 | 133 | draw_controller: PROCEDURE 134 | FOR #d = #c - $0021 TO #c + $01DF STEP $20 135 | PRINT AT #d, "!!!!!!!" 136 | NEXT #d 137 | 138 | PRINT AT #c + $0000, "!!\27!!" 139 | PRINT AT #c + $0040, "\30!\31!\28" 140 | PRINT AT #c + $0080, "!!\29!!" 141 | PRINT AT #c + $00bf, "\31!!!!!\31" 142 | PRINT AT #c + $0100, "1!2!3" 143 | PRINT AT #c + $0140, "4!5!6" 144 | PRINT AT #c + $0180, "7!8!9" 145 | PRINT AT #c + $01C0, "*!0!+" 146 | END 147 | 148 | prepare_key: PROCEDURE 149 | IF c = 0 THEN 150 | x = 16 151 | y = 111 152 | c = 48 153 | ELSEIF c = 10 THEN 154 | x = 0 155 | y = 111 156 | c = 42 157 | ELSEIF c = 11 THEN 158 | x = 32 159 | y = 111 160 | c = 43 161 | ELSEIF c > 0 AND c < 10 THEN 162 | x = ((c - 1) % 3) * 16 163 | y = 63 + ((c - 1) / 3) * 16 164 | c = c + 48 165 | ELSE 166 | ' Some systems have extra characters 167 | x = 16 168 | y = 127 169 | END IF 170 | END 171 | 172 | extra_bitmaps: 173 | BITMAP "...XX..." 174 | BITMAP "..XXXX.." 175 | BITMAP ".XXXXXX." 176 | BITMAP "...XX..." 177 | BITMAP "...XX..." 178 | BITMAP "...XX..." 179 | BITMAP "...XX..." 180 | BITMAP "...XX..." 181 | 182 | BITMAP "........" 183 | BITMAP ".....X.." 184 | BITMAP ".....XX." 185 | BITMAP "XXXXXXXX" 186 | BITMAP "XXXXXXXX" 187 | BITMAP ".....XX." 188 | BITMAP ".....X.." 189 | BITMAP "........" 190 | 191 | BITMAP "...XX..." 192 | BITMAP "...XX..." 193 | BITMAP "...XX..." 194 | BITMAP "...XX..." 195 | BITMAP "...XX..." 196 | BITMAP ".XXXXXX." 197 | BITMAP "..XXXX.." 198 | BITMAP "...XX..." 199 | 200 | BITMAP "........" 201 | BITMAP "..X....." 202 | BITMAP ".XX....." 203 | BITMAP "XXXXXXXX" 204 | BITMAP "XXXXXXXX" 205 | BITMAP ".XX....." 206 | BITMAP "..X....." 207 | BITMAP "........" 208 | 209 | BITMAP "..XXXX.." 210 | BITMAP ".XXXXXX." 211 | BITMAP "XXXXXXXX" 212 | BITMAP "XXXXXXXX" 213 | BITMAP "XXXXXXXX" 214 | BITMAP "XXXXXXXX" 215 | BITMAP ".XXXXXX." 216 | BITMAP "..XXXX.." 217 | 218 | BITMAP "........" 219 | BITMAP "........" 220 | BITMAP "........" 221 | BITMAP "........" 222 | BITMAP "........" 223 | BITMAP "........" 224 | BITMAP "........" 225 | BITMAP "........" 226 | 227 | BITMAP "XXXXXXXX" 228 | BITMAP "XXXXXXXX" 229 | BITMAP "XXXXXXXX" 230 | BITMAP "XXXXXXXX" 231 | BITMAP "XXXXXXXX" 232 | BITMAP "XXXXXXXX" 233 | BITMAP "XXXXXXXX" 234 | BITMAP "XXXXXXXX" 235 | 236 | number_bitmap: 237 | BITMAP "........" 238 | BITMAP ".XX..XX." 239 | BITMAP "..XXXX.." 240 | BITMAP ".XXXXXX." 241 | BITMAP "..XXXX.." 242 | BITMAP ".XX..XX." 243 | BITMAP "........" 244 | BITMAP "........" 245 | 246 | BITMAP "..XX.XX." 247 | BITMAP "..XX.XX." 248 | BITMAP ".XXXXXXX" 249 | BITMAP "..XX.XX." 250 | BITMAP ".XXXXXXX" 251 | BITMAP "..XX.XX." 252 | BITMAP "..XX.XX." 253 | BITMAP "........" 254 | -------------------------------------------------------------------------------- /examples/demo.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Demo of graphics for CVBasic 3 | ' 4 | ' by Oscar Toledo G. 5 | ' 6 | ' Creation date: Mar/08/2024. 7 | ' Revision date: Aug/06/2024. Added endless loop. 8 | ' 9 | 10 | DIM x(32),y(32),col(32) 11 | 12 | MODE 0 13 | 14 | DEFINE SPRITE 0,1,sprite_bitmap 15 | 16 | ' Make a bold font 17 | FOR #c = $0900 TO $0BFF 18 | d = VPEEK(#c) 19 | VPOKE #c, d OR (d + d) 20 | NEXT #c 21 | FOR #c = $2900 TO $2BFF 22 | VPOKE #c, $71 23 | NEXT #c 24 | 25 | DEFINE CHAR 128,50,image_char 26 | DEFINE COLOR 128,50,image_color 27 | 28 | WHILE 1 29 | 30 | CLS 31 | 32 | SCREEN image_pattern,0,260,8,8,8 33 | 34 | GOSUB small_wait 35 | 36 | RESTORE message_1 37 | 38 | GOSUB show_message 39 | 40 | GOSUB small_wait 41 | 42 | FOR c = 0 TO 7 43 | WAIT 44 | WAIT 45 | #c = 260 + c * 32 46 | SCREEN spaces,0,#c,8,1 47 | SCREEN image_pattern,0,#c+32,8,8,8 48 | NEXT c 49 | 50 | FOR c = 0 TO 7 51 | WAIT 52 | WAIT 53 | #c = 516 + c 54 | SCREEN spaces,0,#c,1,8,1 55 | SCREEN image_pattern,0,#c+1,8,8,8 56 | NEXT c 57 | 58 | RESTORE message_2 59 | 60 | GOSUB show_message 61 | 62 | GOSUB small_wait 63 | 64 | FOR c = 0 TO 144 65 | WAIT 66 | SPRITE 0,$A0,c,$00,$0f 67 | NEXT c 68 | 69 | RESTORE message_3 70 | 71 | GOSUB show_message 72 | 73 | GOSUB small_wait 74 | 75 | FOR c = 0 TO 31 76 | x(c) = RANDOM(176) 77 | y(c) = RANDOM(240) 78 | col(c) = (c % 14) + 2 79 | SPRITE c AND 31,y(c),x(c),$00,col(c) 80 | NEXT c 81 | 82 | FOR c = 0 TO 240 83 | WAIT 84 | FOR d = 0 TO 15 85 | SPRITE d,y(d),x(d),$00,col(d) 86 | y(d) = y(d) + 1 87 | IF y(d) = $c0 THEN y(d) = $f1 88 | NEXT d 89 | FOR d = 16 TO 31 90 | SPRITE d,y(d),x(d),$00,col(d) 91 | x(d) = x(d) + 1 92 | IF x(d) = $ff THEN x(d) = $00 93 | NEXT d 94 | NEXT c 95 | 96 | FOR c = 0 TO 31 97 | SPRITE c,$d1,0,0,0 98 | NEXT c 99 | 100 | RESTORE message_4 101 | 102 | GOSUB show_message 103 | 104 | GOSUB small_wait 105 | 106 | WEND 107 | 108 | spaces: 109 | DATA BYTE $20,$20,$20,$20,$20,$20,$20,$20 110 | 111 | INCLUDE "portrait.bas" 112 | 113 | small_wait: PROCEDURE 114 | FOR c = 0 TO 60 115 | WAIT 116 | NEXT c 117 | END 118 | 119 | show_message: PROCEDURE 120 | 121 | ' 122 | ' Erase area. 123 | ' 124 | FOR #position = $190e TO $19ee STEP 32 125 | FOR #c = 0 TO $11 126 | VPOKE #position + #c, 32 127 | NEXT #c 128 | NEXT #position 129 | 130 | ' 131 | ' Draw message. 132 | ' 133 | #position = $1800 + 270 134 | DO 135 | READ BYTE d 136 | IF d = $0D THEN 137 | #position = ((#position + 32) AND $FFE0) + $000e 138 | ELSEIF d <> 0 THEN 139 | VPOKE #position, d 140 | #position = #position + 1 141 | END IF 142 | WAIT 143 | LOOP WHILE d 144 | 145 | END 146 | 147 | message_1: 148 | DATA BYTE "Hi! This is a",$0d 149 | DATA BYTE "CVBasic demo",$0d 150 | DATA BYTE "program.",$00 151 | 152 | message_2: 153 | DATA BYTE "You can displace",$0d 154 | DATA BYTE "graphics moving",$0d 155 | DATA BYTE "tiles on the",$0d 156 | DATA BYTE "screen instead of",$0d 157 | DATA BYTE "graphic data.",$00 158 | 159 | message_3: 160 | DATA BYTE "Sprites can",$0d 161 | DATA BYTE "overlay",$0d 162 | DATA BYTE "background",$0d 163 | DATA BYTE "graphics.",$00 164 | 165 | message_4: 166 | DATA BYTE "I hope you",$0d 167 | DATA BYTE "enjoyed the",$0d 168 | DATA BYTE "demo.",$00 169 | 170 | sprite_bitmap: 171 | BITMAP "XXXXXXXXXXXXXXXX" 172 | BITMAP "XXXXXXXXXXXXXXXX" 173 | BITMAP "XXXXXXXXXXXXXXXX" 174 | BITMAP "XXXXXXXXXXXXXXXX" 175 | BITMAP "XXXXXXXXXXXXXXXX" 176 | BITMAP "XXXXXXXXXXXXXXXX" 177 | BITMAP "XXXXXXXXXXXXXXXX" 178 | BITMAP "XXXXXXXXXXXXXXXX" 179 | BITMAP "XXXXXXXXXXXXXXXX" 180 | BITMAP "XXXXXXXXXXXXXXXX" 181 | BITMAP "XXXXXXXXXXXXXXXX" 182 | BITMAP "XXXXXXXXXXXXXXXX" 183 | BITMAP "XXXXXXXXXXXXXXXX" 184 | BITMAP "XXXXXXXXXXXXXXXX" 185 | BITMAP "XXXXXXXXXXXXXXXX" 186 | BITMAP "XXXXXXXXXXXXXXXX" 187 | -------------------------------------------------------------------------------- /examples/demo_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Demo of graphics for CVBasic 3 | ' 4 | ' by Oscar Toledo G. 5 | ' 6 | ' Creation date: Mar/08/2024. 7 | ' Revision date: Aug/06/2024. Added endless loop. 8 | ' Revision date: Apr/27/2025. Adapted for Sega Master System. 9 | ' 10 | 11 | DIM x(32),y(32),col(32) 12 | 13 | MODE 4 14 | 15 | DEFINE SPRITE 0,28,sprite_bitmap 16 | 17 | ' Make a bold font 18 | FOR #c = $0400 TO $0FFF 19 | d = VPEEK(#c) 20 | VPOKE #c, d OR (d + d) 21 | NEXT #c 22 | FOR #c = $0403 TO $0FFF STEP 4 23 | VPOKE #c, 0 24 | NEXT #c 25 | 26 | DEFINE CHAR 128,62,portrait_char 27 | 28 | WHILE 1 29 | 30 | CLS 31 | 32 | SCREEN portrait_pattern,0,260,8,8,8 33 | 34 | GOSUB small_wait 35 | 36 | RESTORE message_1 37 | 38 | GOSUB show_message 39 | 40 | GOSUB small_wait 41 | 42 | FOR c = 0 TO 7 43 | WAIT 44 | WAIT 45 | #c = 260 + c * 32 46 | SCREEN spaces,0,#c,8,1 47 | SCREEN portrait_pattern,0,#c+32,8,8,8 48 | NEXT c 49 | 50 | FOR c = 0 TO 7 51 | WAIT 52 | WAIT 53 | #c = 516 + c 54 | SCREEN spaces,0,#c,1,8,1 55 | SCREEN portrait_pattern,0,#c+1,8,8,8 56 | NEXT c 57 | 58 | RESTORE message_2 59 | 60 | GOSUB show_message 61 | 62 | GOSUB small_wait 63 | 64 | FOR c = 0 TO 144 65 | WAIT 66 | SPRITE 0,$A0,c,$00 67 | SPRITE 1,$A0,c+8,$02 68 | NEXT c 69 | 70 | RESTORE message_3 71 | 72 | GOSUB show_message 73 | 74 | GOSUB small_wait 75 | 76 | FOR c = 0 TO 31 77 | x(c) = RANDOM(176) 78 | y(c) = RANDOM(240) 79 | col(c) = (c % 14) * 4 80 | SPRITE c * 2,y(c),x(c),col(c) 81 | SPRITE c * 2 + 1,y(c),x(c) + 8,col(c) + 2 82 | NEXT c 83 | 84 | FOR c = 0 TO 240 85 | WAIT 86 | FOR d = 0 TO 15 87 | SPRITE d * 2,y(d),x(d),col(d) 88 | SPRITE d * 2 + 1,y(d),x(d) + 8,col(d) + 2 89 | y(d) = y(d) + 1 90 | IF y(d) = $c0 THEN y(d) = $f1 91 | NEXT d 92 | FOR d = 16 TO 31 93 | SPRITE d * 2,y(d),x(d),col(d) 94 | SPRITE d * 2 + 1,y(d),x(d) + 8,col(d) + 2 95 | x(d) = x(d) + 1 96 | IF x(d) = $ff THEN x(d) = $00 97 | NEXT d 98 | NEXT c 99 | 100 | FOR c = 0 TO 63 101 | SPRITE c,$E0,0,0 102 | NEXT c 103 | 104 | RESTORE message_4 105 | 106 | GOSUB show_message 107 | 108 | GOSUB small_wait 109 | 110 | WEND 111 | 112 | spaces: 113 | DATA BYTE $20,$00,$20,$00,$20,$00,$20,$00,$20,$00,$20,$00,$20,$00,$20,$00 114 | 115 | INCLUDE "portrait_sms.bas" 116 | 117 | small_wait: PROCEDURE 118 | FOR c = 0 TO 60 119 | WAIT 120 | NEXT c 121 | END 122 | 123 | show_message: PROCEDURE 124 | 125 | ' 126 | ' Erase area. 127 | ' 128 | FOR #position = $3A1C TO $3BDC STEP 64 129 | FOR #c = 0 TO $22 STEP 2 130 | VPOKE #position + #c, 32 131 | NEXT #c 132 | NEXT #position 133 | 134 | ' 135 | ' Draw message. 136 | ' 137 | #position = $3800 + 270 * 2 138 | DO 139 | READ BYTE d 140 | IF d = $0D THEN 141 | #position = ((#position + 64) AND $FFC0) + $001C 142 | ELSEIF d <> 0 THEN 143 | VPOKE #position, d 144 | #position = #position + 2 145 | END IF 146 | WAIT 147 | LOOP WHILE d 148 | 149 | END 150 | 151 | message_1: 152 | DATA BYTE "Hi! This is a",$0d 153 | DATA BYTE "CVBasic demo",$0d 154 | DATA BYTE "program.",$00 155 | 156 | message_2: 157 | DATA BYTE "You can displace",$0d 158 | DATA BYTE "graphics moving",$0d 159 | DATA BYTE "tiles on the",$0d 160 | DATA BYTE "screen instead of",$0d 161 | DATA BYTE "graphic data.",$00 162 | 163 | message_3: 164 | DATA BYTE "Sprites can",$0d 165 | DATA BYTE "overlay",$0d 166 | DATA BYTE "background",$0d 167 | DATA BYTE "graphics.",$00 168 | 169 | message_4: 170 | DATA BYTE "I hope you",$0d 171 | DATA BYTE "enjoyed the",$0d 172 | DATA BYTE "demo.",$00 173 | 174 | sprite_bitmap: 175 | BITMAP "2222222222222222" 176 | BITMAP "2222222222222222" 177 | BITMAP "2222222222222222" 178 | BITMAP "2222222222222222" 179 | BITMAP "2222222222222222" 180 | BITMAP "2222222222222222" 181 | BITMAP "2222222222222222" 182 | BITMAP "2222222222222222" 183 | BITMAP "2222222222222222" 184 | BITMAP "2222222222222222" 185 | BITMAP "2222222222222222" 186 | BITMAP "2222222222222222" 187 | BITMAP "2222222222222222" 188 | BITMAP "2222222222222222" 189 | BITMAP "2222222222222222" 190 | BITMAP "2222222222222222" 191 | 192 | BITMAP "3333333333333333" 193 | BITMAP "3333333333333333" 194 | BITMAP "3333333333333333" 195 | BITMAP "3333333333333333" 196 | BITMAP "3333333333333333" 197 | BITMAP "3333333333333333" 198 | BITMAP "3333333333333333" 199 | BITMAP "3333333333333333" 200 | BITMAP "3333333333333333" 201 | BITMAP "3333333333333333" 202 | BITMAP "3333333333333333" 203 | BITMAP "3333333333333333" 204 | BITMAP "3333333333333333" 205 | BITMAP "3333333333333333" 206 | BITMAP "3333333333333333" 207 | BITMAP "3333333333333333" 208 | 209 | BITMAP "4444444444444444" 210 | BITMAP "4444444444444444" 211 | BITMAP "4444444444444444" 212 | BITMAP "4444444444444444" 213 | BITMAP "4444444444444444" 214 | BITMAP "4444444444444444" 215 | BITMAP "4444444444444444" 216 | BITMAP "4444444444444444" 217 | BITMAP "4444444444444444" 218 | BITMAP "4444444444444444" 219 | BITMAP "4444444444444444" 220 | BITMAP "4444444444444444" 221 | BITMAP "4444444444444444" 222 | BITMAP "4444444444444444" 223 | BITMAP "4444444444444444" 224 | BITMAP "4444444444444444" 225 | 226 | BITMAP "5555555555555555" 227 | BITMAP "5555555555555555" 228 | BITMAP "5555555555555555" 229 | BITMAP "5555555555555555" 230 | BITMAP "5555555555555555" 231 | BITMAP "5555555555555555" 232 | BITMAP "5555555555555555" 233 | BITMAP "5555555555555555" 234 | BITMAP "5555555555555555" 235 | BITMAP "5555555555555555" 236 | BITMAP "5555555555555555" 237 | BITMAP "5555555555555555" 238 | BITMAP "5555555555555555" 239 | BITMAP "5555555555555555" 240 | BITMAP "5555555555555555" 241 | BITMAP "5555555555555555" 242 | 243 | BITMAP "6666666666666666" 244 | BITMAP "6666666666666666" 245 | BITMAP "6666666666666666" 246 | BITMAP "6666666666666666" 247 | BITMAP "6666666666666666" 248 | BITMAP "6666666666666666" 249 | BITMAP "6666666666666666" 250 | BITMAP "6666666666666666" 251 | BITMAP "6666666666666666" 252 | BITMAP "6666666666666666" 253 | BITMAP "6666666666666666" 254 | BITMAP "6666666666666666" 255 | BITMAP "6666666666666666" 256 | BITMAP "6666666666666666" 257 | BITMAP "6666666666666666" 258 | BITMAP "6666666666666666" 259 | 260 | BITMAP "7777777777777777" 261 | BITMAP "7777777777777777" 262 | BITMAP "7777777777777777" 263 | BITMAP "7777777777777777" 264 | BITMAP "7777777777777777" 265 | BITMAP "7777777777777777" 266 | BITMAP "7777777777777777" 267 | BITMAP "7777777777777777" 268 | BITMAP "7777777777777777" 269 | BITMAP "7777777777777777" 270 | BITMAP "7777777777777777" 271 | BITMAP "7777777777777777" 272 | BITMAP "7777777777777777" 273 | BITMAP "7777777777777777" 274 | BITMAP "7777777777777777" 275 | BITMAP "7777777777777777" 276 | 277 | BITMAP "8888888888888888" 278 | BITMAP "8888888888888888" 279 | BITMAP "8888888888888888" 280 | BITMAP "8888888888888888" 281 | BITMAP "8888888888888888" 282 | BITMAP "8888888888888888" 283 | BITMAP "8888888888888888" 284 | BITMAP "8888888888888888" 285 | BITMAP "8888888888888888" 286 | BITMAP "8888888888888888" 287 | BITMAP "8888888888888888" 288 | BITMAP "8888888888888888" 289 | BITMAP "8888888888888888" 290 | BITMAP "8888888888888888" 291 | BITMAP "8888888888888888" 292 | BITMAP "8888888888888888" 293 | 294 | BITMAP "9999999999999999" 295 | BITMAP "9999999999999999" 296 | BITMAP "9999999999999999" 297 | BITMAP "9999999999999999" 298 | BITMAP "9999999999999999" 299 | BITMAP "9999999999999999" 300 | BITMAP "9999999999999999" 301 | BITMAP "9999999999999999" 302 | BITMAP "9999999999999999" 303 | BITMAP "9999999999999999" 304 | BITMAP "9999999999999999" 305 | BITMAP "9999999999999999" 306 | BITMAP "9999999999999999" 307 | BITMAP "9999999999999999" 308 | BITMAP "9999999999999999" 309 | BITMAP "9999999999999999" 310 | 311 | BITMAP "AAAAAAAAAAAAAAAA" 312 | BITMAP "AAAAAAAAAAAAAAAA" 313 | BITMAP "AAAAAAAAAAAAAAAA" 314 | BITMAP "AAAAAAAAAAAAAAAA" 315 | BITMAP "AAAAAAAAAAAAAAAA" 316 | BITMAP "AAAAAAAAAAAAAAAA" 317 | BITMAP "AAAAAAAAAAAAAAAA" 318 | BITMAP "AAAAAAAAAAAAAAAA" 319 | BITMAP "AAAAAAAAAAAAAAAA" 320 | BITMAP "AAAAAAAAAAAAAAAA" 321 | BITMAP "AAAAAAAAAAAAAAAA" 322 | BITMAP "AAAAAAAAAAAAAAAA" 323 | BITMAP "AAAAAAAAAAAAAAAA" 324 | BITMAP "AAAAAAAAAAAAAAAA" 325 | BITMAP "AAAAAAAAAAAAAAAA" 326 | BITMAP "AAAAAAAAAAAAAAAA" 327 | 328 | BITMAP "BBBBBBBBBBBBBBBB" 329 | BITMAP "BBBBBBBBBBBBBBBB" 330 | BITMAP "BBBBBBBBBBBBBBBB" 331 | BITMAP "BBBBBBBBBBBBBBBB" 332 | BITMAP "BBBBBBBBBBBBBBBB" 333 | BITMAP "BBBBBBBBBBBBBBBB" 334 | BITMAP "BBBBBBBBBBBBBBBB" 335 | BITMAP "BBBBBBBBBBBBBBBB" 336 | BITMAP "BBBBBBBBBBBBBBBB" 337 | BITMAP "BBBBBBBBBBBBBBBB" 338 | BITMAP "BBBBBBBBBBBBBBBB" 339 | BITMAP "BBBBBBBBBBBBBBBB" 340 | BITMAP "BBBBBBBBBBBBBBBB" 341 | BITMAP "BBBBBBBBBBBBBBBB" 342 | BITMAP "BBBBBBBBBBBBBBBB" 343 | BITMAP "BBBBBBBBBBBBBBBB" 344 | 345 | BITMAP "CCCCCCCCCCCCCCCC" 346 | BITMAP "CCCCCCCCCCCCCCCC" 347 | BITMAP "CCCCCCCCCCCCCCCC" 348 | BITMAP "CCCCCCCCCCCCCCCC" 349 | BITMAP "CCCCCCCCCCCCCCCC" 350 | BITMAP "CCCCCCCCCCCCCCCC" 351 | BITMAP "CCCCCCCCCCCCCCCC" 352 | BITMAP "CCCCCCCCCCCCCCCC" 353 | BITMAP "CCCCCCCCCCCCCCCC" 354 | BITMAP "CCCCCCCCCCCCCCCC" 355 | BITMAP "CCCCCCCCCCCCCCCC" 356 | BITMAP "CCCCCCCCCCCCCCCC" 357 | BITMAP "CCCCCCCCCCCCCCCC" 358 | BITMAP "CCCCCCCCCCCCCCCC" 359 | BITMAP "CCCCCCCCCCCCCCCC" 360 | BITMAP "CCCCCCCCCCCCCCCC" 361 | 362 | BITMAP "DDDDDDDDDDDDDDDD" 363 | BITMAP "DDDDDDDDDDDDDDDD" 364 | BITMAP "DDDDDDDDDDDDDDDD" 365 | BITMAP "DDDDDDDDDDDDDDDD" 366 | BITMAP "DDDDDDDDDDDDDDDD" 367 | BITMAP "DDDDDDDDDDDDDDDD" 368 | BITMAP "DDDDDDDDDDDDDDDD" 369 | BITMAP "DDDDDDDDDDDDDDDD" 370 | BITMAP "DDDDDDDDDDDDDDDD" 371 | BITMAP "DDDDDDDDDDDDDDDD" 372 | BITMAP "DDDDDDDDDDDDDDDD" 373 | BITMAP "DDDDDDDDDDDDDDDD" 374 | BITMAP "DDDDDDDDDDDDDDDD" 375 | BITMAP "DDDDDDDDDDDDDDDD" 376 | BITMAP "DDDDDDDDDDDDDDDD" 377 | BITMAP "DDDDDDDDDDDDDDDD" 378 | 379 | BITMAP "EEEEEEEEEEEEEEEE" 380 | BITMAP "EEEEEEEEEEEEEEEE" 381 | BITMAP "EEEEEEEEEEEEEEEE" 382 | BITMAP "EEEEEEEEEEEEEEEE" 383 | BITMAP "EEEEEEEEEEEEEEEE" 384 | BITMAP "EEEEEEEEEEEEEEEE" 385 | BITMAP "EEEEEEEEEEEEEEEE" 386 | BITMAP "EEEEEEEEEEEEEEEE" 387 | BITMAP "EEEEEEEEEEEEEEEE" 388 | BITMAP "EEEEEEEEEEEEEEEE" 389 | BITMAP "EEEEEEEEEEEEEEEE" 390 | BITMAP "EEEEEEEEEEEEEEEE" 391 | BITMAP "EEEEEEEEEEEEEEEE" 392 | BITMAP "EEEEEEEEEEEEEEEE" 393 | BITMAP "EEEEEEEEEEEEEEEE" 394 | BITMAP "EEEEEEEEEEEEEEEE" 395 | 396 | BITMAP "FFFFFFFFFFFFFFFF" 397 | BITMAP "FFFFFFFFFFFFFFFF" 398 | BITMAP "FFFFFFFFFFFFFFFF" 399 | BITMAP "FFFFFFFFFFFFFFFF" 400 | BITMAP "FFFFFFFFFFFFFFFF" 401 | BITMAP "FFFFFFFFFFFFFFFF" 402 | BITMAP "FFFFFFFFFFFFFFFF" 403 | BITMAP "FFFFFFFFFFFFFFFF" 404 | BITMAP "FFFFFFFFFFFFFFFF" 405 | BITMAP "FFFFFFFFFFFFFFFF" 406 | BITMAP "FFFFFFFFFFFFFFFF" 407 | BITMAP "FFFFFFFFFFFFFFFF" 408 | BITMAP "FFFFFFFFFFFFFFFF" 409 | BITMAP "FFFFFFFFFFFFFFFF" 410 | BITMAP "FFFFFFFFFFFFFFFF" 411 | BITMAP "FFFFFFFFFFFFFFFF" 412 | -------------------------------------------------------------------------------- /examples/face_joystick.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Joystick moving with joystick (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Mar/03/2024. 8 | ' 9 | 10 | DEFINE SPRITE 0,1,happy_face 11 | 12 | PRINT AT 36,"Happy face!" 13 | 14 | x = 50 15 | y = 100 16 | 17 | SPRITE 1, 96, 128, 0, 14 18 | 19 | game_loop: 20 | WAIT 21 | PRINT AT 0, "VDP.STATUS = ", <>VDP.STATUS , " " 22 | 23 | SPRITE 0, y - 1, x, 0, face_color 24 | 25 | IF FRAME AND 1 THEN 26 | face_color = 10 27 | IF cont1.up THEN IF y > 0 THEN y = y - 1 28 | IF cont1.left THEN IF x > 0 THEN x = x - 1 29 | IF cont1.right THEN IF x < 240 THEN x = x + 1 30 | IF cont1.down THEN IF y < 176 THEN y = y + 1 31 | IF cont1.button THEN face_color = 5 32 | IF cont1.button2 THEN face_color = 6 33 | END IF 34 | 35 | GOTO game_loop 36 | 37 | happy_face: 38 | BITMAP "......XXXX......" 39 | BITMAP "....XXXXXXXX...." 40 | BITMAP "...XXXXXXXXXX..." 41 | BITMAP "..XXXXXXXXXXXX.." 42 | BITMAP ".XXXXXXXXXXXXXX." 43 | BITMAP ".XXXXXXXXXXXXXX." 44 | BITMAP "XXXX..XXXX..XXXX" 45 | BITMAP "XXXX..XXXX..XXXX" 46 | BITMAP "XXXXXXXXXXXXXXXX" 47 | BITMAP "XXXXXXXXXXXXXXXX" 48 | BITMAP ".XXXXXXXXXXXXXX." 49 | BITMAP ".XXX..XXXX..XXX." 50 | BITMAP "..XXX......XXX.." 51 | BITMAP "...XXX....XXX..." 52 | BITMAP "....XXXXXXXX...." 53 | BITMAP "......XXXX......" 54 | -------------------------------------------------------------------------------- /examples/face_joystick_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Joystick moving with joystick (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Mar/03/2024. 8 | ' Revision date: Apr/26/2025. Adapted for Sega Master System. 9 | ' 10 | 11 | DEFINE SPRITE 0,2,happy_face 12 | 13 | PRINT AT 36,"Happy face!" 14 | 15 | x = 50 16 | y = 100 17 | 18 | SPRITE 2, 96, 128, 0 19 | SPRITE 3, 96, 136, 2 20 | 21 | game_loop: 22 | WAIT 23 | PRINT AT 0, "VDP.STATUS = ", <>VDP.STATUS , " " 24 | 25 | SPRITE 0,y-1,x,0 26 | SPRITE 1,y-1,x+8,2 27 | 28 | IF FRAME AND 1 THEN 29 | IF cont1.up THEN IF y > 0 THEN y = y - 1 30 | IF cont1.left THEN IF x > 0 THEN x = x - 1 31 | IF cont1.right THEN IF x < 240 THEN x = x + 1 32 | IF cont1.down THEN IF y < 176 THEN y = y + 1 33 | IF cont1.button THEN 34 | PALETTE 10+16,$30 35 | ELSEIF cont1.button2 THEN 36 | PALETTE 10+16,$03 37 | ELSE 38 | PALETTE 10+16,$0F 39 | END IF 40 | END IF 41 | 42 | GOTO game_loop 43 | 44 | ' The face includes the color for the sprite 45 | ' A = Yellow in the default palette. 46 | ' F = White 47 | ' 4 = Yellow 48 | ' 6 = Red 49 | happy_face: 50 | BITMAP "......AAAA......" 51 | BITMAP "....AAAAAAAA...." 52 | BITMAP "...AAAAAAAAAA..." 53 | BITMAP "..AAAAAAAAAAAA.." 54 | BITMAP ".AAAAAAAAAAAAAA." 55 | BITMAP ".AAFFFAAAAFFFAA." 56 | BITMAP "AAAFFFAAAAFFFAAA" 57 | BITMAP "AAAFF4AAAA4FFAAA" 58 | BITMAP "AAAAAAAAAAAAAAAA" 59 | BITMAP "AAAAAAAAAAAAAAAA" 60 | BITMAP ".AAAAAAAAAAAAAA." 61 | BITMAP ".AAA66AAAA66AAA." 62 | BITMAP "..AAA666666AAA.." 63 | BITMAP "...AAA6666AAA..." 64 | BITMAP "....AAAAAAAA...." 65 | BITMAP "......AAAA......" 66 | -------------------------------------------------------------------------------- /examples/happy_face.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Bouncing happy face (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/28/2024. 8 | ' 9 | 10 | DEFINE SPRITE 0,1,happy_face 11 | 12 | PRINT AT 36,"Happy face!" 13 | 14 | x = 50 15 | y = 100 16 | dx = 1 17 | dy = 1 18 | 19 | game_loop: 20 | WAIT 21 | WAIT 22 | SPRITE 0,y-1,x,0,10 23 | 24 | x = x + dx 25 | IF x = 0 THEN dx = -dx 26 | IF x = 240 THEN dx = -dx 27 | y = y + dy 28 | IF y = 0 THEN dy = -dy 29 | IF y = 176 THEN dy = -dy 30 | GOTO game_loop 31 | 32 | happy_face: 33 | BITMAP "......XXXX......" 34 | BITMAP "....XXXXXXXX...." 35 | BITMAP "...XXXXXXXXXX..." 36 | BITMAP "..XXXXXXXXXXXX.." 37 | BITMAP ".XXXXXXXXXXXXXX." 38 | BITMAP ".XXXXXXXXXXXXXX." 39 | BITMAP "XXXX..XXXX..XXXX" 40 | BITMAP "XXXX..XXXX..XXXX" 41 | BITMAP "XXXXXXXXXXXXXXXX" 42 | BITMAP "XXXXXXXXXXXXXXXX" 43 | BITMAP ".XXXXXXXXXXXXXX." 44 | BITMAP ".XXX..XXXX..XXX." 45 | BITMAP "..XXX......XXX.." 46 | BITMAP "...XXX....XXX..." 47 | BITMAP "....XXXXXXXX...." 48 | BITMAP "......XXXX......" 49 | -------------------------------------------------------------------------------- /examples/happy_face_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Bouncing happy face (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/28/2024. 8 | ' Revision date: Apr/26/2025. Adapted for Sega Master System. 9 | ' 10 | 11 | DEFINE SPRITE 0,2,happy_face 12 | 13 | PRINT AT 36,"Happy face!" 14 | 15 | x = 50 16 | y = 100 17 | dx = 1 18 | dy = 1 19 | 20 | game_loop: 21 | WAIT 22 | WAIT 23 | SPRITE 0,y-1,x,0 24 | SPRITE 1,y-1,x+8,2 25 | 26 | x = x + dx 27 | IF x = 0 THEN dx = -dx 28 | IF x = 240 THEN dx = -dx 29 | y = y + dy 30 | IF y = 0 THEN dy = -dy 31 | IF y = 176 THEN dy = -dy 32 | GOTO game_loop 33 | 34 | ' The face includes the color for the sprite 35 | ' A = Yellow in the default palette. 36 | ' F = White 37 | ' 4 = Yellow 38 | ' 6 = Red 39 | happy_face: 40 | BITMAP "......AAAA......" 41 | BITMAP "....AAAAAAAA...." 42 | BITMAP "...AAAAAAAAAA..." 43 | BITMAP "..AAAAAAAAAAAA.." 44 | BITMAP ".AAAAAAAAAAAAAA." 45 | BITMAP ".AAFFFAAAAFFFAA." 46 | BITMAP "AAAFFFAAAAFFFAAA" 47 | BITMAP "AAAFF4AAAA4FFAAA" 48 | BITMAP "AAAAAAAAAAAAAAAA" 49 | BITMAP "AAAAAAAAAAAAAAAA" 50 | BITMAP ".AAAAAAAAAAAAAA." 51 | BITMAP ".AAA66AAAA66AAA." 52 | BITMAP "..AAA666666AAA.." 53 | BITMAP "...AAA6666AAA..." 54 | BITMAP "....AAAAAAAA...." 55 | BITMAP "......AAAA......" 56 | -------------------------------------------------------------------------------- /examples/music.bas: -------------------------------------------------------------------------------- 1 | rem 2 | rem Test of IntyBASIC music player 3 | rem by Oscar Toledo G. http://nanochess.org 4 | rem Aug/26/2014 5 | rem 6 | 7 | REM Include useful predefined constants 8 | 9 | main: 10 | V=0 11 | 12 | wait_key: 13 | CLS 14 | PRINT AT 66,"Press button" 15 | FOR c = 0 TO 60 16 | WAIT 17 | NEXT c 18 | wait_loop: 19 | IF CONT1.BUTTON THEN GOTO play_1 20 | IF CONT1.BUTTON2 THEN GOTO play_2 21 | 22 | GOTO wait_loop 23 | 24 | play_1: 25 | PRINT AT 66,"Bach Invention 8" 26 | PRINT AT 130,"(fragment)" 27 | WAIT 28 | PLAY SIMPLE 29 | PLAY tune_1 30 | 31 | ' Sound effect if button touch 32 | repeat: 33 | WAIT 34 | IF CONT1.BUTTON2 THEN V=15 35 | SOUND 2,300,V 36 | IF V>0 THEN V=V-1 37 | IF MUSIC.PLAYING THEN GOTO repeat 38 | GOTO wait_key 39 | 40 | play_2: 41 | PRINT AT 66,"Mecha-8 Level 4 " 42 | PRINT AT 130,"(fragment)" 43 | WAIT 44 | PLAY FULL 45 | PLAY tune_2 46 | repeat2: 47 | WAIT 48 | IF CONT1.BUTTON THEN PLAY OFF: GOTO wait_key 49 | GOTO repeat2 50 | 51 | ' Bach Invention 8 (BWV779) 52 | ' Fragment 53 | tune_1: DATA BYTE 7 54 | MUSIC F4,- 55 | MUSIC S,- 56 | MUSIC A4,- 57 | MUSIC S,- 58 | MUSIC F4,- 59 | MUSIC S,- 60 | MUSIC C5,- 61 | MUSIC S,- 62 | MUSIC F4,- 63 | MUSIC S,- 64 | 65 | MUSIC F5,- 66 | MUSIC S,- 67 | MUSIC E5,F3 68 | MUSIC D5,S 69 | MUSIC C5,A3 70 | MUSIC D5,S 71 | MUSIC C5,F3 72 | MUSIC A4#,S 73 | MUSIC A4,C4 74 | MUSIC A4#,S 75 | MUSIC A4,F3 76 | MUSIC G4,S 77 | 78 | MUSIC F4,F4 79 | MUSIC S,S 80 | MUSIC A4,E4 81 | MUSIC S,D4 82 | MUSIC C5,C4 83 | MUSIC S,D4 84 | MUSIC A4,C4 85 | MUSIC S,A3# 86 | MUSIC F5,A3 87 | MUSIC S,A3# 88 | MUSIC C5,A3 89 | MUSIC S,G3 90 | 91 | MUSIC A5,F3 92 | MUSIC C6,S 93 | MUSIC A5#,A3 94 | MUSIC C6,S 95 | MUSIC A5,C4 96 | MUSIC C6,S 97 | MUSIC A5#,A3 98 | MUSIC C6,S 99 | MUSIC A5,F4 100 | MUSIC C6,S 101 | MUSIC A5#,C4 102 | MUSIC C6,S 103 | 104 | MUSIC F5,A3 105 | MUSIC A5,C4 106 | MUSIC G5,A3# 107 | MUSIC A5,C4 108 | MUSIC F5,A3 109 | MUSIC A5,C4 110 | MUSIC G5,A3# 111 | MUSIC A5,C4 112 | MUSIC F5,A3 113 | MUSIC A5,C4 114 | MUSIC G5,A3# 115 | MUSIC A5,C4 116 | 117 | MUSIC D5,F3 118 | MUSIC F5,A3 119 | MUSIC E5,G3 120 | MUSIC F5,A3 121 | MUSIC D5,F3 122 | MUSIC F5,A3 123 | MUSIC E5,G3 124 | MUSIC F5,A3 125 | MUSIC D5,F3 126 | MUSIC F5,A3 127 | MUSIC E5,G3 128 | MUSIC F5,A3 129 | 130 | MUSIC B4,D3 131 | MUSIC S,F3 132 | MUSIC G4,E3 133 | MUSIC S,F3 134 | MUSIC D5,D3 135 | MUSIC S,F3 136 | MUSIC B4,E3 137 | MUSIC S,F3 138 | MUSIC F5,D3 139 | MUSIC S,F3 140 | MUSIC D5,E3 141 | MUSIC S,F3 142 | 143 | MUSIC G5,B3 144 | MUSIC A5,S 145 | MUSIC G5,G3 146 | MUSIC F5,S 147 | MUSIC E5,C4 148 | MUSIC F5,S 149 | MUSIC E5,G3 150 | MUSIC D5,S 151 | MUSIC C5,E4 152 | MUSIC D5,S 153 | MUSIC C5,C4 154 | MUSIC A4#,S 155 | 156 | MUSIC A4,F4 157 | MUSIC S,G4 158 | MUSIC D5,F4 159 | MUSIC C5,E4 160 | MUSIC B4,D4 161 | MUSIC C5,E4 162 | MUSIC B4,D4 163 | MUSIC A4,C4 164 | MUSIC G4,B3 165 | MUSIC A4,C4 166 | MUSIC G4,B3 167 | MUSIC F4,A3 168 | 169 | MUSIC E4,G3 170 | MUSIC F4,S 171 | MUSIC E4,C4 172 | MUSIC D4,B3 173 | MUSIC C4,A3 174 | MUSIC S,B3 175 | MUSIC C5,A3 176 | MUSIC B4,G3 177 | MUSIC C5,F3 178 | MUSIC S,G3 179 | MUSIC E4,F3 180 | MUSIC S,E3 181 | 182 | MUSIC F4,D3 183 | MUSIC S,E3 184 | MUSIC C5,D3 185 | MUSIC S,C3 186 | MUSIC E4,G3 187 | MUSIC S,F3 188 | MUSIC C5,E3 189 | MUSIC S,F3 190 | MUSIC D4,G3 191 | MUSIC S,S 192 | MUSIC B4,G2 193 | MUSIC S,S 194 | 195 | MUSIC C5,C4 196 | MUSIC S,S 197 | MUSIC S,S 198 | MUSIC S,S 199 | MUSIC STOP 200 | 201 | ' Mecha-8 level 5: alone 202 | ' Fragment 203 | tune_2: DATA BYTE 5 204 | MUSIC G5#Y,C3#,-,M1 205 | MUSIC S,S,-,M2 206 | MUSIC F5#,G3#,-,M2 207 | MUSIC S,S,-,M2 208 | MUSIC E5,C3#,-,M1 209 | MUSIC S,S,-,M2 210 | MUSIC D5#,G3#,-,M2 211 | MUSIC S,S,-,M2 212 | MUSIC E5,C3#,-,M1 213 | MUSIC S,S,-,M2 214 | MUSIC F5#,G3#,-,M2 215 | MUSIC S,S,-,M2 216 | MUSIC G5#,C3#,-,M1 217 | MUSIC S,S,-,M2 218 | MUSIC S,G3#,-,M2 219 | MUSIC S,S,-,M2 220 | MUSIC S,C3#,-,M1 221 | MUSIC S,S,-,M2 222 | MUSIC C5#,G3#,-,M2 223 | MUSIC -,S,-,M2 224 | MUSIC G5#,C3#,-,M1 225 | MUSIC S,S,-,M2 226 | MUSIC E5,G3#,-,M2 227 | MUSIC -,S,-,M2 228 | MUSIC F5#,B2,-,M1 229 | MUSIC S,S,-,M2 230 | MUSIC S,F3#,-,M2 231 | MUSIC S,S,-,M2 232 | MUSIC S,B2,-,M1 233 | MUSIC S,S,-,M2 234 | MUSIC -,F3#,-,M2 235 | MUSIC -,S,-,M2 236 | MUSIC -,B2,-,M1 237 | MUSIC -,S,-,M2 238 | MUSIC -,F3#,-,M2 239 | MUSIC -,S,-,M2 240 | MUSIC -,B2,-,M1 241 | MUSIC -,S,-,M2 242 | MUSIC -,F3#,-,M1 243 | MUSIC -,S,-,M2 244 | MUSIC C5#,B2,-,M1 245 | MUSIC S,S,-,M2 246 | MUSIC F5#,F3#,-,M1 247 | MUSIC S,S,-,M2 248 | MUSIC C5#,B2,-,M1 249 | MUSIC S,S,-,M2 250 | MUSIC E5,A2,-,M1 251 | MUSIC S,S,-,M2 252 | MUSIC S,E3,-,M1 253 | MUSIC S,S,-,M2 254 | MUSIC S,A2,-,M1 255 | MUSIC S,S,-,M2 256 | MUSIC S,E3,-,M1 257 | MUSIC S,S,-,M2 258 | MUSIC S,A2,-,M1 259 | MUSIC S,S,-,M2 260 | MUSIC S,E3,-,M1 261 | MUSIC S,S,-,M2 262 | MUSIC S,A2,-,M1 263 | MUSIC S,S,-,M2 264 | MUSIC F5#,E3,-,M1 265 | MUSIC S,S,-,M2 266 | MUSIC E5,A2,-,M2 267 | MUSIC S,S,-,M2 268 | MUSIC D5#,E3,-,M1 269 | MUSIC S,S,-,M2 270 | MUSIC S,A2,-,M2 271 | MUSIC S,S,-,M2 272 | MUSIC C5,G2#,-,M1 273 | MUSIC S,S,-,M2 274 | MUSIC S,D3#,-,M2 275 | MUSIC S,S,-,M2 276 | MUSIC S,G2#,-,M1 277 | MUSIC S,S,-,M2 278 | MUSIC S,D3#,-,M2 279 | MUSIC S,S,-,M2 280 | MUSIC S,G2#,-,M1 281 | MUSIC S,S,-,M2 282 | MUSIC -,D3#,-,M2 283 | MUSIC -,S,-,M2 284 | MUSIC -,G2#,-,M1 285 | MUSIC -,S,-,M2 286 | MUSIC -,D3#,-,M2 287 | MUSIC -,S,-,M2 288 | MUSIC -,G2#,-,M1 289 | MUSIC -,S,-,M2 290 | MUSIC -,D3#,-,M1 291 | MUSIC -,S,-,M3 292 | MUSIC -,G2#,-,M1 293 | MUSIC -,S,-,M2 294 | MUSIC -,D3#,-,M1 295 | MUSIC -,S,-,M3 296 | MUSIC -,G2#,-,M1 297 | MUSIC -,S,-,M1 298 | MUSIC -,D3#,-,M1 299 | MUSIC -,S,-,M1 300 | MUSIC REPEAT 301 | -------------------------------------------------------------------------------- /examples/plot.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Drawing pixels and lines with CVBasic 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Jan/23/2025. 8 | ' 9 | 10 | DEF FN PSET(x,y)=#c=((x) AND $f8.)+((y) / 8. * 256)+((y) AND 7.):VPOKE #c,VPEEK(#c) OR bit_table((x) AND 7) 11 | 12 | DEF FN PSETCOLOR(x,y,color)=PSET(x,y):VPOKE #c+$2000,color*16 13 | 14 | DEF FN PRESET(x,y)=#c=((x) AND $f8.)+((y) / 8. * 256)+((y) AND 7.):VPOKE #c,VPEEK(#c) AND NOT bit_table((x) AND 7) 15 | 16 | DEF FN LINE(w,x,y,z)=x1=w:y1=x:x2=y:y2=z:GOSUB draw_line 17 | 18 | DEF FN LINECOLOR(w,x,y,z,a)=x1=w:y1=x:x2=y:y2=z:c=a:GOSUB draw_line_color 19 | 20 | DEF FN CIRCLE(w,x,y)=x1=w:y1=x:c=y:GOSUB draw_circle 21 | 22 | MODE 1 23 | 24 | y = 20 25 | FOR x = 20 TO 220 26 | PSET(x, y) 27 | NEXT x 28 | 29 | FOR y = 20 TO 170 30 | PSET(x, y) 31 | NEXT y 32 | 33 | FOR x = 220 TO 20 STEP -1 34 | PSET(x, y) 35 | NEXT x 36 | 37 | FOR y = 170 TO 20 STEP -1 38 | PSET(x, y) 39 | NEXT y 40 | 41 | FOR y = 40 TO 150 42 | FOR x = 32 TO 55 43 | PSETCOLOR(x, y, y AND $0F) 44 | NEXT x 45 | NEXT y 46 | 47 | FOR x = 102 TO 202 STEP 10 48 | LINE(x, 40, 202, 150) 49 | NEXT x 50 | 51 | FOR y = 40 TO 150 STEP 10 52 | LINE(102, y, 202, 150) 53 | NEXT y 54 | 55 | FOR x = 8 TO 240 STEP 8 56 | LINECOLOR(128, 0, x, 16, (x / 8) AND $0F) 57 | NEXT x 58 | 59 | CIRCLE(80, 60, 15) 60 | CIRCLE(80, 100, 20) 61 | CIRCLE(80, 140, 25) 62 | 63 | WHILE 1: WEND 64 | 65 | ' 66 | ' Draw a line using the Bresenham algorithm 67 | ' 68 | SIGNED #err 69 | 70 | draw_line: PROCEDURE 71 | sx = SGN(x2 + 0 - x1) 72 | sy = SGN(y2 + 0 - y1) 73 | #dx = ABS(x2 + 0 - x1) 74 | #dy = ABS(y2 + 0 - y1) 75 | IF #dx > #dy THEN 76 | #err = 2 * #dy - #dx 77 | WHILE 1 78 | PSET(x1, y1) 79 | IF x1 = x2 THEN RETURN 80 | IF #err < 0 THEN 81 | #err = #err + 2 * #dy 82 | ELSE 83 | #err = #err + 2 * (#dy - #dx) 84 | y1 = y1 + sy 85 | END IF 86 | x1 = x1 + sx 87 | WEND 88 | ELSE 89 | #err = 2 * #dx - #dy 90 | WHILE 1 91 | PSET(x1, y1) 92 | IF y1 = y2 THEN RETURN 93 | IF #err < 0 THEN 94 | #err = #err + 2 * #dx 95 | ELSE 96 | #err = #err + 2 * (#dx - #dy) 97 | x1 = x1 + sx 98 | END IF 99 | y1 = y1 + sy 100 | WEND 101 | END IF 102 | END 103 | 104 | draw_line_color: PROCEDURE 105 | sx = SGN(x2 + 0 - x1) 106 | sy = SGN(y2 + 0 - y1) 107 | #dx = ABS(x2 + 0 - x1) 108 | #dy = ABS(y2 + 0 - y1) 109 | IF #dx > #dy THEN 110 | #err = 2 * #dy - #dx 111 | WHILE 1 112 | PSETCOLOR(x1, y1, c) 113 | IF x1 = x2 THEN RETURN 114 | IF #err < 0 THEN 115 | #err = #err + 2 * #dy 116 | ELSE 117 | #err = #err + 2 * (#dy - #dx) 118 | y1 = y1 + sy 119 | END IF 120 | x1 = x1 + sx 121 | WEND 122 | ELSE 123 | #err = 2 * #dx - #dy 124 | WHILE 1 125 | PSETCOLOR(x1, y1, c) 126 | IF y1 = y2 THEN RETURN 127 | IF #err < 0 THEN 128 | #err = #err + 2 * #dx 129 | ELSE 130 | #err = #err + 2 * (#dx - #dy) 131 | x1 = x1 + sx 132 | END IF 133 | y1 = y1 + sy 134 | WEND 135 | END IF 136 | END 137 | 138 | draw_points: PROCEDURE 139 | PSET(x1 + x, y1 + y) 140 | PSET(x1 + x, y1 - y) 141 | PSET(x1 - x, y1 + y) 142 | PSET(x1 - x, y1 - y) 143 | PSET(x1 + y, y1 + x) 144 | PSET(x1 + y, y1 - x) 145 | PSET(x1 - y, y1 + x) 146 | PSET(x1 - y, y1 - x) 147 | END 148 | 149 | draw_circle: PROCEDURE 150 | x = 0 151 | y = c 152 | #err = 3 - 2 * c 153 | GOSUB draw_points 154 | WHILE x <= y 155 | IF #err > 0 THEN 156 | y = y - 1 157 | #err = #err + 4 * x - 4 * y + 10 158 | ELSE 159 | #err = #err + 4 * x + 6 160 | END IF 161 | x = x + 1 162 | GOSUB draw_points 163 | WEND 164 | 165 | END 166 | 167 | bit_table: 168 | DATA BYTE $80,$40,$20,$10,$08,$04,$02,$01 169 | -------------------------------------------------------------------------------- /examples/portrait.bas: -------------------------------------------------------------------------------- 1 | ' TMSColor 2.1.0 Mar/07/2024 2 | ' Command: tmscolor -t128 -b -n portrait.bmp portrait.bas 3 | ' Created: Fri Mar 08 15:12:14 2024 4 | 5 | ' This portrait is courtesy of my game Zombie Near 6 | 7 | ' 8 | ' Recommended code: 9 | ' MODE 0 10 | ' DEFINE CHAR 128,50,image_char 11 | ' DEFINE COLOR 128,50,image_color 12 | ' SCREEN image_pattern,0,0,8,8,8 13 | ' 14 | image_char: 15 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 16 | DATA BYTE $ff,$ff,$f8,$f0,$e0,$c0,$c0,$80 17 | DATA BYTE $ff,$fc,$ff,$ff,$f8,$fb,$f8,$f0 18 | DATA BYTE $ff,$07,$01,$07,$03,$c0,$3c,$ff 19 | DATA BYTE $ff,$ff,$ff,$ff,$3f,$1f,$0f,$07 20 | DATA BYTE $ff,$ff,$fe,$fe,$fc,$fc,$f8,$f8 21 | DATA BYTE $ff,$ff,$ff,$ff,$f8,$fb,$f0,$e0 22 | DATA BYTE $f7,$f0,$f0,$e0,$ff,$f0,$ff,$c0 23 | DATA BYTE $80,$79,$01,$01,$01,$01,$ff,$0f 24 | DATA BYTE $03,$01,$01,$ff,$ff,$ff,$ff,$7f 25 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$7f,$7f,$3f 26 | DATA BYTE $f8,$f8,$f0,$f0,$f0,$f0,$f0,$f0 27 | DATA BYTE $c0,$80,$fe,$fe,$fc,$fc,$fc,$fc 28 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 29 | DATA BYTE $07,$03,$01,$01,$e0,$f0,$f8,$fc 30 | DATA BYTE $7f,$3f,$3f,$3f,$3f,$1f,$1f,$1f 31 | DATA BYTE $3f,$1f,$1f,$0f,$0f,$0f,$07,$07 32 | DATA BYTE $e0,$e0,$e0,$e0,$e0,$e0,$c0,$c0 33 | DATA BYTE $fc,$fc,$f0,$f0,$e0,$1a,$1c,$19 34 | DATA BYTE $ff,$ff,$7f,$0f,$87,$e7,$1b,$05 35 | DATA BYTE $fe,$ff,$f8,$e0,$c3,$ce,$f0,$c8 36 | DATA BYTE $1f,$0f,$0f,$0f,$7f,$3f,$3f,$3f 37 | DATA BYTE $07,$07,$07,$03,$03,$03,$01,$01 38 | DATA BYTE $80,$80,$80,$80,$fe,$fe,$fe,$fe 39 | DATA BYTE $1d,$1e,$1f,$1f,$1f,$e0,$e0,$e0 40 | DATA BYTE $4d,$1d,$fd,$fd,$fd,$fb,$fb,$f7 41 | DATA BYTE $ea,$f0,$ff,$ff,$ff,$ff,$ff,$ff 42 | DATA BYTE $3f,$37,$33,$33,$03,$03,$03,$03 43 | DATA BYTE $01,$01,$03,$03,$03,$03,$03,$03 44 | DATA BYTE $fe,$fe,$fe,$fe,$fe,$fe,$fe,$14 45 | DATA BYTE $e0,$e0,$e0,$f0,$f0,$f8,$07,$03 46 | DATA BYTE $f7,$f9,$fe,$ff,$f8,$e3,$e4,$f3 47 | DATA BYTE $ff,$7f,$ff,$ff,$3f,$8f,$4f,$9f 48 | DATA BYTE $03,$03,$03,$07,$0f,$1f,$1f,$3f 49 | DATA BYTE $03,$03,$03,$03,$03,$03,$03,$03 50 | DATA BYTE $fe,$fe,$fe,$fe,$fe,$fe,$fe,$ff 51 | DATA BYTE $14,$14,$14,$14,$14,$14,$14,$14 52 | DATA BYTE $f0,$fc,$ff,$ff,$7f,$7f,$7f,$7f 53 | DATA BYTE $f8,$0f,$00,$10,$08,$07,$00,$0f 54 | DATA BYTE $3f,$fe,$f8,$f0,$c0,$01,$01,$03 55 | DATA BYTE $7f,$7f,$09,$09,$09,$09,$09,$09 56 | DATA BYTE $03,$03,$03,$03,$03,$03,$03,$03 57 | DATA BYTE $ff,$f0,$c0,$01,$01,$03,$03,$03 58 | DATA BYTE $14,$14,$14,$22,$22,$22,$22,$22 59 | DATA BYTE $7f,$bf,$bf,$bf,$bf,$9f,$9f,$9f 60 | DATA BYTE $0f,$0f,$00,$ff,$ff,$ff,$ff,$ff 61 | DATA BYTE $03,$03,$03,$03,$07,$07,$07,$07 62 | DATA BYTE $13,$13,$13,$13,$13,$13,$23,$27 63 | DATA BYTE $03,$03,$fc,$fc,$fc,$fc,$fc,$fc 64 | DATA BYTE $ff,$ff,$ff,$1f,$03,$fc,$ff,$ff 65 | 66 | image_color: 67 | DATA BYTE $e1,$e1,$e1,$e1,$e1,$e1,$e1,$e1 68 | DATA BYTE $e1,$e1,$eb,$eb,$eb,$eb,$eb,$eb 69 | DATA BYTE $e1,$eb,$b1,$b1,$ba,$ba,$ba,$ba 70 | DATA BYTE $e1,$eb,$eb,$ba,$ba,$ba,$ba,$a1 71 | DATA BYTE $e1,$e1,$e1,$e1,$eb,$eb,$eb,$eb 72 | DATA BYTE $e1,$e1,$eb,$eb,$eb,$eb,$eb,$eb 73 | DATA BYTE $b1,$b1,$b1,$b1,$ba,$ba,$ba,$ba 74 | DATA BYTE $ba,$ba,$ba,$ba,$a1,$ba,$a1,$a8 75 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$a1,$a8 76 | DATA BYTE $eb,$eb,$eb,$b1,$b1,$b1,$b1,$ba 77 | DATA BYTE $e1,$e1,$e1,$e1,$e1,$eb,$eb,$eb 78 | DATA BYTE $eb,$eb,$eb,$eb,$eb,$eb,$eb,$eb 79 | DATA BYTE $ba,$ba,$a8,$a9,$a9,$a9,$a9,$a9 80 | DATA BYTE $81,$81,$81,$91,$91,$91,$91,$91 81 | DATA BYTE $a8,$a8,$a8,$a8,$98,$98,$98,$98 82 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$ba,$ba 83 | DATA BYTE $eb,$eb,$eb,$eb,$eb,$eb,$eb,$eb 84 | DATA BYTE $eb,$eb,$eb,$eb,$eb,$eb,$eb,$eb 85 | DATA BYTE $a9,$a9,$a1,$b1,$b9,$91,$91,$91 86 | DATA BYTE $91,$91,$91,$91,$91,$91,$91,$91 87 | DATA BYTE $98,$91,$91,$91,$91,$91,$91,$91 88 | DATA BYTE $ba,$ba,$ba,$ba,$a9,$a1,$a1,$a1 89 | DATA BYTE $eb,$eb,$eb,$eb,$eb,$eb,$eb,$eb 90 | DATA BYTE $eb,$eb,$eb,$eb,$a1,$a1,$a1,$a1 91 | DATA BYTE $91,$91,$91,$91,$91,$b9,$b9,$b9 92 | DATA BYTE $91,$91,$91,$91,$91,$91,$91,$91 93 | DATA BYTE $91,$91,$91,$91,$91,$91,$91,$91 94 | DATA BYTE $a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8 95 | DATA BYTE $eb,$ea,$ea,$ea,$ea,$eb,$ea,$eb 96 | DATA BYTE $a1,$a1,$a1,$a1,$a1,$a1,$a1,$ba 97 | DATA BYTE $b9,$b9,$b9,$b9,$b9,$b9,$91,$91 98 | DATA BYTE $91,$91,$91,$91,$96,$98,$98,$96 99 | DATA BYTE $91,$91,$91,$91,$96,$98,$98,$96 100 | DATA BYTE $a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8 101 | DATA BYTE $eb,$ea,$eb,$eb,$eb,$eb,$eb,$eb 102 | DATA BYTE $ea,$ea,$ea,$ea,$ea,$ea,$ea,$e1 103 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$ba,$ba 104 | DATA BYTE $b1,$b1,$b1,$b1,$ba,$ba,$ba,$ba 105 | DATA BYTE $96,$91,$f1,$91,$91,$91,$f1,$91 106 | DATA BYTE $96,$98,$98,$98,$98,$a8,$a1,$a8 107 | DATA BYTE $a8,$a8,$ba,$ba,$ba,$ba,$ba,$ba 108 | DATA BYTE $eb,$eb,$eb,$eb,$eb,$eb,$eb,$eb 109 | DATA BYTE $e1,$e1,$e1,$a1,$a5,$a5,$a5,$a5 110 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$ba,$ba 111 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$ba,$ba 112 | DATA BYTE $91,$91,$f1,$71,$71,$71,$71,$71 113 | DATA BYTE $a8,$a8,$a1,$a7,$a7,$a7,$a7,$a7 114 | DATA BYTE $ba,$ba,$ba,$ba,$ba,$ba,$ba,$ba 115 | DATA BYTE $eb,$eb,$b1,$b5,$b5,$b5,$b5,$b5 116 | DATA BYTE $e1,$e1,$e1,$e1,$e1,$51,$51,$51 117 | 118 | image_pattern: 119 | DATA BYTE $80,$80,$81,$82,$83,$84,$80,$80 120 | DATA BYTE $80,$85,$86,$87,$88,$89,$8a,$80 121 | DATA BYTE $80,$8b,$8c,$8d,$8e,$8f,$90,$80 122 | DATA BYTE $80,$91,$92,$93,$94,$95,$96,$80 123 | DATA BYTE $80,$97,$98,$99,$9a,$9b,$9c,$80 124 | DATA BYTE $80,$9d,$9e,$9f,$a0,$a1,$a2,$80 125 | DATA BYTE $a3,$a4,$a5,$a6,$a7,$a8,$a9,$80 126 | DATA BYTE $aa,$ab,$ac,$ad,$ae,$af,$b0,$b1 127 | -------------------------------------------------------------------------------- /examples/portrait_sms.bas: -------------------------------------------------------------------------------- 1 | ' TMSColor 3.0 Apr/27/2025 2 | ' Command: ../tmscolor/tmscolor -sms -b -n -t128 portrait.bmp portrait_sms.bas portrait 3 | ' Created: Sun Apr 27 01:02:39 2025 4 | 5 | ' 6 | ' Recommended code: 7 | ' MODE 4 8 | ' DEFINE CHAR 128,62,portrait_char 9 | ' SCREEN portrait_pattern,0,0,8,8,8 10 | ' 11 | ' Start tile = 128. Total_tiles = 62 12 | portrait_char: 13 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 14 | DATA BYTE $ff,$00,$00,$00,$f8,$00,$07,$07 15 | DATA BYTE $c0,$00,$3f,$3f,$00,$00,$ff,$ff 16 | DATA BYTE $01,$01,$fe,$fe,$33,$33,$cc,$cc 17 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 18 | DATA BYTE $ff,$00,$00,$00,$1f,$00,$e0,$e0 19 | DATA BYTE $1f,$00,$e0,$e0,$0f,$00,$f0,$f0 20 | DATA BYTE $0f,$00,$f0,$f0,$07,$00,$f8,$f8 21 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 22 | DATA BYTE $ff,$00,$00,$00,$fe,$01,$00,$01 23 | DATA BYTE $fc,$03,$00,$03,$f8,$07,$00,$07 24 | DATA BYTE $f0,$0f,$00,$0f,$e0,$1f,$00,$1f 25 | DATA BYTE $ff,$3f,$00,$3f,$f0,$7f,$00,$7f 26 | DATA BYTE $00,$ff,$00,$ff,$00,$ff,$00,$ff 27 | DATA BYTE $00,$ff,$00,$ff,$00,$ff,$00,$ff 28 | DATA BYTE $00,$ff,$00,$ff,$00,$ff,$00,$ff 29 | DATA BYTE $ff,$ff,$00,$ff,$1f,$ff,$00,$ff 30 | DATA BYTE $2f,$ff,$00,$ff,$07,$ff,$00,$ff 31 | DATA BYTE $07,$ff,$00,$ff,$01,$ff,$00,$ff 32 | DATA BYTE $00,$ff,$00,$ff,$00,$ff,$00,$ff 33 | DATA BYTE $ff,$00,$00,$00,$ff,$80,$00,$80 34 | DATA BYTE $ff,$e0,$00,$e0,$ff,$f0,$00,$f0 35 | DATA BYTE $ff,$f8,$00,$f8,$ff,$fc,$00,$fc 36 | DATA BYTE $ff,$fe,$00,$fe,$fb,$fe,$00,$fe 37 | DATA BYTE $11,$ee,$00,$00,$11,$ee,$00,$00 38 | DATA BYTE $ff,$00,$00,$00,$11,$00,$ee,$ee 39 | DATA BYTE $11,$00,$ee,$ee,$ff,$00,$00,$00 40 | DATA BYTE $11,$00,$ee,$ee,$11,$00,$ee,$ee 41 | DATA BYTE $11,$00,$ee,$ee,$11,$00,$ee,$ee 42 | DATA BYTE $ff,$00,$00,$00,$11,$ee,$00,$00 43 | DATA BYTE $11,$ee,$00,$00,$ff,$00,$00,$00 44 | DATA BYTE $11,$00,$ee,$ee,$11,$00,$ee,$ee 45 | DATA BYTE $60,$60,$9f,$9f,$00,$00,$ff,$ff 46 | DATA BYTE $00,$00,$ff,$ff,$3f,$3f,$c0,$c0 47 | DATA BYTE $60,$60,$9f,$9f,$00,$00,$ff,$ff 48 | DATA BYTE $01,$01,$fe,$fe,$37,$37,$c8,$c8 49 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 50 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 51 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 52 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 53 | DATA BYTE $c0,$3f,$00,$3f,$c0,$3f,$00,$3f 54 | DATA BYTE $e0,$7f,$00,$7f,$fe,$7f,$00,$7f 55 | DATA BYTE $ff,$ff,$00,$ff,$ff,$ff,$00,$ff 56 | DATA BYTE $ff,$ff,$00,$ff,$ff,$ff,$20,$ff 57 | DATA BYTE $00,$ff,$00,$ff,$0e,$ff,$00,$ff 58 | DATA BYTE $0f,$ff,$00,$ff,$7f,$ff,$00,$ff 59 | DATA BYTE $ff,$ff,$00,$ff,$ff,$ff,$00,$ff 60 | DATA BYTE $ff,$ff,$00,$ff,$fe,$ff,$00,$ff 61 | DATA BYTE $00,$ff,$00,$ff,$40,$ff,$00,$ff 62 | DATA BYTE $c0,$ff,$00,$ff,$d0,$ff,$00,$ff 63 | DATA BYTE $f0,$ff,$00,$ff,$f0,$ff,$00,$ff 64 | DATA BYTE $f8,$ff,$00,$ff,$fc,$ff,$00,$ff 65 | DATA BYTE $ff,$fe,$00,$fe,$7d,$ff,$00,$ff 66 | DATA BYTE $7d,$ff,$00,$ff,$1f,$ff,$00,$ff 67 | DATA BYTE $9e,$ff,$00,$ff,$ae,$ff,$00,$ff 68 | DATA BYTE $a7,$ff,$00,$ff,$87,$ff,$00,$ff 69 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 70 | DATA BYTE $ff,$00,$00,$00,$ff,$80,$00,$80 71 | DATA BYTE $ff,$80,$00,$80,$ff,$80,$00,$80 72 | DATA BYTE $ff,$80,$00,$80,$ff,$c0,$00,$c0 73 | DATA BYTE $ff,$00,$00,$00,$11,$ee,$00,$00 74 | DATA BYTE $11,$ee,$00,$00,$ff,$00,$00,$00 75 | DATA BYTE $11,$00,$ee,$ee,$11,$00,$ee,$ee 76 | DATA BYTE $ff,$00,$00,$00,$11,$00,$ee,$ee 77 | DATA BYTE $28,$28,$d7,$d7,$00,$00,$ff,$ff 78 | DATA BYTE $00,$00,$ff,$ff,$07,$00,$f8,$f8 79 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 80 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 81 | DATA BYTE $0f,$00,$f0,$f0,$3f,$00,$c0,$c0 82 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 83 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 84 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 85 | DATA BYTE $ff,$ff,$7f,$ff,$ff,$ff,$ff,$ff 86 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 87 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 88 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$fe,$ff 89 | DATA BYTE $ff,$ff,$00,$ff,$ff,$ff,$00,$ff 90 | DATA BYTE $ff,$ff,$00,$ff,$ff,$ff,$00,$ff 91 | DATA BYTE $ff,$ff,$88,$ff,$ff,$ff,$98,$ff 92 | DATA BYTE $ff,$ff,$9c,$ff,$bf,$80,$00,$c0 93 | DATA BYTE $dc,$ff,$00,$ff,$5c,$ff,$00,$ff 94 | DATA BYTE $5a,$ff,$00,$ff,$fa,$ff,$00,$ff 95 | DATA BYTE $fe,$ff,$00,$ff,$ff,$ff,$00,$ff 96 | DATA BYTE $87,$87,$00,$ff,$07,$07,$00,$ff 97 | DATA BYTE $43,$ff,$00,$ff,$e3,$ff,$00,$ff 98 | DATA BYTE $63,$ff,$00,$ff,$6b,$ff,$00,$ff 99 | DATA BYTE $6b,$ff,$00,$ff,$2b,$ff,$00,$ff 100 | DATA BYTE $2b,$ff,$00,$ff,$2b,$ff,$00,$ff 101 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 102 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 103 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 104 | DATA BYTE $3f,$c0,$00,$c0,$3f,$c0,$00,$c0 105 | DATA BYTE $11,$00,$ee,$ee,$ff,$00,$00,$00 106 | DATA BYTE $11,$ee,$00,$00,$11,$ee,$00,$00 107 | DATA BYTE $ff,$00,$00,$00,$11,$00,$ee,$ee 108 | DATA BYTE $11,$00,$ee,$ee,$ff,$00,$00,$00 109 | DATA BYTE $ff,$00,$00,$00,$e0,$00,$1f,$1f 110 | DATA BYTE $00,$00,$ff,$ff,$00,$00,$ff,$ff 111 | DATA BYTE $00,$00,$ff,$ff,$0e,$0e,$f1,$f1 112 | DATA BYTE $70,$70,$8f,$8f,$00,$00,$ff,$ff 113 | DATA BYTE $ff,$00,$00,$00,$0f,$00,$f0,$f0 114 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 115 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 116 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 117 | DATA BYTE $ff,$e0,$80,$e0,$80,$e0,$00,$ff 118 | DATA BYTE $9f,$e0,$00,$ff,$9f,$e0,$00,$ff 119 | DATA BYTE $9f,$e0,$00,$ff,$9f,$e0,$00,$ff 120 | DATA BYTE $8f,$f0,$00,$ff,$cf,$f0,$00,$ff 121 | DATA BYTE $00,$00,$00,$ff,$3f,$00,$00,$ff 122 | DATA BYTE $3f,$00,$00,$ff,$3f,$00,$00,$ff 123 | DATA BYTE $3f,$00,$00,$ff,$0f,$00,$00,$ff 124 | DATA BYTE $0f,$00,$00,$ff,$1f,$00,$00,$ff 125 | DATA BYTE $07,$07,$00,$ff,$87,$07,$00,$ff 126 | DATA BYTE $87,$07,$00,$ff,$c7,$07,$00,$ff 127 | DATA BYTE $c7,$07,$00,$ff,$c7,$07,$00,$ff 128 | DATA BYTE $c7,$07,$00,$ff,$c7,$07,$00,$ff 129 | DATA BYTE $ab,$ff,$00,$ff,$a3,$ff,$00,$ff 130 | DATA BYTE $a3,$ff,$00,$ff,$a3,$ff,$00,$ff 131 | DATA BYTE $a5,$ff,$00,$ff,$ad,$ff,$00,$ff 132 | DATA BYTE $ad,$ff,$00,$ff,$ad,$ff,$00,$ff 133 | DATA BYTE $7f,$c0,$00,$c0,$ff,$c0,$00,$c0 134 | DATA BYTE $ff,$c0,$00,$c0,$ff,$c0,$00,$c0 135 | DATA BYTE $ff,$c0,$00,$c0,$ff,$c0,$00,$c0 136 | DATA BYTE $ff,$c0,$00,$c0,$ff,$c0,$00,$c0 137 | DATA BYTE $02,$02,$fd,$fd,$7e,$7e,$81,$81 138 | DATA BYTE $00,$00,$ff,$ff,$00,$00,$ff,$ff 139 | DATA BYTE $3f,$3f,$c0,$c0,$00,$00,$ff,$ff 140 | DATA BYTE $00,$00,$ff,$ff,$00,$00,$ff,$ff 141 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 142 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 143 | DATA BYTE $07,$00,$f8,$f8,$07,$00,$f8,$f8 144 | DATA BYTE $1f,$00,$e0,$e0,$7f,$00,$80,$80 145 | DATA BYTE $c7,$f8,$00,$ff,$c3,$fc,$00,$ff 146 | DATA BYTE $c3,$fc,$00,$ff,$c1,$fe,$00,$ff 147 | DATA BYTE $c0,$ff,$00,$ff,$c0,$ff,$00,$ff 148 | DATA BYTE $c0,$ff,$00,$ff,$c0,$ff,$80,$ff 149 | DATA BYTE $ff,$00,$00,$ff,$ff,$00,$00,$ff 150 | DATA BYTE $07,$f8,$f8,$07,$07,$f8,$f8,$07 151 | DATA BYTE $8f,$70,$70,$8f,$ff,$00,$00,$fc 152 | DATA BYTE $ff,$80,$00,$fc,$bf,$c0,$00,$fc 153 | DATA BYTE $c7,$07,$00,$ff,$c7,$07,$00,$ff 154 | DATA BYTE $87,$07,$00,$ff,$8f,$07,$00,$f7 155 | DATA BYTE $9f,$07,$00,$e7,$b7,$07,$01,$4f 156 | DATA BYTE $e7,$07,$01,$1f,$87,$07,$03,$7f 157 | DATA BYTE $af,$ff,$00,$ff,$af,$ff,$00,$ff 158 | DATA BYTE $af,$ff,$00,$ff,$af,$ff,$00,$ff 159 | DATA BYTE $af,$ff,$00,$ff,$af,$ff,$00,$ff 160 | DATA BYTE $af,$ff,$00,$ff,$ef,$ff,$00,$ff 161 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 162 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 163 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 164 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 165 | DATA BYTE $ff,$00,$00,$00,$11,$00,$ee,$ee 166 | DATA BYTE $11,$00,$ee,$ee,$ff,$00,$00,$00 167 | DATA BYTE $11,$00,$ee,$ee,$11,$00,$ee,$ee 168 | DATA BYTE $ff,$00,$00,$00,$11,$ee,$00,$00 169 | DATA BYTE $03,$00,$fc,$fc,$ff,$00,$00,$00 170 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 171 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 172 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 173 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 174 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 175 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 176 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 177 | DATA BYTE $c0,$ff,$80,$ff,$c0,$ff,$80,$ff 178 | DATA BYTE $c0,$ff,$80,$ff,$c0,$ff,$80,$ff 179 | DATA BYTE $c0,$ff,$80,$ff,$c0,$ff,$80,$ff 180 | DATA BYTE $c0,$ff,$80,$ff,$c0,$ff,$80,$ff 181 | DATA BYTE $bf,$c0,$00,$ff,$80,$e0,$00,$ff 182 | DATA BYTE $87,$fc,$00,$ff,$87,$fc,$00,$ff 183 | DATA BYTE $87,$fc,$00,$ff,$8b,$f4,$00,$ff 184 | DATA BYTE $ff,$00,$fc,$ff,$ff,$00,$fc,$ff 185 | DATA BYTE $07,$07,$03,$ff,$07,$07,$03,$ff 186 | DATA BYTE $07,$07,$03,$ff,$87,$07,$03,$ff 187 | DATA BYTE $87,$07,$02,$ff,$e7,$07,$02,$ff 188 | DATA BYTE $ff,$07,$02,$ff,$bf,$07,$02,$ff 189 | DATA BYTE $ed,$ff,$00,$ff,$ef,$ff,$00,$ff 190 | DATA BYTE $ef,$ff,$00,$ff,$ed,$ff,$00,$ff 191 | DATA BYTE $cd,$ff,$00,$ff,$cc,$ff,$00,$ff 192 | DATA BYTE $8c,$ff,$00,$ff,$8c,$ff,$00,$ff 193 | DATA BYTE $7f,$c0,$00,$c0,$7f,$c0,$00,$c0 194 | DATA BYTE $7f,$c0,$00,$c0,$3f,$c0,$00,$c0 195 | DATA BYTE $3f,$c0,$00,$c0,$1f,$e0,$00,$e0 196 | DATA BYTE $1f,$e0,$00,$e0,$1f,$e0,$00,$e0 197 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 198 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 199 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 200 | DATA BYTE $ff,$01,$01,$01,$ff,$0f,$0f,$0f 201 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 202 | DATA BYTE $ff,$02,$02,$02,$ff,$0f,$0f,$0f 203 | DATA BYTE $ff,$3f,$3f,$3f,$ff,$7f,$7f,$7f 204 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 205 | DATA BYTE $c0,$ff,$80,$ff,$c0,$ff,$80,$ff 206 | DATA BYTE $c0,$ff,$80,$ff,$c1,$fe,$81,$ff 207 | DATA BYTE $e1,$fe,$81,$ff,$e1,$ff,$81,$ff 208 | DATA BYTE $e3,$ff,$83,$ff,$e3,$ff,$83,$ff 209 | DATA BYTE $ff,$00,$fc,$ff,$7e,$80,$7e,$ff 210 | DATA BYTE $7f,$80,$7f,$ff,$ff,$03,$ff,$ff 211 | DATA BYTE $ff,$03,$ff,$ff,$ff,$03,$ff,$ff 212 | DATA BYTE $ff,$03,$ff,$ff,$ff,$02,$ff,$ff 213 | DATA BYTE $bf,$07,$02,$ff,$3f,$07,$00,$ff 214 | DATA BYTE $7f,$07,$00,$ff,$3f,$07,$00,$ff 215 | DATA BYTE $ff,$07,$f8,$ff,$ff,$07,$f8,$ff 216 | DATA BYTE $fb,$07,$f8,$ff,$fb,$07,$f8,$ff 217 | DATA BYTE $8c,$ff,$00,$ff,$8c,$ff,$00,$ff 218 | DATA BYTE $8c,$ff,$00,$ff,$88,$ff,$00,$ff 219 | DATA BYTE $83,$ff,$03,$ff,$87,$ff,$07,$ff 220 | DATA BYTE $0f,$ff,$0f,$ff,$3f,$ff,$3f,$ff 221 | DATA BYTE $1f,$e0,$00,$e0,$3f,$ff,$3f,$ff 222 | DATA BYTE $7f,$ff,$7f,$ff,$ff,$ff,$ff,$ff 223 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 224 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 225 | DATA BYTE $ff,$00,$00,$00,$ff,$00,$00,$00 226 | DATA BYTE $ff,$e0,$e0,$e0,$ff,$f8,$f8,$f8 227 | DATA BYTE $ff,$fc,$fc,$fc,$ff,$fe,$fe,$fe 228 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 229 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 230 | DATA BYTE $ff,$ff,$ff,$ff,$fe,$ff,$ff,$ff 231 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 232 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 233 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 234 | DATA BYTE $ff,$ff,$ff,$ff,$3f,$ff,$ff,$ff 235 | DATA BYTE $3f,$ff,$ff,$ff,$3f,$ff,$ff,$ff 236 | DATA BYTE $7f,$ff,$ff,$ff,$7f,$ff,$ff,$ff 237 | DATA BYTE $c3,$ff,$83,$ff,$c3,$ff,$c3,$ff 238 | DATA BYTE $ff,$fe,$ff,$ff,$ff,$fe,$ff,$ff 239 | DATA BYTE $01,$fe,$ff,$ff,$01,$fe,$ff,$ff 240 | DATA BYTE $03,$fc,$ff,$ff,$07,$f8,$ff,$ff 241 | DATA BYTE $ff,$04,$ff,$ff,$ff,$00,$ff,$ff 242 | DATA BYTE $ff,$00,$ff,$ff,$ff,$00,$ff,$ff 243 | DATA BYTE $ff,$00,$ff,$ff,$ff,$00,$ff,$ff 244 | DATA BYTE $ff,$01,$ff,$ff,$ff,$03,$ff,$ff 245 | DATA BYTE $fe,$03,$fc,$ff,$fc,$03,$fc,$ff 246 | DATA BYTE $ff,$0f,$ff,$ff,$ff,$1f,$ff,$ff 247 | DATA BYTE $ff,$7f,$ff,$ff,$ff,$ff,$ff,$ff 248 | DATA BYTE $ff,$ff,$ff,$ff,$fe,$ff,$ff,$ff 249 | DATA BYTE $3f,$ff,$3f,$ff,$ff,$ff,$ff,$ff 250 | DATA BYTE $ff,$ff,$ff,$ff,$fc,$ff,$ff,$ff 251 | DATA BYTE $f0,$ff,$ff,$ff,$c0,$ff,$ff,$ff 252 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 253 | DATA BYTE $f3,$ff,$ff,$ff,$c1,$ff,$ff,$ff 254 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 255 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 256 | DATA BYTE $00,$ff,$ff,$ff,$00,$ff,$ff,$ff 257 | DATA BYTE $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff 258 | DATA BYTE $ff,$ff,$ff,$ff,$3f,$ff,$ff,$ff 259 | DATA BYTE $1f,$ff,$ff,$ff,$1f,$ff,$ff,$ff 260 | DATA BYTE $0f,$ff,$ff,$ff,$0f,$ff,$ff,$ff 261 | 262 | ' Width = 8, height = 8 263 | portrait_pattern: 264 | DATA BYTE $80,$00,$81,$00,$82,$00,$83,$00,$84,$00,$85,$00,$86,$00,$87,$00 265 | DATA BYTE $88,$00,$89,$00,$8a,$00,$8b,$00,$8c,$00,$8d,$00,$8e,$00,$8f,$00 266 | DATA BYTE $90,$00,$91,$00,$92,$00,$93,$00,$94,$00,$95,$00,$96,$00,$97,$00 267 | DATA BYTE $98,$00,$99,$00,$9a,$00,$9b,$00,$9c,$00,$9d,$00,$9e,$00,$86,$04 268 | DATA BYTE $9f,$00,$a0,$00,$a1,$00,$a2,$00,$a3,$00,$a4,$00,$a5,$00,$a6,$00 269 | DATA BYTE $a7,$00,$a8,$00,$a9,$00,$aa,$00,$ab,$00,$ac,$00,$ad,$00,$a6,$04 270 | DATA BYTE $ae,$00,$af,$00,$b0,$00,$b1,$00,$b2,$00,$b3,$00,$b4,$00,$b5,$00 271 | DATA BYTE $b6,$00,$b7,$00,$b8,$00,$b9,$00,$ba,$00,$bb,$00,$bc,$00,$bd,$00 272 | -------------------------------------------------------------------------------- /examples/space_attack.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Space Attack (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/29/2024. 8 | ' Revision date: Nov/13/2024. Added pixel stars background and double-speed enemies. 9 | ' 10 | 11 | DEFINE SPRITE 0,4,sprites_bitmaps 12 | 13 | DIM enemy_x(8) 14 | DIM enemy_y(8) 15 | DIM enemy_s(8) 16 | 17 | restart_game: 18 | CLS 19 | MODE 2 ' In this mode, char definitions are faster 20 | 21 | #score = 0 22 | 23 | player_x = 120 24 | player_y = 176 25 | bullet_y = 0 26 | FOR c = 0 TO 7 27 | enemy_s(c) = 0 28 | NEXT c 29 | 30 | ' Draw the stars background 31 | ' 32 | ' We make a vertical strip using 8 characters (numbers 16 to 23) 33 | ' and we repeat it continuously (24 rows / 8 characters = 3 repetitions) 34 | ' 35 | FOR d = 0 TO 31 ' For each column 36 | e = e + RANDOM(4) + 2 ' Displace the strip offset for this column. 37 | FOR #c = 0 TO 736 STEP 32 38 | e = ((e + 1) AND 7) OR 16 ' Limit to range 16 to 23. 39 | VPOKE $1800 + #c + d, e ' Put strip character. 40 | NEXT #c 41 | NEXT d 42 | 43 | GOSUB update_score 44 | 45 | game_loop: 46 | WAIT 47 | 48 | ' Displace stars pixel by pixel 49 | ' 50 | ' This is almost magic because these characters are used in the whole screen, 51 | ' so this redefinition of characters updates the whole screen. 52 | ' 53 | DEFINE CHAR 16,8,VARPTR pixel_bitmaps(((FRAME / 2) AND 63) XOR 63) 54 | 55 | ' Background "music" (two tones alternating each 16 video frames) 56 | #c = 960 57 | IF FRAME AND 32 THEN #c = 1023 58 | d = (FRAME AND 31) / 2 59 | SOUND 0, #c, 15 - d 60 | 61 | ' Setup player sprite 62 | SPRITE 0,player_y-1,player_x,0,10 63 | 64 | ' Setup bullet sprite 65 | IF bullet_y = 0 THEN ' Active? 66 | SPRITE 1,$d1,0,0,0 ' No, remove sprite. 67 | SOUND 1,,0 ' Disable sound. 68 | ELSE 69 | SPRITE 1,bullet_y-1,bullet_x,8,7 ' Setup sprite. 70 | bullet_y = bullet_y - 4 ' Displace bullet. 71 | SOUND 1,bullet_y+16,11 ' Make sound. 72 | END IF 73 | 74 | ' 75 | ' Display and move the enemies. 76 | ' 77 | FOR c = 0 TO 7 78 | IF enemy_s(c) = 0 THEN ' No enemy 79 | SPRITE c + 2, $d1, 0, 0, 0 80 | ' Create one 81 | enemy_x(c) = RANDOM(240) 82 | enemy_y(c) = $c0 + c * 4 83 | enemy_s(c) = RANDOM(2) + 1 84 | ELSEIF enemy_s(c) < 3 THEN ' Enemy moving. 85 | SPRITE c + 2, enemy_y(c) - 1, enemy_x(c), 4, 2 86 | 87 | ' Slowly drift towards the player. 88 | IF (FRAME AND 3) = 0 THEN 89 | IF player_x < enemy_x(c) THEN 90 | enemy_x(c) = enemy_x(c) - 1 91 | ELSE 92 | enemy_x(c) = enemy_x(c) + 1 93 | END IF 94 | END IF 95 | ' Move down. 96 | IF enemy_s(c) = 1 THEN 97 | enemy_y(c) = enemy_y(c) + 2 98 | ELSE 99 | enemy_y(c) = enemy_y(c) + 3 100 | END IF 101 | IF enemy_y(c) >= $c0 AND enemy_y(c) <= $c7 THEN ' Reached bottom. 102 | enemy_x(c) = RANDOM(240) 103 | enemy_y(c) = $f2 ' Reset enemy. 104 | enemy_s(c) = RANDOM(2) + 1 105 | END IF 106 | 107 | ' 108 | ' Check if bullet has been launched. 109 | ' 110 | IF bullet_y <> 0 THEN ' Is bullet launched? 111 | IF ABS(bullet_x + 1 - enemy_x(c)) < 8 THEN 112 | IF ABS(bullet_y + 1 - enemy_y(c)) < 8 THEN 113 | enemy_s(c) = 3 ' Enemy explodes 114 | #score = #score + 1 115 | GOSUB update_score 116 | bullet_y = 0 117 | sound 2,2 ' Start enemy explosion sound 118 | SOUND 3,$E7,13 119 | END IF 120 | END IF 121 | END IF 122 | 123 | ' 124 | ' Check if player is hit by enemy. 125 | ' 126 | IF ABS(player_y + 1 - enemy_y(c)) < 8 THEN 127 | IF ABS(player_x + 1 - enemy_x(c)) < 8 THEN 128 | GOTO player_dies 129 | END IF 130 | END IF 131 | ELSE 132 | ' Enemy explosion. 133 | IF FRAME AND 4 THEN d = 10 ELSE d = 6 134 | SPRITE c + 2, enemy_y(c) - 1, enemy_x(c), 12, d 135 | 136 | ' Displace explosion slowly. 137 | IF FRAME AND 1 THEN 138 | IF enemy_y(c) < $c0 THEN enemy_y(c) = enemy_y(c) + 1 139 | END IF 140 | 141 | ' Explosion sound. 142 | SOUND 2,enemy_s(c) 143 | enemy_s(c) = enemy_s(c) + 1 144 | IF enemy_s(c) = 80 THEN ' Time reached. 145 | SOUND 3,,0 146 | enemy_x(c) = RANDOM(240) 147 | enemy_y(c) = $f2 148 | enemy_s(c) = 1 ' Bring back enemy. 149 | END IF 150 | END IF 151 | NEXT c 152 | 153 | ' 154 | ' Movement of the player. 155 | ' 156 | IF cont1.left THEN IF player_x > 0 THEN player_x = player_x - 2 157 | IF cont1.right THEN IF player_x < 240 THEN player_x = player_x + 2 158 | IF cont1.button THEN ' Fire! 159 | IF bullet_y = 0 THEN ' Only if no bullet active. 160 | bullet_y = player_y - 8 161 | bullet_x = player_x 162 | END IF 163 | END IF 164 | GOTO game_loop 165 | 166 | ' 167 | ' Player dies. 168 | ' 169 | player_dies: 170 | PRINT AT 11,"GAME OVER" 171 | 172 | ' 173 | ' Explosion effect and sound. 174 | ' 175 | SOUND 0,,0 176 | SOUND 1,,0 177 | SOUND 2,32,0 178 | FOR c = 0 TO 120 179 | WAIT 180 | SOUND 3,$E4 + (c AND 3),13 181 | SPRITE 0, player_y - 1 + RANDOM(5) - 2, player_x + RANDOM(5) - 2, 12, RANDOM(14) + 2 182 | NEXT c 183 | SOUND 3,,0 184 | 185 | ' 186 | ' Remove enemies. 187 | ' 188 | FOR c = 1 TO 9 189 | SPRITE c, $d1, 0, 0, 0 190 | NEXT c 191 | 192 | ' 193 | ' Big delay. 194 | ' 195 | #c = FRAME 196 | DO 197 | WAIT 198 | LOOP WHILE FRAME - #c < 300 199 | 200 | GOTO restart_game 201 | 202 | ' 203 | ' Update the score on the screen. 204 | ' 205 | update_score: PROCEDURE 206 | PRINT AT 2,#score,"0" 207 | END 208 | 209 | ' 210 | ' Pixel scrolling stars 211 | ' 212 | pixel_bitmaps: 213 | BITMAP "....X..." 214 | BITMAP "........" 215 | BITMAP "........" 216 | BITMAP "........" 217 | BITMAP "........" 218 | BITMAP "........" 219 | BITMAP "........" 220 | BITMAP "........" 221 | 222 | BITMAP "........" 223 | BITMAP "........" 224 | BITMAP "........" 225 | BITMAP "........" 226 | BITMAP "........" 227 | BITMAP "........" 228 | BITMAP "........" 229 | BITMAP "........" 230 | 231 | BITMAP "........" 232 | BITMAP "........" 233 | BITMAP "........" 234 | BITMAP "........" 235 | BITMAP "........" 236 | BITMAP "........" 237 | BITMAP "........" 238 | BITMAP "........" 239 | 240 | BITMAP "........" 241 | BITMAP "........" 242 | BITMAP "........" 243 | BITMAP "........" 244 | BITMAP "........" 245 | BITMAP "........" 246 | BITMAP "........" 247 | BITMAP "........" 248 | 249 | BITMAP "........" 250 | BITMAP "........" 251 | BITMAP "........" 252 | BITMAP "........" 253 | BITMAP "........" 254 | BITMAP "........" 255 | BITMAP "........" 256 | BITMAP "........" 257 | 258 | BITMAP "........" 259 | BITMAP "........" 260 | BITMAP "........" 261 | BITMAP "........" 262 | BITMAP "........" 263 | BITMAP "........" 264 | BITMAP "........" 265 | BITMAP "........" 266 | 267 | BITMAP "........" 268 | BITMAP "........" 269 | BITMAP "........" 270 | BITMAP "........" 271 | BITMAP "........" 272 | BITMAP "........" 273 | BITMAP "........" 274 | BITMAP "........" 275 | 276 | BITMAP "........" 277 | BITMAP "........" 278 | BITMAP "........" 279 | BITMAP "........" 280 | BITMAP "........" 281 | BITMAP "........" 282 | BITMAP "........" 283 | BITMAP "........" 284 | 285 | BITMAP "....X..." 286 | BITMAP "........" 287 | BITMAP "........" 288 | BITMAP "........" 289 | BITMAP "........" 290 | BITMAP "........" 291 | BITMAP "........" 292 | BITMAP "........" 293 | 294 | BITMAP "........" 295 | BITMAP "........" 296 | BITMAP "........" 297 | BITMAP "........" 298 | BITMAP "........" 299 | BITMAP "........" 300 | BITMAP "........" 301 | BITMAP "........" 302 | 303 | BITMAP "........" 304 | BITMAP "........" 305 | BITMAP "........" 306 | BITMAP "........" 307 | BITMAP "........" 308 | BITMAP "........" 309 | BITMAP "........" 310 | BITMAP "........" 311 | 312 | BITMAP "........" 313 | BITMAP "........" 314 | BITMAP "........" 315 | BITMAP "........" 316 | BITMAP "........" 317 | BITMAP "........" 318 | BITMAP "........" 319 | BITMAP "........" 320 | 321 | BITMAP "........" 322 | BITMAP "........" 323 | BITMAP "........" 324 | BITMAP "........" 325 | BITMAP "........" 326 | BITMAP "........" 327 | BITMAP "........" 328 | BITMAP "........" 329 | 330 | BITMAP "........" 331 | BITMAP "........" 332 | BITMAP "........" 333 | BITMAP "........" 334 | BITMAP "........" 335 | BITMAP "........" 336 | BITMAP "........" 337 | BITMAP "........" 338 | 339 | BITMAP "........" 340 | BITMAP "........" 341 | BITMAP "........" 342 | BITMAP "........" 343 | BITMAP "........" 344 | BITMAP "........" 345 | BITMAP "........" 346 | BITMAP "........" 347 | 348 | BITMAP "........" 349 | BITMAP "........" 350 | BITMAP "........" 351 | BITMAP "........" 352 | BITMAP "........" 353 | BITMAP "........" 354 | BITMAP "........" 355 | BITMAP "........" 356 | 357 | ' 358 | ' Bitmaps for the game. 359 | ' 360 | sprites_bitmaps: 361 | BITMAP ".......XX......." 362 | BITMAP ".......XX......." 363 | BITMAP "......XXXX......" 364 | BITMAP "......XXXX......" 365 | BITMAP "......XXXX......" 366 | BITMAP ".....XXXXXX....." 367 | BITMAP ".....XXXXXX....." 368 | BITMAP ".....XX..XX....." 369 | BITMAP ".....X....X....." 370 | BITMAP "..XX.XXXXXX.XX.." 371 | BITMAP ".XXX.XXXXXX.XXX." 372 | BITMAP ".XXXXX....XXXXX." 373 | BITMAP "XX..XXXXX.XX..XX" 374 | BITMAP "XXX.XXXXXXXXX.XX" 375 | BITMAP "XXXX.XXXXXX.XXXX" 376 | BITMAP ".XX..XX..XX..XX." 377 | 378 | BITMAP "....XXXXXXXX...." 379 | BITMAP "...X........X..." 380 | BITMAP "..X.XX....XX.X.." 381 | BITMAP ".X...XXXXXX...X." 382 | BITMAP ".X...X.XX.X...X." 383 | BITMAP ".X...XXXXXX...X." 384 | BITMAP ".X....XXXX....X." 385 | BITMAP ".X..XX....XX..X." 386 | BITMAP ".XXXX.XXXX.XXXX." 387 | BITMAP "XXX..X....X..XXX" 388 | BITMAP "..XXXXXXXXXXXX.." 389 | BITMAP "XXX....XX....XXX" 390 | BITMAP "X.XXXX.XX.XXXX.X" 391 | BITMAP "X..XX.XXXX.XX..X" 392 | BITMAP "XXX..XX..XX..XXX" 393 | BITMAP "..XXXX....XXXX.." 394 | 395 | BITMAP "................" 396 | BITMAP "................" 397 | BITMAP "................" 398 | BITMAP "................" 399 | BITMAP ".......XX......." 400 | BITMAP "......XXXX......" 401 | BITMAP "......XXXX......" 402 | BITMAP "......XXXX......" 403 | BITMAP "......XXXX......" 404 | BITMAP "....XXXXXXXX...." 405 | BITMAP "...XXXXXXXXXX..." 406 | BITMAP "......XXXX......" 407 | BITMAP ".....XX...XX...." 408 | BITMAP "................" 409 | BITMAP "................" 410 | BITMAP "................" 411 | 412 | BITMAP "................" 413 | BITMAP "................" 414 | BITMAP ".......X........" 415 | BITMAP ".......XX......." 416 | BITMAP "X......XXX......" 417 | BITMAP "XXX.....XXX...XX" 418 | BITMAP "XXXXX..XXXX..XXX" 419 | BITMAP "...XXXXXXXXXXX.." 420 | BITMAP ".....XXXXXX.X..." 421 | BITMAP "......X..X.X...." 422 | BITMAP ".....XXXXXXXX..." 423 | BITMAP "....XXX.XXXXXX.." 424 | BITMAP "...XXX.....XXXX." 425 | BITMAP "...XX........XXX" 426 | BITMAP "..XX............" 427 | BITMAP "................" 428 | -------------------------------------------------------------------------------- /examples/space_attack_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Space Attack (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/29/2024. 8 | ' Revision date: Nov/13/2024. Added pixel stars background and double-speed enemies. 9 | ' Revision date: Apr/26/2025. Adapted for Sega Master System. 10 | ' 11 | 12 | DEFINE SPRITE 0,8,sprites_bitmaps 13 | 14 | DEFINE CHAR 16,8,pixel_bitmaps 15 | 16 | DIM enemy_x(8) 17 | DIM enemy_y(8) 18 | DIM enemy_s(8) 19 | 20 | restart_game: 21 | CLS 22 | MODE 4 ' In this mode, char definitions are faster 23 | BORDER ,4 ' Avoid scrolling in the columns 24-31 24 | 25 | #score = 0 26 | 27 | player_x = 120 28 | player_y = 176 29 | bullet_y = 0 30 | FOR c = 0 TO 7 31 | enemy_s(c) = 0 32 | NEXT c 33 | 34 | ' Draw the stars background 35 | ' 36 | ' We make a vertical strip using 8 characters (numbers 16 to 23) 37 | ' and we repeat it continuously (24 rows / 8 characters = 3 repetitions) 38 | ' 39 | FOR d = 0 TO 46 STEP 2 ' For each column 40 | FOR #c = 0 TO 1728 STEP 64 41 | e = RANDOM(8) + 16 42 | VPOKE $3800 + #c + d, e ' Put strip character. 43 | NEXT #c 44 | NEXT d 45 | 46 | GOSUB update_score 47 | 48 | game_loop: 49 | WAIT 50 | 51 | ' 52 | ' Displace stars pixel by pixel 53 | ' 54 | scroll_y = scroll_y - 1 55 | IF scroll_y = $ff THEN scroll_y = $df 56 | SCROLL 0, scroll_y 57 | 58 | ' Background "music" (two tones alternating each 16 video frames) 59 | #c = 960 60 | IF FRAME AND 32 THEN #c = 1023 61 | d = (FRAME AND 31) / 2 62 | SOUND 0, #c, 15 - d 63 | 64 | ' Setup player sprite 65 | SPRITE 0,player_y-1,player_x,0 66 | SPRITE 1,player_y-1,player_x+8,2 67 | 68 | ' Setup bullet sprite 69 | IF bullet_y = 0 THEN ' Active? 70 | SPRITE 2,$e0,0,0 ' No, remove sprites. 71 | SPRITE 3,$e0,0,0 72 | SOUND 1,,0 ' Disable sound. 73 | ELSE 74 | SPRITE 2,bullet_y-1,bullet_x,8 ' Setup sprites. 75 | SPRITE 3,bullet_y-1,bullet_x+8,10 ' 76 | bullet_y = bullet_y - 4 ' Displace bullet. 77 | SOUND 1,bullet_y+16,11 ' Make sound. 78 | END IF 79 | 80 | ' 81 | ' Display and move the enemies. 82 | ' 83 | FOR c = 0 TO 7 84 | IF enemy_s(c) = 0 THEN ' No enemy 85 | SPRITE 4 + c * 2, $e0, 0, 0 86 | SPRITE 5 + c * 2, $e0, 0, 0 87 | ' Create one 88 | enemy_x(c) = RANDOM(168) + 4 89 | enemy_y(c) = $c0 + c * 4 90 | enemy_s(c) = RANDOM(2) + 1 91 | ELSEIF enemy_s(c) < 3 THEN ' Enemy moving. 92 | SPRITE 4 + c * 2, enemy_y(c) - 1, enemy_x(c), 4 93 | SPRITE 5 + c * 2, enemy_y(c) - 1, enemy_x(c) + 8, 6 94 | 95 | ' Slowly drift towards the player. 96 | IF (FRAME AND 3) = 0 THEN 97 | IF player_x < enemy_x(c) THEN 98 | enemy_x(c) = enemy_x(c) - 1 99 | ELSE 100 | enemy_x(c) = enemy_x(c) + 1 101 | END IF 102 | END IF 103 | ' Move down. 104 | IF enemy_s(c) = 1 THEN 105 | enemy_y(c) = enemy_y(c) + 2 106 | ELSE 107 | enemy_y(c) = enemy_y(c) + 3 108 | END IF 109 | IF enemy_y(c) >= $c0 AND enemy_y(c) <= $c7 THEN ' Reached bottom. 110 | enemy_x(c) = RANDOM(168) + 4 111 | enemy_y(c) = $f2 ' Reset enemy. 112 | enemy_s(c) = RANDOM(2) + 1 113 | END IF 114 | 115 | ' 116 | ' Check if bullet has been launched. 117 | ' 118 | IF bullet_y <> 0 THEN ' Is bullet launched? 119 | IF ABS(bullet_x + 1 - enemy_x(c)) < 8 THEN 120 | IF ABS(bullet_y + 1 - enemy_y(c)) < 8 THEN 121 | enemy_s(c) = 3 ' Enemy explodes 122 | #score = #score + 1 123 | GOSUB update_score 124 | bullet_y = 0 125 | sound 2,2 ' Start enemy explosion sound 126 | SOUND 3,$E7,13 127 | END IF 128 | END IF 129 | END IF 130 | 131 | ' 132 | ' Check if player is hit by enemy. 133 | ' 134 | IF ABS(player_y + 1 - enemy_y(c)) < 8 THEN 135 | IF ABS(player_x + 1 - enemy_x(c)) < 8 THEN 136 | GOTO player_dies 137 | END IF 138 | END IF 139 | ELSE 140 | ' Enemy explosion. 141 | IF FRAME AND 4 THEN 142 | SPRITE 4 + c * 2, $e0, 0, 0 143 | SPRITE 5 + c * 2, $e0, 0, 0 144 | ELSE 145 | SPRITE 4 + c * 2, enemy_y(c) - 1, enemy_x(c), 12 146 | SPRITE 5 + c * 2, enemy_y(c) - 1, enemy_x(c) + 8, 14 147 | END IF 148 | 149 | ' Displace explosion slowly. 150 | IF FRAME AND 1 THEN 151 | IF enemy_y(c) < $c0 THEN enemy_y(c) = enemy_y(c) + 1 152 | END IF 153 | 154 | ' Explosion sound. 155 | SOUND 2,enemy_s(c) 156 | enemy_s(c) = enemy_s(c) + 1 157 | IF enemy_s(c) = 80 THEN ' Time reached. 158 | SOUND 3,,0 159 | enemy_x(c) = RANDOM(168) + 4 160 | enemy_y(c) = $f2 161 | enemy_s(c) = 1 ' Bring back enemy. 162 | END IF 163 | END IF 164 | NEXT c 165 | 166 | ' 167 | ' Movement of the player. 168 | ' 169 | IF cont1.left THEN IF player_x > 0 THEN player_x = player_x - 2 170 | IF cont1.right THEN IF player_x < 176 THEN player_x = player_x + 2 171 | IF cont1.button THEN ' Fire! 172 | IF bullet_y = 0 THEN ' Only if no bullet active. 173 | bullet_y = player_y - 8 174 | bullet_x = player_x 175 | END IF 176 | END IF 177 | GOTO game_loop 178 | 179 | ' 180 | ' Player dies. 181 | ' 182 | player_dies: 183 | PRINT AT 250,"GAME" 184 | PRINT AT 282,"OVER" 185 | 186 | ' 187 | ' Explosion effect and sound. 188 | ' 189 | SOUND 0,,0 190 | SOUND 1,,0 191 | SOUND 2,32,0 192 | FOR c = 0 TO 120 193 | WAIT 194 | SOUND 3,$E4 + (c AND 3),13 195 | e = player_y - 1 + RANDOM(5) - 2 196 | d = player_x + RANDOM(5) - 2 197 | SPRITE 0, e, d, 12 198 | SPRITE 1, e, d + 8, 14 199 | NEXT c 200 | SOUND 3,,0 201 | 202 | ' 203 | ' Remove enemies. 204 | ' 205 | FOR c = 2 TO 19 206 | SPRITE c, $e0, 0, 0 207 | NEXT c 208 | 209 | ' 210 | ' Big delay. 211 | ' 212 | #c = FRAME 213 | DO 214 | WAIT 215 | LOOP WHILE FRAME - #c < 300 216 | 217 | GOTO restart_game 218 | 219 | ' 220 | ' Update the score on the screen. 221 | ' 222 | update_score: PROCEDURE 223 | PRINT AT 57,"SCORE:" 224 | PRINT AT 89,#score,"0" 225 | END 226 | 227 | ' 228 | ' Pixel scrolling stars 229 | ' 230 | pixel_bitmaps: 231 | BITMAP ".5......" 232 | BITMAP "........" 233 | BITMAP "........" 234 | BITMAP "........" 235 | BITMAP "........" 236 | BITMAP "........" 237 | BITMAP "........" 238 | BITMAP "........" 239 | 240 | BITMAP "........" 241 | BITMAP "........" 242 | BITMAP ".....5.." 243 | BITMAP "........" 244 | BITMAP "........" 245 | BITMAP "........" 246 | BITMAP "........" 247 | BITMAP "........" 248 | 249 | BITMAP "........" 250 | BITMAP "........" 251 | BITMAP "........" 252 | BITMAP "........" 253 | BITMAP "........" 254 | BITMAP "...5...." 255 | BITMAP "........" 256 | BITMAP "........" 257 | 258 | BITMAP "........" 259 | BITMAP "........" 260 | BITMAP "........" 261 | BITMAP "........" 262 | BITMAP "........" 263 | BITMAP ".5......" 264 | BITMAP "........" 265 | BITMAP "........" 266 | 267 | BITMAP "........" 268 | BITMAP "......5." 269 | BITMAP "........" 270 | BITMAP "........" 271 | BITMAP "........" 272 | BITMAP "........" 273 | BITMAP "........" 274 | BITMAP "........" 275 | 276 | BITMAP "........" 277 | BITMAP "........" 278 | BITMAP "........" 279 | BITMAP "........" 280 | BITMAP "........" 281 | BITMAP "........" 282 | BITMAP "......5." 283 | BITMAP "........" 284 | 285 | BITMAP "........" 286 | BITMAP "........" 287 | BITMAP "....5..." 288 | BITMAP "........" 289 | BITMAP "........" 290 | BITMAP "........" 291 | BITMAP "........" 292 | BITMAP "........" 293 | 294 | BITMAP "........" 295 | BITMAP "........" 296 | BITMAP "........" 297 | BITMAP ".5......" 298 | BITMAP "........" 299 | BITMAP "........" 300 | BITMAP "........" 301 | BITMAP "........" 302 | 303 | ' 304 | ' Bitmaps for the game. 305 | ' 306 | sprites_bitmaps: 307 | BITMAP ".......FF......." 308 | BITMAP ".......FF......." 309 | BITMAP "......FFFF......" 310 | BITMAP "......FFFF......" 311 | BITMAP "......FFFF......" 312 | BITMAP ".....FFFFFF....." 313 | BITMAP ".....FFFFFF....." 314 | BITMAP ".....FF55FF....." 315 | BITMAP ".....F5555F....." 316 | BITMAP "..FF4FFFFFF4FF.." 317 | BITMAP ".FFF4FFFFFF4FFF." 318 | BITMAP ".FFFFF4444FFFFF." 319 | BITMAP "FF44FFFFF4FF44FF" 320 | BITMAP "FFF4FFFFFFFFF4FF" 321 | BITMAP "FFFF.FFFFFF.FFFF" 322 | BITMAP ".66..66..66..66." 323 | 324 | BITMAP "....33333333...." 325 | BITMAP "...3........3..." 326 | BITMAP "..3.FF....FF.3.." 327 | BITMAP ".3...FFFFFF...3." 328 | BITMAP ".3...FDFFDF...3." 329 | BITMAP ".3...FFFFFF...3." 330 | BITMAP ".3....FFFF ...3." 331 | BITMAP ".3..DD.FF.DD..3." 332 | BITMAP ".3DDD.DDDD.DDD3." 333 | BITMAP "366..D5555D..663" 334 | BITMAP "..333333333333.." 335 | BITMAP "333CCCC33CCCC333" 336 | BITMAP "3C3333C33C3333C3" 337 | BITMAP "3CC33C3333C33CC3" 338 | BITMAP "333CC33..33CC333" 339 | BITMAP "..3333....3333.." 340 | 341 | BITMAP "................" 342 | BITMAP "................" 343 | BITMAP "................" 344 | BITMAP "................" 345 | BITMAP ".......F5......." 346 | BITMAP "......F775......" 347 | BITMAP "......F775......" 348 | BITMAP "......F775......" 349 | BITMAP "......F775......" 350 | BITMAP "....FFF77775...." 351 | BITMAP "...7777777775..." 352 | BITMAP "......7555......" 353 | BITMAP ".....75...75...." 354 | BITMAP "................" 355 | BITMAP "................" 356 | BITMAP "................" 357 | 358 | BITMAP "................" 359 | BITMAP "................" 360 | BITMAP ".......6........" 361 | BITMAP ".......6A......." 362 | BITMAP "6......66A......" 363 | BITMAP "666.....666...66" 364 | BITMAP "6666A..66A6..6A6" 365 | BITMAP "...66A66AA666A.." 366 | BITMAP ".....66AAAAA6..." 367 | BITMAP "......6AAAA6...." 368 | BITMAP ".....666AAA66..." 369 | BITMAP "....666.66AA66.." 370 | BITMAP "...6A6.....6666." 371 | BITMAP "...6A........666" 372 | BITMAP "..66............" 373 | BITMAP "................" 374 | -------------------------------------------------------------------------------- /examples/strings.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' String handling in CVBASIC 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Apr/14/2025. 8 | ' 9 | 10 | ' 11 | ' CVBasic doesn't support directly strings, but enough 12 | ' support to provide the data and do processing. 13 | ' 14 | 15 | ' This is a macro, CVBasic doesn't process strings 16 | DEF FN center_string(pos, str) = PRINT AT pos - LEN(str)/2, str 17 | 18 | DEF FN wait_for_button(a) = FOR c = 0 TO 15:WAIT:NEXT:DO:WAIT:LOOP WHILE cont.button = 0 19 | 20 | DEF FN get_string(where, num) = RESTORE where: c = num: WHILE c > 0: DO: READ BYTE char: LOOP WHILE char <> 0: c = c - 1: WEND 21 | 22 | DEF FN print_string(a) = WHILE 1: READ BYTE char: IF char <> 0 THEN PRINT CHR$(char): WEND 23 | 24 | WHILE 1 25 | 26 | CLS 27 | 28 | center_string(80, "Hello, World!") 29 | 30 | wait_for_button(0) 31 | 32 | CLS 33 | 34 | get_string(messages_1, RANDOM(10)) 35 | 36 | print_string(0) 37 | 38 | get_string(messages_2, RANDOM(5)) 39 | 40 | print_string(0) 41 | 42 | get_string(messages_3, RANDOM(5)) 43 | 44 | print_string(0) 45 | 46 | wait_for_button(0) 47 | 48 | WEND 49 | 50 | messages_1: 51 | DATA BYTE "William",0 52 | DATA BYTE "Olivia",0 53 | DATA BYTE "Jack",0 54 | DATA BYTE "Amelia",0 55 | DATA BYTE "Michael",0 56 | DATA BYTE "Eleanor",0 57 | DATA BYTE "Noah",0 58 | DATA BYTE "Lily",0 59 | DATA BYTE "James",0 60 | DATA BYTE "Emma",0 61 | 62 | messages_2: 63 | DATA BYTE " likes ",0 64 | DATA BYTE " dislikes ",0 65 | DATA BYTE " loves ",0 66 | DATA BYTE " hates ",0 67 | DATA BYTE " enjoys ",0 68 | 69 | messages_3: 70 | DATA BYTE "frogs",0 71 | DATA BYTE "horses",0 72 | DATA BYTE "dogs",0 73 | DATA BYTE "cats",0 74 | DATA BYTE "turtles",0 75 | -------------------------------------------------------------------------------- /examples/test1.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Test 1 - Moving stars 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/29/2024. 8 | ' Revision date: Apr/27/2025. Uses new CHR$ syntax. 9 | ' 10 | 11 | DIM #stars(24) 12 | 13 | FOR c = 0 TO 23 14 | #stars(c) = 32 * c + #initial_positions(c) 15 | NEXT c 16 | 17 | WHILE 1 18 | PRINT AT 2,FRAME 19 | PRINT AT 12,".",<5>FRAME,"." 20 | PRINT AT 22,":",<.5>FRAME,":" 21 | 22 | WAIT 23 | FOR c = 0 TO 23 24 | PRINT AT #stars(c), CHR$(32) 25 | #stars(c) = #stars(c) + 32 26 | IF #stars(c) >= 768 THEN #stars(c) = #stars(c) - 736 27 | PRINT AT #stars(c), CHR$(42) 28 | NEXT c 29 | WEND 30 | 31 | 32 | #initial_positions: 33 | DATA 21,30,6,5 34 | DATA 18,11,11,5 35 | DATA 29,25,22,8 36 | DATA 10,2,9,22 37 | DATA 6,14,9,20 38 | DATA 14,28,31,24 39 | -------------------------------------------------------------------------------- /examples/test2.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Test 2 - Multiply/Divide/Modulo + READ DATA 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Feb/29/2024. 8 | ' Revision date: Aug/06/2024. Updated with new tests. 9 | ' Revision date: Sep/01/2024. Added arithmetic tests. 10 | ' 11 | 12 | DIM array(5), #array(5) 13 | 14 | SIGNED #count, #value 15 | 16 | WHILE 1 17 | 18 | CLS 19 | 20 | PRINT AT 0,"Arithmetic operations" 21 | 22 | a = $5a 23 | b = $a0 24 | 25 | PRINT AT $0040, a + b 26 | PRINT AT $0060, a - b 27 | PRINT AT $0080, a OR b 28 | PRINT AT $00a0, a AND b 29 | PRINT AT $00c0, a XOR b 30 | PRINT AT $00e0, a = b 31 | PRINT AT $0100, a <> b 32 | PRINT AT $0120, a < b 33 | PRINT AT $0140, a > b 34 | PRINT AT $0160, a <= b 35 | PRINT AT $0180, a >= b 36 | 37 | #a = $5a 38 | #b = $a0 39 | 40 | PRINT AT $0050, #a + #b 41 | PRINT AT $0070, #a - #b 42 | PRINT AT $0090, #a OR #b 43 | PRINT AT $00b0, #a AND #b 44 | PRINT AT $00d0, #a XOR #b 45 | PRINT AT $00f0, #a = #b 46 | PRINT AT $0110, #a <> #b 47 | PRINT AT $0130, #a < #b 48 | PRINT AT $0150, #a > #b 49 | PRINT AT $0170, #a <= #b 50 | PRINT AT $0190, #a >= #b 51 | 52 | FOR c = 1 TO 180 53 | WAIT 54 | NEXT c 55 | 56 | CLS 57 | 58 | PRINT AT 0, "Multiply/Divide/Modulo test" 59 | 60 | FOR c = 0 TO 22 61 | 62 | PRINT AT c * 32 + 32, c * 3 63 | PRINT AT c * 32 + 40, c / 3 64 | PRINT AT c * 32 + 48, c % 3 65 | 66 | NEXT c 67 | 68 | FOR c = 1 TO 180 69 | WAIT 70 | NEXT c 71 | 72 | CLS 73 | 74 | PRINT AT 0, "Same but signed" 75 | 76 | FOR #count = -10 TO 10 77 | 78 | PRINT AT #count * 32 + 352 79 | #value = #count * 3 80 | IF #value < 0 THEN PRINT "-",<>-#value ELSE PRINT <>#value 81 | 82 | PRINT AT #count * 32 + 360 83 | #value = #count / 3 84 | IF #value < 0 THEN PRINT "-",<>-#value ELSE PRINT <>#value 85 | 86 | PRINT AT #count * 32 + 368 87 | #value = #count % 3 88 | IF #value < 0 THEN PRINT "-",<>-#value ELSE PRINT <>#value 89 | 90 | NEXT #count 91 | 92 | FOR c = 1 TO 180 93 | WAIT 94 | NEXT c 95 | 96 | CLS 97 | 98 | PRINT AT 0,"RESTORE/READ BYTE/READ" 99 | 100 | #pointer = $1840 101 | 102 | RESTORE saved_string 103 | 104 | DO 105 | READ BYTE c 106 | IF c = 0 THEN EXIT DO 107 | 108 | PRINT AT #pointer, CHR$(c) 109 | #pointer = #pointer + 1 110 | LOOP WHILE 1 111 | 112 | PRINT AT 128 113 | 114 | DO 115 | READ #c 116 | IF #c = 0 THEN EXIT DO 117 | PRINT <>#c," " 118 | LOOP WHILE 1 119 | 120 | FOR c = 1 TO 180 121 | WAIT 122 | NEXT c 123 | 124 | CLS 125 | 126 | PRINT AT 0,"Arrays" 127 | 128 | array(0) = 8 129 | array(1) = 24 130 | array(2) = 16 131 | array(3) = 32 132 | array(4) = 48 133 | 134 | #array(0) = 101 135 | #array(1) = 202 136 | #array(2) = 303 137 | #array(3) = 404 138 | #array(4) = 505 139 | 140 | FOR c = 0 TO 4 141 | 142 | PRINT AT c * 32 + 64, <>array(c) 143 | PRINT AT c * 32 + 72, <>#array(c) 144 | 145 | NEXT c 146 | 147 | FOR c = 1 TO 180 148 | WAIT 149 | NEXT c 150 | 151 | CLS 152 | 153 | PRINT AT 0,"ON GOTO/ON GOSUB" 154 | 155 | FOR c = 0 TO 5 156 | ON c GOTO label1, label2, label3, label4, label5 157 | PRINT AT 195,"success: out of range" 158 | GOTO label6 159 | 160 | label1: PRINT AT 35,"label1" 161 | GOTO label6 162 | 163 | label2: PRINT AT 67,"label2" 164 | GOTO label6 165 | 166 | label3: PRINT AT 99,"label3" 167 | GOTO label6 168 | 169 | label4: PRINT AT 131,"label4" 170 | GOTO label6 171 | 172 | label5: PRINT AT 163,"label5" 173 | GOTO label6 174 | 175 | label6: 176 | NEXT c 177 | 178 | FOR c = 1 TO 3 179 | ON c - 1 GOSUB subroutine_1, subroutine_2, subroutine_3 180 | NEXT c 181 | 182 | FOR c = 1 TO 180 183 | WAIT 184 | NEXT c 185 | 186 | WEND 187 | 188 | subroutine_1: PROCEDURE 189 | PRINT AT 472,"/-----\\" 190 | END 191 | 192 | subroutine_2: PROCEDURE 193 | PRINT AT 504,"|^ ^|" 194 | END 195 | 196 | subroutine_3: PROCEDURE 197 | PRINT AT 536,"| A |" 198 | END 199 | 200 | saved_string: 201 | DATA BYTE "Test string",0 202 | 203 | DATA 444,333,222,111,0 204 | 205 | -------------------------------------------------------------------------------- /examples/test3.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Test 3 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Nov/12/2024. 8 | ' 9 | 10 | DEFINE SPRITE 0, 1, sprite_bitmap 11 | 12 | sprite_x = 148 13 | sprite_y = 116 14 | 15 | sprite_color = 10 16 | 17 | #state = 0 18 | d = 1 19 | 20 | WHILE 1 21 | 22 | SPRITE 0, sprite_y - 1, sprite_x, 0, sprite_color 23 | 24 | WAIT 25 | WAIT 26 | 27 | d = d - 1 28 | IF d = 0 THEN 29 | d = 40 30 | #state = #state + 1 31 | IF #state = 10 THEN #state = 1 32 | END IF 33 | 34 | SELECT CASE #state 35 | CASE 1 36 | sprite_color = 10 37 | sprite_x = sprite_x - 2 38 | CASE 2 39 | sprite_y = sprite_y - 2 40 | CASE 3 41 | sprite_x = sprite_x + 2 42 | CASE 4 43 | sprite_y = sprite_y + 2 44 | CASE 5 TO 6 45 | sprite_x = sprite_x - 1 46 | sprite_y = sprite_y - 1 47 | CASE 7 TO 8 48 | sprite_x = sprite_x + 1 49 | sprite_y = sprite_y + 1 50 | CASE ELSE 51 | sprite_color = RANDOM(14) + 2 52 | END SELECT 53 | 54 | WEND 55 | 56 | 57 | sprite_bitmap: 58 | BITMAP "......XXXX......" 59 | BITMAP "......XXXX......" 60 | BITMAP "......XXXX......" 61 | BITMAP "......XXXX......" 62 | BITMAP ".......XX......." 63 | BITMAP "..X....XX......." 64 | BITMAP ".XXXXXXXXXXX...." 65 | BITMAP ".XXXXXXXXXXXX..." 66 | BITMAP ".......XX...XX.." 67 | BITMAP ".......XX....XX." 68 | BITMAP "......XXXX....XX" 69 | BITMAP ".....XX..XX....." 70 | BITMAP ".....XX..XX....." 71 | BITMAP ".....XX..XX....." 72 | BITMAP ".....XX..XX....." 73 | BITMAP "....XXX..XXX...." 74 | -------------------------------------------------------------------------------- /examples/test3_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Test 3 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Nov/12/2024. 8 | ' Revision date: Apr/27/2025. Adapted for Sega Master System. 9 | ' 10 | 11 | DEFINE SPRITE 0, 2, sprite_bitmap 12 | 13 | sprite_x = 148 14 | sprite_y = 116 15 | 16 | #state = 0 17 | d = 1 18 | 19 | WHILE 1 20 | 21 | SPRITE 0, sprite_y - 1, sprite_x, 0 22 | SPRITE 1, sprite_y - 1, sprite_x + 8, 2 23 | 24 | WAIT 25 | WAIT 26 | 27 | d = d - 1 28 | IF d = 0 THEN 29 | d = 40 30 | #state = #state + 1 31 | IF #state = 10 THEN #state = 1 32 | END IF 33 | 34 | SELECT CASE #state 35 | CASE 1 36 | PALETTE 10 + 16, $0F 37 | sprite_x = sprite_x - 2 38 | CASE 2 39 | sprite_y = sprite_y - 2 40 | CASE 3 41 | sprite_x = sprite_x + 2 42 | CASE 4 43 | sprite_y = sprite_y + 2 44 | CASE 5 TO 6 45 | sprite_x = sprite_x - 1 46 | sprite_y = sprite_y - 1 47 | CASE 7 TO 8 48 | sprite_x = sprite_x + 1 49 | sprite_y = sprite_y + 1 50 | CASE ELSE 51 | PALETTE 10 + 16, RANDOM(63) + 1 52 | END SELECT 53 | 54 | WEND 55 | 56 | 57 | sprite_bitmap: 58 | BITMAP "......AAAA......" 59 | BITMAP "......AAAA......" 60 | BITMAP "......AAAA......" 61 | BITMAP "......AAAA......" 62 | BITMAP ".......AA......." 63 | BITMAP "..A....AA......." 64 | BITMAP ".AAAAAAAAAAA...." 65 | BITMAP ".AAAAAAAAAAAA..." 66 | BITMAP ".......AA...AA.." 67 | BITMAP ".......AA....AA." 68 | BITMAP "......AAAA....AA" 69 | BITMAP ".....AA..AA....." 70 | BITMAP ".....AA..AA....." 71 | BITMAP ".....AA..AA....." 72 | BITMAP ".....AA..AA....." 73 | BITMAP "....AAA..AAA...." 74 | -------------------------------------------------------------------------------- /examples/varptr.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Using VARPTR to redefine graphics for levels 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Aug/26/2024. 8 | ' 9 | 10 | level = 1 11 | 12 | WHILE 1 13 | 14 | CLS 15 | 16 | DEFINE CHAR 128,2,VARPTR level_bitmaps((level - 1) * 16) ' Each character is 8 bytes. 2*8 = 16 17 | 18 | DEFINE COLOR 128,2,VARPTR level_colors((level - 1) * 16) ' Each character is 8 bytes. 2*8 = 16 19 | 20 | FOR c = 1 TO 10 21 | PRINT AT RANDOM(768),"\128" 22 | NEXT c 23 | FOR c = 1 TO 10 24 | PRINT AT RANDOM(768),"\129" 25 | NEXT c 26 | 27 | FOR c = 1 TO 120: WAIT: NEXT 28 | 29 | level = level + 1 30 | 31 | IF level = 3 THEN level = 1 32 | 33 | WEND 34 | 35 | level_bitmaps: 36 | BITMAP "..XXXX.." 37 | BITMAP ".X....X." 38 | BITMAP "X.X..X.X" 39 | BITMAP "X......X" 40 | BITMAP "X.X..X.X" 41 | BITMAP "X..XX..X" 42 | BITMAP ".X....X." 43 | BITMAP "..XXXX.." 44 | 45 | BITMAP ".....X.." 46 | BITMAP "....XXXX" 47 | BITMAP "XX..X.XX" 48 | BITMAP ".XXXXXXX" 49 | BITMAP "..XXXX.." 50 | BITMAP ".XXXXX.." 51 | BITMAP ".XX..XX." 52 | BITMAP ".XX..XX." 53 | 54 | BITMAP "..XXXX.." 55 | BITMAP ".X....X." 56 | BITMAP "X......X" 57 | BITMAP "X.X..X.X" 58 | BITMAP "X......X" 59 | BITMAP "X......X" 60 | BITMAP ".X....X." 61 | BITMAP "..XXXX.." 62 | 63 | BITMAP "..X..X.." 64 | BITMAP ".XX..XX." 65 | BITMAP ".XXXXXX." 66 | BITMAP ".X.XX.X." 67 | BITMAP ".XXXXX.X" 68 | BITMAP "..XXXX.X" 69 | BITMAP ".XX.XXXX" 70 | BITMAP ".XX.XXXX" 71 | 72 | level_colors: 73 | DATA BYTE $A1,$A1,$A1,$A1,$A1,$A1,$A1,$A1 74 | DATA BYTE $31,$31,$31,$31,$31,$31,$31,$31 75 | DATA BYTE $91,$91,$91,$91,$91,$91,$91,$91 76 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 77 | 78 | -------------------------------------------------------------------------------- /examples/varptr_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Using VARPTR to redefine graphics for levels 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Aug/26/2024. 8 | ' Revision date: Sep/27/2025. Adapted to Sega Master System. 9 | ' 10 | 11 | level = 1 12 | 13 | WHILE 1 14 | 15 | CLS 16 | 17 | DEFINE CHAR 128,2,VARPTR level_bitmaps((level - 1) * 64) ' Each character is 32 bytes. 2*32 = 64 18 | 19 | FOR c = 1 TO 10 20 | PRINT AT RANDOM(768),"\128" 21 | NEXT c 22 | FOR c = 1 TO 10 23 | PRINT AT RANDOM(768),"\129" 24 | NEXT c 25 | 26 | FOR c = 1 TO 120: WAIT: NEXT 27 | 28 | level = level + 1 29 | 30 | IF level = 3 THEN level = 1 31 | 32 | WEND 33 | 34 | level_bitmaps: 35 | BITMAP "..aaaa.." 36 | BITMAP ".a....a." 37 | BITMAP "a.a..a.a" 38 | BITMAP "a......a" 39 | BITMAP "a.a..a.a" 40 | BITMAP "a..aa..a" 41 | BITMAP ".a....a." 42 | BITMAP "..aaaa.." 43 | 44 | BITMAP ".....3.." 45 | BITMAP "....3333" 46 | BITMAP "33..3.33" 47 | BITMAP ".3333333" 48 | BITMAP "..3333.." 49 | BITMAP ".33333.." 50 | BITMAP ".33..33." 51 | BITMAP ".33..33." 52 | 53 | BITMAP "..9999.." 54 | BITMAP ".9....9." 55 | BITMAP "9......9" 56 | BITMAP "9.9..9.9" 57 | BITMAP "9......9" 58 | BITMAP "9......9" 59 | BITMAP ".9....9." 60 | BITMAP "..9999.." 61 | 62 | BITMAP "..5..5.." 63 | BITMAP ".55..55." 64 | BITMAP ".555555." 65 | BITMAP ".5.55.5." 66 | BITMAP ".55555.5" 67 | BITMAP "..5555.5" 68 | BITMAP ".55.5555" 69 | BITMAP ".55.5555" 70 | 71 | -------------------------------------------------------------------------------- /examples/vgm.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Mini VGM player for CVBasic 3 | ' 4 | ' This handles only SN76489 VGM files. 5 | ' 6 | ' by Oscar Toledo G. 7 | ' https://nanochess.org/ 8 | ' 9 | ' Creation date: Mar/13/2024. 10 | ' 11 | 12 | ' 13 | ' I/O port where the PSG is located in hardware. 14 | ' 15 | ' CONST VGM_PSG_PORT = $7F ' For SG-1000/SMS 16 | CONST VGM_PSG_PORT = $FF ' For Colecovision 17 | 18 | ON FRAME GOSUB vgm_play 19 | 20 | PRINT AT 33,"VGM playing..." 21 | 22 | ' 23 | ' Start playing a VGM song. 24 | ' 25 | #vgm_song = VARPTR vgm_music(0) 26 | GOSUB vgm_start 27 | 28 | ' 29 | ' Does nothing except to show the current playing pointer. 30 | ' 31 | WHILE 1 32 | WAIT 33 | PRINT AT 65,#vgm_pointer," " 34 | WEND 35 | 36 | ' 37 | ' Start playing a VGM song. 38 | ' Input: #vgm_song = pointer to song. 39 | ' 40 | vgm_start: PROCEDURE 41 | #vgm_end = #vgm_song + (PEEK(#vgm_song + 4) + (PEEK(#vgm_song + 5) * 256)) 42 | IF PEEK(#vgm_song + 8) < $50 THEN 43 | #vgm_pointer = #vgm_song + 64 44 | ELSE 45 | #vgm_pointer = #vgm_song + $34 + (PEEK(#vgm_song + 52) + (PEEK(#vgm_song + 53) * 256)) 46 | END IF 47 | 48 | END 49 | 50 | ' 51 | ' This routine is called on each video frame to play the next audio data. 52 | ' 53 | vgm_play: PROCEDURE 54 | IF #vgm_pointer = 0 THEN RETURN 55 | 56 | IF #vgm_pointer >= #vgm_end THEN #vgm_pointer = 0: RETURN 57 | 58 | WHILE 1 59 | vgm_byte = PEEK(#vgm_pointer) 60 | #vgm_pointer = #vgm_pointer + 1 61 | IF vgm_byte = $50 THEN 62 | OUT VGM_PSG_PORT,PEEK(#vgm_pointer) 63 | #vgm_pointer = #vgm_pointer + 1 64 | ELSEIF vgm_byte = $61 THEN 65 | #vgm_pointer = #vgm_pointer + 2 66 | EXIT WHILE 67 | ELSEIF vgm_byte = $62 THEN 68 | EXIT WHILE 69 | ELSEIF vgm_byte = $63 THEN 70 | EXIT WHILE 71 | ELSEIF vgm_byte = $66 THEN 72 | #vgm_pointer = 0 73 | EXIT WHILE 74 | END IF 75 | WEND 76 | END 77 | 78 | ' 79 | ' You can download VGM music from: 80 | ' https://www.zophar.net/music/sega-master-system-vgm/alex-kidd-in-miracle-world 81 | ' 82 | ' You need to decompress the file, and inside each file is compressed with gzip, 83 | ' so you need to decompress again each file. 84 | ' 85 | vgm_music: 86 | ASM INCBIN "alexkidd.vgm" 87 | -------------------------------------------------------------------------------- /examples/vgm_ay3.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Mini VGM player for CVBasic 3 | ' 4 | ' This handles only AY-3-8910 VGM files (feed with 3.58 mhz) 5 | ' 6 | ' by Oscar Toledo G. 7 | ' https://nanochess.org/ 8 | ' 9 | ' Creation date: May/06/2025. 10 | ' 11 | 12 | ' 13 | ' I/O port where the PSG is located in hardware. 14 | ' 15 | ' CONST VGM_PSG_PORT = $A0 ' For MSX 16 | CONST VGM_PSG_PORT = $50 ' For Colecovision Super Game Module 17 | 18 | ON FRAME GOSUB vgm_play 19 | 20 | PRINT AT 33,"VGM playing..." 21 | 22 | ' 23 | ' Start playing a VGM song. 24 | ' 25 | #vgm_song = VARPTR vgm_music(0) 26 | GOSUB vgm_start 27 | 28 | ' 29 | ' Does nothing except to show the current playing pointer. 30 | ' 31 | WHILE 1 32 | WAIT 33 | PRINT AT 65,#vgm_pointer," " 34 | WEND 35 | 36 | ' 37 | ' Start playing a VGM song. 38 | ' Input: #vgm_song = pointer to song. 39 | ' 40 | vgm_start: PROCEDURE 41 | #vgm_end = #vgm_song + (PEEK(#vgm_song + 4) + (PEEK(#vgm_song + 5) * 256)) 42 | IF PEEK(#vgm_song + 8) < $50 THEN 43 | #vgm_pointer = #vgm_song + 64 44 | ELSE 45 | #vgm_pointer = #vgm_song + $34 + (PEEK(#vgm_song + 52) + (PEEK(#vgm_song + 53) * 256)) 46 | END IF 47 | 48 | END 49 | 50 | ' 51 | ' This routine is called on each video frame to play the next audio data. 52 | ' 53 | vgm_play: PROCEDURE 54 | IF #vgm_pointer = 0 THEN RETURN 55 | 56 | IF #vgm_pointer >= #vgm_end THEN #vgm_pointer = 0: RETURN 57 | 58 | WHILE 1 59 | vgm_byte = PEEK(#vgm_pointer) 60 | #vgm_pointer = #vgm_pointer + 1 61 | IF vgm_byte = $a0 THEN 62 | OUT VGM_PSG_PORT,PEEK(#vgm_pointer) 63 | #vgm_pointer = #vgm_pointer + 1 64 | OUT VGM_PSG_PORT + 1,PEEK(#vgm_pointer) 65 | #vgm_pointer = #vgm_pointer + 1 66 | ELSEIF vgm_byte = $61 THEN 67 | #vgm_pointer = #vgm_pointer + 2 68 | EXIT WHILE 69 | ELSEIF vgm_byte = $62 THEN 70 | EXIT WHILE 71 | ELSEIF vgm_byte = $63 THEN 72 | EXIT WHILE 73 | ELSEIF vgm_byte = $66 THEN 74 | #vgm_pointer = 0 75 | EXIT WHILE 76 | END IF 77 | WEND 78 | END 79 | 80 | ' 81 | ' You can download VGM music from: 82 | ' https://vgmrips.net/packs/chip/ay-3-8910?letter=L 83 | ' 84 | ' You need to decompress the file, and inside each file is compressed with gzip, 85 | ' so you need to decompress again each file. 86 | ' 87 | vgm_music: 88 | ASM INCBIN "02 map screen.vgm" 89 | -------------------------------------------------------------------------------- /examples/viboritas_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Viboritas (demo for CVBasic) 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Oct/1990. 8 | ' Revision date: Feb/29/2024. Ported to CVBasic. 9 | ' Revision date: Apr/26/2025. Adapted to Sega Master System. 10 | ' 11 | 12 | ' The original game was made in Z80 assembler, 13 | ' you can see it here: https://nanochess.org/viboritas.html 14 | 15 | ' It is easier to understand in CVBasic ;) 16 | 17 | DEFINE CHAR 128,21,game_bitmaps 18 | DEFINE SPRITE 0,20,game_sprites 19 | 20 | restart_game: 21 | lives = 2 22 | level = 1 23 | restart_level: 24 | 25 | PRINT AT 684,"Lives: ",lives 26 | PRINT AT 745,"nanochess 1990" 27 | 28 | next_level: 29 | GOSUB draw_level 30 | 31 | x_player = 8 32 | y_player = 16 33 | player_frame = 0 34 | 35 | x_enemy1 = random(128) + 64 36 | y_enemy1 = 56 37 | enemy1_frame = 24 38 | x_enemy2 = random(128) + 80 39 | y_enemy2 = 96 40 | enemy2_frame = 32 41 | x_enemy3 = random(128) + 48 42 | y_enemy3 = 136 43 | enemy3_frame = 24 44 | 45 | enemy_speed = 0 46 | 47 | GOSUB start_song 48 | 49 | game_loop: 50 | WHILE 1 51 | WAIT 52 | GOSUB play_song 53 | 54 | SPRITE 0, y_player - 1, x_player, player_frame 55 | SPRITE 1, y_player - 1, x_player + 8, player_frame + 2 56 | SPRITE 2, y_enemy1 - 1, x_enemy1, enemy1_frame 57 | SPRITE 3, y_enemy1 - 1, x_enemy1 + 8, enemy1_frame + 2 58 | SPRITE 4, y_enemy2 - 1, x_enemy2, enemy2_frame 59 | SPRITE 5, y_enemy2 - 1, x_enemy2 + 8, enemy2_frame + 2 60 | SPRITE 6, y_enemy3 - 1, x_enemy3, enemy3_frame 61 | SPRITE 7, y_enemy3 - 1, x_enemy3 + 8, enemy3_frame + 2 62 | 63 | GOSUB move_player 64 | 65 | c = $50 + level * 4 66 | enemy_speed = enemy_speed + c 67 | WHILE enemy_speed >= $40 68 | enemy_speed = enemy_speed - $40 69 | GOSUB move_enemies 70 | WEND 71 | IF cont1.button THEN 72 | IF x_player > 232 AND x_player < 248 AND y_player = 136 THEN 73 | GOSUB sound_off 74 | 75 | FOR c = 1 to 10 76 | WAIT 77 | SOUND 0, 200 - c * 10, 13 78 | NEXT c 79 | 80 | level = level + 1 81 | IF level = 6 THEN 82 | GOSUB sound_off 83 | PRINT AT 267," YOU WIN! " 84 | #c = FRAME 85 | DO 86 | WAIT 87 | LOOP WHILE FRAME - #c < 300 88 | level = 1 89 | GOTO restart_level 90 | END IF 91 | GOTO next_level 92 | END IF 93 | END IF 94 | IF ABS(y_player + 1 - y_enemy1) < 8 THEN 95 | IF ABS(x_player + 1 - x_enemy1) < 8 THEN GOTO player_dies 96 | END IF 97 | IF ABS(y_player + 1 - y_enemy2) < 8 THEN 98 | IF ABS(x_player + 1 - x_enemy2) < 8 THEN GOTO player_dies 99 | END IF 100 | IF ABS(y_player + 1 - y_enemy3) < 8 THEN 101 | IF ABS(x_player + 1 - x_enemy3) < 8 THEN GOTO player_dies 102 | END IF 103 | WEND 104 | 105 | player_dies: 106 | GOSUB sound_off 107 | 108 | SOUND 0,640,13 109 | SOUND 1,320,13 110 | SOUND 2,160,13 111 | 112 | player_frame = 0 113 | FOR c = 0 TO 30 114 | WAIT 115 | WAIT 116 | player_frame = player_frame XOR 8 117 | SPRITE 0, y_player - 1, x_player, player_frame 118 | SPRITE 1, y_player - 1, x_player + 8, player_frame + 2 119 | NEXT c 120 | 121 | GOSUB sound_off 122 | 123 | DO 124 | WAIT 125 | SOUND 0,200 - y_player,13 126 | player_frame = player_frame XOR 8 127 | SPRITE 0, y_player - 1, x_player, player_frame 128 | SPRITE 1, y_player - 1, x_player + 8, player_frame + 2 129 | y_player = y_player + 2 130 | LOOP WHILE y_player < 160 131 | 132 | GOSUB sound_off 133 | 134 | IF lives = 0 THEN 135 | PRINT AT 267," GAME OVER " 136 | #c = FRAME 137 | DO 138 | WAIT 139 | LOOP WHILE FRAME - #c < 300 140 | GOTO restart_game 141 | END IF 142 | lives = lives - 1 143 | GOTO restart_level 144 | 145 | ' 146 | ' Draw the current level. 147 | ' 148 | draw_level: PROCEDURE 149 | 150 | ' Get the base character to draw the level. 151 | base_character = 128 + (level - 1) * 4 152 | 153 | ' Draw the background. 154 | FOR #c = $3800 TO $3cf8 STEP 8 155 | VPOKE #c, base_character 156 | VPOKE #c + 2, base_character 157 | VPOKE #c + 4, base_character 158 | VPOKE #c + 6, base_character + 1. 159 | NEXT #c 160 | 161 | ' Draw over the floors. 162 | FOR #c = $3900 TO $3cc0 STEP 320 163 | FOR #d = #c TO #c + 62 STEP 2 164 | VPOKE #d, base_character + 2. 165 | NEXT #d 166 | NEXT #c 167 | 168 | ' Draw the ladders. 169 | ladders = 6 - level 170 | 171 | FOR #c = $3900 TO $3B80 STEP 320 172 | FOR d = 1 TO ladders 173 | e = (RANDOM(28) + 2) * 2 174 | VPOKE #c + e, base_character + 3. 175 | VPOKE #c + e + 64, base_character + 3. 176 | VPOKE #c + e + 128, base_character + 3. 177 | VPOKE #c + e + 192, base_character + 3. 178 | VPOKE #c + e + 256, base_character + 3. 179 | NEXT d 180 | NEXT #c 181 | 182 | ' Draw the "exit". 183 | VPOKE $3CBC, 148 184 | 185 | END 186 | 187 | ' 188 | ' Move the player 189 | ' 190 | move_player: PROCEDURE 191 | IF cont1.left THEN 192 | IF y_player % 40 = 16 THEN ' Player aligned on floor 193 | IF x_player > 0 THEN x_player = x_player - 1 194 | IF FRAME AND 4 THEN player_frame = 8 ELSE player_frame = 12 195 | END IF 196 | END IF 197 | IF cont1.right THEN 198 | IF y_player % 40 = 16 THEN ' Player aligned on floor 199 | IF x_player < 240 THEN x_player = x_player + 1 200 | IF FRAME AND 4 THEN player_frame = 0 ELSE player_frame = 4 201 | END IF 202 | END IF 203 | IF cont1.up THEN 204 | IF y_player % 40 = 16 THEN ' Player aligned on floor. 205 | column = (x_player + 7) /8 206 | row = (y_player + 8) / 8 207 | #c = $3800 + row * 64 + column * 2 208 | IF VPEEK(#c) = base_character + 3 THEN ' Ladder? 209 | y_player = y_player - 1 210 | END IF 211 | ELSE 212 | IF FRAME AND 4 THEN player_frame = 16 ELSE player_frame = 20 213 | y_player = y_player - 1 214 | END IF 215 | END IF 216 | IF cont1.down THEN 217 | IF y_player % 40 = 16 THEN ' Player aligned on floor. 218 | column = (x_player + 7) /8 219 | row = (y_player + 16) / 8 220 | #c = $3800 + row * 64 + column * 2 221 | IF VPEEK(#c) = base_character + 3 THEN ' Ladder? 222 | y_player = y_player + 1 223 | END IF 224 | ELSE 225 | IF FRAME AND 4 THEN player_frame = 16 ELSE player_frame = 20 226 | y_player = y_player + 1 227 | END IF 228 | END IF 229 | END 230 | 231 | ' 232 | ' Move the enemies. 233 | ' 234 | move_enemies: PROCEDURE 235 | IF enemy1_frame < 32 THEN 236 | x_enemy1 = x_enemy1 - 1. 237 | IF x_enemy1 = 0 THEN enemy1_frame = 32 238 | ELSE 239 | x_enemy1 = x_enemy1 + 1. 240 | IF x_enemy1 = 240 THEN enemy1_frame = 24 241 | END IF 242 | enemy1_frame = (enemy1_frame AND $f8) + (FRAME AND 4) 243 | 244 | IF enemy2_frame < 32 THEN 245 | x_enemy2 = x_enemy2 - 1. 246 | IF x_enemy2 = 0 THEN enemy2_frame = 32 247 | ELSE 248 | x_enemy2 = x_enemy2 + 1. 249 | IF x_enemy2 = 240 THEN enemy2_frame = 24 250 | END IF 251 | enemy2_frame = (enemy2_frame AND $f8) + (FRAME AND 4) 252 | 253 | IF enemy3_frame < 32 THEN 254 | x_enemy3 = x_enemy3 - 1. 255 | IF x_enemy3 = 0 THEN enemy3_frame = 32 256 | ELSE 257 | x_enemy3 = x_enemy3 + 1. 258 | IF x_enemy3 = 240 THEN enemy3_frame = 24 259 | END IF 260 | enemy3_frame = (enemy3_frame AND $f8) + (FRAME AND 4) 261 | END 262 | 263 | game_bitmaps: 264 | BITMAP "CCCCCCCC" 265 | BITMAP "CCCCCCCC" 266 | BITMAP "CCCCCCCC" 267 | BITMAP "CCCCCCCC" 268 | BITMAP "CCCCCCCC" 269 | BITMAP "CCCCCCCC" 270 | BITMAP "CCCCCCCC" 271 | BITMAP "CCCCCCCC" 272 | 273 | BITMAP "222..222" 274 | BITMAP "222..222" 275 | BITMAP "222..222" 276 | BITMAP "222..222" 277 | BITMAP "222..222" 278 | BITMAP "222..222" 279 | BITMAP "222..222" 280 | BITMAP "222..222" 281 | 282 | BITMAP "AAAAAAAA" 283 | BITMAP "AAAAAAAA" 284 | BITMAP "........" 285 | BITMAP "AAAAAAAA" 286 | BITMAP "AAAAAAAA" 287 | BITMAP "........" 288 | BITMAP "AAAAAAAA" 289 | BITMAP "AAAAAAAA" 290 | 291 | BITMAP ".5....5." 292 | BITMAP ".5....5." 293 | BITMAP ".555555." 294 | BITMAP ".5....5." 295 | BITMAP ".5....5." 296 | BITMAP ".555555." 297 | BITMAP ".5....5." 298 | BITMAP ".5....5." 299 | 300 | BITMAP "55555554" 301 | BITMAP "54444454" 302 | BITMAP "54555454" 303 | BITMAP "54545454" 304 | BITMAP "54555454" 305 | BITMAP "54444454" 306 | BITMAP "55555554" 307 | BITMAP "44444444" 308 | 309 | BITMAP "5.555.5." 310 | BITMAP "5.555.5." 311 | BITMAP "5.555.5." 312 | BITMAP "5.555.5." 313 | BITMAP "5.555.5." 314 | BITMAP "5.555.5." 315 | BITMAP "5.555.5." 316 | BITMAP "5.555.5." 317 | 318 | BITMAP "FFF.FFF." 319 | BITMAP "........" 320 | BITMAP "EEEEEEEE" 321 | BITMAP "EEEEEEEE" 322 | BITMAP "EEEEEEEE" 323 | BITMAP "........" 324 | BITMAP "........" 325 | BITMAP "........" 326 | 327 | BITMAP ".5....5." 328 | BITMAP ".5....5." 329 | BITMAP ".555555." 330 | BITMAP ".5....5." 331 | BITMAP ".5....5." 332 | BITMAP ".555555." 333 | BITMAP ".5....5." 334 | BITMAP ".5....5." 335 | 336 | BITMAP "66686666" 337 | BITMAP "66686666" 338 | BITMAP "66686666" 339 | BITMAP "88888888" 340 | BITMAP "66666668" 341 | BITMAP "66666668" 342 | BITMAP "66666668" 343 | BITMAP "88888888" 344 | 345 | BITMAP ".888888." 346 | BITMAP ".888888." 347 | BITMAP ".888888." 348 | BITMAP "........" 349 | BITMAP ".88.888." 350 | BITMAP ".88.888." 351 | BITMAP ".88.888." 352 | BITMAP "........" 353 | 354 | BITMAP "........" 355 | BITMAP "55555555" 356 | BITMAP "55555555" 357 | BITMAP "5.5.5.5." 358 | BITMAP ".5...5.." 359 | BITMAP "........" 360 | BITMAP "........" 361 | BITMAP "........" 362 | 363 | BITMAP ".5....5." 364 | BITMAP ".5....5." 365 | BITMAP ".555555." 366 | BITMAP ".5....5." 367 | BITMAP ".5....5." 368 | BITMAP ".555555." 369 | BITMAP ".5....5." 370 | BITMAP ".5....5." 371 | 372 | BITMAP "666.666." 373 | BITMAP "666.666." 374 | BITMAP "666.666." 375 | BITMAP "........" 376 | BITMAP "666.666." 377 | BITMAP "666.666." 378 | BITMAP "666.666." 379 | BITMAP "........" 380 | 381 | BITMAP ".A......" 382 | BITMAP "..AA...." 383 | BITMAP "....AA.." 384 | BITMAP "......AA" 385 | BITMAP "....AA.." 386 | BITMAP "..AA...." 387 | BITMAP ".A......" 388 | BITMAP ".A......" 389 | 390 | BITMAP "........" 391 | BITMAP "FFFFFFFF" 392 | BITMAP "........" 393 | BITMAP "5.5.5.5." 394 | BITMAP ".5.5.5.5" 395 | BITMAP "........" 396 | BITMAP "FFFFFFFF" 397 | BITMAP "........" 398 | 399 | BITMAP "E......E" 400 | BITMAP "E......E" 401 | BITMAP "EE....EE" 402 | BITMAP "E.EEEE.E" 403 | BITMAP "E......E" 404 | BITMAP "E......E" 405 | BITMAP "EE....EE" 406 | BITMAP "E.EEEE.E" 407 | 408 | BITMAP "86666668" 409 | BITMAP "68688666" 410 | BITMAP "66886888" 411 | BITMAP "68666888" 412 | BITMAP "66888668" 413 | BITMAP "66866888" 414 | BITMAP "68668668" 415 | BITMAP "66866888" 416 | 417 | BITMAP "C2CCC222" 418 | BITMAP "C2CC2CC2" 419 | BITMAP "CC2CC222" 420 | BITMAP "C2CCCCCC" 421 | BITMAP "CC2C2CCC" 422 | BITMAP "CCC2C2C2" 423 | BITMAP "CCC2CC2C" 424 | BITMAP "CC2CC222" 425 | 426 | BITMAP "........" 427 | BITMAP "6666666E" 428 | BITMAP "6666666E" 429 | BITMAP "EEEEEEEE" 430 | BITMAP "666E6666" 431 | BITMAP "666E6666" 432 | BITMAP "EEEEEEEE" 433 | BITMAP "........" 434 | 435 | BITMAP "....CC.." 436 | BITMAP "....CC.." 437 | BITMAP "...CC..." 438 | BITMAP "...CC..." 439 | BITMAP "..CC...." 440 | BITMAP "..CC...." 441 | BITMAP "...CC..." 442 | BITMAP "...CC..." 443 | 444 | BITMAP ".F.F.F.." 445 | BITMAP "FFFFFFF." 446 | BITMAP ".F.F.F.." 447 | BITMAP "FFFFFFF." 448 | BITMAP ".F.F.F.." 449 | BITMAP "FFFFFFF." 450 | BITMAP ".F.F.F.." 451 | BITMAP "........" 452 | 453 | game_sprites: 454 | BITMAP ".......1.1.1...." 455 | BITMAP ".....11A1A1A1..." 456 | BITMAP "....1A1999991..." 457 | BITMAP ".....1A999991..." 458 | BITMAP "....1A9999191..." 459 | BITMAP ".....1A969991..." 460 | BITMAP "....1FF966691..." 461 | BITMAP "..1FFFF19991...." 462 | BITMAP ".1FF1FFF11111..." 463 | BITMAP "1FF11FFFF1FFF1.." 464 | BITMAP "1FFF1FFFF1FFF1.." 465 | BITMAP "1FFF1F1111111..." 466 | BITMAP ".11111FFFF111..." 467 | BITMAP "...1FFF1FF7771.." 468 | BITMAP "...177711F77771." 469 | BITMAP "...17777111111.." 470 | 471 | BITMAP "......11A1A1A1.." 472 | BITMAP ".....1A1999991.." 473 | BITMAP "......1A999991.." 474 | BITMAP ".....1A9999191.." 475 | BITMAP "......19969991.." 476 | BITMAP ".....1FF966691.." 477 | BITMAP ".....1FF19991..." 478 | BITMAP "....1FFFF111...." 479 | BITMAP "....1FFFFF1....." 480 | BITMAP "....1FF1FFF1...." 481 | BITMAP "....1FF1FFF1...." 482 | BITMAP "....1FFF111....." 483 | BITMAP ".....1FFFF1....." 484 | BITMAP ".....1FF1......." 485 | BITMAP ".....177771....." 486 | BITMAP ".....1777771...." 487 | 488 | BITMAP "....1.1.1......." 489 | BITMAP "...1A1A1A11....." 490 | BITMAP "...1999991A1...." 491 | BITMAP "...199999A1....." 492 | BITMAP "...1919999A1...." 493 | BITMAP "...199969A1....." 494 | BITMAP "...1966699F1...." 495 | BITMAP "....19991FFFF1.." 496 | BITMAP ".....111FFF1FF1." 497 | BITMAP "..1FFF1FFFF11FF1" 498 | BITMAP "..1FFF1FFFF1FFF1" 499 | BITMAP "...111.111F1FFF1" 500 | BITMAP "...111FFFF11111." 501 | BITMAP "..1777FF1FFF1..." 502 | BITMAP ".17777F117771..." 503 | BITMAP "..11111177771..." 504 | 505 | BITMAP "..1A1A1A11......" 506 | BITMAP "..1999991A1....." 507 | BITMAP "..199999A1......" 508 | BITMAP "..1919999A1....." 509 | BITMAP "..199969A1......" 510 | BITMAP "..1966699A1....." 511 | BITMAP "...19991FF1....." 512 | BITMAP "....111FFFF1...." 513 | BITMAP ".....1FFFFF1...." 514 | BITMAP "....1FFF1FF1...." 515 | BITMAP "....1FFF1FF1...." 516 | BITMAP ".....111FFF1...." 517 | BITMAP ".....1FFFF1....." 518 | BITMAP "......11FF1....." 519 | BITMAP ".....177771....." 520 | BITMAP "....1777771....." 521 | 522 | BITMAP "...1A1A1A1A1...." 523 | BITMAP "....1AAAAA1....." 524 | BITMAP "...1AAAAAAA1...." 525 | BITMAP "...1AAAAAAA1111." 526 | BITMAP "....1AAAAA11FFF1" 527 | BITMAP "....1AAAAA11FFF1" 528 | BITMAP ".....199911FF11." 529 | BITMAP "...1FF111FFF1..." 530 | BITMAP ".11FF1FFFF11...." 531 | BITMAP "1FFF1.1111......" 532 | BITMAP "1FFF11FFFF1....." 533 | BITMAP ".111.1F11FF11..." 534 | BITMAP "....1FF1.17771.." 535 | BITMAP "...11FF1.177771." 536 | BITMAP "..177771..1111.." 537 | BITMAP ".1777771........" 538 | 539 | BITMAP "....1A1A1A1A1..." 540 | BITMAP ".....1AAAAA1...." 541 | BITMAP "....1AAAAAAA1..." 542 | BITMAP ".1111AAAAAAA1..." 543 | BITMAP "1FFF11AAAAA1...." 544 | BITMAP "1FFF11AAAAA1...." 545 | BITMAP ".11FF1199911...." 546 | BITMAP "...1FFF111FF1..." 547 | BITMAP "....11FFFF1FF11." 548 | BITMAP "......1111.1FFF1" 549 | BITMAP ".....1FFFF11FFF1" 550 | BITMAP "...11FF11F1.111." 551 | BITMAP "..17771.1FF1...." 552 | BITMAP ".17771..1FF11..." 553 | BITMAP "..111...177771.." 554 | BITMAP "........1777771." 555 | 556 | BITMAP "..1331321......." 557 | BITMAP ".13F33F21......." 558 | BITMAP ".13F33F21......." 559 | BITMAP ".1331321........" 560 | BITMAP ".11333321......." 561 | BITMAP "1633331321......" 562 | BITMAP "6113313321....1." 563 | BITMAP "...1113321...131" 564 | BITMAP "...133321....131" 565 | BITMAP "..1333321...1321" 566 | BITMAP ".1333321....1321" 567 | BITMAP ".133321.11.13321" 568 | BITMAP ".13332113311321." 569 | BITMAP ".13333333331321." 570 | BITMAP "..1333333333321." 571 | BITMAP "...12222112221.." 572 | 573 | BITMAP "....11.11......." 574 | BITMAP "...1331321......" 575 | BITMAP "..13F33F21......" 576 | BITMAP "..13F33F21......" 577 | BITMAP "..1331321......." 578 | BITMAP "...1333321......" 579 | BITMAP ".1133331321....." 580 | BITMAP "16133313321....." 581 | BITMAP "16611113321..1.." 582 | BITMAP ".111333321..131." 583 | BITMAP "..13333211.1321." 584 | BITMAP "..13332132.1321." 585 | BITMAP "..133321321321.." 586 | BITMAP "..133333333321.." 587 | BITMAP "...13333313321.." 588 | BITMAP "....122211221..." 589 | 590 | BITMAP ".......1231331.." 591 | BITMAP ".......12F33F31." 592 | BITMAP ".......12F33F31." 593 | BITMAP "........1231331." 594 | BITMAP ".......12333311." 595 | BITMAP "......1231333361" 596 | BITMAP ".1....1233133116" 597 | BITMAP "131...1233111..." 598 | BITMAP "131....123331..." 599 | BITMAP "1231...1233331.." 600 | BITMAP "1231....1233331." 601 | BITMAP "12331.11.123331." 602 | BITMAP ".12311331123331." 603 | BITMAP ".12313333333331." 604 | BITMAP ".1233333333331.." 605 | BITMAP "..12221122221..." 606 | 607 | BITMAP ".......11.11...." 608 | BITMAP "......1231331..." 609 | BITMAP "......12F33F31.." 610 | BITMAP "......12F33F31.." 611 | BITMAP ".......1231331.." 612 | BITMAP "......1233331..." 613 | BITMAP ".....123133331.." 614 | BITMAP ".....12331333161" 615 | BITMAP "..1..12331111661" 616 | BITMAP ".131..1233331..." 617 | BITMAP ".1231.11233331.." 618 | BITMAP ".1231133123331.." 619 | BITMAP "..123133123331.." 620 | BITMAP "..123333333331.." 621 | BITMAP "..12331333331..." 622 | BITMAP "...122112221...." 623 | 624 | start_song: PROCEDURE 625 | tick_note = 8 626 | song_note = 47 627 | END 628 | 629 | play_song: PROCEDURE 630 | tick_note = tick_note + 1. 631 | IF tick_note = 16. THEN 632 | tick_note = 0. 633 | song_note = song_note + 1. 634 | IF song_note = 48. THEN song_note = 0. 635 | note = song_notes(song_note) 636 | SOUND 0, #note_freq(note - 1) 637 | END IF 638 | SOUND 0, , volume_effect(tick_note) 639 | END 640 | 641 | sound_off: PROCEDURE 642 | SOUND 0,,0 643 | SOUND 1,,0 644 | SOUND 2,,0 645 | SOUND 3,,0 646 | END 647 | 648 | volume_effect: 649 | DATA BYTE 11,12,13,12,12,11,11,10 650 | DATA BYTE 10,9,9,10,10,9,9,8 651 | 652 | song_notes: 653 | DATA BYTE 1,2,3,4,5,4,3,2 654 | DATA BYTE 1,2,3,4,5,4,3,2 655 | DATA BYTE 6,4,7,8,9,8,7,4 656 | DATA BYTE 6,4,7,8,9,8,7,4 657 | DATA BYTE 3,12,8,10,11,10,8,12 658 | DATA BYTE 6,4,7,8,9,8,7,4 659 | 660 | #note_freq: 661 | DATA $01AC 662 | DATA $0153 663 | DATA $011D 664 | DATA $00FE 665 | DATA $00F0 666 | DATA $0140 667 | DATA $00D6 668 | DATA $00BE 669 | DATA $00B4 670 | DATA $00AA 671 | DATA $00A0 672 | DATA $00E2 673 | -------------------------------------------------------------------------------- /examples/vramcopy.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Example of DEFINE VRAM READ 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Oct/15/2024. 8 | ' 9 | 10 | DIM array(64) 11 | 12 | CLS 13 | MODE 0 14 | DEFINE CHAR 16,2,wall_bitmaps 15 | DEFINE COLOR 16,2,wall_colors 16 | 17 | FOR #c = 0 TO 63 18 | VPOKE $1800 + #c, RANDOM(2) + 16 19 | NEXT #c 20 | 21 | DEFINE VRAM READ $1800,$0040,VARPTR array(0) 22 | 23 | FOR #c = 64 TO 704 STEP 64 24 | DEFINE VRAM $1800 + #c, $0040, VARPTR array(0) 25 | NEXT #c 26 | 27 | WHILE 1: WEND 28 | 29 | wall_bitmaps: 30 | BITMAP "XXX.XXXX" 31 | BITMAP "XXX.XXXX" 32 | BITMAP "XXX.XXXX" 33 | BITMAP "........" 34 | BITMAP "XXXXXXX." 35 | BITMAP "XXXXXXX." 36 | BITMAP "XXXXXXX." 37 | BITMAP "........" 38 | 39 | BITMAP "XXXXXXX." 40 | BITMAP "X..X..XX" 41 | BITMAP "X..X..XX" 42 | BITMAP "X..X..XX" 43 | BITMAP "X..X..XX" 44 | BITMAP "X..X..XX" 45 | BITMAP "XXXXXXXX" 46 | BITMAP ".XXXXXXX" 47 | 48 | wall_colors: 49 | DATA BYTE $6E,$6E,$6E,$6E,$6E,$6E,$6E,$6E 50 | DATA BYTE $F1,$F5,$F5,$F4,$F4,$F4,$F1,$F1 -------------------------------------------------------------------------------- /examples/vramcopy_sms.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Example of DEFINE VRAM READ 3 | ' 4 | ' by Oscar Toledo G. 5 | ' https://nanochess.org/ 6 | ' 7 | ' Creation date: Oct/15/2024. 8 | ' Revision date: Apr/27/2025. Adapted for Sega Master System. 9 | ' 10 | 11 | DIM array(128) 12 | 13 | CLS 14 | MODE 4 15 | DEFINE CHAR 16,2,wall_bitmaps 16 | 17 | FOR #c = 0 TO 126 STEP 2 18 | VPOKE $3800 + #c, RANDOM(2) + 16 19 | NEXT #c 20 | 21 | DEFINE VRAM READ $3800,$0080,VARPTR array(0) 22 | 23 | FOR #c = 128 TO 1408 STEP 128 24 | DEFINE VRAM $3800 + #c, $0080, VARPTR array(0) 25 | NEXT #c 26 | 27 | WHILE 1: WEND 28 | 29 | wall_bitmaps: 30 | BITMAP "666E6666" 31 | BITMAP "666E6666" 32 | BITMAP "666E6666" 33 | BITMAP "EEEEEEEE" 34 | BITMAP "6666666E" 35 | BITMAP "6666666E" 36 | BITMAP "6666666E" 37 | BITMAP "EEEEEEEE" 38 | 39 | BITMAP "FFFFFFF1" 40 | BITMAP "F55F55FF" 41 | BITMAP "F55F55FF" 42 | BITMAP "F44F44FF" 43 | BITMAP "F44F44FF" 44 | BITMAP "F44F44FF" 45 | BITMAP "FFFFFFFF" 46 | BITMAP "1FFFFFFF" 47 | 48 | -------------------------------------------------------------------------------- /gasm80: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nanochess/CVBasic/bb37d91c478d85b9acce86b631288791c5f1a4c0/gasm80 -------------------------------------------------------------------------------- /linkticart.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os.path 4 | import sys 5 | 6 | # take the first name, and return (base,zeros) 7 | # where zeros is how many leading zeros are in the index 8 | def parseFilename(fn): 9 | zerocnt = 1 10 | namebase = fn[:-5] 11 | while (namebase[-1] == '0'): 12 | zerocnt += 1 13 | namebase = namebase[:-1] 14 | return (namebase, zerocnt) 15 | 16 | # converts a binary from xas99 (xas99.py -b -R file.a99) with banks to a single non-inverted cart image 17 | # note: minimal error checking - GIGO. 18 | # pass the name of the first file (ie: file_b0.bin) 19 | if (len(sys.argv) < 3): 20 | print('Pass the first output file (ie: file_b0.bin), and the output file, and optionally a name for the cart') 21 | print('ie: linkticart.py file_b0.bin file_8.bin "AWESOME GAME"') 22 | exit(1) 23 | 24 | f = open(sys.argv[1], 'rb') 25 | data = f.read() 26 | f.close() 27 | 28 | # first 80 bytes are the cartridge header 29 | hdr = data[0:80] 30 | 31 | if (len(sys.argv) > 3): 32 | name = sys.argv[3].upper() 33 | while (len(name)<20): 34 | name += ' ' 35 | p = hdr.find(b'CVBASIC GAME *') 36 | if p == -1: 37 | print('WARNING: Could not find cart name to set it') 38 | else: 39 | hdr = hdr[0:p] + bytearray(name, 'utf-8') + hdr[p+20:] 40 | 41 | # after 16k starts the RAM data 42 | ram = data[16384:] 43 | 44 | # make sure we have 3 pages to pull from (especially if not banked, it won't be padded) 45 | while len(ram) < 8192*3: 46 | ram += b'\xff'*8192 47 | 48 | fo = open(sys.argv[2], 'wb') 49 | 50 | # write the loader pages 51 | fo.write(hdr) 52 | fo.write(ram[0:8112]) 53 | fo.write(hdr) 54 | fo.write(ram[8112:16224]) 55 | fo.write(hdr) 56 | fo.write(ram[16224:24336]) 57 | # any excess is discarded 58 | 59 | # now check if there are any pages to concatenate 60 | # track pages written so we can square up the final size 61 | sz = 3 62 | 63 | if (sys.argv[1][-5:] != '0.bin'): 64 | print('Banking not detected - finishing cart...') 65 | else: 66 | print('Banked cart detected...') 67 | 68 | (namebase,zerocnt) = parseFilename(sys.argv[1]) 69 | 70 | file = namebase + str(sz).zfill(zerocnt) + '.bin' 71 | 72 | while os.path.isfile(file): 73 | f = open(file, 'rb') 74 | data = f.read() 75 | if len(data) < 8192: 76 | while len(data)<8192: 77 | data += b'\xff' 78 | f.close() 79 | fo.write(data) 80 | sz+=1 81 | file = namebase + str(sz).zfill(zerocnt) + '.bin' 82 | 83 | # calculate number of files needed for power of two 84 | desired=0 85 | if sz>64: 86 | desired=128 87 | elif sz>32: 88 | desired=64 89 | elif sz>16: 90 | desired=32 91 | elif sz>8: 92 | desired=16 93 | elif sz>4: 94 | desired=8 95 | else: 96 | desired=4 97 | 98 | while sz 11 | 12 | //unsigned char * VDPDATA = 0x8800; 13 | //unsigned char * VDPSTATUS = 0x8802; 14 | //unsigned char * VDPWDATA = 0x8c00; 15 | //unsigned char * VDPWADR = 0x8c02; 16 | 17 | unsigned char data [1024 * 1024] = { 18 | 0x00 19 | }; 20 | 21 | unsigned char dest [1024 * 1024] = { 22 | 0x00 23 | }; 24 | 25 | unsigned char * getbit (unsigned char * a, unsigned char * hl, unsigned char * carry) { 26 | unsigned char carry2; 27 | 28 | if (*a & 0x80) *carry = 1; else *carry = 0; 29 | *a <<= 1; 30 | if (*a == 0) { 31 | *a = *hl++; //printf ("\t\t%02X (%c)\n", *a, *a); 32 | if (*a & 0x80) carry2 = 1; else carry2 = 0; 33 | *a <<= 1; 34 | *a |= *carry; 35 | *carry = carry2; 36 | } 37 | return hl; 38 | } 39 | 40 | unsigned short unpack (unsigned short de, unsigned char * hl) { 41 | unsigned char carry; 42 | unsigned char a = *hl++; 43 | unsigned char b; 44 | unsigned char c; 45 | unsigned char t; 46 | unsigned short bc; 47 | unsigned short _hl; 48 | unsigned short hl2; 49 | unsigned short ix = a >> 5; 50 | int i; 51 | 52 | //printf ("\t\t%02X (%c)\n", a, a); 53 | a <<= 3; 54 | a |= 0x04; 55 | literal: 56 | /*__asm volatile ("LIMI 0\n"); 57 | *VDPWADR = de; 58 | *VDPWADR = 0x40 | (de++ >> 8); 59 | *VDPWDATA = *hl++; 60 | __asm volatile ("LIMI 2\n");*/ 61 | //printf ("%04X=%02X (%c)\n", de, *hl, *hl); 62 | dest [de++] = *hl++; 63 | loop: 64 | hl = getbit (&a, hl, &carry); 65 | if (carry == 0) goto literal; 66 | 67 | _hl = 1; 68 | //getlen: 69 | hl = getbit (&a, hl, &carry); 70 | if (carry == 0) goto lenok; 71 | lus: 72 | hl = getbit (&a, hl, &carry); 73 | if (_hl & 0x8000) return de; 74 | _hl = _hl + _hl + carry; 75 | 76 | hl = getbit (&a, hl, &carry); 77 | if (carry == 0) goto lenok; 78 | 79 | hl = getbit (&a, hl, &carry); 80 | if (_hl & 0x8000) return de; 81 | _hl = _hl + _hl + carry; 82 | 83 | hl = getbit (&a, hl, &carry); 84 | if (carry) goto lus; 85 | lenok: 86 | _hl++; 87 | c = *hl++; //printf ("\t\t%02X (%c)\n", c, c); 88 | b = 0; 89 | if ((c & 0x80) == 0) goto offsok; 90 | 91 | i = ix; 92 | if (i) { 93 | while (i) { 94 | hl = getbit (&a, hl, &carry); 95 | b <<= 1; b |= carry; 96 | i--; 97 | } 98 | hl = getbit (&a, hl, &carry); 99 | if (carry) { 100 | carry = 0; 101 | b++; 102 | c &= 0x7F; 103 | } 104 | } 105 | offsok: 106 | bc = (b << 8) | c; 107 | bc++; 108 | hl2 = de - bc - carry; 109 | bc = _hl; 110 | loop2: 111 | /*__asm volatile ("LIMI 0\n"); 112 | ... 113 | __asm volatile ("LIMI 2\n");*/ 114 | t = dest [hl2++]; //printf ("%04X=%02X (%c)\n", de, t, t); 115 | dest [de++] = t; 116 | bc--; 117 | if (bc) goto loop2; 118 | goto loop; 119 | } 120 | 121 | static char * args [] = { 122 | "p", 123 | "test.txt", 124 | "test.bin" 125 | }; 126 | 127 | int mainy(int argc, char *argv[]); 128 | 129 | void main () { 130 | int end; 131 | FILE * f; 132 | 133 | mainy (3, args); // compress test file using pletter.c with main() renamed 134 | 135 | f = fopen ("test.bin", "rb"); 136 | if (f) { 137 | fread (data, 1, 1024 * 1024, f); 138 | fclose (f); 139 | end = unpack (0x0000, data); 140 | f = fopen ("result.bin", "wb"); 141 | if (f) { 142 | fwrite (dest, 1, end, f); 143 | fclose (f); 144 | } 145 | } 146 | return; 147 | } 148 | -------------------------------------------------------------------------------- /utility/notes.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** Calculate frequencies for music notes 3 | ** 4 | ** by Oscar Toledo G. 5 | ** https://nanochess.org/ 6 | ** 7 | ** Creation date: Aug/06/2024. 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | /* 16 | ** Mathematics based on this post: 17 | ** https://codepen.io/enxaneta/post/frequencies-of-musical-notes 18 | */ 19 | 20 | double frequencies[12]; 21 | 22 | /* 23 | ** Calculate octave 24 | */ 25 | void calculate_octave(int octave) 26 | { 27 | double a; 28 | 29 | a = 440.0 * pow(2, octave - 4.0); 30 | frequencies[0] = a * pow(2, -9.0/12); 31 | frequencies[1] = a * pow(2, -8.0/12); 32 | frequencies[2] = a * pow(2, -7.0/12); 33 | frequencies[3] = a * pow(2, -6.0/12); 34 | frequencies[4] = a * pow(2, -5.0/12); 35 | frequencies[5] = a * pow(2, -4.0/12); 36 | frequencies[6] = a * pow(2, -3.0/12); 37 | frequencies[7] = a * pow(2, -2.0/12); 38 | frequencies[8] = a * pow(2, -1.0/12); 39 | frequencies[9] = a; 40 | frequencies[10] = a * pow(2, 1.0/12); 41 | frequencies[11] = a * pow(2, 2.0/12); 42 | } 43 | 44 | /* 45 | ** Main program 46 | */ 47 | int main(int argc, char *argv[]) 48 | { 49 | int c; 50 | int d; 51 | int e; 52 | int base_freq; 53 | int max; 54 | int value; 55 | 56 | if (argc == 1) { 57 | fprintf(stderr, "\n"); 58 | fprintf(stderr, "Usage:\n"); 59 | fprintf(stderr, " notes [-sn] 3579545 >source.asm\n"); 60 | fprintf(stderr, "\n"); 61 | fprintf(stderr, "It will generate an assembler note table for the given\n"); 62 | fprintf(stderr, "frequency. This is useful in my CVBasic compiler\n"); 63 | fprintf(stderr, "because I need 3 tables: 3.58 mhz, 4.00 mhz, and 2.00 mhz.\n"); 64 | fprintf(stderr, "Of course, doing these tables manually is a chore.\n"); 65 | fprintf(stderr, "\n"); 66 | fprintf(stderr, "The values are valid for AY-3-8910 or SN76489 chips.\n"); 67 | fprintf(stderr, "\n"); 68 | fprintf(stderr, "It will warn you if the final value exceeds 4095 or\n"); 69 | fprintf(stderr, "1023 (if the -sn option is used).\n"); 70 | fprintf(stderr, "\n"); 71 | fprintf(stderr, "Base musical frequencies are output in stderr, and\n"); 72 | fprintf(stderr, "assembler code in stdout.\n"); 73 | fprintf(stderr, "\n"); 74 | exit(1); 75 | } 76 | fprintf(stderr, "Notes v0.1.0 Aug/07/2024 by Oscar Toledo G. https://nanochess.org\n"); 77 | 78 | if (argv[1][0] == '-' && tolower(argv[1][1] == 's') && tolower(argv[1][2]) == 'n') { 79 | base_freq = atoi(argv[2]); 80 | max = 1023; 81 | } else { 82 | base_freq = atoi(argv[1]); 83 | max = 4095; 84 | } 85 | fprintf(stdout, "\t;\n"); 86 | fprintf(stdout, "\t; Musical notes table.\n"); 87 | fprintf(stdout, "\t;\n"); 88 | fprintf(stdout, "music_notes_table:\n"); 89 | fprintf(stdout, "\t; Silence - 0\n"); 90 | fprintf(stdout, "\tdw 0\n"); 91 | for (c = 2; c < 8; c++) { 92 | switch (c) { 93 | case 2: 94 | fprintf(stdout, "\t; Values for %4.2f mhz.\n", base_freq / 1e6); 95 | fprintf(stdout, "\t; 2nd octave - Index 1\n"); 96 | break; 97 | case 3: 98 | fprintf(stdout, "\t; 3rd octave - Index 13\n"); 99 | break; 100 | case 4: 101 | fprintf(stdout, "\t; 4th octave - Index 25\n"); 102 | break; 103 | case 5: 104 | fprintf(stdout, "\t; 5th octave - Index 37\n"); 105 | break; 106 | case 6: 107 | fprintf(stdout, "\t; 6th octave - Index 49\n"); 108 | break; 109 | case 7: 110 | fprintf(stdout, "\t; 7th octave - Index 61\n"); 111 | break; 112 | } 113 | calculate_octave(c); 114 | if (c == 7) 115 | e = 3; 116 | else 117 | e = 12; 118 | fprintf(stdout, "\tdw "); 119 | for (d = 0; d < e; d++) { 120 | fprintf(stderr, "%4.1f%s", frequencies[d], (d == e - 1) ? "\n" : ","); 121 | value = (int) (base_freq / 32.0 / frequencies[d] + 0.5); 122 | if (value > max) 123 | fprintf(stderr, "Warning: Exceeded range for octave %d, note %d\n", c, d); 124 | fprintf(stdout, "%d%c", value, (d == e - 1) ? '\n' : ','); 125 | } 126 | fprintf(stderr, "---\n"); 127 | } 128 | exit(0); 129 | } 130 | 131 | -------------------------------------------------------------------------------- /utility/switch.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** Switch two 8K banks (for Creativision MAME) 3 | ** Use with --creativision -rom16 switch of CVBasic. 4 | ** 5 | ** by Oscar Toledo G. 6 | ** 7 | ** Creation date: Sep/12/2024. 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | char rom[16384]; 14 | 15 | /* 16 | ** Main program 17 | */ 18 | int main(int argc, char *argv[]) 19 | { 20 | FILE *input; 21 | FILE *output; 22 | 23 | if (argc != 2) { 24 | fprintf(stderr, "Usage: switch game.rom\n"); 25 | exit(1); 26 | } 27 | input = fopen(argv[1], "rb"); 28 | if (input == NULL) { 29 | fprintf(stderr, "Cannot open '%s'\n", argv[1]); 30 | exit(1); 31 | } 32 | if (fread(rom, 1, sizeof(rom), input) != sizeof(rom)) { 33 | fprintf(stderr, "Cannot read at least 16K\n"); 34 | exit(1); 35 | } 36 | fclose(input); 37 | output = fopen(argv[1], "wb"); 38 | if (output == NULL) { 39 | fprintf(stderr, "Cannot open '%s'\n", argv[1]); 40 | exit(1); 41 | } 42 | if (fwrite(rom + 8192, 1, 8192, output) != 8192) { 43 | fprintf(stderr, "Couldn't write switched ROM data\n"); 44 | exit(1); 45 | } 46 | if (fwrite(rom, 1, 8192, output) != 8192) { 47 | fprintf(stderr, "Couldn't write switched ROM data\n"); 48 | exit(1); 49 | } 50 | fclose(output); 51 | exit(0); 52 | } 53 | 54 | --------------------------------------------------------------------------------