├── .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 |
--------------------------------------------------------------------------------