├── .gitignore ├── contrib └── ScrollTest.bmp ├── e.sh ├── cvbasic_9900_epilogue.asm ├── compile_with_warnings.sh ├── old ├── boingbasic_epilogue.asm ├── example.bas ├── cvbasic_epilogue.asm ├── boingbasic_prologue.asm └── cvbasic_prologue.asm ├── cvbasic_6502_epilogue.asm ├── driver.h ├── Makefile ├── cpu6502.h ├── cpuz80.h ├── cpu9900.h ├── examples ├── test1.bas ├── face_joystick.bas ├── happy_face.bas ├── varptr.bas ├── vgm.bas ├── demo.bas ├── test2.bas ├── portrait.bas ├── music.bas ├── controller.bas ├── space_attack.bas ├── viboritas.bas ├── oscar_compressed.bas └── bank.bas ├── LICENSE.txt ├── cvbasic.h ├── node.h ├── cvbasic_epilogue.asm ├── README - TI99.md ├── driver.c ├── utility ├── Try.c └── notes.c ├── README.md └── node.c /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | cvbasic 3 | utility/notes 4 | *.o 5 | 6 | -------------------------------------------------------------------------------- /contrib/ScrollTest.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/CVBasic/master/contrib/ScrollTest.bmp -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /cvbasic_9900_epilogue.asm: -------------------------------------------------------------------------------- 1 | ;;; CV BASIC Epilogue 2 | 3 | ; data in low RAM 4 | aorg >2000 5 | 6 | ; must be even aligned 7 | ; mirror for sprite table 8 | sprites bss 128 9 | 10 | ; Vars can start at >2080 11 | aorg >2080 12 | 13 | -------------------------------------------------------------------------------- /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 -o cvbasic 3 | -------------------------------------------------------------------------------- /old/boingbasic_epilogue.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; BoingBASIC epilogue. 3 | ; 4 | ; by Oscar Toledo G. 5 | ; https://nanochess.org/ 6 | ; 7 | ; Creation date: Feb/27/2024. 8 | ; 9 | 10 | org $7000 11 | 12 | sprites: 13 | rb 128 14 | sprite_data: 15 | rb 4 16 | cursor: 17 | rb 2 18 | mode: rb 1 19 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Ultra simple makefile for CVBasic 2 | # by Oscar Toledo G. 3 | # https://github.com/nanochess/CVBasic 4 | # 5 | CFLAGS = -O 6 | 7 | build: 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 cvbasic 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /old/example.bas: -------------------------------------------------------------------------------- 1 | ' Feb/27/2024 18:24 2 | VPOKE $3800,$3C 3 | VPOKE $3801,$42 4 | VPOKE $3802,$A5 5 | VPOKE $3803,$81 6 | VPOKE $3804,$A5 7 | VPOKE $3805,$99 8 | VPOKE $3806,$42 9 | VPOKE $3807,$3C 10 | 11 | x = 50 12 | y = 100 13 | dx = 1 14 | dy = 1 15 | 16 | game_loop: 17 | WAIT 18 | WAIT 19 | VPOKE $1B00,y-1. 20 | VPOKE $1B01,x 21 | VPOKE $1B02,0 22 | VPOKE $1B03,10 23 | 24 | x = x + dx 25 | IF x = 0 THEN dx = -dx 26 | IF x = 248 THEN dx = -dx 27 | y = y + dy 28 | IF y = 0 THEN dy = -dy 29 | IF y = 184 THEN dy = -dy 30 | GOTO game_loop 31 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /old/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 | ; 11 | 12 | org $7000 13 | 14 | sprites: 15 | rb 128 16 | sprite_data: 17 | rb 4 18 | frame: 19 | rb 2 20 | read_pointer: 21 | rb 2 22 | cursor: 23 | rb 2 24 | lfsr: 25 | rb 2 26 | mode: 27 | rb 1 28 | joy1_data: 29 | rb 1 30 | joy2_data: 31 | rb 1 32 | key1_data: 33 | rb 1 34 | key2_data: 35 | rb 1 36 | 37 | -------------------------------------------------------------------------------- /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 | ' 9 | 10 | DIM #stars(24) 11 | 12 | FOR c = 0 TO 23 13 | #stars(c) = 32 * c + #initial_positions(c) 14 | NEXT c 15 | 16 | WHILE 1 17 | PRINT AT 2,FRAME 18 | PRINT AT 12,".",<5>FRAME,"." 19 | PRINT AT 22,":",<.5>FRAME,":" 20 | 21 | WAIT 22 | FOR c = 0 TO 23 23 | VPOKE $1800 + #stars(c), 32 24 | #stars(c) = #stars(c) + 32 25 | IF #stars(c) >= 768 THEN #stars(c) = #stars(c) - 736 26 | VPOKE $1800 + #stars(c), 42 27 | NEXT c 28 | WEND 29 | 30 | 31 | #initial_positions: 32 | DATA 21,30,6,5 33 | DATA 18,11,11,5 34 | DATA 29,25,22,8 35 | DATA 10,2,9,22 36 | DATA 6,14,9,20 37 | DATA 14,28,31,24 38 | -------------------------------------------------------------------------------- /examples/face_joystick.bas: -------------------------------------------------------------------------------- 1 | 2 | DEFINE SPRITE 0,1,happy_face 3 | 4 | PRINT AT 36,"Happy face!" 5 | 6 | x = 50 7 | y = 100 8 | dx = 1 9 | dy = 1 10 | 11 | 12 | game_loop: 13 | WAIT 14 | WAIT 15 | SPRITE 0,y-1,x,0,face_color 16 | 17 | face_color = 10 18 | IF cont1.up THEN IF y > 0 THEN y = y - 1 19 | IF cont1.left THEN IF x > 0 THEN x = x - 1 20 | IF cont1.right THEN IF x < 240 THEN x = x + 1 21 | IF cont1.down THEN IF y < 176 THEN y = y + 1 22 | IF cont1.button THEN face_color = 5 23 | IF cont1.button2 THEN face_color = 6 24 | 25 | GOTO game_loop 26 | 27 | happy_face: 28 | BITMAP "......XXXX......" 29 | BITMAP "....XXXXXXXX...." 30 | BITMAP "...XXXXXXXXXX..." 31 | BITMAP "..XXXXXXXXXXXX.." 32 | BITMAP ".XXXXXXXXXXXXXX." 33 | BITMAP ".XXXXXXXXXXXXXX." 34 | BITMAP "XXXX..XXXX..XXXX" 35 | BITMAP "XXXX..XXXX..XXXX" 36 | BITMAP "XXXXXXXXXXXXXXXX" 37 | BITMAP "XXXXXXXXXXXXXXXX" 38 | BITMAP ".XXXXXXXXXXXXXX." 39 | BITMAP ".XXX..XXXX..XXX." 40 | BITMAP "..XXX......XXX.." 41 | BITMAP "...XXX....XXX..." 42 | BITMAP "....XXXXXXXX...." 43 | BITMAP "......XXXX......" 44 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 ARRAY_PREFIX "array_" 12 | #define LABEL_PREFIX "cvb_" 13 | #define INTERNAL_PREFIX "cv" 14 | 15 | #define MAX_LINE_SIZE 1024 16 | 17 | enum cpu_target { 18 | CPU_Z80, 19 | CPU_6502, 20 | CPU_9900 21 | }; 22 | 23 | extern enum cpu_target target; 24 | extern char temp[MAX_LINE_SIZE]; 25 | extern int optimized; 26 | extern FILE *output; 27 | extern int next_local; 28 | 29 | #define HASH_PRIME 1103 /* A prime number */ 30 | 31 | struct label { 32 | struct label *next; 33 | int used; 34 | int length; /* For arrays */ 35 | char name[1]; 36 | }; 37 | 38 | /* 39 | ** These flags are used to keep types when evaluating expressions, but also 40 | ** for variables (TYPE_SIGNED isn't keep in variables or arrays, instead in 41 | ** a separate signedness definition table). 42 | */ 43 | #define MAIN_TYPE 0x03 44 | #define TYPE_8 0x00 45 | #define TYPE_16 0x01 46 | #define TYPE_SIGNED 0x04 47 | 48 | /* 49 | ** These flags are used in labels 50 | */ 51 | #define LABEL_USED 0x10 52 | #define LABEL_DEFINED 0x20 53 | #define LABEL_CALLED_BY_GOTO 0x40 54 | #define LABEL_CALLED_BY_GOSUB 0x80 55 | #define LABEL_IS_PROCEDURE 0x100 56 | #define LABEL_IS_VARIABLE 0x200 57 | #define LABEL_IS_ARRAY 0x400 58 | 59 | #define LABEL_VAR_READ 0x0800 60 | #define LABEL_VAR_WRITE 0x1000 61 | #define LABEL_VAR_ACCESS (LABEL_VAR_READ | LABEL_VAR_WRITE) 62 | 63 | extern void emit_error(char *); 64 | -------------------------------------------------------------------------------- /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/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 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 | -------------------------------------------------------------------------------- /node.h: -------------------------------------------------------------------------------- 1 | /* 2 | ** CVBasic - Header for expression nodes 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** © Copyright 2024 Óscar Toledo G. 7 | ** https://nanochess.org/ 8 | ** 9 | ** Creation date: Jun/21/2024. 10 | */ 11 | 12 | enum node_type { 13 | N_OR8, N_OR16, 14 | N_XOR8, N_XOR16, 15 | N_AND8, N_AND16, 16 | 17 | N_EQUAL8, N_EQUAL16, N_NOTEQUAL8, N_NOTEQUAL16, 18 | N_LESS8, N_LESS16, N_LESSEQUAL8, N_LESSEQUAL16, 19 | N_GREATER8, N_GREATER16, N_GREATEREQUAL8, N_GREATEREQUAL16, 20 | N_LESS8S, N_LESS16S, N_LESSEQUAL8S, N_LESSEQUAL16S, 21 | N_GREATER8S, N_GREATER16S, N_GREATEREQUAL8S, N_GREATEREQUAL16S, 22 | 23 | N_PLUS8, N_PLUS16, N_MINUS8, N_MINUS16, 24 | N_MUL8, N_MUL16, N_DIV8, N_DIV16, N_DIV16S, N_MOD16, N_MOD16S, 25 | N_NEG8, N_NEG16, N_NOT8, N_NOT16, 26 | N_EXTEND8, N_EXTEND8S, N_REDUCE16, 27 | N_LOAD8, N_LOAD16, 28 | N_ASSIGN8, N_ASSIGN16, 29 | N_READ8, N_READ16, 30 | N_NUM8, N_NUM16, 31 | N_PEEK8, N_PEEK16, N_VPEEK, N_INP, N_ABS16, N_SGN16, 32 | N_JOY1, N_JOY2, N_KEY1, N_KEY2, 33 | N_RANDOM, N_FRAME, N_MUSIC, N_NTSC, N_POS, 34 | N_ADDR, 35 | N_USR, 36 | }; 37 | 38 | #define REG_A 0x01 39 | #define REG_F 0x02 40 | #define REG_B 0x04 41 | #define REG_C 0x08 42 | #define REG_D 0x10 43 | #define REG_E 0x20 44 | #define REG_H 0x40 45 | #define REG_L 0x80 46 | 47 | #define REG_AF (REG_A | REG_F) 48 | #define REG_BC (REG_B | REG_C) 49 | #define REG_DE (REG_D | REG_E) 50 | #define REG_HL (REG_H | REG_L) 51 | 52 | #define REG_ALL (REG_AF | REG_BC | REG_DE | REG_HL) 53 | 54 | struct node { 55 | enum node_type type; 56 | int value; 57 | struct node *left; 58 | struct node *right; 59 | struct label *label; 60 | int regs; 61 | int x; 62 | }; 63 | 64 | extern int is_power_of_two(int); 65 | extern int is_commutative(enum node_type); 66 | 67 | extern int node_same_tree(struct node *, struct node *); 68 | extern int node_same_address(struct node *, struct node *); 69 | extern void node_visual(struct node *); 70 | extern struct node *node_create(enum node_type, int, struct node *, struct node *); 71 | extern void node_get_label(struct node *, int); 72 | extern void node_label(struct node *); 73 | extern void node_generate(struct node *, int); 74 | extern void node_delete(struct node *); 75 | -------------------------------------------------------------------------------- /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 | ; 22 | 23 | rom_end: 24 | 25 | if MEMOTECH+EINSTEIN 26 | ; Align following data to a 256-byte page. 27 | TIMES $100-($&$ff) DB $4f 28 | endif 29 | if PV2000 30 | TIMES $10000-$ DB $ff 31 | endif 32 | if COLECO+SG1000+MSX+SVI+SORD+PV2000 33 | org BASE_RAM 34 | endif 35 | ram_start: 36 | 37 | sprites: 38 | rb 128 39 | sprite_data: 40 | rb 4 41 | frame: 42 | rb 2 43 | read_pointer: 44 | rb 2 45 | cursor: 46 | rb 2 47 | lfsr: 48 | rb 2 49 | mode: 50 | rb 1 51 | flicker: 52 | rb 1 53 | joy1_data: 54 | rb 1 55 | joy2_data: 56 | rb 1 57 | key1_data: 58 | rb 1 59 | key2_data: 60 | rb 1 61 | ntsc: 62 | rb 1 63 | 64 | if CVBASIC_MUSIC_PLAYER 65 | music_tick: rb 1 66 | music_mode: rb 1 67 | 68 | if CVBASIC_BANK_SWITCHING 69 | music_bank: rb 1 70 | endif 71 | music_start: rb 2 72 | music_pointer: rb 2 73 | music_playing: rb 1 74 | music_timing: rb 1 75 | music_note_counter: rb 1 76 | music_instrument_1: rb 1 77 | music_counter_1: rb 1 78 | music_note_1: rb 1 79 | music_instrument_2: rb 1 80 | music_counter_2: rb 1 81 | music_note_2: rb 1 82 | music_instrument_3: rb 1 83 | music_counter_3: rb 1 84 | music_note_3: rb 1 85 | music_counter_4: rb 1 86 | music_drum: rb 1 87 | 88 | audio_freq1: rb 2 89 | audio_freq2: rb 2 90 | audio_freq3: rb 2 91 | audio_noise: rb 1 92 | audio_mix: rb 1 93 | audio_vol1: rb 1 94 | audio_vol2: rb 1 95 | audio_vol3: rb 1 96 | 97 | audio_control: rb 1 98 | audio_vol4hw: rb 1 99 | endif 100 | 101 | if SGM 102 | org $2000 ; Start for variables. 103 | endif 104 | -------------------------------------------------------------------------------- /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 5 | 6 | The following require bank switching which is not implemented: 7 | bank 8 | 9 | The current build creates an assembly language file intended to be assembled with xas99 from the xdt99 tool suite: 10 | https://github.com/endlos99/xdt99 11 | 12 | Other assemblers are unlikely to work as it makes use of some of xdt99's features. 13 | 14 | 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. 15 | 16 | The program supports FCTN-= (Alt-= on PC emulation) to reset. 17 | 18 | The program is stored in the 24k memory expansion starting at >A000. The 8k RAM block at >2000 is used for variables and stack. (This is significantly more than most projects require.) 19 | 20 | cvbasic --ti994a test2.bas test2.a99 21 | 22 | The output of the compiler is an assembly file, it can be assembled like so: 23 | 24 | xas99.py -R test2.a99 -L test2.txt 25 | 26 | Consult the xas99 manual for details, but in short you need the -R switch to define registers for this code. -L provides a listing file if the assembly was successful. 27 | 28 | The output of xas is an uncompressed object file in Linux text format with an OBJ extension. You can load it directly in Classic99 as an E/A#3 file, and from there you can SAVE as a program image, or pack into a loader cartridge. 29 | 30 | To do this: 31 | 32 | - Select Cartridge->Apps->Editor/Assembler from the Classic99 menu 33 | - Press any key to clear the title page 34 | - Press '2' to Select Editor/Assembler 35 | - Press '3' to Load and Run 36 | - Enter the filename. If you stored the file in your DSK1 folder, this might be "DSK1.test2.obj". 37 | - After the program loads, press enter to finish loading 38 | - Enter 'START' as the run program name. 39 | 40 | You can also build a disk image for Js99er.net (online TI-99/4A emulator): 41 | 42 | xdm99.py -X sssd work.dsk -a test2.obj -f df80 43 | 44 | For Js99er.net, select the three lines icon and select Editor/Assembler, then select the disk icon and select the work.dsk file. Follow the previous list of instructions to load the program. 45 | 46 | TODO: 47 | - implement cartridge target (plan is a 24k loader cartridge with ROM support - so 24k fixed code space, 8k pages, and 8k RAM.) 48 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /utility/Try.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** Pletter decompressor for TI-99/4A 3 | ** 4 | ** C version contributed by JasonACT 5 | ** 6 | ** Aug/31/2024. 7 | */ 8 | 9 | #define _CRT_SECURE_NO_WARNINGS 10 | #include 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 | -------------------------------------------------------------------------------- /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 | VPOKE #pointer, 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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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/controller.bas: -------------------------------------------------------------------------------- 1 | ' 2 | ' Controller test 3 | ' 4 | ' by Oscar Toledo G. 5 | ' 6 | ' Creation date: Aug/21/2024. 7 | ' 8 | 9 | CONST left_x = 56 10 | CONST left_y = 40 11 | CONST right_x = 160 12 | CONST right_y = 40 13 | 14 | DEF FN CHAR_XY(x, y) = ((y) / 8 * 32 + (x) / 8) 15 | 16 | MODE 2 ' Color for sets of 8 characters. 17 | 18 | DEFINE CHAR 27,7,extra_bitmaps 19 | 20 | VPOKE $2003, $E1 ' Color for characters $18-$1f 21 | VPOKE $2004, $14 ' $20-$27 22 | VPOKE $2005, $1F ' $28-$29 23 | VPOKE $2006, $1F ' $30-$37 24 | VPOKE $2007, $1F ' $38-$3f 25 | VPOKE $2008, $F4 ' $40-$47 26 | VPOKE $2009, $F4 ' $48-$4f 27 | VPOKE $200A, $F4 ' $50-$57 28 | VPOKE $200B, $F4 ' $58-$5f 29 | VPOKE $200C, $F4 ' $60-$67 30 | VPOKE $200D, $F4 ' $68-$6f 31 | VPOKE $200E, $F4 ' $70-$77 32 | VPOKE $200F, $F4 ' $78-$7f 33 | 34 | ' Center numbers bitmaps 35 | FOR #c = $0150 TO $01CF 36 | d = VPEEK(#c) 37 | VPOKE #c, (d / 2) OR (d / 4) 38 | NEXT #c 39 | DEFINE CHAR 42,2,number_bitmap 40 | 41 | VDP(1) = $E0 ' 8x8 sprites 42 | VDP(6) = $00 ' Sprites use character bitmaps. 43 | 44 | PRINT AT 36,"CVBasic controller test" 45 | 46 | #c = CHAR_XY(left_x, left_y) 47 | GOSUB draw_controller 48 | #c = CHAR_XY(right_x, right_y) 49 | GOSUB draw_controller 50 | 51 | main_loop: 52 | WHILE 1 53 | IF cont1.up THEN 54 | SPRITE 0, left_y - 1, left_x + 16, 27, 9 55 | ELSE 56 | SPRITE 0, $d1, 0, 0, 0 57 | END IF 58 | IF cont1.left THEN 59 | SPRITE 1, left_y + 15, left_x, 30, 9 60 | ELSE 61 | SPRITE 1, $d1, 0, 0, 0 62 | END IF 63 | IF cont1.right THEN 64 | SPRITE 2, left_y + 15, left_x + 32, 28, 9 65 | ELSE 66 | SPRITE 2, $d1, 0, 0, 0 67 | END IF 68 | IF cont1.down THEN 69 | SPRITE 3, left_y + 31, left_x + 16, 29, 9 70 | ELSE 71 | SPRITE 3, $d1, 0, 0, 0 72 | END IF 73 | IF cont1.button THEN 74 | SPRITE 4, left_y + 47, left_x - 8, 31, 9 75 | ELSE 76 | SPRITE 4, $d1, 0, 0, 0 77 | END IF 78 | IF cont1.button2 THEN 79 | SPRITE 5, left_y + 47, left_x + 40, 31, 9 80 | ELSE 81 | SPRITE 5, $d1, 0, 0, 0 82 | END IF 83 | c = cont1.key 84 | IF cont1.key = 15 THEN 85 | SPRITE 6, $d1, 0, 0, 0 86 | ELSE 87 | IF c = 0 THEN 88 | x = 16 89 | y = 111 90 | c = 48 91 | ELSEIF c = 10 THEN 92 | x = 0 93 | y = 111 94 | c = 42 95 | ELSEIF c = 11 THEN 96 | x = 32 97 | y = 111 98 | c = 43 99 | ELSE 100 | x = ((c - 1) % 3) * 16 101 | y = 63 + ((c - 1) / 3) * 16 102 | c = c + 48 103 | END IF 104 | SPRITE 6, left_y + y, left_x + x, c, 9 105 | END IF 106 | 107 | IF cont2.up THEN 108 | SPRITE 7, right_y - 1, right_x + 16, 27, 9 109 | ELSE 110 | SPRITE 7, $d1, 0, 0, 0 111 | END IF 112 | IF cont2.left THEN 113 | SPRITE 8, right_y + 15, right_x, 30, 9 114 | ELSE 115 | SPRITE 8, $d1, 0, 0, 0 116 | END IF 117 | IF cont2.right THEN 118 | SPRITE 9, right_y + 15, right_x + 32, 28, 9 119 | ELSE 120 | SPRITE 9, $d1, 0, 0, 0 121 | END IF 122 | IF cont2.down THEN 123 | SPRITE 10, right_y + 31, right_x + 16, 29, 9 124 | ELSE 125 | SPRITE 10, $d1, 0, 0, 0 126 | END IF 127 | IF cont2.button THEN 128 | SPRITE 11, right_y + 47, right_x - 8, 31, 9 129 | ELSE 130 | SPRITE 11, $d1, 0, 0, 0 131 | END IF 132 | IF cont2.button2 THEN 133 | SPRITE 12, right_y + 47, right_x + 40, 31, 9 134 | ELSE 135 | SPRITE 12, $d1, 0, 0, 0 136 | END IF 137 | c = cont2.key 138 | IF cont2.key = 15 THEN 139 | SPRITE 14, $d1, 0, 0, 0 140 | ELSE 141 | IF c = 0 THEN 142 | x = 16 143 | y = 111 144 | c = 48 145 | ELSEIF c = 10 THEN 146 | x = 0 147 | y = 111 148 | c = 42 149 | ELSEIF c = 11 THEN 150 | x = 32 151 | y = 111 152 | c = 35 153 | ELSE 154 | x = ((c - 1) % 3) * 16 155 | y = 63 + ((c - 1) / 3) * 16 156 | c = c + 48 157 | END IF 158 | SPRITE 14, right_y + y, right_x + x, c, 9 159 | END IF 160 | 161 | WAIT 162 | 163 | WEND 164 | 165 | draw_controller: PROCEDURE 166 | FOR #d = #c - $0021 TO #c + $01DF STEP $20 167 | PRINT AT #d, "!!!!!!!" 168 | NEXT #d 169 | 170 | PRINT AT #c + $0000, "!!\27!!" 171 | PRINT AT #c + $0040, "\30!\31!\28" 172 | PRINT AT #c + $0080, "!!\29!!" 173 | PRINT AT #c + $00bf, "\31!!!!!\31" 174 | PRINT AT #c + $0100, "1!2!3" 175 | PRINT AT #c + $0140, "4!5!6" 176 | PRINT AT #c + $0180, "7!8!9" 177 | PRINT AT #c + $01C0, "*!0!+" 178 | END 179 | 180 | extra_bitmaps: 181 | BITMAP "...XX..." 182 | BITMAP "..XXXX.." 183 | BITMAP ".XXXXXX." 184 | BITMAP "...XX..." 185 | BITMAP "...XX..." 186 | BITMAP "...XX..." 187 | BITMAP "...XX..." 188 | BITMAP "...XX..." 189 | 190 | BITMAP "........" 191 | BITMAP ".....X.." 192 | BITMAP ".....XX." 193 | BITMAP "XXXXXXXX" 194 | BITMAP "XXXXXXXX" 195 | BITMAP ".....XX." 196 | BITMAP ".....X.." 197 | BITMAP "........" 198 | 199 | BITMAP "...XX..." 200 | BITMAP "...XX..." 201 | BITMAP "...XX..." 202 | BITMAP "...XX..." 203 | BITMAP "...XX..." 204 | BITMAP ".XXXXXX." 205 | BITMAP "..XXXX.." 206 | BITMAP "...XX..." 207 | 208 | BITMAP "........" 209 | BITMAP "..X....." 210 | BITMAP ".XX....." 211 | BITMAP "XXXXXXXX" 212 | BITMAP "XXXXXXXX" 213 | BITMAP ".XX....." 214 | BITMAP "..X....." 215 | BITMAP "........" 216 | 217 | BITMAP "..XXXX.." 218 | BITMAP ".XXXXXX." 219 | BITMAP "XXXXXXXX" 220 | BITMAP "XXXXXXXX" 221 | BITMAP "XXXXXXXX" 222 | BITMAP "XXXXXXXX" 223 | BITMAP ".XXXXXX." 224 | BITMAP "..XXXX.." 225 | 226 | BITMAP "........" 227 | BITMAP "........" 228 | BITMAP "........" 229 | BITMAP "........" 230 | BITMAP "........" 231 | BITMAP "........" 232 | BITMAP "........" 233 | BITMAP "........" 234 | 235 | BITMAP "XXXXXXXX" 236 | BITMAP "XXXXXXXX" 237 | BITMAP "XXXXXXXX" 238 | BITMAP "XXXXXXXX" 239 | BITMAP "XXXXXXXX" 240 | BITMAP "XXXXXXXX" 241 | BITMAP "XXXXXXXX" 242 | BITMAP "XXXXXXXX" 243 | 244 | number_bitmap: 245 | BITMAP "........" 246 | BITMAP ".XX..XX." 247 | BITMAP "..XXXX.." 248 | BITMAP ".XXXXXX." 249 | BITMAP "..XXXX.." 250 | BITMAP ".XX..XX." 251 | BITMAP "........" 252 | BITMAP "........" 253 | 254 | BITMAP "..XX.XX." 255 | BITMAP "..XX.XX." 256 | BITMAP ".XXXXXXX" 257 | BITMAP "..XX.XX." 258 | BITMAP ".XXXXXXX" 259 | BITMAP "..XX.XX." 260 | BITMAP "..XX.XX." 261 | BITMAP "........" 262 | -------------------------------------------------------------------------------- /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 | ' 9 | 10 | DEFINE SPRITE 0,4,sprites_bitmaps 11 | 12 | DIM enemy_x(8) 13 | DIM enemy_y(8) 14 | DIM enemy_s(8) 15 | 16 | restart_game: 17 | CLS 18 | 19 | #score = 0 20 | 21 | GOSUB update_score 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 | game_loop: 31 | WAIT 32 | 33 | ' Background "music" (two tones alternating each 16 video frames) 34 | #c = 960 35 | IF FRAME AND 16 THEN #c = 1023 36 | SOUND 0,#c,15-(FRAME AND 15) 37 | 38 | ' Setup player sprite 39 | SPRITE 0,player_y-1,player_x,0,10 40 | 41 | ' Setup bullet sprite 42 | IF bullet_y = 0 THEN ' Active? 43 | SPRITE 1,$d1,0,0,0 ' No, remove sprite. 44 | SOUND 1,,0 ' Disable sound. 45 | ELSE 46 | SPRITE 1,bullet_y-1,bullet_x,8,7 ' Setup sprite. 47 | bullet_y = bullet_y - 4 ' Displace bullet. 48 | SOUND 1,bullet_y+16,11 ' Make sound. 49 | END IF 50 | 51 | ' 52 | ' Display and move the enemies. 53 | ' 54 | FOR c = 0 TO 7 55 | IF enemy_s(c) = 0 THEN ' No enemy 56 | SPRITE c + 2, $d1, 0, 0, 0 57 | ' Create one 58 | enemy_x(c) = RANDOM(240) 59 | enemy_y(c) = $c0 + c * 4 60 | enemy_s(c) = 1 61 | ELSEIF enemy_s(c) = 1 THEN ' Enemy moving. 62 | SPRITE c + 2, enemy_y(c) - 1, enemy_x(c), 4, 2 63 | 64 | ' Slowly drift towards the player. 65 | IF (FRAME AND 3) = 0 THEN 66 | IF player_x < enemy_x(c) THEN 67 | enemy_x(c) = enemy_x(c) - 1 68 | ELSE 69 | enemy_x(c) = enemy_x(c) + 1 70 | END IF 71 | END IF 72 | ' Move down. 73 | enemy_y(c) = enemy_y(c) + 2 74 | IF enemy_y(c) = $c0 THEN ' Reached frontier. 75 | enemy_x(c) = RANDOM(240) 76 | enemy_y(c) = $f2 ' Reset enemy. 77 | END IF 78 | 79 | ' 80 | ' Check if bullet has been launched. 81 | ' 82 | IF bullet_y <> 0 THEN ' Is bullet launched? 83 | IF ABS(bullet_x + 1 - enemy_x(c)) < 8 THEN 84 | IF ABS(bullet_y + 1 - enemy_y(c)) < 8 THEN 85 | enemy_s(c) = 2 ' Enemy explodes 86 | #score = #score + 1 87 | GOSUB update_score 88 | bullet_y = 0 89 | sound 2,2 ' Start enemy explosion sound 90 | SOUND 3,$E7,13 91 | END IF 92 | END IF 93 | END IF 94 | 95 | ' 96 | ' Check if player is hit by enemy. 97 | ' 98 | IF ABS(player_y + 1 - enemy_y(c)) < 8 THEN 99 | IF ABS(player_x + 1 - enemy_x(c)) < 8 THEN 100 | GOTO player_dies 101 | END IF 102 | END IF 103 | ELSE 104 | ' Enemy explosion. 105 | IF FRAME AND 4 THEN d = 10 ELSE d = 6 106 | SPRITE c + 2, enemy_y(c) - 1, enemy_x(c), 12, d 107 | 108 | ' Displace explosion slowly. 109 | IF FRAME AND 1 THEN 110 | IF enemy_y(c) < $c0 THEN enemy_y(c) = enemy_y(c) + 1 111 | END IF 112 | 113 | ' Explosion sound. 114 | SOUND 2,enemy_s(c) 115 | enemy_s(c) = enemy_s(c) + 1 116 | IF enemy_s(c) = 80 THEN ' Time reached. 117 | SOUND 3,,0 118 | enemy_x(c) = RANDOM(240) 119 | enemy_y(c) = $f2 120 | enemy_s(c) = 1 ' Bring back enemy. 121 | END IF 122 | END IF 123 | NEXT c 124 | 125 | ' 126 | ' Movement of the player. 127 | ' 128 | IF cont1.left THEN IF player_x > 0 THEN player_x = player_x - 2 129 | IF cont1.right THEN IF player_x < 240 THEN player_x = player_x + 2 130 | IF cont1.button THEN ' Fire! 131 | IF bullet_y = 0 THEN ' Only if no bullet active. 132 | bullet_y = player_y - 8 133 | bullet_x = player_x 134 | END IF 135 | END IF 136 | GOTO game_loop 137 | 138 | ' 139 | ' Player dies. 140 | ' 141 | player_dies: 142 | PRINT AT 11,"GAME OVER" 143 | 144 | ' 145 | ' Explosion effect and sound. 146 | ' 147 | SOUND 0,,0 148 | SOUND 1,,0 149 | SOUND 2,32,0 150 | FOR c = 0 TO 120 151 | WAIT 152 | SOUND 3,$E4 + (c AND 3),13 153 | SPRITE 0, player_y - 1 + RANDOM(5) - 2, player_x + RANDOM(5) - 2, 12, RANDOM(14) + 2 154 | NEXT c 155 | SOUND 3,,0 156 | 157 | ' 158 | ' Remove enemies. 159 | ' 160 | FOR c = 1 TO 9 161 | SPRITE c, $d1, 0, 0, 0 162 | NEXT c 163 | 164 | ' 165 | ' Big delay. 166 | ' 167 | #c = FRAME 168 | DO 169 | WAIT 170 | LOOP WHILE FRAME - #c < 300 171 | 172 | GOTO restart_game 173 | 174 | ' 175 | ' Update the score on the screen. 176 | ' 177 | update_score: PROCEDURE 178 | PRINT AT 2,#score,"0" 179 | END 180 | 181 | ' 182 | ' Bitmaps for the game. 183 | ' 184 | sprites_bitmaps: 185 | BITMAP ".......XX......." 186 | BITMAP ".......XX......." 187 | BITMAP "......XXXX......" 188 | BITMAP "......XXXX......" 189 | BITMAP "......XXXX......" 190 | BITMAP ".....XXXXXX....." 191 | BITMAP ".....XXXXXX....." 192 | BITMAP ".....XX..XX....." 193 | BITMAP ".....X....X....." 194 | BITMAP "..XX.XXXXXX.XX.." 195 | BITMAP ".XXX.XXXXXX.XXX." 196 | BITMAP ".XXXXX....XXXXX." 197 | BITMAP "XX..XXXXX.XX..XX" 198 | BITMAP "XXX.XXXXXXXXX.XX" 199 | BITMAP "XXXX.XXXXXX.XXXX" 200 | BITMAP ".XX..XX..XX..XX." 201 | 202 | BITMAP "....XXXXXXXX...." 203 | BITMAP "...X........X..." 204 | BITMAP "..X.XX....XX.X.." 205 | BITMAP ".X...XXXXXX...X." 206 | BITMAP ".X...X.XX.X...X." 207 | BITMAP ".X...XXXXXX...X." 208 | BITMAP ".X....XXXX....X." 209 | BITMAP ".X..XX....XX..X." 210 | BITMAP ".XXXX.XXXX.XXXX." 211 | BITMAP "XXX..X....X..XXX" 212 | BITMAP "..XXXXXXXXXXXX.." 213 | BITMAP "XXX....XX....XXX" 214 | BITMAP "X.XXXX.XX.XXXX.X" 215 | BITMAP "X..XX.XXXX.XX..X" 216 | BITMAP "XXX..XX..XX..XXX" 217 | BITMAP "..XXXX....XXXX.." 218 | 219 | BITMAP "................" 220 | BITMAP "................" 221 | BITMAP "................" 222 | BITMAP "................" 223 | BITMAP ".......XX......." 224 | BITMAP "......XXXX......" 225 | BITMAP "......XXXX......" 226 | BITMAP "......XXXX......" 227 | BITMAP "......XXXX......" 228 | BITMAP "....XXXXXXXX...." 229 | BITMAP "...XXXXXXXXXX..." 230 | BITMAP "......XXXX......" 231 | BITMAP ".....XX...XX...." 232 | BITMAP "................" 233 | BITMAP "................" 234 | BITMAP "................" 235 | 236 | BITMAP "................" 237 | BITMAP "................" 238 | BITMAP ".......X........" 239 | BITMAP ".......XX......." 240 | BITMAP "X......XXX......" 241 | BITMAP "XXX.....XXX...XX" 242 | BITMAP "XXXXX..XXXX..XXX" 243 | BITMAP "...XXXXXXXXXXX.." 244 | BITMAP ".....XXXXXX.X..." 245 | BITMAP "......X..X.X...." 246 | BITMAP ".....XXXXXXXX..." 247 | BITMAP "....XXX.XXXXXX.." 248 | BITMAP "...XXX.....XXXX." 249 | BITMAP "...XX........XXX" 250 | BITMAP "..XX............" 251 | BITMAP "................" 252 | -------------------------------------------------------------------------------- /old/boingbasic_prologue.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; BoingBASIC prologue 3 | ; 4 | ; by Oscar Toledo G. 5 | ; https://nanochess.org/ 6 | ; 7 | ; Creation date: Feb/27/2024. 8 | ; 9 | 10 | fname "game.rom" 11 | 12 | VDP: equ $be 13 | JOYSEL: equ $c0 14 | KEYSEL: equ $80 15 | JOY1: equ $fc 16 | JOY2: equ $ff 17 | 18 | STACK: equ $7400 19 | 20 | org $8000 21 | db $55,$aa 22 | dw 0 23 | dw 0 24 | dw 0 25 | dw 0 26 | dw START 27 | 28 | jp 0 ; rst $08 29 | jp 0 ; rst $10 30 | jp 0 ; rst $18 31 | jp 0 ; rst $20 32 | jp 0 ; rst $28 33 | jp 0 ; rst $30 34 | jp 0 ; rst $38 35 | 36 | jp nmi_handler 37 | 38 | WRTVDP: 39 | ld a,b 40 | out (VDP+1),a 41 | ld a,c 42 | or $80 43 | out (VDP+1),a 44 | ret 45 | 46 | SETWRT: 47 | ld a,l 48 | out (VDP+1),a 49 | ld a,h 50 | or $40 51 | out (VDP+1),a 52 | ret 53 | 54 | SETRD: 55 | ld a,l 56 | out (VDP+1),a 57 | ld a,h 58 | and $3f 59 | out (VDP+1),a 60 | ret 61 | 62 | WRTVRM: 63 | push af 64 | call SETWRT 65 | pop af 66 | out (VDP),a 67 | ret 68 | 69 | RDVRM: 70 | push af 71 | call SETRD 72 | pop af 73 | ex (sp),hl 74 | ex (sp),hl 75 | in a,(VDP) 76 | ret 77 | 78 | FILVRM: 79 | push af 80 | call SETWRT 81 | .1: pop af 82 | out (VDP),a 83 | push af 84 | dec bc 85 | ld a,b 86 | or c 87 | jp nz,.1 88 | pop af 89 | ret 90 | 91 | LDIRVM: 92 | EX DE,HL 93 | .1: LD A,(DE) 94 | CALL WRTVRM 95 | INC DE 96 | INC HL 97 | DEC BC 98 | LD A,B 99 | OR C 100 | JR NZ,.1 101 | RET 102 | 103 | LDIRVM3: 104 | call .1 105 | call .1 106 | .1: push hl 107 | push de 108 | push bc 109 | call LDIRVM 110 | pop bc 111 | pop de 112 | ld a,d 113 | add a,8 114 | ld d,a 115 | pop hl 116 | ret 117 | 118 | nmi_off: 119 | push hl 120 | ld hl,mode 121 | set 0,(hl) 122 | pop hl 123 | ret 124 | 125 | nmi_on: 126 | push af 127 | push hl 128 | ld hl,mode 129 | res 0,(hl) 130 | nop 131 | bit 1,(hl) 132 | jr nz,nmi_handler.0 133 | pop hl 134 | pop af 135 | ret 136 | 137 | nmi_handler: 138 | push af 139 | push hl 140 | ld hl,mode 141 | bit 0,(hl) 142 | jr z,.1 143 | set 1,(hl) 144 | pop hl 145 | pop af 146 | retn 147 | 148 | .0: res 1,(hl) 149 | 150 | .1: ld hl,$1b00 151 | call SETWRT 152 | ld hl,sprites 153 | ld bc,$8000+VDP 154 | outi 155 | jp nz,$-2 156 | pop hl 157 | in a,(VDP+1) 158 | pop af 159 | retn 160 | 161 | GTSTCK: 162 | out (JOYSEL),a 163 | ex (sp),hl 164 | ex (sp),hl 165 | in a,(JOY1) 166 | ld b,a 167 | in a,(JOY2) 168 | and b 169 | and $0f 170 | ld c,a 171 | ld b,0 172 | ld hl,.1 173 | add hl,bc 174 | ld a,(hl) 175 | ret 176 | 177 | .1: 178 | db 0,0,0,6,0,0,8,7,0,4,0,5,2,3,1,0 179 | 180 | GTTRIG: 181 | out (KEYSEL),a 182 | ex (sp),hl 183 | ex (sp),hl 184 | in a,(JOY1) 185 | ld c,a 186 | in a,(JOY2) 187 | and c 188 | ld c,a 189 | out (JOYSEL),a 190 | ex (sp),hl 191 | ex (sp),hl 192 | in a,(JOY1) 193 | and c 194 | ld c,a 195 | in a,(JOY2) 196 | and c 197 | rlca 198 | rlca 199 | ccf 200 | ld a,0 201 | sbc a,a 202 | ret 203 | 204 | cls: 205 | ld hl,$1800 206 | ld (cursor),hl 207 | ld bc,$0300 208 | ld a,$20 209 | call nmi_off 210 | call FILVRM 211 | jp nmi_on 212 | 213 | print_string: 214 | ld c,a 215 | ld b,0 216 | ld de,(cursor) 217 | ld a,d 218 | and $03 219 | or $18 220 | ld d,a 221 | push de 222 | push bc 223 | call nmi_off 224 | call LDIRVM 225 | call nmi_on 226 | pop bc 227 | pop hl 228 | add hl,bc 229 | ld (cursor),hl 230 | ret 231 | 232 | define_sprite: 233 | ex de,hl 234 | ld l,a 235 | ld h,0 236 | add hl,hl ; x2 237 | add hl,hl ; x4 238 | add hl,hl ; x8 239 | add hl,hl ; x16 240 | add hl,hl ; x32 241 | ld c,l 242 | ld b,h 243 | pop af 244 | pop hl 245 | push af 246 | add hl,hl ; x2 247 | add hl,hl ; x4 248 | ld h,$07 249 | add hl,hl ; x8 250 | add hl,hl ; x16 251 | add hl,hl ; x32 252 | ex de,hl 253 | call nmi_off 254 | call LDIRVM 255 | jp nmi_on 256 | 257 | define_char: 258 | ex de,hl 259 | ld l,a 260 | ld h,0 261 | add hl,hl ; x2 262 | add hl,hl ; x4 263 | add hl,hl ; x8 264 | ld c,l 265 | ld b,h 266 | pop af 267 | pop hl 268 | push af 269 | add hl,hl ; x2 270 | add hl,hl ; x4 271 | add hl,hl ; x8 272 | ex de,hl 273 | call nmi_off 274 | call LDIRVM3 275 | jp nmi_on 276 | 277 | define_color: 278 | ex de,hl 279 | ld l,a 280 | ld h,0 281 | add hl,hl ; x2 282 | add hl,hl ; x4 283 | add hl,hl ; x8 284 | ld c,l 285 | ld b,h 286 | pop af 287 | pop hl 288 | push af 289 | add hl,hl ; x2 290 | add hl,hl ; x4 291 | add hl,hl ; x8 292 | ex de,hl 293 | set 5,d 294 | call nmi_off 295 | call LDIRVM3 296 | jp nmi_on 297 | 298 | update_sprite: 299 | pop bc 300 | ld (sprite_data+3),a 301 | pop af 302 | ld (sprite_data+2),a 303 | pop af 304 | ld (sprite_data+1),a 305 | pop af 306 | ld (sprite_data),a 307 | pop af 308 | push bc 309 | ld de,sprites 310 | add a,a 311 | add a,a 312 | ld e,a 313 | ld hl,sprite_data 314 | ld bc,4 315 | ldir 316 | ret 317 | 318 | START: 319 | di 320 | ld sp,STACK 321 | in a,(VDP+1) 322 | ld bc,$8201 323 | call WRTVDP 324 | in a,(VDP+1) 325 | ld bc,$8201 326 | call WRTVDP 327 | xor a 328 | ld (mode),a 329 | ld bc,$0200 330 | call WRTVDP 331 | ld bc,$0602 ; $1800 for pattern table. 332 | call WRTVDP 333 | ld bc,$ff03 ; $2000 for color table. 334 | call WRTVDP 335 | ld bc,$0304 ; $0000 for bitmap table. 336 | call WRTVDP 337 | ld bc,$3605 ; $1b00 for sprite attribute table. 338 | call WRTVDP 339 | ld bc,$0706 ; $3800 for sprites bitmaps. 340 | call WRTVDP 341 | 342 | ld hl,($006c) 343 | ld de,-128 344 | add hl,de 345 | push hl 346 | ld de,$0100 347 | ld bc,$0300 348 | call LDIRVM 349 | pop hl 350 | push hl 351 | ld de,$0900 352 | ld bc,$0300 353 | call LDIRVM 354 | pop hl 355 | ld de,$1100 356 | ld bc,$0300 357 | call LDIRVM 358 | ld hl,$2000 359 | ld bc,$1800 360 | ld a,$f1 361 | call FILVRM 362 | ld hl,$1800 363 | ld bc,$0300 364 | ld a,$20 365 | call FILVRM 366 | ld hl,$1b00 367 | ld bc,$0080 368 | ld a,$d1 369 | call FILVRM 370 | ld hl,sprites 371 | ld de,sprites+1 372 | ld bc,127 373 | ld (hl),$d1 374 | ldir 375 | ld hl,$3800 376 | ld bc,$0800 377 | xor a 378 | call FILVRM 379 | 380 | ld de,$0100 381 | ld bc,$e201 ; Enable screen and interrupts. 382 | call WRTVDP 383 | 384 | ; boingBASIC program start. 385 | -------------------------------------------------------------------------------- /old/cvbasic_prologue.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; CVBasic prologue (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. Turns off sound. Now it reads the controllers. 9 | ; Added 16-bit multiply, division, modulo, and abs. 10 | ; Added random generator. Added sound routines. 11 | ; 12 | 13 | fname "game.rom" 14 | 15 | VDP: equ $be 16 | JOYSEL: equ $c0 17 | KEYSEL: equ $80 18 | JOY1: equ $fc 19 | JOY2: equ $ff 20 | PSG: equ $ff 21 | 22 | TURN_OFF_SOUND: equ $1fd6 23 | 24 | STACK: equ $7400 25 | 26 | org $8000 27 | db $55,$aa 28 | dw 0 29 | dw 0 30 | dw 0 31 | dw 0 32 | dw START 33 | 34 | jp 0 ; rst $08 35 | jp 0 ; rst $10 36 | jp 0 ; rst $18 37 | jp 0 ; rst $20 38 | jp 0 ; rst $28 39 | jp 0 ; rst $30 40 | jp 0 ; rst $38 41 | 42 | jp nmi_handler 43 | 44 | WRTVDP: 45 | ld a,b 46 | out (VDP+1),a 47 | ld a,c 48 | or $80 49 | out (VDP+1),a 50 | ret 51 | 52 | SETWRT: 53 | ld a,l 54 | out (VDP+1),a 55 | ld a,h 56 | or $40 57 | out (VDP+1),a 58 | ret 59 | 60 | SETRD: 61 | ld a,l 62 | out (VDP+1),a 63 | ld a,h 64 | and $3f 65 | out (VDP+1),a 66 | ret 67 | 68 | WRTVRM: 69 | push af 70 | call SETWRT 71 | pop af 72 | out (VDP),a 73 | ret 74 | 75 | RDVRM: 76 | push af 77 | call SETRD 78 | pop af 79 | ex (sp),hl 80 | ex (sp),hl 81 | in a,(VDP) 82 | ret 83 | 84 | FILVRM: 85 | push af 86 | call SETWRT 87 | .1: pop af 88 | out (VDP),a 89 | push af 90 | dec bc 91 | ld a,b 92 | or c 93 | jp nz,.1 94 | pop af 95 | ret 96 | 97 | LDIRVM: 98 | EX DE,HL 99 | .1: LD A,(DE) 100 | CALL WRTVRM 101 | INC DE 102 | INC HL 103 | DEC BC 104 | LD A,B 105 | OR C 106 | JR NZ,.1 107 | RET 108 | 109 | LDIRVM3: 110 | call .1 111 | call .1 112 | .1: push hl 113 | push de 114 | push bc 115 | call LDIRVM 116 | pop bc 117 | pop de 118 | ld a,d 119 | add a,8 120 | ld d,a 121 | pop hl 122 | ret 123 | 124 | nmi_off: 125 | push hl 126 | ld hl,mode 127 | set 0,(hl) 128 | pop hl 129 | ret 130 | 131 | nmi_on: 132 | push af 133 | push hl 134 | ld hl,mode 135 | res 0,(hl) 136 | nop 137 | bit 1,(hl) 138 | jr nz,nmi_handler.0 139 | pop hl 140 | pop af 141 | ret 142 | 143 | nmi_handler: 144 | push af 145 | push hl 146 | ld hl,mode 147 | bit 0,(hl) 148 | jr z,.1 149 | set 1,(hl) 150 | pop hl 151 | pop af 152 | retn 153 | 154 | .0: res 1,(hl) 155 | 156 | .1: push bc 157 | push de 158 | ld hl,$1b00 159 | call SETWRT 160 | ld hl,sprites 161 | ld bc,$8000+VDP 162 | outi 163 | jp nz,$-2 164 | 165 | out (JOYSEL),a 166 | ex (sp),hl 167 | ex (sp),hl 168 | in a,(JOY1) 169 | or $b0 170 | ld b,a 171 | in a,(JOY2) 172 | or $b0 173 | ld c,a 174 | 175 | out (KEYSEL),a 176 | ex (sp),hl 177 | ex (sp),hl 178 | in a,(JOY1) 179 | ld d,a 180 | in a,(JOY2) 181 | ld e,a 182 | 183 | ld a,d 184 | rlca 185 | or $7f 186 | and b 187 | cpl 188 | ld (joy1_data),a 189 | 190 | ld a,e 191 | rlca 192 | or $7f 193 | and c 194 | cpl 195 | ld (joy2_data),a 196 | 197 | ld a,d 198 | and $0f 199 | ld c,a 200 | ld b,0 201 | ld hl,keypad_table 202 | add hl,bc 203 | ld a,(hl) 204 | ld (key1_data),a 205 | 206 | ld a,e 207 | and $0f 208 | ld c,a 209 | ld hl,keypad_table 210 | add hl,bc 211 | ld a,(hl) 212 | ld (key2_data),a 213 | 214 | ld hl,(frame) 215 | inc hl 216 | ld (frame),hl 217 | 218 | pop de 219 | pop bc 220 | pop hl 221 | in a,(VDP+1) 222 | pop af 223 | retn 224 | 225 | keypad_table: 226 | db $0f,$08,$04,$05,$0c,$07,$0a,$02 227 | db $0d,$0b,$00,$09,$03,$01,$06,$0f 228 | 229 | cls: 230 | ld hl,$1800 231 | ld (cursor),hl 232 | ld bc,$0300 233 | ld a,$20 234 | call nmi_off 235 | call FILVRM 236 | jp nmi_on 237 | 238 | print_string: 239 | ld c,a 240 | ld b,0 241 | ld de,(cursor) 242 | ld a,d 243 | and $03 244 | or $18 245 | ld d,a 246 | push de 247 | push bc 248 | call nmi_off 249 | call LDIRVM 250 | call nmi_on 251 | pop bc 252 | pop hl 253 | add hl,bc 254 | ld (cursor),hl 255 | ret 256 | 257 | print_number: 258 | ld b,0 259 | ld de,10000 260 | call nmi_off 261 | call .1 262 | ld de,1000 263 | call .1 264 | ld de,100 265 | call .1 266 | ld de,10 267 | call .1 268 | ld de,1 269 | inc b 270 | call .1 271 | jp nmi_on 272 | 273 | .1: ld a,$2f 274 | or a 275 | .2: inc a 276 | sbc hl,de 277 | jp nc,.2 278 | add hl,de 279 | cp $30 280 | jr nz,.3 281 | ld a,b 282 | or a 283 | ret z 284 | ld a,$30 285 | .3: push hl 286 | ld hl,(cursor) 287 | ld c,a 288 | ld a,h 289 | and $03 290 | or $18 291 | ld h,a 292 | ld a,c 293 | call WRTVRM 294 | inc hl 295 | ld (cursor),hl 296 | pop hl 297 | ld b,1 298 | ret 299 | 300 | define_sprite: 301 | ex de,hl 302 | ld l,a 303 | ld h,0 304 | add hl,hl ; x2 305 | add hl,hl ; x4 306 | add hl,hl ; x8 307 | add hl,hl ; x16 308 | add hl,hl ; x32 309 | ld c,l 310 | ld b,h 311 | pop af 312 | pop hl 313 | push af 314 | add hl,hl ; x2 315 | add hl,hl ; x4 316 | ld h,$07 317 | add hl,hl ; x8 318 | add hl,hl ; x16 319 | add hl,hl ; x32 320 | ex de,hl 321 | call nmi_off 322 | call LDIRVM 323 | jp nmi_on 324 | 325 | define_char: 326 | ex de,hl 327 | ld l,a 328 | ld h,0 329 | add hl,hl ; x2 330 | add hl,hl ; x4 331 | add hl,hl ; x8 332 | ld c,l 333 | ld b,h 334 | pop af 335 | pop hl 336 | push af 337 | add hl,hl ; x2 338 | add hl,hl ; x4 339 | add hl,hl ; x8 340 | ex de,hl 341 | call nmi_off 342 | call LDIRVM3 343 | jp nmi_on 344 | 345 | define_color: 346 | ex de,hl 347 | ld l,a 348 | ld h,0 349 | add hl,hl ; x2 350 | add hl,hl ; x4 351 | add hl,hl ; x8 352 | ld c,l 353 | ld b,h 354 | pop af 355 | pop hl 356 | push af 357 | add hl,hl ; x2 358 | add hl,hl ; x4 359 | add hl,hl ; x8 360 | ex de,hl 361 | set 5,d 362 | call nmi_off 363 | call LDIRVM3 364 | jp nmi_on 365 | 366 | update_sprite: 367 | pop bc 368 | ld (sprite_data+3),a 369 | pop af 370 | ld (sprite_data+2),a 371 | pop af 372 | ld (sprite_data+1),a 373 | pop af 374 | ld (sprite_data),a 375 | pop af 376 | push bc 377 | ld de,sprites 378 | add a,a 379 | add a,a 380 | ld e,a 381 | ld hl,sprite_data 382 | ld bc,4 383 | ldir 384 | ret 385 | 386 | ; Fast 16-bit multiplication. 387 | _mul16: 388 | ld b,h 389 | ld c,l 390 | ld a,16 391 | ld hl,0 392 | .1: 393 | srl d 394 | rr e 395 | jr nc,.2 396 | add hl,bc 397 | .2: sla c 398 | rl b 399 | dec a 400 | jp nz,.1 401 | ret 402 | 403 | ; Fast 16-bit division. 404 | _div16: 405 | ld b,h 406 | ld c,l 407 | ld hl,0 408 | ld a,16 409 | .1: 410 | rl c 411 | rl b 412 | adc hl,hl 413 | sbc hl,de 414 | jp nc,.2 415 | add hl,de 416 | .2: 417 | ccf 418 | dec a 419 | jp nz,.1 420 | rl c 421 | rl b 422 | ld h,b 423 | ld l,c 424 | ret 425 | 426 | ; Fast 16-bit modulo. 427 | _mod16: 428 | ld b,h 429 | ld c,l 430 | ld hl,0 431 | ld a,16 432 | .1: 433 | rl c 434 | rl b 435 | adc hl,hl 436 | sbc hl,de 437 | jp nc,.2 438 | add hl,de 439 | .2: 440 | ccf 441 | dec a 442 | jp nz,.1 443 | ret 444 | 445 | _abs16: 446 | bit 7,h 447 | ret z 448 | ld a,h 449 | cpl 450 | ld h,a 451 | ld a,l 452 | cpl 453 | ld l,a 454 | inc hl 455 | ret 456 | 457 | ; Random number generator. 458 | ; From my game Mecha Eight. 459 | random: 460 | ld hl,(lfsr) 461 | ld a,h 462 | or l 463 | jr nz,.0 464 | ld hl,$7811 465 | .0: ld a,h 466 | and $80 467 | ld b,a 468 | ld a,h 469 | and $02 470 | rrca 471 | rrca 472 | xor b 473 | ld b,a 474 | ld a,h 475 | and $01 476 | rrca 477 | xor b 478 | ld b,a 479 | ld a,l 480 | and $20 481 | rlca 482 | rlca 483 | xor b 484 | rlca 485 | rr h 486 | rr l 487 | ld (lfsr),hl 488 | ret 489 | 490 | sn76489_freq: 491 | ld b,a 492 | ld a,l 493 | and $0f 494 | or b 495 | out (PSG),a 496 | add hl,hl 497 | add hl,hl 498 | add hl,hl 499 | add hl,hl 500 | ld a,h 501 | and $3f 502 | out (PSG),a 503 | ret 504 | 505 | sn76489_vol: 506 | cpl 507 | and $0f 508 | or b 509 | out (PSG),a 510 | ret 511 | 512 | sn76489_control: 513 | and $0f 514 | or $e0 515 | out (PSG),a 516 | ret 517 | 518 | START: 519 | di 520 | ld sp,STACK 521 | in a,(VDP+1) 522 | ld bc,$8201 523 | call WRTVDP 524 | in a,(VDP+1) 525 | ld bc,$8201 526 | call WRTVDP 527 | 528 | ld hl,(lfsr) ; Save RAM trash for random generator. 529 | ld de,$7000 530 | xor a 531 | ld (de),a 532 | inc de 533 | bit 2,d 534 | jp z,$-4 535 | ld (lfsr),hl 536 | 537 | call TURN_OFF_SOUND 538 | 539 | xor a 540 | ld (mode),a 541 | ld bc,$0200 542 | call WRTVDP 543 | ld bc,$0602 ; $1800 for pattern table. 544 | call WRTVDP 545 | ld bc,$ff03 ; $2000 for color table. 546 | call WRTVDP 547 | ld bc,$0304 ; $0000 for bitmap table. 548 | call WRTVDP 549 | ld bc,$3605 ; $1b00 for sprite attribute table. 550 | call WRTVDP 551 | ld bc,$0706 ; $3800 for sprites bitmaps. 552 | call WRTVDP 553 | 554 | ld hl,($006c) 555 | ld de,-128 556 | add hl,de 557 | push hl 558 | ld de,$0100 559 | ld bc,$0300 560 | call LDIRVM 561 | pop hl 562 | push hl 563 | ld de,$0900 564 | ld bc,$0300 565 | call LDIRVM 566 | pop hl 567 | ld de,$1100 568 | ld bc,$0300 569 | call LDIRVM 570 | ld hl,$2000 571 | ld bc,$1800 572 | ld a,$f1 573 | call FILVRM 574 | ld hl,$1800 575 | ld bc,$0300 576 | ld a,$20 577 | call FILVRM 578 | ld hl,$1b00 579 | ld bc,$0080 580 | ld a,$d1 581 | call FILVRM 582 | ld hl,sprites 583 | ld de,sprites+1 584 | ld bc,127 585 | ld (hl),$d1 586 | ldir 587 | ld hl,$3800 588 | ld bc,$0800 589 | xor a 590 | call FILVRM 591 | 592 | ld de,$0100 593 | ld bc,$e201 ; Enable screen and interrupts. 594 | call WRTVDP 595 | 596 | ld a,$ff 597 | ld (joy1_data),a 598 | ld (joy2_data),a 599 | ld a,$0f 600 | ld (key1_data),a 601 | ld (key2_data),a 602 | 603 | ; CVBasic program start. 604 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CVBasic compiler v0.7.0 2 | *(c) Copyright 2024 Ó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). 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 | * Spectravideo SVI-318 / 328. 14 | * Sord M5. 15 | * Memotech MTX. 16 | * Vtech Creativision (Dick Smith's Wizzard / Laser 2001). 17 | * Tatung Einstein. 18 | * Casio PV2000. 19 | * Hanimex/Soundic Pencil II. 20 | * Texas Instruments TI-99/4A (courtesy of @tursilion) 21 | 22 | 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. 23 | 24 | The following files compose the compiler: 25 | 26 | cvbasic.h The CVBasic compiler global definitions. 27 | cvbasic.c The CVBasic compiler C language source code. 28 | cpu6502.h 6502 code headers. 29 | cpu6502.c 6502 code generation. 30 | cpu9900.h TMS9900 code headers. 31 | cpu9900.c TMS9900 code generation. 32 | cpuz80.h Z80 code headers. 33 | cpuz80.c Z80 code generation. 34 | driver.h Driver headers. 35 | driver.c Driver for both processors. 36 | node.h Tree node headers. 37 | node.c Tree node creation and optimization. 38 | LICENSE.txt Source code license 39 | 40 | cvbasic_prologue.asm Prologue file needed for compiled programs. 41 | cvbasic_epilogue.asm Epilogue file needed for compiled programs. 42 | cvbasic_6502_prologue.asm Prologue file needed for 6502 compiled programs. 43 | cvbasic_6502_epilogue.asm Epilogue file needed for 6502 compiled programs. 44 | cvbasic_9900_prologue.asm Prologue file needed for TMS9900 compiled programs. 45 | cvbasic_9900_epilogue.asm Epilogue file needed for TMS9900 compiled programs. 46 | 47 | manual.txt English manual for CVBasic 48 | 49 | README.md This file 50 | 51 | examples/bank.bas Bank-switching example. 52 | examples/demo.bas Demo of graphics. 53 | examples/face_joystick.bas Moving face with joystick. 54 | examples/happy_face.bas Bouncing face. 55 | examples/music.bas Music example. 56 | examples/oscar_compressed.bas High-resolution graphics example compressed with Pletter. 57 | examples/oscar.bas High-resolution graphics example. 58 | examples/portrait.bas Data used by demo.bas 59 | examples/space_attack.bas Game example. 60 | examples/test1.bas Moving stars. 61 | examples/test2.bas Arithmetic test. 62 | examples/vgm.bas VGM audio player. 63 | examples/viboritas.bas Game example. 64 | 65 | 66 | ### Usage guide 67 | 68 | Using CVBasic to compile a Colecovision program: 69 | 70 | cvbasic game.bas game.asm 71 | gasm80 game.asm -o game.rom -l game.lst 72 | 73 | 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) 74 | 75 | Using CVBasic to compile a Sega SG1000/SC3000 program: 76 | 77 | cvbasic --sg1000 game.bas game.asm 78 | gasm80 game.asm -o game.rom 79 | 80 | Using CVBasic to compile a MSX program for 8K RAM (wider compatibility) and 16K RAM: 81 | 82 | cvbasic --msx game.bas game.asm 83 | gasm80 game.asm -o game.rom 84 | 85 | cvbasic --msx -ram16 game.bas game.asm 86 | gasm80 game.asm -o game.rom 87 | 88 | Using CVBasic to compile a Colecovision Super Game Module program: 89 | 90 | cvbasic --sgm game.bas game.asm 91 | gasm80 game.asm -o game.rom 92 | 93 | Using CVBasic to compile a Spectravideo SVI-318/328 program: 94 | 95 | cvbasic --svi game.bas game.asm 96 | gasm80 game.asm -o game.rom 97 | 98 | Using CVBasic to compile a Sord M5 program: 99 | 100 | cvbasic --sord game.bas game.asm 101 | gasm80 game.asm -o game.rom 102 | 103 | Using CVBasic to compile a Memotech MTX program: 104 | 105 | cvbasic --memotech game.bas game.asm 106 | gasm80 game.asm -o game.run 107 | 108 | cvbasic --memotech -cpm game.bas game.asm 109 | gasm80 game.asm -o game.com 110 | 111 | Using CVBasic to compile a VTech Creativision (Dick Smith's Wizzard / Vtech Laser 2001) program: 112 | 113 | cvbasic --creativision game.bas game.asm 114 | gasm80 game.asm -o game.rom 115 | 116 | Using CVBasic to compile a Hanimex/Soundic Pencil II program (almost exactly like a Colecovision, but with 2K of RAM and different cartridge header): 117 | 118 | cvbasic --pencil game.bas game.asm 119 | gasm80 game.asm -o game.rom 120 | 121 | Using CVBasic to compile a Tatung Einstein program: 122 | 123 | cvbasic --einstein game.bas game.asm 124 | gasm80 game.asm -o game.com 125 | 126 | Using CVBasic to compile a Casio PV-2000 program: 127 | 128 | cvbasic --pv2000 game.bas game.asm 129 | gasm80 game.asm -o game.rom 130 | 131 | Using CVBasic to compile a Texas Instruments TI-99/4A program: 132 | 133 | cvbasic --ti994a game.bas game.a99 134 | xas99.py -R game.a99 135 | xdm99.py -X sssd game.dsk -a game.obj -f df80 136 | 137 | You require the utilities from the xdt99 tool suite: [https://github.com/endlos99/xdt99](https://github.com/endlos99/xdt99) 138 | 139 | The target is a stock TI-99/4A system with 32k memory expansion and joysticks. You can execute the dsk or obj file directly with the onlne emulator [js99er.net](js99er.net), or put it the obj file into a DSK directory for Classic99. 140 | 141 | ### Notes 142 | 143 | The current official version is v0.7.0. 144 | 145 | All platforms have been tested in emulation. 146 | 147 | * Colecovision and MSX have been tested in real hardware by myself. 148 | * Sega SG1000/SC3000 tested in real hardware by aotta. 149 | * Spectravideo SVI-318/328 tested in real hardware by Tony Cruise. 150 | * Creativision / Dick Smith's Wizzard tested in real hardware by Scouter3d. 151 | 152 | 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). 153 | 154 | The Sega SG1000 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. 155 | 156 | 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. 157 | 158 | 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. 159 | 160 | The Memotech can only use binaries up to 32 kb, keyboard is handled as controller 1, and it can also emulate the Colecovision keypad (CONT1.KEY only) using the keys 0-9, BS and Ret. 161 | 162 | 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. 163 | 164 | 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. 165 | 166 | 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. 167 | 168 | The TI-99/4A can only generate binaries up to 24 kb. 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. 169 | 170 | 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/) 171 | 172 | 173 | ### Supporting the developer 174 | 175 | 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 176 | 177 | 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. 178 | 179 | 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. 180 | 181 | The foreword is written by the legendary David R. Megarry, programmer of Zaxxon™ for Colecovision, and creator of the Dungeon!™ Board game. 182 | 183 | All the games in the book will compile for **all** the platforms. 184 | 185 | * [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) 186 | * [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) 187 | * [Programming Games for Colecovision, PDF ebook, 250 pages](https://nanochess.org/store.html) 188 | 189 | 190 | ### Acknowledgments 191 | 192 | 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, wavemotion, and youki. 193 | -------------------------------------------------------------------------------- /examples/viboritas.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 | ' 10 | 11 | ' The original game was made in Z80 assembler, 12 | ' you can see it here: https://nanochess.org/viboritas.html 13 | 14 | ' It is easier to understand in CVBasic ;) 15 | 16 | DEFINE CHAR 128,21,game_bitmaps 17 | DEFINE COLOR 128,21,game_colors 18 | DEFINE SPRITE 0,10,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, 15 55 | SPRITE 1, y_enemy1 - 1, x_enemy1, enemy1_frame, 14 56 | SPRITE 2, y_enemy2 - 1, x_enemy2, enemy2_frame, 14 57 | SPRITE 3, y_enemy3 - 1, x_enemy3, enemy3_frame, 14 58 | 59 | GOSUB move_player 60 | 61 | c = $50 + level * 4 62 | enemy_speed = enemy_speed + c 63 | WHILE enemy_speed >= $40 64 | enemy_speed = enemy_speed - $40 65 | GOSUB move_enemies 66 | WEND 67 | IF cont1.button THEN 68 | IF x_player > 232 AND x_player < 248 AND y_player = 136 THEN 69 | GOSUB sound_off 70 | 71 | FOR c = 1 to 10 72 | WAIT 73 | SOUND 0, 200 - c * 10, 13 74 | NEXT c 75 | 76 | level = level + 1 77 | IF level = 6 THEN 78 | GOSUB sound_off 79 | PRINT AT 267," YOU WIN! " 80 | #c = FRAME 81 | DO 82 | WAIT 83 | LOOP WHILE FRAME - #c < 300 84 | level = 1 85 | GOTO restart_level 86 | END IF 87 | GOTO next_level 88 | END IF 89 | END IF 90 | IF ABS(y_player + 1 - y_enemy1) < 8 THEN 91 | IF ABS(x_player + 1 - x_enemy1) < 8 THEN GOTO player_dies 92 | END IF 93 | IF ABS(y_player + 1 - y_enemy2) < 8 THEN 94 | IF ABS(x_player + 1 - x_enemy2) < 8 THEN GOTO player_dies 95 | END IF 96 | IF ABS(y_player + 1 - y_enemy3) < 8 THEN 97 | IF ABS(x_player + 1 - x_enemy3) < 8 THEN GOTO player_dies 98 | END IF 99 | WEND 100 | 101 | player_dies: 102 | GOSUB sound_off 103 | 104 | SOUND 0,640,13 105 | SOUND 1,320,13 106 | SOUND 2,160,13 107 | 108 | player_frame = 0 109 | FOR c = 0 TO 30 110 | WAIT 111 | WAIT 112 | player_frame = player_frame XOR 8 113 | SPRITE 0, y_player - 1, x_player, player_frame, 15 114 | NEXT c 115 | 116 | GOSUB sound_off 117 | 118 | DO 119 | WAIT 120 | SOUND 0,200 - y_player,13 121 | player_frame = player_frame XOR 8 122 | SPRITE 0, y_player - 1, x_player, player_frame, 15 123 | y_player = y_player + 2 124 | LOOP WHILE y_player < 160 125 | 126 | GOSUB sound_off 127 | 128 | IF lives = 0 THEN 129 | PRINT AT 267," GAME OVER " 130 | #c = FRAME 131 | DO 132 | WAIT 133 | LOOP WHILE FRAME - #c < 300 134 | GOTO restart_game 135 | END IF 136 | lives = lives - 1 137 | GOTO restart_level 138 | 139 | ' 140 | ' Draw the current level. 141 | ' 142 | draw_level: PROCEDURE 143 | 144 | ' Get the base character to draw the level. 145 | base_character = 128 + (level - 1) * 4 146 | 147 | ' Draw the background. 148 | FOR #c = $1800 TO $1a7c STEP 4 149 | VPOKE #c, base_character 150 | VPOKE #c + 1, base_character 151 | VPOKE #c + 2, base_character 152 | VPOKE #c + 3, base_character + 1. 153 | NEXT #c 154 | 155 | ' Draw over the floors. 156 | FOR #c = $1880 TO $1A60 STEP 160 157 | FOR #d = #c TO #c + 31 158 | VPOKE #d, base_character + 2. 159 | NEXT #d 160 | NEXT #c 161 | 162 | ' Draw the ladders. 163 | ladders = 6 - level 164 | 165 | FOR #c = $1880 TO $19C0 STEP 160 166 | FOR d = 1 TO ladders 167 | e = RANDOM(28) + 2 168 | VPOKE #c + e, base_character + 3. 169 | VPOKE #c + e + 32, base_character + 3. 170 | VPOKE #c + e + 64, base_character + 3. 171 | VPOKE #c + e + 96, base_character + 3. 172 | VPOKE #c + e + 128, base_character + 3. 173 | NEXT d 174 | NEXT #c 175 | 176 | ' Draw the "exit". 177 | VPOKE $1A5E, 148 178 | 179 | END 180 | 181 | ' 182 | ' Move the player 183 | ' 184 | move_player: PROCEDURE 185 | IF cont1.left THEN 186 | IF y_player % 40 = 16 THEN ' Player aligned on floor 187 | IF x_player > 0 THEN x_player = x_player - 1 188 | IF FRAME AND 4 THEN player_frame = 8 ELSE player_frame = 12 189 | END IF 190 | END IF 191 | IF cont1.right THEN 192 | IF y_player % 40 = 16 THEN ' Player aligned on floor 193 | IF x_player < 240 THEN x_player = x_player + 1 194 | IF FRAME AND 4 THEN player_frame = 0 ELSE player_frame = 4 195 | END IF 196 | END IF 197 | IF cont1.up THEN 198 | IF y_player % 40 = 16 THEN ' Player aligned on floor. 199 | column = (x_player + 7) /8 200 | row = (y_player + 8) / 8 201 | #c = $1800 + row * 32 + column 202 | IF VPEEK(#c) = base_character + 3 THEN ' Ladder? 203 | y_player = y_player - 1 204 | END IF 205 | ELSE 206 | IF FRAME AND 4 THEN player_frame = 16 ELSE player_frame = 20 207 | y_player = y_player - 1 208 | END IF 209 | END IF 210 | IF cont1.down THEN 211 | IF y_player % 40 = 16 THEN ' Player aligned on floor. 212 | column = (x_player + 7) /8 213 | row = (y_player + 16) / 8 214 | #c = $1800 + row * 32 + column 215 | IF VPEEK(#c) = base_character + 3 THEN ' Ladder? 216 | y_player = y_player + 1 217 | END IF 218 | ELSE 219 | IF FRAME AND 4 THEN player_frame = 16 ELSE player_frame = 20 220 | y_player = y_player + 1 221 | END IF 222 | END IF 223 | END 224 | 225 | ' 226 | ' Move the enemies. 227 | ' 228 | move_enemies: PROCEDURE 229 | IF enemy1_frame < 32 THEN 230 | x_enemy1 = x_enemy1 - 1. 231 | IF x_enemy1 = 0 THEN enemy1_frame = 32 232 | ELSE 233 | x_enemy1 = x_enemy1 + 1. 234 | IF x_enemy1 = 240 THEN enemy1_frame = 24 235 | END IF 236 | enemy1_frame = (enemy1_frame AND $f8) + (FRAME AND 4) 237 | 238 | IF enemy2_frame < 32 THEN 239 | x_enemy2 = x_enemy2 - 1. 240 | IF x_enemy2 = 0 THEN enemy2_frame = 32 241 | ELSE 242 | x_enemy2 = x_enemy2 + 1. 243 | IF x_enemy2 = 240 THEN enemy2_frame = 24 244 | END IF 245 | enemy2_frame = (enemy2_frame AND $f8) + (FRAME AND 4) 246 | 247 | IF enemy3_frame < 32 THEN 248 | x_enemy3 = x_enemy3 - 1. 249 | IF x_enemy3 = 0 THEN enemy3_frame = 32 250 | ELSE 251 | x_enemy3 = x_enemy3 + 1. 252 | IF x_enemy3 = 240 THEN enemy3_frame = 24 253 | END IF 254 | enemy3_frame = (enemy3_frame AND $f8) + (FRAME AND 4) 255 | END 256 | 257 | game_bitmaps: 258 | BITMAP "XXXXXXXX" 259 | BITMAP "XXXXXXXX" 260 | BITMAP "XXXXXXXX" 261 | BITMAP "XXXXXXXX" 262 | BITMAP "XXXXXXXX" 263 | BITMAP "XXXXXXXX" 264 | BITMAP "XXXXXXXX" 265 | BITMAP "XXXXXXXX" 266 | 267 | BITMAP "XXX..XXX" 268 | BITMAP "XXX..XXX" 269 | BITMAP "XXX..XXX" 270 | BITMAP "XXX..XXX" 271 | BITMAP "XXX..XXX" 272 | BITMAP "XXX..XXX" 273 | BITMAP "XXX..XXX" 274 | BITMAP "XXX..XXX" 275 | 276 | BITMAP "XXXXXXXX" 277 | BITMAP "XXXXXXXX" 278 | BITMAP "........" 279 | BITMAP "XXXXXXXX" 280 | BITMAP "XXXXXXXX" 281 | BITMAP "........" 282 | BITMAP "XXXXXXXX" 283 | BITMAP "XXXXXXXX" 284 | 285 | BITMAP ".X....X." 286 | BITMAP ".X....X." 287 | BITMAP ".XXXXXX." 288 | BITMAP ".X....X." 289 | BITMAP ".X....X." 290 | BITMAP ".XXXXXX." 291 | BITMAP ".X....X." 292 | BITMAP ".X....X." 293 | 294 | BITMAP "XXXXXXX." 295 | BITMAP "X.....X." 296 | BITMAP "X.XXX.X." 297 | BITMAP "X.X.X.X." 298 | BITMAP "X.XXX.X." 299 | BITMAP "X.....X." 300 | BITMAP "XXXXXXX." 301 | BITMAP "........" 302 | 303 | BITMAP "X.XXX.X." 304 | BITMAP "X.XXX.X." 305 | BITMAP "X.XXX.X." 306 | BITMAP "X.XXX.X." 307 | BITMAP "X.XXX.X." 308 | BITMAP "X.XXX.X." 309 | BITMAP "X.XXX.X." 310 | BITMAP "X.XXX.X." 311 | 312 | BITMAP "XXX.XXX." 313 | BITMAP "........" 314 | BITMAP "XXXXXXXX" 315 | BITMAP "XXXXXXXX" 316 | BITMAP "XXXXXXXX" 317 | BITMAP "........" 318 | BITMAP "........" 319 | BITMAP "........" 320 | 321 | BITMAP ".X....X." 322 | BITMAP ".X....X." 323 | BITMAP ".XXXXXX." 324 | BITMAP ".X....X." 325 | BITMAP ".X....X." 326 | BITMAP ".XXXXXX." 327 | BITMAP ".X....X." 328 | BITMAP ".X....X." 329 | 330 | BITMAP "XXX.XXXX" 331 | BITMAP "XXX.XXXX" 332 | BITMAP "XXX.XXXX" 333 | BITMAP "........" 334 | BITMAP "XXXXXXX." 335 | BITMAP "XXXXXXX." 336 | BITMAP "XXXXXXX." 337 | BITMAP "........" 338 | 339 | BITMAP ".XXXXXX." 340 | BITMAP ".XXXXXX." 341 | BITMAP ".XXXXXX." 342 | BITMAP "........" 343 | BITMAP ".XX.XXX." 344 | BITMAP ".XX.XXX." 345 | BITMAP ".XX.XXX." 346 | BITMAP "........" 347 | 348 | BITMAP "........" 349 | BITMAP "XXXXXXXX" 350 | BITMAP "XXXXXXXX" 351 | BITMAP "X.X.X.X." 352 | BITMAP ".X...X.." 353 | BITMAP "........" 354 | BITMAP "........" 355 | BITMAP "........" 356 | 357 | BITMAP ".X....X." 358 | BITMAP ".X....X." 359 | BITMAP ".XXXXXX." 360 | BITMAP ".X....X." 361 | BITMAP ".X....X." 362 | BITMAP ".XXXXXX." 363 | BITMAP ".X....X." 364 | BITMAP ".X....X." 365 | 366 | BITMAP "XXX.XXX." 367 | BITMAP "XXX.XXX." 368 | BITMAP "XXX.XXX." 369 | BITMAP "........" 370 | BITMAP "XXX.XXX." 371 | BITMAP "XXX.XXX." 372 | BITMAP "XXX.XXX." 373 | BITMAP "........" 374 | 375 | BITMAP ".X......" 376 | BITMAP "..XX...." 377 | BITMAP "....XX.." 378 | BITMAP "......XX" 379 | BITMAP "....XX.." 380 | BITMAP "..XX...." 381 | BITMAP ".X......" 382 | BITMAP ".X......" 383 | 384 | BITMAP "........" 385 | BITMAP "XXXXXXXX" 386 | BITMAP "........" 387 | BITMAP "X.X.X.X." 388 | BITMAP ".X.X.X.X" 389 | BITMAP "........" 390 | BITMAP "XXXXXXXX" 391 | BITMAP "........" 392 | 393 | BITMAP "X......X" 394 | BITMAP "X......X" 395 | BITMAP "XX....XX" 396 | BITMAP "X.XXXX.X" 397 | BITMAP "X......X" 398 | BITMAP "X......X" 399 | BITMAP "XX....XX" 400 | BITMAP "X.XXXX.X" 401 | 402 | BITMAP "X......X" 403 | BITMAP ".X.XX..." 404 | BITMAP "..XX.XXX" 405 | BITMAP ".X...XXX" 406 | BITMAP "..XXX..X" 407 | BITMAP "..X..XXX" 408 | BITMAP ".X..X..X" 409 | BITMAP "..X..XXX" 410 | 411 | BITMAP ".X...XXX" 412 | BITMAP ".X..X..X" 413 | BITMAP "..X..XXX" 414 | BITMAP ".X......" 415 | BITMAP "..X.X..." 416 | BITMAP "...X.X.X" 417 | BITMAP "...X..X." 418 | BITMAP "..X..XXX" 419 | 420 | BITMAP "........" 421 | BITMAP "XXXXXXX." 422 | BITMAP "XXXXXXX." 423 | BITMAP "........" 424 | BITMAP "XXX.XXXX" 425 | BITMAP "XXX.XXXX" 426 | BITMAP "........" 427 | BITMAP "........" 428 | 429 | BITMAP "....XX.." 430 | BITMAP "....XX.." 431 | BITMAP "...XX..." 432 | BITMAP "...XX..." 433 | BITMAP "..XX...." 434 | BITMAP "..XX...." 435 | BITMAP "...XX..." 436 | BITMAP "...XX..." 437 | 438 | BITMAP ".X.X.X.." 439 | BITMAP "XXXXXXX." 440 | BITMAP ".X.X.X.." 441 | BITMAP "XXXXXXX." 442 | BITMAP ".X.X.X.." 443 | BITMAP "XXXXXXX." 444 | BITMAP ".X.X.X.." 445 | BITMAP "........" 446 | 447 | game_colors: 448 | DATA BYTE $CC,$CC,$CC,$CC,$CC,$CC,$CC,$CC 449 | DATA BYTE $21,$21,$21,$21,$21,$21,$21,$21 450 | DATA BYTE $A1,$A1,$A1,$A1,$A1,$A1,$A1,$A1 451 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 452 | 453 | DATA BYTE $54,$54,$54,$54,$54,$54,$54,$54 454 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 455 | DATA BYTE $F1,$11,$E1,$E1,$E1,$11,$11,$11 456 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 457 | 458 | DATA BYTE $68,$68,$68,$68,$68,$68,$68,$68 459 | DATA BYTE $81,$81,$81,$81,$81,$81,$81,$81 460 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 461 | DATA BYTE $51,$51,$51,$51,$51,$51,$51,$51 462 | 463 | DATA BYTE $61,$61,$61,$61,$61,$61,$61,$61 464 | DATA BYTE $A1,$A1,$A1,$A1,$A1,$A1,$A1,$A1 465 | DATA BYTE $F1,$F1,$F1,$51,$51,$F1,$F1,$F1 466 | DATA BYTE $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1 467 | 468 | DATA BYTE $86,$86,$86,$86,$86,$86,$86,$86 469 | DATA BYTE $2C,$2C,$2C,$2C,$2C,$2C,$2C,$2C 470 | DATA BYTE $11,$6E,$6E,$6E,$6E,$6E,$6E,$11 471 | DATA BYTE $C1,$C1,$C1,$C1,$C1,$C1,$C1,$C1 472 | 473 | DATA BYTE $F1,$F1,$F1,$F1,$F1,$F1,$F1,$F1 474 | 475 | game_sprites: 476 | BITMAP "................" 477 | BITMAP ".......X.X.X...." 478 | BITMAP ".....X.XXXXX...." 479 | BITMAP "......XXXXXX...." 480 | BITMAP ".....XXXXX.X...." 481 | BITMAP "......XX.XXX...." 482 | BITMAP ".....XXX...X...." 483 | BITMAP "...XXXX.XXX....." 484 | BITMAP "..XX.XXX........" 485 | BITMAP ".XX..XXXX.XXX..." 486 | BITMAP ".XXX.XXXX.XXX..." 487 | BITMAP ".XXX.X.........." 488 | BITMAP "......XXXX......" 489 | BITMAP "....XXX.XXXXX..." 490 | BITMAP "....XXX..XXXXX.." 491 | BITMAP "....XXXX........" 492 | 493 | BITMAP "........X.X.X..." 494 | BITMAP "......X.XXXXX..." 495 | BITMAP ".......XXXXXX..." 496 | BITMAP "......XXXXX.X..." 497 | BITMAP ".......XX.XXX..." 498 | BITMAP "......XXX...X..." 499 | BITMAP "......XX.XXX...." 500 | BITMAP ".....XXXX......." 501 | BITMAP ".....XXXXX......" 502 | BITMAP ".....XX.XXX....." 503 | BITMAP ".....XX.XXX....." 504 | BITMAP ".....XXX........" 505 | BITMAP "......XXXX......" 506 | BITMAP "......XX........" 507 | BITMAP "......XXXX......" 508 | BITMAP "......XXXXX....." 509 | 510 | BITMAP "................" 511 | BITMAP "....X.X.X......." 512 | BITMAP "....XXXXX.X....." 513 | BITMAP "....XXXXXX......" 514 | BITMAP "....X.XXXXX....." 515 | BITMAP "....XXX.XX......" 516 | BITMAP "....X...XXX....." 517 | BITMAP ".....XXX.XXXX..." 518 | BITMAP "........XXX.XX.." 519 | BITMAP "...XXX.XXXX..XX." 520 | BITMAP "...XXX.XXXX.XXX." 521 | BITMAP "..........X.XXX." 522 | BITMAP "......XXXX......" 523 | BITMAP "...XXXXX.XXX...." 524 | BITMAP "..XXXXX..XXX...." 525 | BITMAP "........XXXX...." 526 | 527 | BITMAP "...X.X.X........" 528 | BITMAP "...XXXXX.X......" 529 | BITMAP "...XXXXXX......." 530 | BITMAP "...X.XXXXX......" 531 | BITMAP "...XXX.XX......." 532 | BITMAP "...X...XXX......" 533 | BITMAP "....XXX.XX......" 534 | BITMAP ".......XXXX....." 535 | BITMAP "......XXXXX....." 536 | BITMAP ".....XXX.XX....." 537 | BITMAP ".....XXX.XX....." 538 | BITMAP "........XXX....." 539 | BITMAP "......XXXX......" 540 | BITMAP "........XX......" 541 | BITMAP "......XXXX......" 542 | BITMAP ".....XXXXX......" 543 | 544 | BITMAP "....X.X.X.X....." 545 | BITMAP ".....XXXXX......" 546 | BITMAP "....XXXXXXX....." 547 | BITMAP "....XXXXXXX....." 548 | BITMAP ".....XXXXX..XXX." 549 | BITMAP ".....XXXXX..XXX." 550 | BITMAP "......XXX..XX..." 551 | BITMAP "....XX...XXX...." 552 | BITMAP "...XX.XXXX......" 553 | BITMAP ".XXX............" 554 | BITMAP ".XXX..XXXX......" 555 | BITMAP "......X..XX....." 556 | BITMAP ".....XX...XXX..." 557 | BITMAP ".....XX...XXXX.." 558 | BITMAP "...XXXX........." 559 | BITMAP "..XXXXX........." 560 | 561 | 562 | BITMAP ".....X.X.X.X...." 563 | BITMAP "......XXXXX....." 564 | BITMAP ".....XXXXXXX...." 565 | BITMAP ".....XXXXXXX...." 566 | BITMAP ".XXX..XXXXX....." 567 | BITMAP ".XXX..XXXXX....." 568 | BITMAP "...XX..XXX......" 569 | BITMAP "....XXX...XX...." 570 | BITMAP "......XXXX.XX..." 571 | BITMAP "............XXX." 572 | BITMAP "......XXXX..XXX." 573 | BITMAP ".....XX..X......" 574 | BITMAP "...XXX...XX....." 575 | BITMAP "..XXX....XX....." 576 | BITMAP ".........XXXX..." 577 | BITMAP ".........XXXXX.." 578 | 579 | BITMAP "...XX.XX........" 580 | BITMAP "..X.XX.X........" 581 | BITMAP "..X.XX.X........" 582 | BITMAP "..XX.XX........." 583 | BITMAP "...XXXXX........" 584 | BITMAP ".XXXXX.XX......." 585 | BITMAP "X..XX.XXX......." 586 | BITMAP "......XXX.....X." 587 | BITMAP "....XXXX......X." 588 | BITMAP "...XXXXX.....XX." 589 | BITMAP "..XXXXX......XX." 590 | BITMAP "..XXXX......XXX." 591 | BITMAP "..XXXX..XX..XX.." 592 | BITMAP "..XXXXXXXXX.XX.." 593 | BITMAP "...XXXXXXXXXXX.." 594 | BITMAP "....XXXX..XXX..." 595 | 596 | BITMAP "................" 597 | BITMAP "....XX.XX......." 598 | BITMAP "...X.XX.X......." 599 | BITMAP "...X.XX.X......." 600 | BITMAP "...XX.XX........" 601 | BITMAP "....XXXXX......." 602 | BITMAP "...XXXX.XX......" 603 | BITMAP ".X.XXX.XXX......" 604 | BITMAP ".XX....XXX......" 605 | BITMAP "....XXXXX....X.." 606 | BITMAP "...XXXXX....XX.." 607 | BITMAP "...XXXX.XX..XX.." 608 | BITMAP "...XXXX.XX.XX..." 609 | BITMAP "...XXXXXXXXXX..." 610 | BITMAP "....XXXXX.XXX..." 611 | BITMAP ".....XXX..XX...." 612 | 613 | BITMAP "........XX.XX..." 614 | BITMAP "........X.XX.X.." 615 | BITMAP "........X.XX.X.." 616 | BITMAP ".........XX.XX.." 617 | BITMAP "........XXXXX..." 618 | BITMAP ".......XX.XXXXX." 619 | BITMAP ".......XXX.XX..X" 620 | BITMAP ".X.....XXX......" 621 | BITMAP ".X......XXXX...." 622 | BITMAP ".XX.....XXXXX..." 623 | BITMAP ".XX......XXXXX.." 624 | BITMAP ".XXX......XXXX.." 625 | BITMAP "..XX..XX..XXXX.." 626 | BITMAP "..XX.XXXXXXXXX.." 627 | BITMAP "..XXXXXXXXXXX..." 628 | BITMAP "...XXX..XXXX...." 629 | 630 | BITMAP "................" 631 | BITMAP ".......XX.XX...." 632 | BITMAP ".......X.XX.X..." 633 | BITMAP ".......X.XX.X..." 634 | BITMAP "........XX.XX..." 635 | BITMAP ".......XXXXX...." 636 | BITMAP "......XX.XXXX..." 637 | BITMAP "......XXX.XXX.X." 638 | BITMAP "......XXX....XX." 639 | BITMAP "..X....XXXXX...." 640 | BITMAP "..XX....XXXXX..." 641 | BITMAP "..XX..XX.XXXX..." 642 | BITMAP "...XX.XX.XXXX..." 643 | BITMAP "...XXXXXXXXXX..." 644 | BITMAP "...XXX.XXXXX...." 645 | BITMAP "....XX..XXX....." 646 | 647 | start_song: PROCEDURE 648 | tick_note = 8 649 | song_note = 47 650 | END 651 | 652 | play_song: PROCEDURE 653 | tick_note = tick_note + 1. 654 | IF tick_note = 16. THEN 655 | tick_note = 0. 656 | song_note = song_note + 1. 657 | IF song_note = 48. THEN song_note = 0. 658 | note = song_notes(song_note) 659 | SOUND 0, #note_freq(note - 1) 660 | END IF 661 | SOUND 0, , volume_effect(tick_note) 662 | END 663 | 664 | sound_off: PROCEDURE 665 | SOUND 0,,0 666 | SOUND 1,,0 667 | SOUND 2,,0 668 | SOUND 3,,0 669 | END 670 | 671 | volume_effect: 672 | DATA BYTE 11,12,13,12,12,11,11,10 673 | DATA BYTE 10,9,9,10,10,9,9,8 674 | 675 | song_notes: 676 | DATA BYTE 1,2,3,4,5,4,3,2 677 | DATA BYTE 1,2,3,4,5,4,3,2 678 | DATA BYTE 6,4,7,8,9,8,7,4 679 | DATA BYTE 6,4,7,8,9,8,7,4 680 | DATA BYTE 3,12,8,10,11,10,8,12 681 | DATA BYTE 6,4,7,8,9,8,7,4 682 | 683 | #note_freq: 684 | DATA $01AC 685 | DATA $0153 686 | DATA $011D 687 | DATA $00FE 688 | DATA $00F0 689 | DATA $0140 690 | DATA $00D6 691 | DATA $00BE 692 | DATA $00B4 693 | DATA $00AA 694 | DATA $00A0 695 | DATA $00E2 696 | -------------------------------------------------------------------------------- /node.c: -------------------------------------------------------------------------------- 1 | /* 2 | ** CVBasic - Create/handle/generate Z80 code for expression nodes 3 | ** 4 | ** by Oscar Toledo G. 5 | ** 6 | ** © Copyright 2024 Óscar Toledo G. 7 | ** https://nanochess.org/ 8 | ** 9 | ** Creation date: Jun/21/2024. 10 | */ 11 | 12 | #include 13 | #include 14 | #include 15 | #include "cvbasic.h" 16 | #include "node.h" 17 | #include "cpuz80.h" 18 | #include "cpu6502.h" 19 | #include "cpu9900.h" 20 | 21 | /* 22 | ** Comparison of tree nodes. 23 | */ 24 | int node_same_tree(struct node *node1, struct node *node2) 25 | { 26 | if (node1->type != node2->type) 27 | return 0; 28 | if (node1->value != node2->value) 29 | return 0; 30 | if (node1->label != node2->label) 31 | return 0; 32 | if (node1->left != NULL && node2->left != NULL) { 33 | if (node_same_tree(node1->left, node2->left) == 0) 34 | return 0; 35 | } else if (node1->left != NULL || node2->left != NULL) { 36 | return 0; 37 | } 38 | if (node1->right != NULL && node2->right != NULL) { 39 | if (node_same_tree(node1->right, node2->right) == 0) 40 | return 0; 41 | } else if (node1->right != NULL || node2->right != NULL) { 42 | return 0; 43 | } 44 | return 1; 45 | } 46 | 47 | /* 48 | ** Comparison of node addresses. 49 | ** 50 | ** node1 is a read node. 51 | ** node2 is a write node (address). 52 | */ 53 | int node_same_address(struct node *node1, struct node *node2) 54 | { 55 | if (node1->type == N_LOAD8) { 56 | if (node2->type != N_ADDR) 57 | return 0; 58 | if (node1->label != node2->label) 59 | return 0; 60 | return 1; 61 | } 62 | if (node1->type == N_LOAD16) { 63 | if (node2->type != N_ADDR) 64 | return 0; 65 | if (node1->label != node2->label) 66 | return 0; 67 | return 1; 68 | } 69 | if (node1->type == N_PEEK8) { 70 | node1 = node1->left; 71 | } else if (node1->type == N_PEEK16) { 72 | node1 = node1->left; 73 | } else { 74 | return 0; 75 | } 76 | return node_same_tree(node1, node2); 77 | } 78 | 79 | static char *node_types[] = { 80 | "N_OR8", "N_OR16", 81 | "N_XOR8", "N_XOR16", 82 | "N_AND8", "N_AND16", 83 | "N_EQUAL8", "N_EQUAL16", "N_NOTEQUAL8", "N_NOTEQUAL16", 84 | "N_LESS8", "N_LESS16", "N_LESSEQUAL8", "N_LESSEQUAL16", 85 | "N_GREATER8", "N_GREATER16", "N_GREATEREQUAL8", "N_GREATEREQUAL16", 86 | "N_LESS8S", "N_LESS16S", "N_LESSEQUAL8S", "N_LESSEQUAL16S", 87 | "N_GREATER8S", "N_GREATER16S", "N_GREATEREQUAL8S", "N_GREATEREQUAL16S", 88 | "N_PLUS8", "N_PLUS16", "N_MINUS8", "N_MINUS16", 89 | "N_MUL8", "N_MUL16", "N_DIV8", "N_DIV16", "N_DIV16S", "N_MOD16", "N_MOD16S", 90 | "N_NEG8", "N_NEG16", "N_NOT8", "N_NOT16", 91 | "N_EXTEND8", "N_EXTEND8S", "N_REDUCE16", 92 | "N_LOAD8", "N_LOAD16", 93 | "N_ASSIGN8", "N_ASSIGN16", 94 | "N_READ8", "N_READ16", 95 | "N_NUM8", "N_NUM16", 96 | "N_PEEK8", "N_PEEK16", "N_VPEEK", "N_INP", "N_ABS16", "N_SGN16", 97 | "N_JOY1", "N_JOY2", "N_KEY1", "N_KEY2", 98 | "N_RANDOM", "N_FRAME", "N_MUSIC", "N_NTSC", "N_POS", 99 | "N_ADDR", 100 | "N_USR", 101 | }; 102 | 103 | /* 104 | ** Check if a number is a power of two 105 | */ 106 | int is_power_of_two(int value) 107 | { 108 | if (value == 2 || value == 4 || value == 8 || value == 16 109 | || value == 32 || value == 64 || value == 128 || value == 256 110 | || value == 512 || value == 1024 || value == 2048 || value == 4096 111 | || value == 8192 || value == 16384 || value == 32768) 112 | return 1; 113 | return 0; 114 | } 115 | 116 | /* 117 | ** Check if a node is commutative 118 | */ 119 | int is_commutative(enum node_type type) 120 | { 121 | if (type == N_PLUS8 || type == N_PLUS16 122 | || type == N_MUL8 || type == N_MUL16 123 | || type == N_OR8 || type == N_OR16 124 | || type == N_AND8 || type == N_AND16 125 | || type == N_XOR8 || type == N_XOR16 126 | || type == N_EQUAL8 || type == N_EQUAL16 127 | || type == N_NOTEQUAL8 || type == N_NOTEQUAL16) 128 | return 1; 129 | return 0; 130 | } 131 | 132 | /* 133 | ** Traverse a tree to measure it 134 | ** 135 | ** This algorithm simply assigns horizontal space as needed. 136 | ** A better algorithm would center the top node and put subtrees at left and right. 137 | */ 138 | static void node_traverse(struct node *tree, int y, int *depth, int *width) 139 | { 140 | if (tree->left != NULL && tree->right != NULL) { 141 | node_traverse(tree->left, y + 1, depth, width); 142 | tree->x = width[0]++; 143 | node_traverse(tree->right, y + 1, depth, width); 144 | } else if (tree->left != NULL) { 145 | node_traverse(tree->left, y + 1, depth, width); 146 | tree->x = tree->left->x; 147 | } else { 148 | tree->x = width[0]++; 149 | } 150 | if (y > *depth) 151 | *depth = y; 152 | } 153 | 154 | /* 155 | ** Get the column for a node 156 | */ 157 | static int node_column(int x, int width) 158 | { 159 | return (int) (32.0 / width + x * 64 / width) + 8; 160 | } 161 | 162 | /* 163 | ** Display a tree 164 | */ 165 | static void node_display(struct node *tree, int y, int max, char *report) 166 | { 167 | int real_x; 168 | int real_y; 169 | int c; 170 | char *p; 171 | char *s; 172 | 173 | real_x = node_column(tree->x, max); 174 | real_y = y * 2; 175 | s = node_types[tree->type]; 176 | p = report + real_y * 80 + real_x - (strlen(s) + 1) / 2; 177 | while (*s) 178 | *p++ = *s++; 179 | #if 1 180 | { 181 | char *hex = "0123456789abcdef"; 182 | 183 | *p++ = '('; 184 | *p++ = hex[tree->regs >> 4]; 185 | *p++ = hex[tree->regs & 0x0f]; 186 | *p++ = ')'; 187 | } 188 | #endif 189 | if (tree->left != NULL && tree->right != NULL) { 190 | c = (real_x + node_column(tree->left->x, max) + 1) / 2; 191 | report[(real_y + 1) * 80 + c] = '/'; 192 | node_display(tree->left, y + 1, max, report); 193 | c = (real_x + node_column(tree->right->x, max) + 1) / 2; 194 | report[(real_y + 1) * 80 + c] = '\\'; 195 | node_display(tree->right, y + 1, max, report); 196 | } else if (tree->left != NULL) { 197 | report[(real_y + 1) * 80 + real_x] = '|'; 198 | node_display(tree->left, y + 1, max, report); 199 | } 200 | } 201 | 202 | /* 203 | ** Convert a node to a visual representation 204 | */ 205 | void node_visual(struct node *tree) 206 | { 207 | int depth; 208 | char *report; 209 | int c; 210 | int width; 211 | 212 | width = 0; 213 | depth = 0; 214 | node_traverse(tree, 0, &depth, &width); 215 | if (width < 12) 216 | width = 12; 217 | report = malloc((80 * (depth + 1) * 2 + 1) * sizeof(char)); 218 | memset(&report[0], ' ', 80 * (depth + 1) * 2); 219 | report[80 * (depth + 1) * 2] = '\0'; 220 | for (c = 0; c < (depth + 1) * 2; c++) 221 | report[79 + 80 * c] = '\n'; 222 | node_display(tree, 0, width, report); 223 | fprintf(stderr, "%s", report); 224 | } 225 | 226 | /* 227 | ** Node creation. 228 | ** It also optimizes common patterns of expression node trees. 229 | */ 230 | struct node *node_create(enum node_type type, int value, struct node *left, struct node *right) 231 | { 232 | struct node *new_node; 233 | struct node *extract; 234 | 235 | /* 236 | ** Convert signed operations to simpler operations 237 | ** This way no special code is needed in node_generate. 238 | */ 239 | switch (type) { 240 | case N_LESS8S: 241 | case N_LESSEQUAL8S: 242 | case N_GREATER8S: 243 | case N_GREATEREQUAL8S: 244 | left = node_create(N_XOR8, 0, left, node_create(N_NUM8, 0x80, NULL, NULL)); 245 | right = node_create(N_XOR8, 0, right, node_create(N_NUM8, 0x80, NULL, NULL)); 246 | if (type == N_LESS8S) 247 | type = N_LESS8; 248 | else if (type == N_LESSEQUAL8S) 249 | type = N_LESSEQUAL8; 250 | else if (type == N_GREATER8S) 251 | type = N_GREATER8; 252 | else if (type == N_GREATEREQUAL8S) 253 | type = N_GREATEREQUAL8; 254 | break; 255 | case N_LESS16S: 256 | case N_LESSEQUAL16S: 257 | case N_GREATER16S: 258 | case N_GREATEREQUAL16S: 259 | left = node_create(N_XOR16, 0, left, node_create(N_NUM16, 0x8000, NULL, NULL)); 260 | right = node_create(N_XOR16, 0, right, node_create(N_NUM16, 0x8000, NULL, NULL)); 261 | if (type == N_LESS16S) 262 | type = N_LESS16; 263 | else if (type == N_LESSEQUAL16S) 264 | type = N_LESSEQUAL16; 265 | else if (type == N_GREATER16S) 266 | type = N_GREATER16; 267 | else if (type == N_GREATEREQUAL16S) 268 | type = N_GREATEREQUAL16; 269 | break; 270 | default: 271 | /* We are good :) */ 272 | break; 273 | } 274 | 275 | /* 276 | ** Do constant optimization and optimize some trees. 277 | */ 278 | switch (type) { 279 | case N_REDUCE16: /* Reduce a 16-bit value to 8-bit */ 280 | if (left->type == N_NUM16) { 281 | left->type = N_NUM8; 282 | left->value &= 255; 283 | return left; 284 | } 285 | 286 | /* 287 | ** Optimize expressions that extended an 8-bit variable and then reduced it again. 288 | ** 289 | ** N_REDUCE16 (intended) 290 | ** / \ 291 | ** N_PLUS16 N_NUM16 292 | ** | 293 | ** N_EXTEND8 294 | */ 295 | if ((left->type == N_PLUS16 || 296 | left->type == N_MINUS16 || 297 | left->type == N_AND16 || 298 | left->type == N_OR16 || 299 | left->type == N_XOR16 || 300 | (left->type == N_MUL16 && left->right->type == N_NUM16 && 301 | is_power_of_two(left->right->value & 0xff)) || 302 | (left->type == N_DIV16 && left->right->type == N_NUM16 && 303 | is_power_of_two(left->right->value & 0xff))) && 304 | (left->left->type == N_EXTEND8 || left->left->type == N_EXTEND8S) && left->right->type == N_NUM16) { 305 | 306 | if (left->type == N_PLUS16) 307 | left->type = N_PLUS8; 308 | else if (left->type == N_MINUS16) 309 | left->type = N_MINUS8; 310 | else if (left->type == N_MUL16) 311 | left->type = N_MUL8; 312 | else if (left->type == N_DIV16) 313 | left->type = N_DIV8; 314 | else if (left->type == N_AND16) 315 | left->type = N_AND8; 316 | else if (left->type == N_OR16) 317 | left->type = N_OR8; 318 | else if (left->type == N_XOR16) 319 | left->type = N_XOR8; 320 | left->right->type = N_NUM8; 321 | left->right->value &= 0xff; 322 | /* Remove the N_EXTEND8 */ 323 | new_node = left->left; 324 | left->left = new_node->left; 325 | new_node->left = NULL; 326 | node_delete(new_node); 327 | return left; 328 | } 329 | 330 | /* 331 | ** Optimize expressions to avoid 16-bit operations when 8-bit are enough. 332 | ** 333 | ** Division cannot be optimized to 8-bit because we don't know if there 334 | ** are extra precision bits. 335 | */ 336 | if ((left->type == N_PLUS16 || 337 | left->type == N_MINUS16 || 338 | left->type == N_AND16 || 339 | left->type == N_OR16 || 340 | left->type == N_XOR16 || 341 | (left->type == N_MUL16 && left->right->type == N_NUM16 && is_power_of_two(left->right->value & 0xff))) && 342 | (left->right->type == N_NUM16)) { 343 | 344 | if (left->type == N_PLUS16) 345 | left->type = N_PLUS8; 346 | else if (left->type == N_MINUS16) 347 | left->type = N_MINUS8; 348 | else if (left->type == N_MUL16) 349 | left->type = N_MUL8; 350 | else if (left->type == N_AND16) 351 | left->type = N_AND8; 352 | else if (left->type == N_OR16) 353 | left->type = N_OR8; 354 | else if (left->type == N_XOR16) 355 | left->type = N_XOR8; 356 | left->right->type = N_NUM8; 357 | left->right->value &= 0xff; 358 | 359 | /* 360 | ** Move down the N_REDUCE16 calling node_create to 361 | ** make recursive optimization. 362 | */ 363 | extract = left; 364 | type = left->type; 365 | right = left->right; 366 | left = node_create(N_REDUCE16, 0, left->left, NULL); 367 | value = 0; 368 | 369 | extract->left = NULL; 370 | extract->right = NULL; 371 | node_delete(extract); 372 | } 373 | 374 | /* 375 | ** Optimize a 16-bit variable read to a 8-bit variable read 376 | */ 377 | if (left->type == N_LOAD16) { 378 | left->type = N_LOAD8; 379 | return left; 380 | } 381 | 382 | /* 383 | ** Optimize a just expanded value 384 | */ 385 | if (left->type == N_EXTEND8) 386 | return left->left; 387 | break; 388 | case N_EXTEND8: /* Extend 8-bit expression to 16-bit */ 389 | if (left->type == N_NUM8) { 390 | left->type = N_NUM16; 391 | left->value &= 255; 392 | return left; 393 | } 394 | break; 395 | case N_EXTEND8S: /* Extend 8-bit signed expression to 16-bit */ 396 | if (left->type == N_NUM8) { 397 | left->type = N_NUM16; 398 | left->value &= 255; 399 | if (left->value >= 128) 400 | left->value |= 0xff00; 401 | return left; 402 | } 403 | break; 404 | case N_NEG8: /* 8-bit negation */ 405 | if (left->type == N_NUM8) { /* Optimize constant case */ 406 | left->value = -left->value & 0xff; 407 | return left; 408 | } 409 | break; 410 | case N_NEG16: /* 16-bit negation */ 411 | if (left->type == N_NUM16) { /* Optimize constant case */ 412 | left->value = -left->value & 0xffff; 413 | return left; 414 | } 415 | break; 416 | case N_NOT8: /* 8-bit complement */ 417 | if (left->type == N_NUM8) { /* Optimize constant case */ 418 | left->value = ~left->value & 0xff; 419 | return left; 420 | } 421 | break; 422 | case N_NOT16: /* 16-bit complement */ 423 | if (left->type == N_NUM16) { /* Optimize constant case */ 424 | left->value = ~left->value & 0xffff; 425 | return left; 426 | } 427 | break; 428 | case N_MUL16: /* 16-bit multiplication */ 429 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 430 | left->value = (left->value * right->value) & 0xffff; 431 | node_delete(right); 432 | return left; 433 | } 434 | if (left->type == N_NUM16) { /* Move constant to right */ 435 | new_node = left; 436 | left = right; 437 | right = new_node; 438 | } 439 | if (right->type == N_NUM16 && right->value == 0) { /* Nullify zero multiplication */ 440 | node_delete(left); 441 | return right; 442 | } 443 | break; 444 | case N_DIV16: /* 16-bit unsigned division */ 445 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 446 | left->value = left->value / right->value; 447 | node_delete(right); 448 | return left; 449 | } 450 | if (right->type == N_NUM16 && right->value == 1) { 451 | node_delete(right); 452 | return left; 453 | } 454 | break; 455 | case N_MOD16: /* 16-bit unsigned modulo */ 456 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 457 | left->value = left->value % right->value; 458 | node_delete(right); 459 | return left; 460 | } 461 | if (right->type == N_NUM16) { /* Optimize power of 2 constant case */ 462 | if (is_power_of_two(right->value)) { 463 | right->value--; 464 | type = N_AND16; 465 | } 466 | } 467 | break; 468 | case N_EQUAL16: 469 | case N_NOTEQUAL16: 470 | case N_LESS16: 471 | case N_LESSEQUAL16: 472 | case N_GREATER16: 473 | case N_GREATEREQUAL16: 474 | if (left->type == N_EXTEND8 && right->type == N_NUM16 && (right->value & ~0xff) == 0) { 475 | extract = left; 476 | if (type == N_EQUAL16) 477 | type = N_EQUAL8; 478 | else if (type == N_NOTEQUAL16) 479 | type = N_NOTEQUAL8; 480 | else if (type == N_LESS16) 481 | type = N_LESS8; 482 | else if (type == N_LESSEQUAL16) 483 | type = N_LESSEQUAL8; 484 | else if (type == N_GREATER16) 485 | type = N_GREATER8; 486 | else if (type == N_GREATEREQUAL16) 487 | type = N_GREATEREQUAL8; 488 | left = left->left; 489 | right->type = N_NUM8; 490 | 491 | extract->left = NULL; 492 | node_delete(extract); 493 | } 494 | break; 495 | case N_PLUS16: /* 16-bit addition */ 496 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 497 | left->value = (left->value + right->value) & 0xffff; 498 | node_delete(right); 499 | return left; 500 | } 501 | 502 | /* 503 | ** Collapse several additions/subtractions 504 | ** 505 | ** N_PLUS16 506 | ** / \ 507 | ** N_PLUS16 N_NUM16 508 | ** / \ 509 | ** N_NUM16 510 | */ 511 | if (left->type == N_PLUS16 && left->right->type == N_NUM16 && right->type == N_NUM16) { 512 | left->right->value = (left->right->value + right->value) & 0xffff; 513 | node_delete(right); 514 | return left; 515 | } 516 | if (left->type == N_MINUS16 && left->right->type == N_NUM16 && right->type == N_NUM16) { 517 | left->right->value = (left->right->value - right->value) & 0xffff; 518 | node_delete(right); 519 | return left; 520 | } 521 | if (left->type == N_NUM16) { /* Move constant to right */ 522 | new_node = left; 523 | left = right; 524 | right = new_node; 525 | } 526 | if (right->type == N_NUM16 && right->value == 0) { /* Remove zero add */ 527 | node_delete(right); 528 | return left; 529 | } 530 | break; 531 | case N_MINUS16: /* 16-bit subtraction */ 532 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 533 | left->value = (left->value - right->value) & 0xffff; 534 | node_delete(right); 535 | return left; 536 | } 537 | 538 | /* 539 | ** Collapse several additions/subtractions 540 | ** 541 | ** N_MINUS16 542 | ** / \ 543 | ** N_MINUS16 N_NUM16 544 | ** / \ 545 | ** N_NUM16 546 | */ 547 | if (left->type == N_PLUS16 && left->right->type == N_NUM16 && right->type == N_NUM16) { 548 | left->right->value = (left->right->value - right->value) & 0xffff; 549 | node_delete(right); 550 | return left; 551 | } 552 | if (left->type == N_MINUS16 && left->right->type == N_NUM16 && right->type == N_NUM16) { 553 | left->right->value = (left->right->value + right->value) & 0xffff; 554 | node_delete(right); 555 | return left; 556 | } 557 | if (right->type == N_NUM16 && right->value == 0) { /* Remove zero subtraction */ 558 | node_delete(right); 559 | return left; 560 | } 561 | break; 562 | case N_AND16: /* 16-bit AND */ 563 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 564 | left->value &= right->value; 565 | node_delete(right); 566 | return left; 567 | } 568 | if (left->type == N_NUM16) { /* Move constant to right */ 569 | new_node = left; 570 | left = right; 571 | right = new_node; 572 | } 573 | if (right->type == N_NUM16) { /* Remove no operation */ 574 | if (right->value == 0xffff) { 575 | node_delete(right); 576 | return left; 577 | } 578 | if (right->value == 0x0000) { 579 | node_delete(left); 580 | return right; 581 | } 582 | if ((right->value & 0xff00) == 0x0000 && left->type == N_EXTEND8) { 583 | left->type = N_AND8; 584 | right->type = N_NUM8; 585 | left->right = right; 586 | type = N_EXTEND8; 587 | right = NULL; 588 | } 589 | } 590 | break; 591 | case N_OR16: /* 16-bit OR */ 592 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 593 | left->value |= right->value; 594 | node_delete(right); 595 | return left; 596 | } 597 | if (left->type == N_NUM16) { /* Move constant to right */ 598 | new_node = left; 599 | left = right; 600 | right = new_node; 601 | } 602 | if (right->type == N_NUM16) { /* Remove no operation */ 603 | if (right->value == 0x0000) { 604 | node_delete(right); 605 | return left; 606 | } 607 | if (right->value == 0xffff) { 608 | node_delete(left); 609 | return right; 610 | } 611 | if ((right->value & 0xff00) == 0x0000 && left->type == N_EXTEND8) { 612 | left->type = N_OR8; 613 | right->type = N_NUM8; 614 | left->right = right; 615 | type = N_EXTEND8; 616 | right = NULL; 617 | } 618 | } 619 | break; 620 | case N_XOR16: /* 16-bit XOR */ 621 | if (left->type == N_NUM16 && right->type == N_NUM16) { /* Optimize constant case */ 622 | left->value ^= right->value; 623 | node_delete(right); 624 | return left; 625 | } 626 | if (left->type == N_NUM16) { /* Move constant to right */ 627 | new_node = left; 628 | left = right; 629 | right = new_node; 630 | } 631 | if (right->type == N_NUM16) { /* Remove no operation */ 632 | if (right->value == 0) { 633 | node_delete(right); 634 | return left; 635 | } 636 | if ((right->value & 0xff00) == 0x0000 && left->type == N_EXTEND8) { 637 | left->type = N_XOR8; 638 | right->type = N_NUM8; 639 | left->right = right; 640 | type = N_EXTEND8; 641 | right = NULL; 642 | } 643 | } 644 | break; 645 | case N_PLUS8: /* 8-bit addition */ 646 | if (left->type == N_NUM8 && right->type == N_NUM8) { /* Optimize constant case */ 647 | left->value = (left->value + right->value) & 0xff; 648 | node_delete(right); 649 | return left; 650 | } 651 | if (left->type == N_NUM8) { /* Move constant to right */ 652 | new_node = left; 653 | left = right; 654 | right = new_node; 655 | } 656 | if (right->type == N_NUM8 && right->value == 0) { 657 | node_delete(right); 658 | return left; 659 | } 660 | break; 661 | case N_MINUS8: /* 8-bit subtraction */ 662 | if (left->type == N_NUM8 && right->type == N_NUM8) { /* Optimize constant case */ 663 | left->value = (left->value - right->value) & 0xff; 664 | node_delete(right); 665 | return left; 666 | } 667 | if (right->type == N_NUM8 && right->value == 0) { /* Remove no operation */ 668 | node_delete(right); 669 | return left; 670 | } 671 | break; 672 | case N_AND8: /* 8-bit AND */ 673 | if (left->type == N_NUM8 && right->type == N_NUM8) { /* Optimize constant case */ 674 | left->value &= right->value; 675 | node_delete(right); 676 | return left; 677 | } 678 | if (left->type == N_NUM8) { /* Move constant to right */ 679 | new_node = left; 680 | left = right; 681 | right = new_node; 682 | } 683 | if (right->type == N_NUM8) { /* Remove no operation */ 684 | if (right->value == 0xff) { 685 | node_delete(right); 686 | return left; 687 | } 688 | if (right->value == 0x00) { 689 | node_delete(left); 690 | return right; 691 | } 692 | } 693 | break; 694 | case N_OR8: /* 8-bit OR */ 695 | if (left->type == N_NUM8 && right->type == N_NUM8) { /* Optimize constant case */ 696 | left->value |= right->value; 697 | node_delete(right); 698 | return left; 699 | } 700 | if (left->type == N_NUM8) { /* Move constant to right */ 701 | new_node = left; 702 | left = right; 703 | right = new_node; 704 | } 705 | if (right->type == N_NUM8) { /* Remove no operation */ 706 | if (right->value == 0x00) { 707 | node_delete(right); 708 | return left; 709 | } 710 | if (right->value == 0xff) { 711 | node_delete(left); 712 | return right; 713 | } 714 | } 715 | break; 716 | case N_XOR8: /* 8-bit XOR */ 717 | if (left->type == N_NUM8 && right->type == N_NUM8) { /* Optimize constant case */ 718 | left->value ^= right->value; 719 | node_delete(right); 720 | return left; 721 | } 722 | if (left->type == N_NUM8) { /* Move constant to right */ 723 | new_node = left; 724 | left = right; 725 | right = new_node; 726 | } 727 | if (right->type == N_NUM8) { /* Remove no operation */ 728 | if (right->value == 0x00) { 729 | node_delete(right); 730 | return left; 731 | } 732 | } 733 | break; 734 | default: 735 | break; 736 | } 737 | 738 | /* 739 | ** Optimize difficult comparisons with constants to use simpler comparisons. 740 | */ 741 | switch (type) { 742 | case N_LESSEQUAL8: /* 8-bit <= */ 743 | if (right->type == N_NUM8 && right->value < 255) { 744 | type = N_LESS8; 745 | right->value++; 746 | } 747 | break; 748 | case N_GREATER8: /* 8-bit > */ 749 | if (right->type == N_NUM8 && right->value < 255) { 750 | type = N_GREATEREQUAL8; 751 | right->value++; 752 | } 753 | break; 754 | case N_LESSEQUAL16: /* 16-bit <= */ 755 | if (right->type == N_NUM16 && right->value < 65535) { 756 | type = N_LESS16; 757 | right->value++; 758 | } 759 | break; 760 | case N_GREATER16: /* 16-bit > */ 761 | if (right->type == N_NUM16 && right->value < 65535) { 762 | type = N_GREATEREQUAL16; 763 | right->value++; 764 | } 765 | break; 766 | default: 767 | break; 768 | } 769 | new_node = malloc(sizeof(struct node)); 770 | if (new_node == NULL) { 771 | emit_error("out of memory"); 772 | exit(1); 773 | } 774 | new_node->type = type; 775 | new_node->value = value; 776 | new_node->left = left; 777 | new_node->right = right; 778 | new_node->label = NULL; 779 | new_node->x = 0; 780 | new_node->regs = 0; 781 | return new_node; 782 | } 783 | 784 | /* 785 | ** Get the assembler label for the CVBasic label. 786 | ** parenthesis: 787 | 1 - open and close () 788 | 2 - # 789 | 3 - open only ( 790 | 4 - @ 791 | */ 792 | void node_get_label(struct node *node, int parenthesis) 793 | { 794 | temp[0] = '\0'; 795 | if (parenthesis == 1 || parenthesis == 3) 796 | strcat(temp, "("); 797 | else if (parenthesis == 2) 798 | strcat(temp, "#"); 799 | else if (parenthesis == 4) 800 | strcat(temp, "@"); 801 | if (node->label->length) { 802 | strcat(temp, ARRAY_PREFIX); 803 | } else { 804 | strcat(temp, LABEL_PREFIX); 805 | } 806 | strcat(temp, node->label->name); 807 | if (parenthesis == 1) 808 | strcat(temp, ")"); 809 | } 810 | 811 | /* 812 | ** Label register usage in tree 813 | ** 814 | ** This should match exactly register usage in node_generate. 815 | */ 816 | void node_label(struct node *node) 817 | { 818 | if (target == CPU_Z80) 819 | cpuz80_node_label(node); 820 | if (target == CPU_6502) 821 | cpu6502_node_label(node); 822 | if (target == CPU_9900) 823 | cpu9900_node_label(node); 824 | } 825 | 826 | /* 827 | ** Generate code for tree 828 | */ 829 | void node_generate(struct node *node, int decision) 830 | { 831 | if (target == CPU_Z80) 832 | cpuz80_node_generate(node, decision); 833 | if (target == CPU_6502) 834 | cpu6502_node_generate(node, decision); 835 | if (target == CPU_9900) 836 | cpu9900_node_generate(node, decision); 837 | } 838 | 839 | /* 840 | ** Delete an expression node 841 | */ 842 | void node_delete(struct node *tree) 843 | { 844 | if (tree == NULL) 845 | return; 846 | if (tree->left != NULL) 847 | node_delete(tree->left); 848 | if (tree->right != NULL) 849 | node_delete(tree->right); 850 | free(tree); 851 | } 852 | 853 | 854 | -------------------------------------------------------------------------------- /examples/oscar_compressed.bas: -------------------------------------------------------------------------------- 1 | ' TMSColor 2.2.0 Mar/13/2024 2 | ' Command: tmscolor -z -b -p2 oscar.bmp oscar_compressed.bas 3 | ' Created: Wed Mar 13 15:21:28 2024 4 | 5 | MODE 1 6 | SCREEN DISABLE 7 | DEFINE VRAM PLETTER $0000,$1800,image_bitmap 8 | DEFINE VRAM PLETTER $2000,$1800,image_color 9 | SCREEN ENABLE 10 | WHILE 1: WEND 11 | 12 | image_bitmap: 13 | DATA BYTE $61,$bf,$5f,$ff,$df,$ff,$80,$00 14 | DATA BYTE $70,$10,$3e,$0e,$87,$00,$c0,$e0 15 | DATA BYTE $fc,$7f,$1f,$07,$03,$00,$18,$00 16 | DATA BYTE $02,$40,$12,$55,$0e,$aa,$55,$7f 17 | DATA BYTE $7f,$1b,$a3,$00,$09,$ea,$fd,$68 18 | DATA BYTE $09,$22,$e0,$c4,$07,$c0,$d5,$aa 19 | DATA BYTE $d4,$0f,$01,$00,$1d,$0f,$7f,$8e 20 | DATA BYTE $07,$8f,$90,$01,$3a,$99,$f9,$fc 21 | DATA BYTE $0d,$fe,$9e,$fe,$fe,$20,$33,$03 22 | DATA BYTE $ed,$67,$c8,$cc,$00,$88,$0c,$df 23 | DATA BYTE $cf,$e7,$e7,$08,$44,$d8,$01,$8a 24 | DATA BYTE $df,$01,$8a,$ff,$8a,$10,$fb,$40 25 | DATA BYTE $03,$30,$00,$05,$01,$45,$ff,$df 26 | DATA BYTE $c3,$00,$fc,$f8,$05,$00,$f0,$f9 27 | DATA BYTE $d0,$5b,$e0,$01,$45,$cc,$55,$01 28 | DATA BYTE $9f,$1f,$9f,$55,$3f,$5e,$38,$c3 29 | DATA BYTE $18,$f0,$af,$0e,$00,$8f,$1f,$1f 30 | DATA BYTE $01,$18,$28,$51,$a0,$41,$82,$07 31 | DATA BYTE $5b,$09,$27,$b1,$01,$a8,$50,$90 32 | DATA BYTE $1f,$8f,$11,$50,$08,$07,$40,$00 33 | DATA BYTE $90,$00,$59,$bf,$7f,$ea,$03,$d5 34 | DATA BYTE $bf,$fe,$7e,$d5,$ea,$80,$01,$55 35 | DATA BYTE $a2,$c0,$a2,$46,$e0,$0f,$e6,$e4 36 | DATA BYTE $e4,$aa,$03,$c9,$01,$01,$8f,$83 37 | DATA BYTE $81,$80,$80,$b0,$85,$80,$aa,$3f 38 | DATA BYTE $aa,$c4,$8a,$d4,$aa,$42,$d1,$01 39 | DATA BYTE $bf,$fc,$fc,$33,$c2,$04,$df,$04 40 | DATA BYTE $b1,$14,$0f,$b2,$2d,$e3,$82,$93 41 | DATA BYTE $03,$34,$e3,$f1,$09,$0e,$0f,$80 42 | DATA BYTE $84,$88,$01,$4b,$df,$1f,$08,$01 43 | DATA BYTE $81,$ff,$40,$30,$01,$fb,$00,$23 44 | DATA BYTE $41,$03,$03,$40,$22,$40,$02,$54 45 | DATA BYTE $93,$4f,$07,$37,$07,$d0,$e4,$19 46 | DATA BYTE $7f,$01,$ae,$30,$00,$fe,$03,$80 47 | DATA BYTE $04,$60,$ff,$01,$80,$c4,$aa,$60 48 | DATA BYTE $fc,$c3,$68,$c9,$10,$db,$a3,$f7 49 | DATA BYTE $00,$fe,$e0,$84,$97,$44,$88,$02 50 | DATA BYTE $00,$1f,$55,$0e,$0c,$a2,$4e,$00 51 | DATA BYTE $1f,$bf,$3f,$7e,$7c,$f8,$f1,$e3 52 | DATA BYTE $68,$c7,$85,$0f,$d5,$00,$f5,$54 53 | DATA BYTE $a0,$00,$01,$80,$51,$02,$4f,$28 54 | DATA BYTE $70,$ec,$03,$f8,$a8,$40,$80,$c7 55 | DATA BYTE $07,$04,$a8,$00,$07,$3a,$80,$50 56 | DATA BYTE $47,$b1,$22,$8a,$41,$07,$20,$2a 57 | DATA BYTE $55,$f9,$00,$be,$75,$aa,$1f,$82 58 | DATA BYTE $51,$a2,$e4,$c0,$fb,$04,$ea,$0a 59 | DATA BYTE $44,$aa,$7f,$00,$3f,$c4,$1f,$80 60 | DATA BYTE $2f,$c0,$84,$00,$a0,$54,$0f,$ac 61 | DATA BYTE $09,$17,$01,$22,$02,$27,$e8,$e0 62 | DATA BYTE $d1,$ea,$e0,$00,$0c,$fd,$7f,$3d 63 | DATA BYTE $fc,$00,$41,$54,$7f,$f2,$f7,$e3 64 | DATA BYTE $54,$22,$4f,$0a,$1f,$04,$e7,$cf 65 | DATA BYTE $07,$83,$18,$96,$06,$47,$02,$18 66 | DATA BYTE $ff,$c8,$44,$f7,$18,$b1,$38,$fb 67 | DATA BYTE $18,$b7,$12,$03,$88,$fd,$01,$db 68 | DATA BYTE $80,$fb,$10,$05,$ff,$54,$01,$10 69 | DATA BYTE $54,$14,$61,$54,$87,$83,$01,$01 70 | DATA BYTE $3f,$3f,$bf,$c0,$e1,$70,$fe,$fb 71 | DATA BYTE $56,$70,$47,$e8,$ff,$09,$f0,$6f 72 | DATA BYTE $82,$10,$06,$fd,$f9,$be,$8c,$f3 73 | DATA BYTE $aa,$57,$01,$82,$97,$99,$20,$75 74 | DATA BYTE $7a,$fb,$7b,$48,$7b,$0f,$a0,$d7 75 | DATA BYTE $50,$44,$95,$4a,$11,$07,$03,$4d 76 | DATA BYTE $00,$37,$a3,$d7,$8e,$f2,$fa,$f3 77 | DATA BYTE $fa,$18,$f1,$fa,$f5,$fb,$06,$50 78 | DATA BYTE $80,$10,$e9,$02,$05,$0a,$10,$10 79 | DATA BYTE $80,$00,$01,$f0,$c0,$80,$11,$7f 80 | DATA BYTE $0a,$15,$01,$1f,$3f,$35,$11,$8a 81 | DATA BYTE $0c,$8d,$ab,$57,$ac,$25,$05,$27 82 | DATA BYTE $08,$45,$a8,$44,$00,$01,$01,$8a 83 | DATA BYTE $05,$01,$2a,$0a,$82,$54,$51,$a0 84 | DATA BYTE $21,$5d,$0a,$45,$a7,$2b,$07,$a2 85 | DATA BYTE $22,$0b,$11,$63,$37,$77,$e2,$01 86 | DATA BYTE $02,$55,$e0,$1e,$a3,$22,$e5,$ea 87 | DATA BYTE $5d,$01,$c6,$ee,$fc,$3e,$0a,$0a 88 | DATA BYTE $0c,$06,$b2,$11,$01,$7f,$bf,$9f 89 | DATA BYTE $02,$d0,$e8,$d5,$ff,$14,$f1,$00 90 | DATA BYTE $67,$55,$82,$55,$f0,$ab,$f0,$01 91 | DATA BYTE $20,$50,$c2,$b5,$d0,$00,$08,$40 92 | DATA BYTE $e0,$01,$88,$41,$14,$55,$83,$fb 93 | DATA BYTE $28,$01,$23,$99,$f0,$ee,$04,$9f 94 | DATA BYTE $cf,$fe,$d7,$b1,$af,$20,$78,$00 95 | DATA BYTE $0f,$5f,$af,$07,$ef,$00,$e0,$fb 96 | DATA BYTE $3a,$e0,$c0,$00,$ff,$33,$ae,$d5 97 | DATA BYTE $0f,$01,$fd,$ef,$3c,$57,$01,$02 98 | DATA BYTE $50,$a2,$41,$8f,$1e,$be,$93,$40 99 | DATA BYTE $f7,$eb,$e7,$af,$00,$5f,$eb,$dd 100 | DATA BYTE $eb,$cd,$eb,$ed,$aa,$25,$e3,$c8 101 | DATA BYTE $8d,$c2,$9f,$11,$28,$ff,$28,$e5 102 | DATA BYTE $08,$0c,$1c,$0c,$d3,$0e,$ff,$50 103 | DATA BYTE $2b,$67,$2a,$01,$cc,$37,$bf,$eb 104 | DATA BYTE $18,$f9,$0c,$ab,$df,$d8,$18,$dd 105 | DATA BYTE $00,$54,$aa,$14,$a2,$05,$a0,$60 106 | DATA BYTE $d0,$a3,$a4,$01,$95,$94,$8f,$0a 107 | DATA BYTE $04,$28,$28,$55,$11,$af,$81,$0a 108 | DATA BYTE $05,$08,$14,$8a,$08,$0e,$40,$82 109 | DATA BYTE $41,$cf,$00,$22,$41,$02,$01,$22 110 | DATA BYTE $45,$69,$22,$3b,$16,$fb,$10,$fd 111 | DATA BYTE $51,$80,$03,$0e,$08,$7d,$2a,$15 112 | DATA BYTE $51,$9e,$bf,$01,$66,$af,$07,$81 113 | DATA BYTE $ac,$a6,$07,$c3,$63,$0c,$06,$03 114 | DATA BYTE $4a,$09,$0f,$c1,$32,$20,$10,$23 115 | DATA BYTE $31,$08,$41,$01,$01,$0c,$9f,$ff 116 | DATA BYTE $11,$01,$04,$55,$08,$29,$c7,$c7 117 | DATA BYTE $cf,$81,$51,$5f,$1f,$78,$7c,$07 118 | DATA BYTE $01,$38,$0c,$2c,$04,$03,$fb,$03 119 | DATA BYTE $f1,$8f,$53,$fc,$f4,$10,$f4,$80 120 | DATA BYTE $fb,$73,$47,$f1,$e9,$13,$ec,$30 121 | DATA BYTE $d9,$a0,$b3,$23,$10,$a0,$e6,$90 122 | DATA BYTE $c6,$15,$09,$23,$3d,$af,$89,$00 123 | DATA BYTE $03,$fb,$f7,$fb,$f5,$eb,$e5,$e9 124 | DATA BYTE $31,$c1,$80,$00,$e0,$e2,$00,$0c 125 | DATA BYTE $00,$c0,$c3,$98,$87,$ab,$55,$98 126 | DATA BYTE $01,$7f,$00,$ea,$47,$f5,$93,$0a 127 | DATA BYTE $eb,$eb,$ef,$43,$f8,$e0,$40,$9f 128 | DATA BYTE $10,$38,$71,$f8,$01,$cd,$cd,$75 129 | DATA BYTE $d8,$ad,$24,$af,$96,$8d,$d1,$32 130 | DATA BYTE $ea,$d4,$25,$60,$00,$f3,$41,$a7 131 | DATA BYTE $30,$04,$08,$08,$82,$40,$06,$0a 132 | DATA BYTE $01,$28,$05,$20,$24,$bd,$13,$8a 133 | DATA BYTE $43,$51,$99,$ce,$af,$03,$83,$a6 134 | DATA BYTE $9d,$e7,$3f,$6b,$37,$b2,$01,$af 135 | DATA BYTE $e7,$1d,$10,$07,$08,$ba,$42,$a9 136 | DATA BYTE $8f,$10,$cf,$c7,$ff,$fb,$0b,$05 137 | DATA BYTE $ff,$01,$03,$e2,$1f,$04,$3f,$be 138 | DATA BYTE $14,$bf,$0f,$bf,$25,$2b,$07,$90 139 | DATA BYTE $35,$23,$17,$82,$ff,$c3,$60,$e2 140 | DATA BYTE $f5,$f0,$f1,$81,$05,$e7,$ef,$aa 141 | DATA BYTE $cf,$cf,$d0,$8b,$fe,$29,$aa,$fe 142 | DATA BYTE $00,$f3,$f1,$ab,$21,$c5,$06,$15 143 | DATA BYTE $4d,$cd,$3d,$3d,$cc,$d9,$f3,$01 144 | DATA BYTE $e5,$c7,$c3,$c2,$c2,$e2,$51,$83 145 | DATA BYTE $a7,$c6,$a8,$c8,$08,$60,$71,$70 146 | DATA BYTE $51,$f5,$c2,$60,$40,$ce,$00,$f3 147 | DATA BYTE $6e,$e3,$58,$f9,$1d,$2a,$d7,$04 148 | DATA BYTE $15,$ae,$91,$af,$51,$88,$73,$2a 149 | DATA BYTE $01,$03,$b8,$1c,$18,$3c,$1c,$3e 150 | DATA BYTE $01,$fe,$f0,$b7,$98,$fc,$e5,$f1 151 | DATA BYTE $01,$a8,$54,$12,$ad,$e0,$dd,$11 152 | DATA BYTE $f5,$a2,$d5,$86,$89,$3b,$60,$1f 153 | DATA BYTE $bb,$d0,$2b,$99,$f4,$e0,$ce,$17 154 | DATA BYTE $00,$00,$72,$80,$c3,$ec,$f9,$5b 155 | DATA BYTE $ec,$01,$c7,$62,$e3,$00,$e1,$00 156 | DATA BYTE $82,$fb,$eb,$1d,$45,$9f,$50,$cf 157 | DATA BYTE $03,$f9,$54,$c3,$c3,$a0,$09,$fd 158 | DATA BYTE $3b,$17,$0b,$03,$58,$ff,$15,$f0 159 | DATA BYTE $00,$03,$06,$d0,$44,$25,$f1,$f3 160 | DATA BYTE $24,$a2,$c5,$b1,$99,$de,$03,$8f 161 | DATA BYTE $af,$c0,$f3,$e8,$b2,$18,$c5,$b0 162 | DATA BYTE $d7,$d0,$00,$89,$88,$a2,$40,$a2 163 | DATA BYTE $a3,$20,$d9,$31,$15,$aa,$c3,$88 164 | DATA BYTE $aa,$0c,$cf,$02,$00,$41,$a0,$10 165 | DATA BYTE $91,$31,$0a,$5f,$01,$59,$e3,$1f 166 | DATA BYTE $28,$2a,$d9,$fc,$d5,$20,$e0,$70 167 | DATA BYTE $60,$70,$36,$20,$78,$85,$08,$90 168 | DATA BYTE $71,$ed,$91,$bc,$a5,$c5,$57,$0e 169 | DATA BYTE $1f,$01,$55,$b8,$00,$1a,$cd,$f8 170 | DATA BYTE $cf,$35,$80,$25,$dc,$57,$05,$0f 171 | DATA BYTE $c5,$14,$9f,$c5,$20,$57,$eb,$18 172 | DATA BYTE $e1,$e3,$00,$63,$63,$32,$fc,$ea 173 | DATA BYTE $f7,$ef,$f7,$46,$fa,$ce,$10,$c1 174 | DATA BYTE $db,$47,$81,$00,$83,$03,$05,$f9 175 | DATA BYTE $29,$0e,$a7,$23,$05,$40,$cb,$b8 176 | DATA BYTE $18,$55,$8f,$01,$a7,$cd,$68,$5f 177 | DATA BYTE $9b,$7c,$e5,$b6,$40,$96,$07,$ad 178 | DATA BYTE $b6,$00,$07,$20,$7f,$07,$f9,$69 179 | DATA BYTE $c1,$00,$80,$da,$01,$cd,$03,$66 180 | DATA BYTE $c7,$00,$1b,$9b,$55,$4b,$83,$c3 181 | DATA BYTE $c3,$0b,$4f,$bf,$eb,$2e,$e5,$2e 182 | DATA BYTE $1b,$5f,$7f,$c9,$ce,$f7,$49,$9a 183 | DATA BYTE $c3,$ef,$e7,$e2,$c5,$6a,$c5,$02 184 | DATA BYTE $fb,$ff,$fb,$9f,$fb,$fd,$07,$00 185 | DATA BYTE $10,$51,$81,$51,$d1,$d0,$e1,$f1 186 | DATA BYTE $44,$a8,$93,$f9,$18,$f9,$18,$fc 187 | DATA BYTE $d5,$c0,$02,$45,$8a,$4f,$2a,$06 188 | DATA BYTE $ff,$1c,$3d,$e8,$71,$36,$29,$74 189 | DATA BYTE $55,$20,$e0,$00,$f9,$02,$fa,$f4 190 | DATA BYTE $a8,$e1,$63,$7b,$dd,$50,$7c,$7e 191 | DATA BYTE $3a,$3e,$1c,$3e,$3d,$03,$00,$07 192 | DATA BYTE $b2,$fd,$b1,$09,$f3,$99,$a0,$21 193 | DATA BYTE $97,$63,$b5,$7c,$83,$0d,$57,$9a 194 | DATA BYTE $07,$ba,$24,$af,$01,$e8,$ab,$5b 195 | DATA BYTE $a7,$4a,$fe,$fd,$a8,$8c,$83,$00 196 | DATA BYTE $a8,$4e,$04,$8d,$06,$19,$0e,$1e 197 | DATA BYTE $1e,$3c,$67,$00,$34,$04,$fd,$45 198 | DATA BYTE $fc,$e9,$b5,$44,$05,$65,$20,$b0 199 | DATA BYTE $85,$50,$a4,$24,$27,$b9,$29,$73 200 | DATA BYTE $0a,$e7,$71,$55,$9b,$d0,$0f,$b7 201 | DATA BYTE $75,$01,$f0,$38,$d5,$73,$c3,$a4 202 | DATA BYTE $ef,$81,$52,$c4,$0d,$23,$df,$f9 203 | DATA BYTE $0a,$ee,$94,$41,$44,$94,$f6,$2e 204 | DATA BYTE $4c,$02,$03,$93,$6b,$bc,$b2,$e7 205 | DATA BYTE $e8,$78,$83,$83,$0f,$1f,$38,$b1 206 | DATA BYTE $3f,$57,$01,$3e,$56,$36,$10,$02 207 | DATA BYTE $10,$e7,$ad,$bf,$96,$93,$6a,$02 208 | DATA BYTE $1f,$ae,$5f,$f2,$f5,$f6,$8b,$11 209 | DATA BYTE $d5,$ba,$f5,$28,$0b,$8a,$8b,$54 210 | DATA BYTE $5d,$a3,$20,$99,$6f,$f0,$00,$20 211 | DATA BYTE $b5,$80,$e2,$63,$62,$73,$97,$31 212 | DATA BYTE $00,$95,$f8,$b3,$ee,$09,$9f,$9a 213 | DATA BYTE $d5,$18,$3a,$af,$02,$fc,$00,$30 214 | DATA BYTE $21,$8b,$8a,$44,$00,$2e,$df,$4e 215 | DATA BYTE $03,$07,$e8,$4d,$12,$28,$14,$43 216 | DATA BYTE $f0,$c6,$4c,$01,$00,$f1,$d8,$61 217 | DATA BYTE $77,$a0,$50,$09,$99,$f8,$53,$2a 218 | DATA BYTE $75,$ee,$c9,$13,$d7,$02,$d4,$ad 219 | DATA BYTE $90,$23,$57,$01,$1e,$3f,$22,$99 220 | DATA BYTE $ab,$c5,$da,$7f,$27,$f7,$85,$df 221 | DATA BYTE $8b,$af,$e7,$85,$20,$02,$f3,$f4 222 | DATA BYTE $e7,$48,$b6,$61,$97,$a6,$b3,$01 223 | DATA BYTE $2d,$40,$c0,$99,$b2,$ed,$0f,$21 224 | DATA BYTE $2f,$07,$81,$62,$e1,$e1,$98,$e3 225 | DATA BYTE $e7,$00,$f3,$00,$f3,$f7,$bf,$15 226 | DATA BYTE $70,$78,$7d,$71,$05,$61,$55,$ef 227 | DATA BYTE $55,$28,$ad,$f6,$6d,$7e,$b3,$64 228 | DATA BYTE $b9,$25,$66,$d8,$3d,$88,$30,$d9 229 | DATA BYTE $4d,$20,$b1,$bf,$92,$d0,$00,$cb 230 | DATA BYTE $41,$9b,$0d,$07,$fc,$22,$07,$08 231 | DATA BYTE $a5,$07,$53,$18,$55,$7a,$75,$01 232 | DATA BYTE $55,$00,$87,$01,$ae,$5d,$ae,$5c 233 | DATA BYTE $a8,$59,$ea,$ea,$80,$da,$70,$d0 234 | DATA BYTE $03,$10,$04,$1f,$18,$38,$18,$83 235 | DATA BYTE $d7,$c0,$e6,$bc,$8f,$50,$7a,$45 236 | DATA BYTE $7a,$f6,$14,$fc,$b1,$d3,$00,$00 237 | DATA BYTE $5c,$00,$30,$2a,$14,$ad,$94,$05 238 | DATA BYTE $01,$ed,$0c,$0b,$d5,$21,$ab,$7f 239 | DATA BYTE $f8,$19,$b0,$f4,$fc,$17,$4d,$c0 240 | DATA BYTE $3f,$c7,$95,$15,$2e,$b6,$b1,$14 241 | DATA BYTE $6d,$5d,$08,$b9,$7e,$01,$6a,$e4 242 | DATA BYTE $d5,$81,$fc,$f5,$af,$cc,$f1,$80 243 | DATA BYTE $c6,$97,$4f,$a0,$01,$44,$e0,$17 244 | DATA BYTE $f7,$51,$01,$11,$c6,$fb,$0c,$07 245 | DATA BYTE $71,$01,$60,$b1,$64,$8a,$c7,$2a 246 | DATA BYTE $60,$07,$a7,$80,$1e,$1f,$fa,$1a 247 | DATA BYTE $45,$00,$9d,$81,$b9,$7c,$c6,$a3 248 | DATA BYTE $c0,$f8,$7c,$fc,$70,$38,$40,$01 249 | DATA BYTE $00,$18,$18,$1c,$1c,$39,$10,$c0 250 | DATA BYTE $e4,$fc,$da,$40,$fc,$a2,$08,$c4 251 | DATA BYTE $c6,$ce,$3e,$f1,$c7,$dc,$22,$14 252 | DATA BYTE $b0,$bf,$4d,$8e,$b4,$90,$04,$06 253 | DATA BYTE $04,$0e,$04,$f2,$59,$99,$c8,$03 254 | DATA BYTE $05,$aa,$5f,$23,$1f,$c0,$f7,$9d 255 | DATA BYTE $9b,$fe,$9e,$ce,$3c,$9a,$00,$0c 256 | DATA BYTE $46,$b0,$f8,$80,$38,$ed,$a9,$00 257 | DATA BYTE $33,$02,$4f,$9f,$01,$9d,$0e,$03 258 | DATA BYTE $94,$4f,$25,$92,$10,$ff,$3c,$08 259 | DATA BYTE $1f,$64,$13,$53,$5b,$02,$39,$04 260 | DATA BYTE $ea,$d3,$95,$05,$98,$7b,$6c,$f7 261 | DATA BYTE $e3,$18,$ef,$ef,$05,$18,$ed,$40 262 | DATA BYTE $f1,$79,$40,$d7,$34,$c1,$98,$e0 263 | DATA BYTE $a0,$ff,$81,$ef,$81,$03,$0f,$47 264 | DATA BYTE $91,$09,$df,$22,$11,$4b,$2b,$ad 265 | DATA BYTE $d3,$13,$6f,$06,$0b,$01,$0e,$05 266 | DATA BYTE $17,$a3,$01,$c7,$65,$3f,$c3,$a2 267 | DATA BYTE $0f,$33,$5c,$00,$a8,$30,$c1,$e2 268 | DATA BYTE $75,$40,$90,$bf,$20,$f0,$ec,$b6 269 | DATA BYTE $0c,$fa,$1f,$16,$06,$b5,$a8,$7f 270 | DATA BYTE $fb,$17,$62,$1f,$f0,$c6,$fb,$a8 271 | DATA BYTE $6d,$9c,$5b,$07,$97,$94,$81,$04 272 | DATA BYTE $9c,$9b,$1e,$1d,$24,$0e,$0e,$af 273 | DATA BYTE $80,$ab,$20,$61,$23,$e3,$54,$bd 274 | DATA BYTE $88,$2e,$c1,$c3,$31,$3f,$60,$db 275 | DATA BYTE $f7,$20,$fa,$6e,$f2,$01,$ee,$0e 276 | DATA BYTE $3e,$c1,$85,$cf,$d9,$54,$c5,$af 277 | DATA BYTE $9d,$01,$98,$d9,$54,$e9,$4f,$11 278 | DATA BYTE $02,$a7,$57,$d1,$29,$4d,$a8,$8f 279 | DATA BYTE $d3,$8d,$24,$5f,$c7,$a7,$61,$45 280 | DATA BYTE $1f,$06,$fe,$57,$fd,$88,$1f,$c0 281 | DATA BYTE $cf,$b5,$3f,$bd,$0a,$dd,$49,$da 282 | DATA BYTE $0b,$55,$74,$40,$87,$f4,$df,$06 283 | DATA BYTE $1f,$ff,$e0,$40,$dc,$ed,$bf,$da 284 | DATA BYTE $be,$9a,$87,$5a,$05,$63,$47,$eb 285 | DATA BYTE $14,$09,$0e,$0c,$ef,$f7,$00,$76 286 | DATA BYTE $41,$a8,$38,$a0,$83,$b1,$8f,$d8 287 | DATA BYTE $60,$b7,$04,$e1,$f5,$00,$0b,$81 288 | DATA BYTE $1a,$9f,$9f,$5f,$4c,$6f,$11,$7f 289 | DATA BYTE $8c,$84,$b0,$08,$88,$18,$02,$bb 290 | DATA BYTE $48,$24,$22,$87,$54,$01,$61,$01 291 | DATA BYTE $28,$c1,$c3,$f8,$a7,$22,$96,$00 292 | DATA BYTE $13,$31,$20,$60,$02,$4b,$28,$c0 293 | DATA BYTE $48,$e2,$b2,$10,$d3,$12,$22,$65 294 | DATA BYTE $cb,$a2,$8b,$da,$89,$f2,$6b,$91 295 | DATA BYTE $fa,$00,$fb,$43,$18,$0c,$6d,$1d 296 | DATA BYTE $b0,$0f,$a9,$36,$01,$c0,$a5,$3c 297 | DATA BYTE $22,$44,$df,$5c,$01,$36,$60,$54 298 | DATA BYTE $9f,$e7,$ab,$6d,$a5,$a1,$ee,$7c 299 | DATA BYTE $0b,$c7,$87,$e3,$1f,$54,$22,$2d 300 | DATA BYTE $75,$c5,$46,$0a,$87,$07,$83,$95 301 | DATA BYTE $1d,$ef,$45,$31,$ab,$22,$45,$fc 302 | DATA BYTE $d7,$8f,$0a,$38,$c9,$f8,$50,$ba 303 | DATA BYTE $35,$07,$88,$03,$cf,$ff,$80,$af 304 | DATA BYTE $3f,$14,$94,$e1,$08,$14,$11,$28 305 | DATA BYTE $10,$ff,$93,$f6,$be,$a0,$f0,$dc 306 | DATA BYTE $2c,$bf,$bf,$c2,$a0,$00,$db,$31 307 | DATA BYTE $8c,$cc,$00,$9c,$00,$f9,$1b,$5f 308 | DATA BYTE $7f,$86,$00,$d5,$fa,$f5,$56,$21 309 | DATA BYTE $e3,$d7,$50,$ef,$cd,$d7,$a1,$7f 310 | DATA BYTE $ff,$8e,$27,$aa,$bf,$f7,$84,$80 311 | DATA BYTE $b1,$48,$10,$b1,$62,$eb,$a7,$49 312 | DATA BYTE $c5,$2d,$0f,$87,$00,$0b,$a3,$11 313 | DATA BYTE $49,$02,$06,$1e,$06,$88,$0b,$20 314 | DATA BYTE $b8,$c5,$f0,$30,$21,$06,$dc,$17 315 | DATA BYTE $e5,$9f,$f6,$00,$21,$9d,$54,$2a 316 | DATA BYTE $80,$d3,$08,$f0,$93,$74,$b5,$0d 317 | DATA BYTE $e8,$cf,$c9,$5b,$82,$ec,$00,$ab 318 | DATA BYTE $45,$40,$63,$5d,$65,$5e,$55,$4b 319 | DATA BYTE $01,$81,$b4,$3f,$aa,$18,$b1,$90 320 | DATA BYTE $fc,$f8,$87,$bd,$37,$bb,$70,$01 321 | DATA BYTE $bb,$f7,$03,$84,$f7,$fe,$c4,$d5 322 | DATA BYTE $73,$c0,$80,$5b,$3d,$27,$00,$9c 323 | DATA BYTE $00,$fc,$43,$27,$ed,$3c,$50,$ea 324 | DATA BYTE $ef,$b3,$af,$5f,$34,$8f,$fd,$fa 325 | DATA BYTE $d1,$30,$ab,$14,$89,$0f,$7f,$b1 326 | DATA BYTE $07,$9e,$68,$01,$07,$7f,$c7,$d3 327 | DATA BYTE $b8,$e9,$b8,$d0,$9d,$31,$d8,$bc 328 | DATA BYTE $ce,$01,$05,$a0,$fc,$1b,$f1,$7e 329 | DATA BYTE $0b,$cf,$44,$0d,$60,$bf,$bf,$f0 330 | DATA BYTE $ff,$38,$0a,$c7,$17,$1c,$00,$87 331 | DATA BYTE $af,$17,$d5,$37,$87,$c9,$d5,$c1 332 | DATA BYTE $ff,$d8,$00,$a8,$55,$1e,$1b,$a5 333 | DATA BYTE $30,$13,$61,$5b,$ff,$c1,$ba,$82 334 | DATA BYTE $91,$d0,$3c,$a8,$51,$e7,$14,$40 335 | DATA BYTE $ef,$50,$84,$f6,$20,$82,$85,$05 336 | DATA BYTE $9b,$c2,$cd,$3f,$0f,$cf,$82,$f5 337 | DATA BYTE $03,$63,$20,$05,$fe,$0d,$4b,$e8 338 | DATA BYTE $e6,$88,$96,$01,$03,$66,$82,$f8 339 | DATA BYTE $3f,$1f,$05,$a7,$ab,$80,$f7,$bf 340 | DATA BYTE $47,$5f,$92,$f2,$9f,$c5,$02,$a8 341 | DATA BYTE $10,$a5,$72,$a5,$68,$b5,$b8,$b1 342 | DATA BYTE $d8,$19,$7f,$25,$fe,$7f,$cd,$bf 343 | DATA BYTE $b6,$3e,$f5,$97,$39,$d7,$ac,$00 344 | DATA BYTE $d7,$10,$ef,$57,$05,$04,$98,$00 345 | DATA BYTE $05,$99,$e9,$2a,$e0,$10,$15,$a3 346 | DATA BYTE $c8,$60,$40,$00,$f8,$c0,$f7,$01 347 | DATA BYTE $f7,$02,$e2,$ff,$70,$dc,$07,$78 348 | DATA BYTE $78,$38,$38,$07,$ff,$17,$d3,$1e 349 | DATA BYTE $8b,$3e,$09,$11,$8f,$0e,$c4,$d6 350 | DATA BYTE $a0,$5e,$e3,$94,$2c,$be,$30,$5f 351 | DATA BYTE $37,$04,$f8,$43,$f4,$f3,$6a,$fd 352 | DATA BYTE $a8,$cd,$44,$14,$ef,$55,$d7,$60 353 | DATA BYTE $d9,$68,$1c,$88,$05,$4c,$26,$03 354 | DATA BYTE $09,$05,$1e,$90,$0d,$99,$9e,$c0 355 | DATA BYTE $ff,$11,$91,$ff,$27,$b3,$07,$f0 356 | DATA BYTE $d0,$8c,$2b,$c7,$f8,$09,$ea,$3f 357 | DATA BYTE $e3,$bd,$3e,$03,$05,$6f,$e0,$df 358 | DATA BYTE $c0,$e1,$c9,$97,$d8,$ef,$2c,$79 359 | DATA BYTE $93,$35,$75,$f3,$63,$82,$57,$8b 360 | DATA BYTE $0c,$8f,$aa,$75,$bc,$b1,$aa,$df 361 | DATA BYTE $85,$8a,$ee,$3e,$29,$f0,$31,$d9 362 | DATA BYTE $a7,$85,$06,$86,$84,$00,$09,$92 363 | DATA BYTE $c3,$00,$bf,$96,$00,$9d,$cc,$00 364 | DATA BYTE $08,$00,$d6,$ff,$a5,$08,$77,$84 365 | DATA BYTE $df,$a0,$20,$02,$7f,$c2,$04,$01 366 | DATA BYTE $f8,$54,$7f,$d7,$c6,$31,$8f,$0a 367 | DATA BYTE $fb,$fd,$bf,$d3,$22,$bf,$13,$7d 368 | DATA BYTE $be,$5d,$97,$63,$8f,$f4,$a7,$e7 369 | DATA BYTE $cd,$16,$a0,$51,$13,$98,$d5,$50 370 | DATA BYTE $0d,$a2,$54,$0a,$01,$94,$bf,$20 371 | DATA BYTE $10,$02,$08,$4c,$8e,$47,$a3,$11 372 | DATA BYTE $dd,$2c,$ae,$a4,$07,$87,$2d,$fd 373 | DATA BYTE $88,$c7,$f0,$01,$2a,$f1,$f3,$ff 374 | DATA BYTE $06,$ce,$fe,$1e,$0e,$0f,$d8,$00 375 | DATA BYTE $b3,$76,$1c,$71,$a3,$0f,$17,$1f 376 | DATA BYTE $b9,$31,$77,$ab,$f7,$39,$17,$ff 377 | DATA BYTE $e1,$00,$02,$17,$dd,$87,$19,$03 378 | DATA BYTE $ae,$5f,$d1,$d0,$f5,$4b,$8f,$18 379 | DATA BYTE $93,$75,$fb,$f7,$b1,$07,$83,$c1 380 | DATA BYTE $f5,$ba,$75,$e8,$50,$b0,$fb,$4f 381 | DATA BYTE $99,$b0,$07,$ba,$55,$c3,$89,$00 382 | DATA BYTE $c1,$e3,$03,$cf,$e2,$8f,$0c,$83 383 | DATA BYTE $20,$30,$00,$89,$d6,$b8,$fe,$03 384 | DATA BYTE $fe,$01,$80,$f8,$08,$78,$83,$87 385 | DATA BYTE $f9,$18,$a8,$38,$95,$11,$ef,$ff 386 | DATA BYTE $9e,$ff,$89,$01,$fa,$fd,$fe,$9a 387 | DATA BYTE $01,$e3,$cf,$64,$cd,$51,$25,$b3 388 | DATA BYTE $ad,$0a,$8d,$dc,$37,$79,$08,$d9 389 | DATA BYTE $28,$e0,$d3,$cd,$50,$20,$c5,$17 390 | DATA BYTE $1e,$bb,$e8,$0c,$e9,$4c,$10,$10 391 | DATA BYTE $e2,$0d,$1b,$ef,$9b,$b5,$5a,$e7 392 | DATA BYTE $e1,$8b,$79,$0f,$00,$60,$4f,$fc 393 | DATA BYTE $62,$fd,$11,$2b,$57,$db,$a9,$2b 394 | DATA BYTE $1f,$ef,$06,$55,$fa,$d5,$97,$c1 395 | DATA BYTE $3c,$87,$81,$34,$01,$89,$a8,$f4 396 | DATA BYTE $fd,$d1,$ba,$85,$20,$54,$95,$e8 397 | DATA BYTE $25,$03,$ab,$7f,$11,$ef,$5f,$af 398 | DATA BYTE $91,$a7,$5f,$8f,$75,$eb,$a9,$29 399 | DATA BYTE $d5,$91,$67,$c7,$2d,$27,$d5,$18 400 | DATA BYTE $00,$78,$3c,$91,$5a,$6a,$00,$81 401 | DATA BYTE $f8,$d8,$00,$a3,$58,$de,$9a,$6f 402 | DATA BYTE $29,$42,$1b,$bb,$70,$17,$70,$af 403 | DATA BYTE $f7,$9b,$76,$00,$15,$ef,$01,$ae 404 | DATA BYTE $47,$cf,$d7,$b7,$bf,$c7,$ef,$91 405 | DATA BYTE $bd,$0f,$00,$f5,$7f,$f5,$91,$47 406 | DATA BYTE $c0,$c1,$d9,$00,$f7,$8c,$0f,$d7 407 | DATA BYTE $fe,$df,$e5,$82,$72,$01,$eb,$15 408 | DATA BYTE $8a,$1f,$01,$05,$2a,$2c,$91,$03 409 | DATA BYTE $f5,$45,$ab,$e1,$8a,$95,$ae,$96 410 | DATA BYTE $97,$0b,$04,$75,$fa,$d4,$ae,$f4 411 | DATA BYTE $77,$fe,$f9,$a1,$e2,$9b,$25,$05 412 | DATA BYTE $fb,$a7,$5d,$14,$29,$9d,$70,$a9 413 | DATA BYTE $75,$d3,$a3,$e0,$d7,$2d,$55,$3c 414 | DATA BYTE $9d,$c8,$01,$a5,$19,$60,$00,$b0 415 | DATA BYTE $fd,$3b,$02,$00,$50,$87,$39,$9e 416 | DATA BYTE $38,$a8,$9b,$f8,$53,$df,$7c,$e6 417 | DATA BYTE $17,$70,$84,$00,$78,$f8,$f1,$50 418 | DATA BYTE $e1,$f2,$eb,$78,$a7,$0f,$54,$c0 419 | DATA BYTE $ff,$a2,$59,$fb,$31,$41,$02,$9f 420 | DATA BYTE $18,$08,$ed,$dc,$8b,$78,$f7,$94 421 | DATA BYTE $61,$cd,$6f,$04,$50,$f8,$18,$10 422 | DATA BYTE $9b,$68,$0d,$e4,$20,$a5,$eb,$dd 423 | DATA BYTE $6d,$2a,$53,$85,$a5,$81,$fd,$e8 424 | DATA BYTE $26,$2a,$65,$7f,$d1,$e6,$00,$f5 425 | DATA BYTE $83,$6a,$3e,$9b,$da,$79,$07,$8b 426 | DATA BYTE $17,$9d,$2c,$fb,$a3,$bc,$a5,$fc 427 | DATA BYTE $fd,$0b,$ae,$59,$0b,$ff,$52,$b7 428 | DATA BYTE $96,$5c,$d7,$6f,$1f,$df,$df,$91 429 | DATA BYTE $ec,$84,$70,$01,$7e,$7c,$3e,$a3 430 | DATA BYTE $c5,$58,$27,$c0,$78,$96,$b5,$a4 431 | DATA BYTE $44,$18,$ac,$9f,$4d,$47,$e5,$83 432 | DATA BYTE $01,$45,$88,$44,$82,$8f,$b7,$0a 433 | DATA BYTE $f1,$25,$7f,$88,$45,$05,$f7,$0d 434 | DATA BYTE $ec,$87,$aa,$50,$49,$8d,$08,$ef 435 | DATA BYTE $6d,$21,$20,$55,$97,$7f,$14,$07 436 | DATA BYTE $fe,$c9,$df,$9c,$45,$01,$54,$d3 437 | DATA BYTE $ff,$07,$91,$2b,$15,$da,$77,$06 438 | DATA BYTE $9b,$70,$01,$fb,$76,$d0,$bf,$aa 439 | DATA BYTE $af,$97,$f1,$0f,$80,$4e,$03,$f5 440 | DATA BYTE $51,$68,$a0,$91,$28,$8a,$fd,$45 441 | DATA BYTE $51,$80,$fd,$ad,$ec,$ee,$93,$1f 442 | DATA BYTE $96,$1f,$ae,$01,$c7,$df,$3d,$e4 443 | DATA BYTE $00,$89,$e4,$c5,$ec,$bd,$00,$f7 444 | DATA BYTE $0f,$d9,$2f,$26,$a2,$8a,$8d,$0e 445 | DATA BYTE $04,$06,$35,$1e,$09,$67,$40,$82 446 | DATA BYTE $93,$33,$b0,$0e,$88,$51,$ed,$2d 447 | DATA BYTE $42,$93,$68,$51,$05,$41,$db,$d3 448 | DATA BYTE $ba,$01,$1b,$b8,$01,$8b,$94,$8a 449 | DATA BYTE $93,$e9,$21,$81,$d3,$8f,$9d,$7d 450 | DATA BYTE $1d,$6f,$01,$d1,$0f,$05,$54,$01 451 | DATA BYTE $e7,$a8,$c4,$9f,$e2,$47,$2b,$5d 452 | DATA BYTE $1d,$f8,$9f,$3b,$77,$e9,$27,$85 453 | DATA BYTE $79,$98,$07,$01,$41,$aa,$c1,$c9 454 | DATA BYTE $e9,$07,$6f,$8b,$cc,$0f,$a8,$07 455 | DATA BYTE $eb,$41,$07,$be,$f3,$97,$2e,$8a 456 | DATA BYTE $56,$ee,$a4,$a7,$6b,$35,$b1,$5b 457 | DATA BYTE $24,$cb,$00,$dc,$6f,$fc,$c9,$96 458 | DATA BYTE $a8,$af,$7e,$25,$e1,$7a,$17,$8c 459 | DATA BYTE $06,$93,$61,$0b,$d5,$67,$e3,$77 460 | DATA BYTE $95,$cd,$01,$45,$9d,$1d,$a2,$05 461 | DATA BYTE $07,$d5,$75,$fb,$26,$a7,$c6,$51 462 | DATA BYTE $09,$ed,$77,$47,$74,$25,$f9,$68 463 | DATA BYTE $a1,$99,$11,$7b,$3b,$24,$d7,$f9 464 | DATA BYTE $18,$01,$01,$b0,$01,$c7,$cd,$51 465 | DATA BYTE $2a,$1b,$ab,$ef,$df,$b9,$f1,$ab 466 | DATA BYTE $1b,$dd,$44,$a6,$b9,$31,$e9,$4b 467 | DATA BYTE $c9,$7b,$0b,$63,$a7,$fc,$85,$33 468 | DATA BYTE $51,$8a,$61,$f7,$ec,$19,$91,$0c 469 | DATA BYTE $e9,$12,$15,$a2,$8f,$44,$15,$95 470 | DATA BYTE $2b,$20,$ab,$09,$f5,$fb,$af,$ae 471 | DATA BYTE $05,$ff,$0d,$33,$9f,$5a,$5f,$a0 472 | DATA BYTE $fc,$05,$6f,$57,$c1,$ff,$b4,$67 473 | DATA BYTE $f3,$bf,$6d,$2f,$8e,$30,$bd,$7f 474 | DATA BYTE $ff,$ff,$ff,$e0 475 | 476 | image_color: 477 | DATA BYTE $65,$eb,$eb,$e1,$01,$80,$00,$91 478 | DATA BYTE $f6,$91,$91,$61,$6c,$e1,$00,$f1 479 | DATA BYTE $18,$f1,$71,$71,$06,$a5,$8d,$00 480 | DATA BYTE $e4,$ed,$ac,$11,$09,$27,$fa,$00 481 | DATA BYTE $1b,$4d,$c4,$1f,$fe,$8f,$00,$f1 482 | DATA BYTE $fe,$34,$00,$19,$17,$ed,$ed,$c5 483 | DATA BYTE $29,$5f,$2d,$03,$3e,$13,$fe,$00 484 | DATA BYTE $5c,$ed,$0e,$04,$fe,$fb,$38,$7f 485 | DATA BYTE $8c,$00,$f6,$f6,$04,$9e,$42,$c5 486 | DATA BYTE $4a,$00,$63,$e6,$65,$6a,$ad,$05 487 | DATA BYTE $00,$1b,$7a,$eb,$1d,$06,$b6,$71 488 | DATA BYTE $00,$5f,$07,$1c,$3d,$00,$c4,$1d 489 | DATA BYTE $00,$a5,$1f,$1d,$00,$a6,$a6,$05 490 | DATA BYTE $d8,$56,$39,$eb,$c0,$dd,$13,$ed 491 | DATA BYTE $e5,$53,$00,$43,$39,$00,$17,$51 492 | DATA BYTE $9d,$00,$3a,$06,$ce,$9a,$41,$81 493 | DATA BYTE $f8,$cf,$0b,$71,$3e,$00,$13,$83 494 | DATA BYTE $d6,$6a,$07,$5a,$93,$08,$96,$6b 495 | DATA BYTE $05,$09,$02,$9c,$06,$f8,$e8,$33 496 | DATA BYTE $1f,$5b,$00,$b7,$2e,$83,$ff,$54 497 | DATA BYTE $87,$1b,$0d,$74,$97,$1e,$14,$cc 498 | DATA BYTE $3d,$01,$ac,$00,$60,$66,$cd,$67 499 | DATA BYTE $c0,$96,$a8,$00,$10,$c7,$27,$0f 500 | DATA BYTE $e6,$03,$94,$e6,$ce,$00,$f7,$0d 501 | DATA BYTE $40,$fe,$c0,$f0,$42,$e6,$02,$61 502 | DATA BYTE $71,$61,$00,$82,$f9,$07,$e7,$00 503 | DATA BYTE $f1,$63,$09,$00,$ed,$01,$cb,$c1 504 | DATA BYTE $0c,$01,$c1,$43,$c4,$fc,$06,$51 505 | DATA BYTE $c1,$fc,$18,$03,$e4,$71,$fc,$1a 506 | DATA BYTE $06,$fe,$c1,$ea,$f0,$ef,$69,$0d 507 | DATA BYTE $6e,$0c,$78,$79,$05,$b6,$ce,$08 508 | DATA BYTE $df,$03,$61,$fd,$38,$00,$ea,$36 509 | DATA BYTE $f0,$0a,$3f,$06,$fa,$0c,$4e,$be 510 | DATA BYTE $08,$c5,$0f,$33,$00,$62,$c0,$e1 511 | DATA BYTE $e0,$f9,$f5,$0f,$97,$c1,$bc,$70 512 | DATA BYTE $e6,$de,$60,$cc,$70,$d7,$63,$59 513 | DATA BYTE $e6,$6e,$7a,$00,$db,$10,$40,$fc 514 | DATA BYTE $36,$b6,$eb,$00,$c7,$12,$a6,$d0 515 | DATA BYTE $00,$9d,$e0,$ee,$1c,$b1,$a6,$f1 516 | DATA BYTE $16,$04,$9b,$05,$77,$1c,$27,$06 517 | DATA BYTE $fb,$cc,$00,$f1,$01,$a0,$00,$c7 518 | DATA BYTE $db,$10,$87,$b9,$87,$99,$5b,$00 519 | DATA BYTE $6b,$6d,$02,$0b,$e2,$b3,$1b,$6c 520 | DATA BYTE $82,$c9,$97,$44,$b6,$00,$e6,$96 521 | DATA BYTE $9c,$4d,$32,$b6,$a5,$0f,$15,$b4 522 | DATA BYTE $19,$99,$2d,$8f,$fc,$3c,$10,$9f 523 | DATA BYTE $37,$fe,$e6,$00,$2e,$ab,$cf,$17 524 | DATA BYTE $fb,$14,$c2,$fb,$fb,$dd,$03,$ff 525 | DATA BYTE $ef,$2f,$03,$d6,$c6,$57,$a5,$1f 526 | DATA BYTE $e2,$81,$95,$c5,$eb,$a1,$f1,$6d 527 | DATA BYTE $20,$f1,$96,$e0,$ed,$41,$ea,$cd 528 | DATA BYTE $cb,$c1,$f0,$f6,$00,$c3,$97,$cd 529 | DATA BYTE $cb,$b6,$4c,$2b,$a6,$c1,$58,$fe 530 | DATA BYTE $39,$04,$f1,$f5,$0e,$59,$b5,$0e 531 | DATA BYTE $06,$f6,$0f,$d0,$09,$fd,$68,$81 532 | DATA BYTE $64,$61,$fe,$e9,$3a,$68,$00,$7a 533 | DATA BYTE $f6,$be,$00,$a0,$5f,$01,$f9,$da 534 | DATA BYTE $b1,$fd,$1b,$da,$da,$05,$f9,$22 535 | DATA BYTE $f0,$f6,$7c,$06,$ed,$d2,$00,$f3 536 | DATA BYTE $5f,$e1,$97,$d7,$02,$fb,$47,$95 537 | DATA BYTE $d1,$ed,$ac,$f2,$7e,$34,$c2,$dc 538 | DATA BYTE $14,$74,$7d,$e1,$d0,$fd,$20,$ca 539 | DATA BYTE $e8,$02,$9c,$1b,$e1,$90,$00,$f7 540 | DATA BYTE $62,$f5,$40,$ab,$ea,$b4,$18,$9a 541 | DATA BYTE $7e,$ef,$0d,$3c,$28,$9a,$7d,$02 542 | DATA BYTE $bc,$23,$90,$b7,$c5,$ea,$a4,$00 543 | DATA BYTE $24,$b1,$e0,$0d,$21,$87,$86,$23 544 | DATA BYTE $fc,$bb,$05,$08,$03,$f5,$c0,$fb 545 | DATA BYTE $bc,$13,$1b,$53,$f1,$a4,$d9,$01 546 | DATA BYTE $38,$e3,$00,$da,$c8,$00,$51,$f6 547 | DATA BYTE $da,$d7,$b8,$00,$9e,$7b,$07,$c4 548 | DATA BYTE $bf,$e5,$a5,$d1,$01,$53,$e6,$00 549 | DATA BYTE $83,$88,$b8,$a6,$ff,$c5,$f7,$8f 550 | DATA BYTE $cf,$a3,$d2,$b4,$ed,$ee,$8b,$43 551 | DATA BYTE $e4,$8b,$f0,$e7,$56,$71,$5d,$e3 552 | DATA BYTE $87,$6b,$35,$a4,$01,$81,$b2,$cd 553 | DATA BYTE $e7,$9a,$0e,$45,$27,$f4,$9e,$03 554 | DATA BYTE $72,$00,$ff,$7c,$bf,$06,$ba,$b1 555 | DATA BYTE $22,$00,$fa,$00,$a1,$b1,$09,$a3 556 | DATA BYTE $01,$07,$c1,$21,$63,$af,$c1,$86 557 | DATA BYTE $d0,$b9,$f6,$6d,$36,$f1,$fb,$ad 558 | DATA BYTE $98,$cd,$fe,$37,$fe,$ff,$0f,$fb 559 | DATA BYTE $00,$62,$92,$c0,$8f,$f2,$aa,$f4 560 | DATA BYTE $ee,$90,$e1,$43,$53,$e1,$c7,$e5 561 | DATA BYTE $c7,$e7,$f5,$03,$ff,$81,$fa,$c5 562 | DATA BYTE $cb,$f7,$c3,$a6,$8c,$03,$71,$c2 563 | DATA BYTE $af,$9b,$f6,$0b,$96,$d0,$00,$c4 564 | DATA BYTE $f6,$5c,$e6,$3f,$a9,$90,$b8,$45 565 | DATA BYTE $da,$81,$fd,$5e,$05,$00,$07,$e9 566 | DATA BYTE $8a,$b7,$e1,$e7,$b7,$d3,$e6,$3b 567 | DATA BYTE $13,$a0,$00,$f1,$95,$f8,$eb,$8b 568 | DATA BYTE $dd,$5e,$07,$08,$2d,$e3,$07,$c6 569 | DATA BYTE $91,$fe,$64,$e4,$00,$b8,$9b,$1b 570 | DATA BYTE $b7,$e6,$b4,$34,$b7,$9d,$c0,$f8 571 | DATA BYTE $77,$e6,$0f,$07,$db,$4f,$cd,$c5 572 | DATA BYTE $ed,$e9,$07,$9e,$18,$6a,$07,$71 573 | DATA BYTE $00,$81,$fc,$ff,$1c,$03,$c5,$c5 574 | DATA BYTE $84,$c0,$d6,$f2,$96,$66,$04,$f1 575 | DATA BYTE $f3,$a2,$c8,$bd,$ec,$e0,$d7,$eb 576 | DATA BYTE $d1,$c6,$b2,$73,$ed,$bd,$6d,$82 577 | DATA BYTE $56,$5f,$60,$04,$ed,$47,$94,$d9 578 | DATA BYTE $cb,$c8,$c9,$fe,$a3,$87,$a3,$fa 579 | DATA BYTE $c8,$fe,$3c,$b1,$f1,$df,$4b,$6f 580 | DATA BYTE $cb,$93,$d9,$93,$5c,$d6,$07,$a5 581 | DATA BYTE $e5,$b2,$f1,$16,$a5,$dc,$2e,$ef 582 | DATA BYTE $1b,$1c,$05,$ea,$21,$04,$a6,$47 583 | DATA BYTE $b1,$8d,$c1,$a4,$d3,$92,$4f,$22 584 | DATA BYTE $62,$91,$02,$bb,$07,$bf,$a3,$67 585 | DATA BYTE $c8,$86,$da,$d4,$0a,$d2,$e0,$f6 586 | DATA BYTE $8d,$13,$e6,$a6,$b9,$1b,$e6,$3a 587 | DATA BYTE $50,$96,$79,$16,$b6,$77,$01,$1a 588 | DATA BYTE $0f,$86,$9d,$1b,$05,$a9,$b1,$bb 589 | DATA BYTE $60,$05,$fd,$5b,$f4,$6d,$0c,$b8 590 | DATA BYTE $b5,$00,$67,$f4,$b1,$ec,$00,$ec 591 | DATA BYTE $e0,$f4,$83,$f9,$aa,$85,$00,$d6 592 | DATA BYTE $8b,$ee,$61,$90,$04,$eb,$da,$70 593 | DATA BYTE $85,$68,$ff,$f7,$02,$6c,$5c,$85 594 | DATA BYTE $0c,$f6,$a4,$fe,$05,$90,$00,$91 595 | DATA BYTE $8d,$65,$05,$77,$01,$bf,$db,$db 596 | DATA BYTE $9d,$05,$1c,$b1,$d7,$c0,$f8,$91 597 | DATA BYTE $d3,$09,$16,$47,$d6,$08,$a6,$ca 598 | DATA BYTE $03,$b6,$f1,$a1,$a1,$a6,$82,$fb 599 | DATA BYTE $05,$e9,$00,$05,$c1,$8a,$a3,$ea 600 | DATA BYTE $c1,$93,$b8,$37,$d8,$28,$01,$f9 601 | DATA BYTE $3d,$91,$f2,$61,$07,$ff,$cd,$df 602 | DATA BYTE $e8,$e7,$9d,$2f,$b1,$af,$e9,$39 603 | DATA BYTE $f1,$fa,$7d,$07,$67,$13,$aa,$75 604 | DATA BYTE $9e,$74,$c6,$48,$ca,$61,$65,$a5 605 | DATA BYTE $c8,$d6,$03,$cb,$78,$9f,$99,$d7 606 | DATA BYTE $3d,$06,$dd,$e1,$d9,$e6,$95,$bd 607 | DATA BYTE $d7,$ed,$84,$f4,$41,$d9,$be,$28 608 | DATA BYTE $d3,$d0,$81,$1f,$a6,$25,$87,$07 609 | DATA BYTE $8d,$bd,$c2,$db,$c1,$e1,$df,$d1 610 | DATA BYTE $a0,$bc,$bf,$5f,$06,$91,$0e,$ed 611 | DATA BYTE $03,$72,$00,$61,$da,$d1,$b8,$ed 612 | DATA BYTE $ab,$00,$59,$1c,$04,$b6,$8a,$fb 613 | DATA BYTE $01,$fe,$a1,$21,$0f,$8c,$0d,$e2 614 | DATA BYTE $54,$03,$c2,$b6,$81,$fc,$e6,$c1 615 | DATA BYTE $f6,$ab,$cd,$ef,$f7,$ff,$ff,$70 616 | DATA BYTE $17,$96,$f2,$03,$e1,$e2,$0d,$bb 617 | DATA BYTE $b2,$ab,$9f,$07,$fd,$83,$9d,$83 618 | DATA BYTE $b9,$c3,$a0,$7c,$71,$e7,$bb,$0f 619 | DATA BYTE $c6,$66,$10,$18,$35,$f2,$2b,$ec 620 | DATA BYTE $bf,$1f,$02,$d6,$21,$9a,$14,$41 621 | DATA BYTE $25,$51,$70,$51,$89,$86,$a5,$65 622 | DATA BYTE $64,$d6,$9d,$e8,$e6,$00,$c2,$8f 623 | DATA BYTE $71,$dd,$07,$80,$ab,$d4,$b4,$55 624 | DATA BYTE $f6,$35,$d1,$21,$9a,$7b,$67,$fb 625 | DATA BYTE $de,$66,$4b,$d5,$71,$93,$d5,$9b 626 | DATA BYTE $e9,$63,$f1,$6c,$a6,$f4,$5d,$07 627 | DATA BYTE $a2,$eb,$69,$0d,$7c,$1d,$f5,$db 628 | DATA BYTE $06,$b6,$9e,$7b,$0e,$88,$d8,$27 629 | DATA BYTE $13,$f6,$f0,$97,$77,$bd,$cd,$ed 630 | DATA BYTE $85,$e8,$01,$84,$d1,$41,$4f,$00 631 | DATA BYTE $e9,$62,$0d,$de,$9a,$d1,$51,$80 632 | DATA BYTE $b9,$e6,$fa,$ca,$be,$99,$39,$a0 633 | DATA BYTE $3a,$ff,$ef,$00,$11,$b1,$f1,$b0 634 | DATA BYTE $a8,$9e,$a6,$51,$73,$f0,$65,$c6 635 | DATA BYTE $e3,$f9,$e9,$3e,$c5,$05,$21,$00 636 | DATA BYTE $d9,$d8,$79,$03,$77,$5b,$13,$6d 637 | DATA BYTE $d3,$b3,$f6,$29,$69,$23,$a5,$ae 638 | DATA BYTE $f1,$06,$ea,$f7,$59,$e1,$5b,$35 639 | DATA BYTE $a7,$73,$03,$86,$a6,$f3,$00,$42 640 | DATA BYTE $ea,$bc,$06,$8c,$5e,$f8,$0f,$b7 641 | DATA BYTE $08,$38,$00,$c1,$f7,$0b,$cd,$83 642 | DATA BYTE $a0,$e0,$fb,$ee,$78,$08,$6d,$e4 643 | DATA BYTE $00,$b0,$b4,$f2,$c3,$68,$f2,$57 644 | DATA BYTE $19,$f5,$e0,$6b,$07,$d1,$64,$00 645 | DATA BYTE $80,$66,$ce,$f8,$e9,$1c,$a6,$51 646 | DATA BYTE $e7,$6c,$90,$3a,$c1,$f9,$f0,$87 647 | DATA BYTE $be,$c1,$ef,$4d,$db,$00,$9f,$ad 648 | DATA BYTE $b6,$00,$b7,$95,$e6,$c4,$fe,$9a 649 | DATA BYTE $00,$7e,$83,$5f,$57,$3e,$c1,$ff 650 | DATA BYTE $f3,$89,$da,$31,$c9,$df,$dc,$07 651 | DATA BYTE $98,$9c,$98,$2f,$61,$27,$27,$0d 652 | DATA BYTE $65,$d5,$f7,$fd,$a8,$dd,$82,$59 653 | DATA BYTE $71,$77,$05,$79,$94,$89,$eb,$a2 654 | DATA BYTE $0d,$d0,$ec,$0a,$9a,$0d,$27,$87 655 | DATA BYTE $41,$af,$53,$e4,$a6,$f0,$fb,$60 656 | DATA BYTE $d4,$68,$d8,$1e,$47,$d3,$69,$0a 657 | DATA BYTE $0d,$ff,$7a,$00,$0b,$c8,$71,$5a 658 | DATA BYTE $0f,$f9,$0d,$6e,$9f,$ed,$00,$82 659 | DATA BYTE $f6,$01,$d9,$02,$c1,$78,$27,$bf 660 | DATA BYTE $3b,$85,$d2,$b2,$ff,$6f,$9f,$00 661 | DATA BYTE $0f,$9f,$b1,$88,$e8,$bb,$0f,$b1 662 | DATA BYTE $b1,$63,$ce,$38,$f1,$34,$f7,$0f 663 | DATA BYTE $83,$f5,$bb,$04,$00,$ef,$0f,$3d 664 | DATA BYTE $8d,$fe,$06,$fa,$35,$00,$fd,$87 665 | DATA BYTE $b1,$e2,$de,$f8,$8c,$3d,$1f,$8c 666 | DATA BYTE $f4,$ff,$0d,$87,$c0,$61,$8a,$d6 667 | DATA BYTE $83,$5f,$01,$b6,$f6,$6d,$19,$e5 668 | DATA BYTE $9c,$f1,$5f,$2d,$90,$29,$dd,$36 669 | DATA BYTE $2e,$6d,$00,$45,$5b,$07,$71,$77 670 | DATA BYTE $6c,$34,$7d,$0b,$f6,$1f,$6f,$0f 671 | DATA BYTE $06,$fb,$c5,$96,$c9,$f3,$c1,$d8 672 | DATA BYTE $bb,$78,$00,$d6,$0c,$fe,$02,$d3 673 | DATA BYTE $82,$fb,$0b,$c0,$fb,$66,$fb,$00 674 | DATA BYTE $d1,$3f,$a6,$f9,$17,$f5,$2f,$00 675 | DATA BYTE $dc,$6a,$ef,$9b,$7a,$68,$d6,$00 676 | DATA BYTE $7a,$f2,$b7,$fc,$ff,$1a,$5f,$04 677 | DATA BYTE $05,$16,$ff,$27,$ff,$74,$46,$8b 678 | DATA BYTE $f8,$e6,$0b,$43,$02,$3f,$05,$bc 679 | DATA BYTE $00,$1c,$eb,$00,$79,$92,$89,$07 680 | DATA BYTE $fb,$7c,$fb,$07,$e1,$af,$f9,$09 681 | DATA BYTE $eb,$e2,$fe,$6e,$05,$f9,$01,$78 682 | DATA BYTE $04,$f5,$18,$00,$fb,$d3,$04,$4e 683 | DATA BYTE $05,$07,$e0,$fd,$a8,$35,$03,$f9 684 | DATA BYTE $37,$41,$af,$8f,$87,$7f,$3f,$00 685 | DATA BYTE $b4,$37,$fc,$2c,$e3,$0e,$f8,$7a 686 | DATA BYTE $bb,$59,$65,$d3,$f4,$84,$18,$43 687 | DATA BYTE $43,$f8,$01,$c4,$54,$54,$41,$fa 688 | DATA BYTE $66,$00,$3c,$7d,$03,$0d,$b1,$e9 689 | DATA BYTE $75,$ff,$fb,$1b,$00,$41,$51,$5b 690 | DATA BYTE $00,$29,$7c,$07,$be,$2c,$eb,$67 691 | DATA BYTE $de,$81,$78,$ec,$be,$f1,$0d,$0b 692 | DATA BYTE $ee,$c7,$0a,$f1,$96,$0f,$0c,$b8 693 | DATA BYTE $af,$6e,$e6,$03,$f8,$dd,$9a,$71 694 | DATA BYTE $ec,$8f,$3a,$15,$96,$2b,$6f,$a3 695 | DATA BYTE $f5,$18,$82,$88,$c4,$ef,$35,$fb 696 | DATA BYTE $00,$73,$37,$34,$0b,$0e,$f8,$d8 697 | DATA BYTE $35,$be,$68,$91,$1f,$a0,$00,$9b 698 | DATA BYTE $66,$75,$00,$cd,$1d,$51,$c0,$f7 699 | DATA BYTE $e5,$93,$dc,$ff,$0d,$64,$f5,$fb 700 | DATA BYTE $12,$43,$8d,$e3,$a7,$ef,$29,$8e 701 | DATA BYTE $b3,$af,$9f,$86,$87,$e4,$9b,$00 702 | DATA BYTE $79,$97,$f2,$9b,$75,$c1,$87,$83 703 | DATA BYTE $f2,$b1,$00,$fc,$fc,$00,$de,$1b 704 | DATA BYTE $ec,$ea,$81,$bc,$c4,$bf,$c1,$fa 705 | DATA BYTE $ae,$9a,$00,$02,$fa,$43,$01,$79 706 | DATA BYTE $75,$00,$83,$a7,$2f,$6c,$51,$01 707 | DATA BYTE $83,$ad,$9b,$f0,$e0,$fc,$de,$81 708 | DATA BYTE $19,$05,$f1,$f1,$8f,$db,$07,$cd 709 | DATA BYTE $f1,$5d,$08,$0b,$0f,$ec,$87,$b0 710 | DATA BYTE $81,$b6,$b6,$00,$d3,$0d,$97,$fb 711 | DATA BYTE $fb,$87,$7c,$16,$fe,$ff,$0d,$30 712 | DATA BYTE $2f,$98,$77,$70,$fb,$b5,$3f,$09 713 | DATA BYTE $41,$8f,$69,$71,$28,$04,$f8,$00 714 | DATA BYTE $e5,$ed,$00,$03,$fc,$9e,$6b,$51 715 | DATA BYTE $cf,$32,$fe,$93,$ff,$fe,$00,$fc 716 | DATA BYTE $23,$d6,$89,$56,$a6,$8e,$05,$b1 717 | DATA BYTE $fc,$0c,$8e,$ef,$47,$fd,$dc,$af 718 | DATA BYTE $fd,$ac,$16,$01,$fa,$0b,$27,$eb 719 | DATA BYTE $af,$f8,$8d,$70,$b1,$db,$41,$f8 720 | DATA BYTE $00,$f1,$de,$85,$7d,$70,$87,$5e 721 | DATA BYTE $41,$36,$ee,$06,$f9,$05,$fb,$05 722 | DATA BYTE $d1,$f4,$bd,$bf,$6c,$f1,$0c,$ea 723 | DATA BYTE $39,$15,$d9,$c4,$e4,$03,$f4,$6f 724 | DATA BYTE $fe,$f7,$00,$85,$fc,$f0,$85,$ec 725 | DATA BYTE $fd,$55,$b7,$5f,$67,$7f,$e0,$e3 726 | DATA BYTE $f8,$79,$bf,$db,$74,$95,$81,$3f 727 | DATA BYTE $1f,$87,$86,$ac,$71,$f4,$da,$0e 728 | DATA BYTE $01,$df,$cb,$00,$42,$d9,$9f,$7e 729 | DATA BYTE $17,$60,$74,$84,$a6,$65,$00,$c4 730 | DATA BYTE $2c,$df,$00,$43,$e9,$d9,$d8,$99 731 | DATA BYTE $7d,$a8,$8f,$d1,$41,$f9,$84,$75 732 | DATA BYTE $fb,$07,$53,$a3,$fb,$c2,$fa,$06 733 | DATA BYTE $00,$d7,$4b,$97,$c2,$fc,$d0,$a9 734 | DATA BYTE $70,$85,$d5,$a9,$00,$03,$0e,$a7 735 | DATA BYTE $c7,$84,$aa,$85,$ec,$c3,$95,$b1 736 | DATA BYTE $b9,$76,$06,$c9,$fb,$b8,$f5,$1f 737 | DATA BYTE $c7,$82,$f4,$3a,$f4,$0c,$a5,$00 738 | DATA BYTE $c0,$f8,$f1,$88,$5e,$51,$2d,$91 739 | DATA BYTE $21,$b7,$3e,$76,$51,$06,$fe,$13 740 | DATA BYTE $fd,$e1,$c9,$86,$dd,$3d,$c7,$b6 741 | DATA BYTE $99,$c5,$eb,$07,$ff,$40,$00,$ef 742 | DATA BYTE $a9,$d3,$00,$ba,$09,$00,$07,$ff 743 | DATA BYTE $ff,$ff,$ff,$c0 744 | -------------------------------------------------------------------------------- /examples/bank.bas: -------------------------------------------------------------------------------- 1 | rem 2 | rem Bank-switching example 3 | rem by Oscar Toledo G. http://nanochess.org 4 | rem Apr/27/2024 5 | rem 6 | 7 | BANK ROM 128 ' Select a 128KB target ROM size. 8 | ' Now it is in bank 0. 9 | 10 | PLAY FULL 11 | BANK SELECT 1 ' Select bank 1 to access. 12 | PLAY tune_2 13 | 14 | BANK SELECT 2 ' Select bank 2 to access. 15 | 16 | ' Notice bank 2 is selected, but the 17 | ' music is being played from bank 1. 18 | 19 | MODE 1 20 | SCREEN DISABLE 21 | DEFINE VRAM PLETTER $0000,$1800,image_bitmap 22 | DEFINE VRAM PLETTER $2000,$1800,image_color 23 | SCREEN ENABLE 24 | 25 | WHILE 1: WEND 26 | 27 | BANK 1 ' Start of bank 1 data 28 | 29 | ' Mecha-8 level 5: alone 30 | ' Fragment 31 | tune_2: DATA BYTE 5 32 | MUSIC G5#Y,C3#,-,M1 33 | MUSIC S,S,-,M2 34 | MUSIC F5#,G3#,-,M2 35 | MUSIC S,S,-,M2 36 | MUSIC E5,C3#,-,M1 37 | MUSIC S,S,-,M2 38 | MUSIC D5#,G3#,-,M2 39 | MUSIC S,S,-,M2 40 | MUSIC E5,C3#,-,M1 41 | MUSIC S,S,-,M2 42 | MUSIC F5#,G3#,-,M2 43 | MUSIC S,S,-,M2 44 | MUSIC G5#,C3#,-,M1 45 | MUSIC S,S,-,M2 46 | MUSIC S,G3#,-,M2 47 | MUSIC S,S,-,M2 48 | MUSIC S,C3#,-,M1 49 | MUSIC S,S,-,M2 50 | MUSIC C5#,G3#,-,M2 51 | MUSIC -,S,-,M2 52 | MUSIC G5#,C3#,-,M1 53 | MUSIC S,S,-,M2 54 | MUSIC E5,G3#,-,M2 55 | MUSIC -,S,-,M2 56 | MUSIC F5#,B2,-,M1 57 | MUSIC S,S,-,M2 58 | MUSIC S,F3#,-,M2 59 | MUSIC S,S,-,M2 60 | MUSIC S,B2,-,M1 61 | MUSIC S,S,-,M2 62 | MUSIC -,F3#,-,M2 63 | MUSIC -,S,-,M2 64 | MUSIC -,B2,-,M1 65 | MUSIC -,S,-,M2 66 | MUSIC -,F3#,-,M2 67 | MUSIC -,S,-,M2 68 | MUSIC -,B2,-,M1 69 | MUSIC -,S,-,M2 70 | MUSIC -,F3#,-,M1 71 | MUSIC -,S,-,M2 72 | MUSIC C5#,B2,-,M1 73 | MUSIC S,S,-,M2 74 | MUSIC F5#,F3#,-,M1 75 | MUSIC S,S,-,M2 76 | MUSIC C5#,B2,-,M1 77 | MUSIC S,S,-,M2 78 | MUSIC E5,A2,-,M1 79 | MUSIC S,S,-,M2 80 | MUSIC S,E3,-,M1 81 | MUSIC S,S,-,M2 82 | MUSIC S,A2,-,M1 83 | MUSIC S,S,-,M2 84 | MUSIC S,E3,-,M1 85 | MUSIC S,S,-,M2 86 | MUSIC S,A2,-,M1 87 | MUSIC S,S,-,M2 88 | MUSIC S,E3,-,M1 89 | MUSIC S,S,-,M2 90 | MUSIC S,A2,-,M1 91 | MUSIC S,S,-,M2 92 | MUSIC F5#,E3,-,M1 93 | MUSIC S,S,-,M2 94 | MUSIC E5,A2,-,M2 95 | MUSIC S,S,-,M2 96 | MUSIC D5#,E3,-,M1 97 | MUSIC S,S,-,M2 98 | MUSIC S,A2,-,M2 99 | MUSIC S,S,-,M2 100 | MUSIC C5,G2#,-,M1 101 | MUSIC S,S,-,M2 102 | MUSIC S,D3#,-,M2 103 | MUSIC S,S,-,M2 104 | MUSIC S,G2#,-,M1 105 | MUSIC S,S,-,M2 106 | MUSIC S,D3#,-,M2 107 | MUSIC S,S,-,M2 108 | MUSIC S,G2#,-,M1 109 | MUSIC S,S,-,M2 110 | MUSIC -,D3#,-,M2 111 | MUSIC -,S,-,M2 112 | MUSIC -,G2#,-,M1 113 | MUSIC -,S,-,M2 114 | MUSIC -,D3#,-,M2 115 | MUSIC -,S,-,M2 116 | MUSIC -,G2#,-,M1 117 | MUSIC -,S,-,M2 118 | MUSIC -,D3#,-,M1 119 | MUSIC -,S,-,M3 120 | MUSIC -,G2#,-,M1 121 | MUSIC -,S,-,M2 122 | MUSIC -,D3#,-,M1 123 | MUSIC -,S,-,M3 124 | MUSIC -,G2#,-,M1 125 | MUSIC -,S,-,M1 126 | MUSIC -,D3#,-,M1 127 | MUSIC -,S,-,M1 128 | MUSIC REPEAT 129 | 130 | BANK 2 ' Start of bank 2 data. 131 | 132 | image_bitmap: 133 | DATA BYTE $61,$bf,$5f,$ff,$df,$ff,$80,$00 134 | DATA BYTE $70,$10,$3e,$0e,$87,$00,$c0,$e0 135 | DATA BYTE $fc,$7f,$1f,$07,$03,$00,$18,$00 136 | DATA BYTE $02,$40,$12,$55,$0e,$aa,$55,$7f 137 | DATA BYTE $7f,$1b,$a3,$00,$09,$ea,$fd,$68 138 | DATA BYTE $09,$22,$e0,$c4,$07,$c0,$d5,$aa 139 | DATA BYTE $d4,$0f,$01,$00,$1d,$0f,$7f,$8e 140 | DATA BYTE $07,$8f,$90,$01,$3a,$99,$f9,$fc 141 | DATA BYTE $0d,$fe,$9e,$fe,$fe,$20,$33,$03 142 | DATA BYTE $ed,$67,$c8,$cc,$00,$88,$0c,$df 143 | DATA BYTE $cf,$e7,$e7,$08,$44,$d8,$01,$8a 144 | DATA BYTE $df,$01,$8a,$ff,$8a,$10,$fb,$40 145 | DATA BYTE $03,$30,$00,$05,$01,$45,$ff,$df 146 | DATA BYTE $c3,$00,$fc,$f8,$05,$00,$f0,$f9 147 | DATA BYTE $d0,$5b,$e0,$01,$45,$cc,$55,$01 148 | DATA BYTE $9f,$1f,$9f,$55,$3f,$5e,$38,$c3 149 | DATA BYTE $18,$f0,$af,$0e,$00,$8f,$1f,$1f 150 | DATA BYTE $01,$18,$28,$51,$a0,$41,$82,$07 151 | DATA BYTE $5b,$09,$27,$b1,$01,$a8,$50,$90 152 | DATA BYTE $1f,$8f,$11,$50,$08,$07,$40,$00 153 | DATA BYTE $90,$00,$59,$bf,$7f,$ea,$03,$d5 154 | DATA BYTE $bf,$fe,$7e,$d5,$ea,$80,$01,$55 155 | DATA BYTE $a2,$c0,$a2,$46,$e0,$0f,$e6,$e4 156 | DATA BYTE $e4,$aa,$03,$c9,$01,$01,$8f,$83 157 | DATA BYTE $81,$80,$80,$b0,$85,$80,$aa,$3f 158 | DATA BYTE $aa,$c4,$8a,$d4,$aa,$42,$d1,$01 159 | DATA BYTE $bf,$fc,$fc,$33,$c2,$04,$df,$04 160 | DATA BYTE $b1,$14,$0f,$b2,$2d,$e3,$82,$93 161 | DATA BYTE $03,$34,$e3,$f1,$09,$0e,$0f,$80 162 | DATA BYTE $84,$88,$01,$4b,$df,$1f,$08,$01 163 | DATA BYTE $81,$ff,$40,$30,$01,$fb,$00,$23 164 | DATA BYTE $41,$03,$03,$40,$22,$40,$02,$54 165 | DATA BYTE $93,$4f,$07,$37,$07,$d0,$e4,$19 166 | DATA BYTE $7f,$01,$ae,$30,$00,$fe,$03,$80 167 | DATA BYTE $04,$60,$ff,$01,$80,$c4,$aa,$60 168 | DATA BYTE $fc,$c3,$68,$c9,$10,$db,$a3,$f7 169 | DATA BYTE $00,$fe,$e0,$84,$97,$44,$88,$02 170 | DATA BYTE $00,$1f,$55,$0e,$0c,$a2,$4e,$00 171 | DATA BYTE $1f,$bf,$3f,$7e,$7c,$f8,$f1,$e3 172 | DATA BYTE $68,$c7,$85,$0f,$d5,$00,$f5,$54 173 | DATA BYTE $a0,$00,$01,$80,$51,$02,$4f,$28 174 | DATA BYTE $70,$ec,$03,$f8,$a8,$40,$80,$c7 175 | DATA BYTE $07,$04,$a8,$00,$07,$3a,$80,$50 176 | DATA BYTE $47,$b1,$22,$8a,$41,$07,$20,$2a 177 | DATA BYTE $55,$f9,$00,$be,$75,$aa,$1f,$82 178 | DATA BYTE $51,$a2,$e4,$c0,$fb,$04,$ea,$0a 179 | DATA BYTE $44,$aa,$7f,$00,$3f,$c4,$1f,$80 180 | DATA BYTE $2f,$c0,$84,$00,$a0,$54,$0f,$ac 181 | DATA BYTE $09,$17,$01,$22,$02,$27,$e8,$e0 182 | DATA BYTE $d1,$ea,$e0,$00,$0c,$fd,$7f,$3d 183 | DATA BYTE $fc,$00,$41,$54,$7f,$f2,$f7,$e3 184 | DATA BYTE $54,$22,$4f,$0a,$1f,$04,$e7,$cf 185 | DATA BYTE $07,$83,$18,$96,$06,$47,$02,$18 186 | DATA BYTE $ff,$c8,$44,$f7,$18,$b1,$38,$fb 187 | DATA BYTE $18,$b7,$12,$03,$88,$fd,$01,$db 188 | DATA BYTE $80,$fb,$10,$05,$ff,$54,$01,$10 189 | DATA BYTE $54,$14,$61,$54,$87,$83,$01,$01 190 | DATA BYTE $3f,$3f,$bf,$c0,$e1,$70,$fe,$fb 191 | DATA BYTE $56,$70,$47,$e8,$ff,$09,$f0,$6f 192 | DATA BYTE $82,$10,$06,$fd,$f9,$be,$8c,$f3 193 | DATA BYTE $aa,$57,$01,$82,$97,$99,$20,$75 194 | DATA BYTE $7a,$fb,$7b,$48,$7b,$0f,$a0,$d7 195 | DATA BYTE $50,$44,$95,$4a,$11,$07,$03,$4d 196 | DATA BYTE $00,$37,$a3,$d7,$8e,$f2,$fa,$f3 197 | DATA BYTE $fa,$18,$f1,$fa,$f5,$fb,$06,$50 198 | DATA BYTE $80,$10,$e9,$02,$05,$0a,$10,$10 199 | DATA BYTE $80,$00,$01,$f0,$c0,$80,$11,$7f 200 | DATA BYTE $0a,$15,$01,$1f,$3f,$35,$11,$8a 201 | DATA BYTE $0c,$8d,$ab,$57,$ac,$25,$05,$27 202 | DATA BYTE $08,$45,$a8,$44,$00,$01,$01,$8a 203 | DATA BYTE $05,$01,$2a,$0a,$82,$54,$51,$a0 204 | DATA BYTE $21,$5d,$0a,$45,$a7,$2b,$07,$a2 205 | DATA BYTE $22,$0b,$11,$63,$37,$77,$e2,$01 206 | DATA BYTE $02,$55,$e0,$1e,$a3,$22,$e5,$ea 207 | DATA BYTE $5d,$01,$c6,$ee,$fc,$3e,$0a,$0a 208 | DATA BYTE $0c,$06,$b2,$11,$01,$7f,$bf,$9f 209 | DATA BYTE $02,$d0,$e8,$d5,$ff,$14,$f1,$00 210 | DATA BYTE $67,$55,$82,$55,$f0,$ab,$f0,$01 211 | DATA BYTE $20,$50,$c2,$b5,$d0,$00,$08,$40 212 | DATA BYTE $e0,$01,$88,$41,$14,$55,$83,$fb 213 | DATA BYTE $28,$01,$23,$99,$f0,$ee,$04,$9f 214 | DATA BYTE $cf,$fe,$d7,$b1,$af,$20,$78,$00 215 | DATA BYTE $0f,$5f,$af,$07,$ef,$00,$e0,$fb 216 | DATA BYTE $3a,$e0,$c0,$00,$ff,$33,$ae,$d5 217 | DATA BYTE $0f,$01,$fd,$ef,$3c,$57,$01,$02 218 | DATA BYTE $50,$a2,$41,$8f,$1e,$be,$93,$40 219 | DATA BYTE $f7,$eb,$e7,$af,$00,$5f,$eb,$dd 220 | DATA BYTE $eb,$cd,$eb,$ed,$aa,$25,$e3,$c8 221 | DATA BYTE $8d,$c2,$9f,$11,$28,$ff,$28,$e5 222 | DATA BYTE $08,$0c,$1c,$0c,$d3,$0e,$ff,$50 223 | DATA BYTE $2b,$67,$2a,$01,$cc,$37,$bf,$eb 224 | DATA BYTE $18,$f9,$0c,$ab,$df,$d8,$18,$dd 225 | DATA BYTE $00,$54,$aa,$14,$a2,$05,$a0,$60 226 | DATA BYTE $d0,$a3,$a4,$01,$95,$94,$8f,$0a 227 | DATA BYTE $04,$28,$28,$55,$11,$af,$81,$0a 228 | DATA BYTE $05,$08,$14,$8a,$08,$0e,$40,$82 229 | DATA BYTE $41,$cf,$00,$22,$41,$02,$01,$22 230 | DATA BYTE $45,$69,$22,$3b,$16,$fb,$10,$fd 231 | DATA BYTE $51,$80,$03,$0e,$08,$7d,$2a,$15 232 | DATA BYTE $51,$9e,$bf,$01,$66,$af,$07,$81 233 | DATA BYTE $ac,$a6,$07,$c3,$63,$0c,$06,$03 234 | DATA BYTE $4a,$09,$0f,$c1,$32,$20,$10,$23 235 | DATA BYTE $31,$08,$41,$01,$01,$0c,$9f,$ff 236 | DATA BYTE $11,$01,$04,$55,$08,$29,$c7,$c7 237 | DATA BYTE $cf,$81,$51,$5f,$1f,$78,$7c,$07 238 | DATA BYTE $01,$38,$0c,$2c,$04,$03,$fb,$03 239 | DATA BYTE $f1,$8f,$53,$fc,$f4,$10,$f4,$80 240 | DATA BYTE $fb,$73,$47,$f1,$e9,$13,$ec,$30 241 | DATA BYTE $d9,$a0,$b3,$23,$10,$a0,$e6,$90 242 | DATA BYTE $c6,$15,$09,$23,$3d,$af,$89,$00 243 | DATA BYTE $03,$fb,$f7,$fb,$f5,$eb,$e5,$e9 244 | DATA BYTE $31,$c1,$80,$00,$e0,$e2,$00,$0c 245 | DATA BYTE $00,$c0,$c3,$98,$87,$ab,$55,$98 246 | DATA BYTE $01,$7f,$00,$ea,$47,$f5,$93,$0a 247 | DATA BYTE $eb,$eb,$ef,$43,$f8,$e0,$40,$9f 248 | DATA BYTE $10,$38,$71,$f8,$01,$cd,$cd,$75 249 | DATA BYTE $d8,$ad,$24,$af,$96,$8d,$d1,$32 250 | DATA BYTE $ea,$d4,$25,$60,$00,$f3,$41,$a7 251 | DATA BYTE $30,$04,$08,$08,$82,$40,$06,$0a 252 | DATA BYTE $01,$28,$05,$20,$24,$bd,$13,$8a 253 | DATA BYTE $43,$51,$99,$ce,$af,$03,$83,$a6 254 | DATA BYTE $9d,$e7,$3f,$6b,$37,$b2,$01,$af 255 | DATA BYTE $e7,$1d,$10,$07,$08,$ba,$42,$a9 256 | DATA BYTE $8f,$10,$cf,$c7,$ff,$fb,$0b,$05 257 | DATA BYTE $ff,$01,$03,$e2,$1f,$04,$3f,$be 258 | DATA BYTE $14,$bf,$0f,$bf,$25,$2b,$07,$90 259 | DATA BYTE $35,$23,$17,$82,$ff,$c3,$60,$e2 260 | DATA BYTE $f5,$f0,$f1,$81,$05,$e7,$ef,$aa 261 | DATA BYTE $cf,$cf,$d0,$8b,$fe,$29,$aa,$fe 262 | DATA BYTE $00,$f3,$f1,$ab,$21,$c5,$06,$15 263 | DATA BYTE $4d,$cd,$3d,$3d,$cc,$d9,$f3,$01 264 | DATA BYTE $e5,$c7,$c3,$c2,$c2,$e2,$51,$83 265 | DATA BYTE $a7,$c6,$a8,$c8,$08,$60,$71,$70 266 | DATA BYTE $51,$f5,$c2,$60,$40,$ce,$00,$f3 267 | DATA BYTE $6e,$e3,$58,$f9,$1d,$2a,$d7,$04 268 | DATA BYTE $15,$ae,$91,$af,$51,$88,$73,$2a 269 | DATA BYTE $01,$03,$b8,$1c,$18,$3c,$1c,$3e 270 | DATA BYTE $01,$fe,$f0,$b7,$98,$fc,$e5,$f1 271 | DATA BYTE $01,$a8,$54,$12,$ad,$e0,$dd,$11 272 | DATA BYTE $f5,$a2,$d5,$86,$89,$3b,$60,$1f 273 | DATA BYTE $bb,$d0,$2b,$99,$f4,$e0,$ce,$17 274 | DATA BYTE $00,$00,$72,$80,$c3,$ec,$f9,$5b 275 | DATA BYTE $ec,$01,$c7,$62,$e3,$00,$e1,$00 276 | DATA BYTE $82,$fb,$eb,$1d,$45,$9f,$50,$cf 277 | DATA BYTE $03,$f9,$54,$c3,$c3,$a0,$09,$fd 278 | DATA BYTE $3b,$17,$0b,$03,$58,$ff,$15,$f0 279 | DATA BYTE $00,$03,$06,$d0,$44,$25,$f1,$f3 280 | DATA BYTE $24,$a2,$c5,$b1,$99,$de,$03,$8f 281 | DATA BYTE $af,$c0,$f3,$e8,$b2,$18,$c5,$b0 282 | DATA BYTE $d7,$d0,$00,$89,$88,$a2,$40,$a2 283 | DATA BYTE $a3,$20,$d9,$31,$15,$aa,$c3,$88 284 | DATA BYTE $aa,$0c,$cf,$02,$00,$41,$a0,$10 285 | DATA BYTE $91,$31,$0a,$5f,$01,$59,$e3,$1f 286 | DATA BYTE $28,$2a,$d9,$fc,$d5,$20,$e0,$70 287 | DATA BYTE $60,$70,$36,$20,$78,$85,$08,$90 288 | DATA BYTE $71,$ed,$91,$bc,$a5,$c5,$57,$0e 289 | DATA BYTE $1f,$01,$55,$b8,$00,$1a,$cd,$f8 290 | DATA BYTE $cf,$35,$80,$25,$dc,$57,$05,$0f 291 | DATA BYTE $c5,$14,$9f,$c5,$20,$57,$eb,$18 292 | DATA BYTE $e1,$e3,$00,$63,$63,$32,$fc,$ea 293 | DATA BYTE $f7,$ef,$f7,$46,$fa,$ce,$10,$c1 294 | DATA BYTE $db,$47,$81,$00,$83,$03,$05,$f9 295 | DATA BYTE $29,$0e,$a7,$23,$05,$40,$cb,$b8 296 | DATA BYTE $18,$55,$8f,$01,$a7,$cd,$68,$5f 297 | DATA BYTE $9b,$7c,$e5,$b6,$40,$96,$07,$ad 298 | DATA BYTE $b6,$00,$07,$20,$7f,$07,$f9,$69 299 | DATA BYTE $c1,$00,$80,$da,$01,$cd,$03,$66 300 | DATA BYTE $c7,$00,$1b,$9b,$55,$4b,$83,$c3 301 | DATA BYTE $c3,$0b,$4f,$bf,$eb,$2e,$e5,$2e 302 | DATA BYTE $1b,$5f,$7f,$c9,$ce,$f7,$49,$9a 303 | DATA BYTE $c3,$ef,$e7,$e2,$c5,$6a,$c5,$02 304 | DATA BYTE $fb,$ff,$fb,$9f,$fb,$fd,$07,$00 305 | DATA BYTE $10,$51,$81,$51,$d1,$d0,$e1,$f1 306 | DATA BYTE $44,$a8,$93,$f9,$18,$f9,$18,$fc 307 | DATA BYTE $d5,$c0,$02,$45,$8a,$4f,$2a,$06 308 | DATA BYTE $ff,$1c,$3d,$e8,$71,$36,$29,$74 309 | DATA BYTE $55,$20,$e0,$00,$f9,$02,$fa,$f4 310 | DATA BYTE $a8,$e1,$63,$7b,$dd,$50,$7c,$7e 311 | DATA BYTE $3a,$3e,$1c,$3e,$3d,$03,$00,$07 312 | DATA BYTE $b2,$fd,$b1,$09,$f3,$99,$a0,$21 313 | DATA BYTE $97,$63,$b5,$7c,$83,$0d,$57,$9a 314 | DATA BYTE $07,$ba,$24,$af,$01,$e8,$ab,$5b 315 | DATA BYTE $a7,$4a,$fe,$fd,$a8,$8c,$83,$00 316 | DATA BYTE $a8,$4e,$04,$8d,$06,$19,$0e,$1e 317 | DATA BYTE $1e,$3c,$67,$00,$34,$04,$fd,$45 318 | DATA BYTE $fc,$e9,$b5,$44,$05,$65,$20,$b0 319 | DATA BYTE $85,$50,$a4,$24,$27,$b9,$29,$73 320 | DATA BYTE $0a,$e7,$71,$55,$9b,$d0,$0f,$b7 321 | DATA BYTE $75,$01,$f0,$38,$d5,$73,$c3,$a4 322 | DATA BYTE $ef,$81,$52,$c4,$0d,$23,$df,$f9 323 | DATA BYTE $0a,$ee,$94,$41,$44,$94,$f6,$2e 324 | DATA BYTE $4c,$02,$03,$93,$6b,$bc,$b2,$e7 325 | DATA BYTE $e8,$78,$83,$83,$0f,$1f,$38,$b1 326 | DATA BYTE $3f,$57,$01,$3e,$56,$36,$10,$02 327 | DATA BYTE $10,$e7,$ad,$bf,$96,$93,$6a,$02 328 | DATA BYTE $1f,$ae,$5f,$f2,$f5,$f6,$8b,$11 329 | DATA BYTE $d5,$ba,$f5,$28,$0b,$8a,$8b,$54 330 | DATA BYTE $5d,$a3,$20,$99,$6f,$f0,$00,$20 331 | DATA BYTE $b5,$80,$e2,$63,$62,$73,$97,$31 332 | DATA BYTE $00,$95,$f8,$b3,$ee,$09,$9f,$9a 333 | DATA BYTE $d5,$18,$3a,$af,$02,$fc,$00,$30 334 | DATA BYTE $21,$8b,$8a,$44,$00,$2e,$df,$4e 335 | DATA BYTE $03,$07,$e8,$4d,$12,$28,$14,$43 336 | DATA BYTE $f0,$c6,$4c,$01,$00,$f1,$d8,$61 337 | DATA BYTE $77,$a0,$50,$09,$99,$f8,$53,$2a 338 | DATA BYTE $75,$ee,$c9,$13,$d7,$02,$d4,$ad 339 | DATA BYTE $90,$23,$57,$01,$1e,$3f,$22,$99 340 | DATA BYTE $ab,$c5,$da,$7f,$27,$f7,$85,$df 341 | DATA BYTE $8b,$af,$e7,$85,$20,$02,$f3,$f4 342 | DATA BYTE $e7,$48,$b6,$61,$97,$a6,$b3,$01 343 | DATA BYTE $2d,$40,$c0,$99,$b2,$ed,$0f,$21 344 | DATA BYTE $2f,$07,$81,$62,$e1,$e1,$98,$e3 345 | DATA BYTE $e7,$00,$f3,$00,$f3,$f7,$bf,$15 346 | DATA BYTE $70,$78,$7d,$71,$05,$61,$55,$ef 347 | DATA BYTE $55,$28,$ad,$f6,$6d,$7e,$b3,$64 348 | DATA BYTE $b9,$25,$66,$d8,$3d,$88,$30,$d9 349 | DATA BYTE $4d,$20,$b1,$bf,$92,$d0,$00,$cb 350 | DATA BYTE $41,$9b,$0d,$07,$fc,$22,$07,$08 351 | DATA BYTE $a5,$07,$53,$18,$55,$7a,$75,$01 352 | DATA BYTE $55,$00,$87,$01,$ae,$5d,$ae,$5c 353 | DATA BYTE $a8,$59,$ea,$ea,$80,$da,$70,$d0 354 | DATA BYTE $03,$10,$04,$1f,$18,$38,$18,$83 355 | DATA BYTE $d7,$c0,$e6,$bc,$8f,$50,$7a,$45 356 | DATA BYTE $7a,$f6,$14,$fc,$b1,$d3,$00,$00 357 | DATA BYTE $5c,$00,$30,$2a,$14,$ad,$94,$05 358 | DATA BYTE $01,$ed,$0c,$0b,$d5,$21,$ab,$7f 359 | DATA BYTE $f8,$19,$b0,$f4,$fc,$17,$4d,$c0 360 | DATA BYTE $3f,$c7,$95,$15,$2e,$b6,$b1,$14 361 | DATA BYTE $6d,$5d,$08,$b9,$7e,$01,$6a,$e4 362 | DATA BYTE $d5,$81,$fc,$f5,$af,$cc,$f1,$80 363 | DATA BYTE $c6,$97,$4f,$a0,$01,$44,$e0,$17 364 | DATA BYTE $f7,$51,$01,$11,$c6,$fb,$0c,$07 365 | DATA BYTE $71,$01,$60,$b1,$64,$8a,$c7,$2a 366 | DATA BYTE $60,$07,$a7,$80,$1e,$1f,$fa,$1a 367 | DATA BYTE $45,$00,$9d,$81,$b9,$7c,$c6,$a3 368 | DATA BYTE $c0,$f8,$7c,$fc,$70,$38,$40,$01 369 | DATA BYTE $00,$18,$18,$1c,$1c,$39,$10,$c0 370 | DATA BYTE $e4,$fc,$da,$40,$fc,$a2,$08,$c4 371 | DATA BYTE $c6,$ce,$3e,$f1,$c7,$dc,$22,$14 372 | DATA BYTE $b0,$bf,$4d,$8e,$b4,$90,$04,$06 373 | DATA BYTE $04,$0e,$04,$f2,$59,$99,$c8,$03 374 | DATA BYTE $05,$aa,$5f,$23,$1f,$c0,$f7,$9d 375 | DATA BYTE $9b,$fe,$9e,$ce,$3c,$9a,$00,$0c 376 | DATA BYTE $46,$b0,$f8,$80,$38,$ed,$a9,$00 377 | DATA BYTE $33,$02,$4f,$9f,$01,$9d,$0e,$03 378 | DATA BYTE $94,$4f,$25,$92,$10,$ff,$3c,$08 379 | DATA BYTE $1f,$64,$13,$53,$5b,$02,$39,$04 380 | DATA BYTE $ea,$d3,$95,$05,$98,$7b,$6c,$f7 381 | DATA BYTE $e3,$18,$ef,$ef,$05,$18,$ed,$40 382 | DATA BYTE $f1,$79,$40,$d7,$34,$c1,$98,$e0 383 | DATA BYTE $a0,$ff,$81,$ef,$81,$03,$0f,$47 384 | DATA BYTE $91,$09,$df,$22,$11,$4b,$2b,$ad 385 | DATA BYTE $d3,$13,$6f,$06,$0b,$01,$0e,$05 386 | DATA BYTE $17,$a3,$01,$c7,$65,$3f,$c3,$a2 387 | DATA BYTE $0f,$33,$5c,$00,$a8,$30,$c1,$e2 388 | DATA BYTE $75,$40,$90,$bf,$20,$f0,$ec,$b6 389 | DATA BYTE $0c,$fa,$1f,$16,$06,$b5,$a8,$7f 390 | DATA BYTE $fb,$17,$62,$1f,$f0,$c6,$fb,$a8 391 | DATA BYTE $6d,$9c,$5b,$07,$97,$94,$81,$04 392 | DATA BYTE $9c,$9b,$1e,$1d,$24,$0e,$0e,$af 393 | DATA BYTE $80,$ab,$20,$61,$23,$e3,$54,$bd 394 | DATA BYTE $88,$2e,$c1,$c3,$31,$3f,$60,$db 395 | DATA BYTE $f7,$20,$fa,$6e,$f2,$01,$ee,$0e 396 | DATA BYTE $3e,$c1,$85,$cf,$d9,$54,$c5,$af 397 | DATA BYTE $9d,$01,$98,$d9,$54,$e9,$4f,$11 398 | DATA BYTE $02,$a7,$57,$d1,$29,$4d,$a8,$8f 399 | DATA BYTE $d3,$8d,$24,$5f,$c7,$a7,$61,$45 400 | DATA BYTE $1f,$06,$fe,$57,$fd,$88,$1f,$c0 401 | DATA BYTE $cf,$b5,$3f,$bd,$0a,$dd,$49,$da 402 | DATA BYTE $0b,$55,$74,$40,$87,$f4,$df,$06 403 | DATA BYTE $1f,$ff,$e0,$40,$dc,$ed,$bf,$da 404 | DATA BYTE $be,$9a,$87,$5a,$05,$63,$47,$eb 405 | DATA BYTE $14,$09,$0e,$0c,$ef,$f7,$00,$76 406 | DATA BYTE $41,$a8,$38,$a0,$83,$b1,$8f,$d8 407 | DATA BYTE $60,$b7,$04,$e1,$f5,$00,$0b,$81 408 | DATA BYTE $1a,$9f,$9f,$5f,$4c,$6f,$11,$7f 409 | DATA BYTE $8c,$84,$b0,$08,$88,$18,$02,$bb 410 | DATA BYTE $48,$24,$22,$87,$54,$01,$61,$01 411 | DATA BYTE $28,$c1,$c3,$f8,$a7,$22,$96,$00 412 | DATA BYTE $13,$31,$20,$60,$02,$4b,$28,$c0 413 | DATA BYTE $48,$e2,$b2,$10,$d3,$12,$22,$65 414 | DATA BYTE $cb,$a2,$8b,$da,$89,$f2,$6b,$91 415 | DATA BYTE $fa,$00,$fb,$43,$18,$0c,$6d,$1d 416 | DATA BYTE $b0,$0f,$a9,$36,$01,$c0,$a5,$3c 417 | DATA BYTE $22,$44,$df,$5c,$01,$36,$60,$54 418 | DATA BYTE $9f,$e7,$ab,$6d,$a5,$a1,$ee,$7c 419 | DATA BYTE $0b,$c7,$87,$e3,$1f,$54,$22,$2d 420 | DATA BYTE $75,$c5,$46,$0a,$87,$07,$83,$95 421 | DATA BYTE $1d,$ef,$45,$31,$ab,$22,$45,$fc 422 | DATA BYTE $d7,$8f,$0a,$38,$c9,$f8,$50,$ba 423 | DATA BYTE $35,$07,$88,$03,$cf,$ff,$80,$af 424 | DATA BYTE $3f,$14,$94,$e1,$08,$14,$11,$28 425 | DATA BYTE $10,$ff,$93,$f6,$be,$a0,$f0,$dc 426 | DATA BYTE $2c,$bf,$bf,$c2,$a0,$00,$db,$31 427 | DATA BYTE $8c,$cc,$00,$9c,$00,$f9,$1b,$5f 428 | DATA BYTE $7f,$86,$00,$d5,$fa,$f5,$56,$21 429 | DATA BYTE $e3,$d7,$50,$ef,$cd,$d7,$a1,$7f 430 | DATA BYTE $ff,$8e,$27,$aa,$bf,$f7,$84,$80 431 | DATA BYTE $b1,$48,$10,$b1,$62,$eb,$a7,$49 432 | DATA BYTE $c5,$2d,$0f,$87,$00,$0b,$a3,$11 433 | DATA BYTE $49,$02,$06,$1e,$06,$88,$0b,$20 434 | DATA BYTE $b8,$c5,$f0,$30,$21,$06,$dc,$17 435 | DATA BYTE $e5,$9f,$f6,$00,$21,$9d,$54,$2a 436 | DATA BYTE $80,$d3,$08,$f0,$93,$74,$b5,$0d 437 | DATA BYTE $e8,$cf,$c9,$5b,$82,$ec,$00,$ab 438 | DATA BYTE $45,$40,$63,$5d,$65,$5e,$55,$4b 439 | DATA BYTE $01,$81,$b4,$3f,$aa,$18,$b1,$90 440 | DATA BYTE $fc,$f8,$87,$bd,$37,$bb,$70,$01 441 | DATA BYTE $bb,$f7,$03,$84,$f7,$fe,$c4,$d5 442 | DATA BYTE $73,$c0,$80,$5b,$3d,$27,$00,$9c 443 | DATA BYTE $00,$fc,$43,$27,$ed,$3c,$50,$ea 444 | DATA BYTE $ef,$b3,$af,$5f,$34,$8f,$fd,$fa 445 | DATA BYTE $d1,$30,$ab,$14,$89,$0f,$7f,$b1 446 | DATA BYTE $07,$9e,$68,$01,$07,$7f,$c7,$d3 447 | DATA BYTE $b8,$e9,$b8,$d0,$9d,$31,$d8,$bc 448 | DATA BYTE $ce,$01,$05,$a0,$fc,$1b,$f1,$7e 449 | DATA BYTE $0b,$cf,$44,$0d,$60,$bf,$bf,$f0 450 | DATA BYTE $ff,$38,$0a,$c7,$17,$1c,$00,$87 451 | DATA BYTE $af,$17,$d5,$37,$87,$c9,$d5,$c1 452 | DATA BYTE $ff,$d8,$00,$a8,$55,$1e,$1b,$a5 453 | DATA BYTE $30,$13,$61,$5b,$ff,$c1,$ba,$82 454 | DATA BYTE $91,$d0,$3c,$a8,$51,$e7,$14,$40 455 | DATA BYTE $ef,$50,$84,$f6,$20,$82,$85,$05 456 | DATA BYTE $9b,$c2,$cd,$3f,$0f,$cf,$82,$f5 457 | DATA BYTE $03,$63,$20,$05,$fe,$0d,$4b,$e8 458 | DATA BYTE $e6,$88,$96,$01,$03,$66,$82,$f8 459 | DATA BYTE $3f,$1f,$05,$a7,$ab,$80,$f7,$bf 460 | DATA BYTE $47,$5f,$92,$f2,$9f,$c5,$02,$a8 461 | DATA BYTE $10,$a5,$72,$a5,$68,$b5,$b8,$b1 462 | DATA BYTE $d8,$19,$7f,$25,$fe,$7f,$cd,$bf 463 | DATA BYTE $b6,$3e,$f5,$97,$39,$d7,$ac,$00 464 | DATA BYTE $d7,$10,$ef,$57,$05,$04,$98,$00 465 | DATA BYTE $05,$99,$e9,$2a,$e0,$10,$15,$a3 466 | DATA BYTE $c8,$60,$40,$00,$f8,$c0,$f7,$01 467 | DATA BYTE $f7,$02,$e2,$ff,$70,$dc,$07,$78 468 | DATA BYTE $78,$38,$38,$07,$ff,$17,$d3,$1e 469 | DATA BYTE $8b,$3e,$09,$11,$8f,$0e,$c4,$d6 470 | DATA BYTE $a0,$5e,$e3,$94,$2c,$be,$30,$5f 471 | DATA BYTE $37,$04,$f8,$43,$f4,$f3,$6a,$fd 472 | DATA BYTE $a8,$cd,$44,$14,$ef,$55,$d7,$60 473 | DATA BYTE $d9,$68,$1c,$88,$05,$4c,$26,$03 474 | DATA BYTE $09,$05,$1e,$90,$0d,$99,$9e,$c0 475 | DATA BYTE $ff,$11,$91,$ff,$27,$b3,$07,$f0 476 | DATA BYTE $d0,$8c,$2b,$c7,$f8,$09,$ea,$3f 477 | DATA BYTE $e3,$bd,$3e,$03,$05,$6f,$e0,$df 478 | DATA BYTE $c0,$e1,$c9,$97,$d8,$ef,$2c,$79 479 | DATA BYTE $93,$35,$75,$f3,$63,$82,$57,$8b 480 | DATA BYTE $0c,$8f,$aa,$75,$bc,$b1,$aa,$df 481 | DATA BYTE $85,$8a,$ee,$3e,$29,$f0,$31,$d9 482 | DATA BYTE $a7,$85,$06,$86,$84,$00,$09,$92 483 | DATA BYTE $c3,$00,$bf,$96,$00,$9d,$cc,$00 484 | DATA BYTE $08,$00,$d6,$ff,$a5,$08,$77,$84 485 | DATA BYTE $df,$a0,$20,$02,$7f,$c2,$04,$01 486 | DATA BYTE $f8,$54,$7f,$d7,$c6,$31,$8f,$0a 487 | DATA BYTE $fb,$fd,$bf,$d3,$22,$bf,$13,$7d 488 | DATA BYTE $be,$5d,$97,$63,$8f,$f4,$a7,$e7 489 | DATA BYTE $cd,$16,$a0,$51,$13,$98,$d5,$50 490 | DATA BYTE $0d,$a2,$54,$0a,$01,$94,$bf,$20 491 | DATA BYTE $10,$02,$08,$4c,$8e,$47,$a3,$11 492 | DATA BYTE $dd,$2c,$ae,$a4,$07,$87,$2d,$fd 493 | DATA BYTE $88,$c7,$f0,$01,$2a,$f1,$f3,$ff 494 | DATA BYTE $06,$ce,$fe,$1e,$0e,$0f,$d8,$00 495 | DATA BYTE $b3,$76,$1c,$71,$a3,$0f,$17,$1f 496 | DATA BYTE $b9,$31,$77,$ab,$f7,$39,$17,$ff 497 | DATA BYTE $e1,$00,$02,$17,$dd,$87,$19,$03 498 | DATA BYTE $ae,$5f,$d1,$d0,$f5,$4b,$8f,$18 499 | DATA BYTE $93,$75,$fb,$f7,$b1,$07,$83,$c1 500 | DATA BYTE $f5,$ba,$75,$e8,$50,$b0,$fb,$4f 501 | DATA BYTE $99,$b0,$07,$ba,$55,$c3,$89,$00 502 | DATA BYTE $c1,$e3,$03,$cf,$e2,$8f,$0c,$83 503 | DATA BYTE $20,$30,$00,$89,$d6,$b8,$fe,$03 504 | DATA BYTE $fe,$01,$80,$f8,$08,$78,$83,$87 505 | DATA BYTE $f9,$18,$a8,$38,$95,$11,$ef,$ff 506 | DATA BYTE $9e,$ff,$89,$01,$fa,$fd,$fe,$9a 507 | DATA BYTE $01,$e3,$cf,$64,$cd,$51,$25,$b3 508 | DATA BYTE $ad,$0a,$8d,$dc,$37,$79,$08,$d9 509 | DATA BYTE $28,$e0,$d3,$cd,$50,$20,$c5,$17 510 | DATA BYTE $1e,$bb,$e8,$0c,$e9,$4c,$10,$10 511 | DATA BYTE $e2,$0d,$1b,$ef,$9b,$b5,$5a,$e7 512 | DATA BYTE $e1,$8b,$79,$0f,$00,$60,$4f,$fc 513 | DATA BYTE $62,$fd,$11,$2b,$57,$db,$a9,$2b 514 | DATA BYTE $1f,$ef,$06,$55,$fa,$d5,$97,$c1 515 | DATA BYTE $3c,$87,$81,$34,$01,$89,$a8,$f4 516 | DATA BYTE $fd,$d1,$ba,$85,$20,$54,$95,$e8 517 | DATA BYTE $25,$03,$ab,$7f,$11,$ef,$5f,$af 518 | DATA BYTE $91,$a7,$5f,$8f,$75,$eb,$a9,$29 519 | DATA BYTE $d5,$91,$67,$c7,$2d,$27,$d5,$18 520 | DATA BYTE $00,$78,$3c,$91,$5a,$6a,$00,$81 521 | DATA BYTE $f8,$d8,$00,$a3,$58,$de,$9a,$6f 522 | DATA BYTE $29,$42,$1b,$bb,$70,$17,$70,$af 523 | DATA BYTE $f7,$9b,$76,$00,$15,$ef,$01,$ae 524 | DATA BYTE $47,$cf,$d7,$b7,$bf,$c7,$ef,$91 525 | DATA BYTE $bd,$0f,$00,$f5,$7f,$f5,$91,$47 526 | DATA BYTE $c0,$c1,$d9,$00,$f7,$8c,$0f,$d7 527 | DATA BYTE $fe,$df,$e5,$82,$72,$01,$eb,$15 528 | DATA BYTE $8a,$1f,$01,$05,$2a,$2c,$91,$03 529 | DATA BYTE $f5,$45,$ab,$e1,$8a,$95,$ae,$96 530 | DATA BYTE $97,$0b,$04,$75,$fa,$d4,$ae,$f4 531 | DATA BYTE $77,$fe,$f9,$a1,$e2,$9b,$25,$05 532 | DATA BYTE $fb,$a7,$5d,$14,$29,$9d,$70,$a9 533 | DATA BYTE $75,$d3,$a3,$e0,$d7,$2d,$55,$3c 534 | DATA BYTE $9d,$c8,$01,$a5,$19,$60,$00,$b0 535 | DATA BYTE $fd,$3b,$02,$00,$50,$87,$39,$9e 536 | DATA BYTE $38,$a8,$9b,$f8,$53,$df,$7c,$e6 537 | DATA BYTE $17,$70,$84,$00,$78,$f8,$f1,$50 538 | DATA BYTE $e1,$f2,$eb,$78,$a7,$0f,$54,$c0 539 | DATA BYTE $ff,$a2,$59,$fb,$31,$41,$02,$9f 540 | DATA BYTE $18,$08,$ed,$dc,$8b,$78,$f7,$94 541 | DATA BYTE $61,$cd,$6f,$04,$50,$f8,$18,$10 542 | DATA BYTE $9b,$68,$0d,$e4,$20,$a5,$eb,$dd 543 | DATA BYTE $6d,$2a,$53,$85,$a5,$81,$fd,$e8 544 | DATA BYTE $26,$2a,$65,$7f,$d1,$e6,$00,$f5 545 | DATA BYTE $83,$6a,$3e,$9b,$da,$79,$07,$8b 546 | DATA BYTE $17,$9d,$2c,$fb,$a3,$bc,$a5,$fc 547 | DATA BYTE $fd,$0b,$ae,$59,$0b,$ff,$52,$b7 548 | DATA BYTE $96,$5c,$d7,$6f,$1f,$df,$df,$91 549 | DATA BYTE $ec,$84,$70,$01,$7e,$7c,$3e,$a3 550 | DATA BYTE $c5,$58,$27,$c0,$78,$96,$b5,$a4 551 | DATA BYTE $44,$18,$ac,$9f,$4d,$47,$e5,$83 552 | DATA BYTE $01,$45,$88,$44,$82,$8f,$b7,$0a 553 | DATA BYTE $f1,$25,$7f,$88,$45,$05,$f7,$0d 554 | DATA BYTE $ec,$87,$aa,$50,$49,$8d,$08,$ef 555 | DATA BYTE $6d,$21,$20,$55,$97,$7f,$14,$07 556 | DATA BYTE $fe,$c9,$df,$9c,$45,$01,$54,$d3 557 | DATA BYTE $ff,$07,$91,$2b,$15,$da,$77,$06 558 | DATA BYTE $9b,$70,$01,$fb,$76,$d0,$bf,$aa 559 | DATA BYTE $af,$97,$f1,$0f,$80,$4e,$03,$f5 560 | DATA BYTE $51,$68,$a0,$91,$28,$8a,$fd,$45 561 | DATA BYTE $51,$80,$fd,$ad,$ec,$ee,$93,$1f 562 | DATA BYTE $96,$1f,$ae,$01,$c7,$df,$3d,$e4 563 | DATA BYTE $00,$89,$e4,$c5,$ec,$bd,$00,$f7 564 | DATA BYTE $0f,$d9,$2f,$26,$a2,$8a,$8d,$0e 565 | DATA BYTE $04,$06,$35,$1e,$09,$67,$40,$82 566 | DATA BYTE $93,$33,$b0,$0e,$88,$51,$ed,$2d 567 | DATA BYTE $42,$93,$68,$51,$05,$41,$db,$d3 568 | DATA BYTE $ba,$01,$1b,$b8,$01,$8b,$94,$8a 569 | DATA BYTE $93,$e9,$21,$81,$d3,$8f,$9d,$7d 570 | DATA BYTE $1d,$6f,$01,$d1,$0f,$05,$54,$01 571 | DATA BYTE $e7,$a8,$c4,$9f,$e2,$47,$2b,$5d 572 | DATA BYTE $1d,$f8,$9f,$3b,$77,$e9,$27,$85 573 | DATA BYTE $79,$98,$07,$01,$41,$aa,$c1,$c9 574 | DATA BYTE $e9,$07,$6f,$8b,$cc,$0f,$a8,$07 575 | DATA BYTE $eb,$41,$07,$be,$f3,$97,$2e,$8a 576 | DATA BYTE $56,$ee,$a4,$a7,$6b,$35,$b1,$5b 577 | DATA BYTE $24,$cb,$00,$dc,$6f,$fc,$c9,$96 578 | DATA BYTE $a8,$af,$7e,$25,$e1,$7a,$17,$8c 579 | DATA BYTE $06,$93,$61,$0b,$d5,$67,$e3,$77 580 | DATA BYTE $95,$cd,$01,$45,$9d,$1d,$a2,$05 581 | DATA BYTE $07,$d5,$75,$fb,$26,$a7,$c6,$51 582 | DATA BYTE $09,$ed,$77,$47,$74,$25,$f9,$68 583 | DATA BYTE $a1,$99,$11,$7b,$3b,$24,$d7,$f9 584 | DATA BYTE $18,$01,$01,$b0,$01,$c7,$cd,$51 585 | DATA BYTE $2a,$1b,$ab,$ef,$df,$b9,$f1,$ab 586 | DATA BYTE $1b,$dd,$44,$a6,$b9,$31,$e9,$4b 587 | DATA BYTE $c9,$7b,$0b,$63,$a7,$fc,$85,$33 588 | DATA BYTE $51,$8a,$61,$f7,$ec,$19,$91,$0c 589 | DATA BYTE $e9,$12,$15,$a2,$8f,$44,$15,$95 590 | DATA BYTE $2b,$20,$ab,$09,$f5,$fb,$af,$ae 591 | DATA BYTE $05,$ff,$0d,$33,$9f,$5a,$5f,$a0 592 | DATA BYTE $fc,$05,$6f,$57,$c1,$ff,$b4,$67 593 | DATA BYTE $f3,$bf,$6d,$2f,$8e,$30,$bd,$7f 594 | DATA BYTE $ff,$ff,$ff,$e0 595 | 596 | image_color: 597 | DATA BYTE $65,$eb,$eb,$e1,$01,$80,$00,$91 598 | DATA BYTE $f6,$91,$91,$61,$6c,$e1,$00,$f1 599 | DATA BYTE $18,$f1,$71,$71,$06,$a5,$8d,$00 600 | DATA BYTE $e4,$ed,$ac,$11,$09,$27,$fa,$00 601 | DATA BYTE $1b,$4d,$c4,$1f,$fe,$8f,$00,$f1 602 | DATA BYTE $fe,$34,$00,$19,$17,$ed,$ed,$c5 603 | DATA BYTE $29,$5f,$2d,$03,$3e,$13,$fe,$00 604 | DATA BYTE $5c,$ed,$0e,$04,$fe,$fb,$38,$7f 605 | DATA BYTE $8c,$00,$f6,$f6,$04,$9e,$42,$c5 606 | DATA BYTE $4a,$00,$63,$e6,$65,$6a,$ad,$05 607 | DATA BYTE $00,$1b,$7a,$eb,$1d,$06,$b6,$71 608 | DATA BYTE $00,$5f,$07,$1c,$3d,$00,$c4,$1d 609 | DATA BYTE $00,$a5,$1f,$1d,$00,$a6,$a6,$05 610 | DATA BYTE $d8,$56,$39,$eb,$c0,$dd,$13,$ed 611 | DATA BYTE $e5,$53,$00,$43,$39,$00,$17,$51 612 | DATA BYTE $9d,$00,$3a,$06,$ce,$9a,$41,$81 613 | DATA BYTE $f8,$cf,$0b,$71,$3e,$00,$13,$83 614 | DATA BYTE $d6,$6a,$07,$5a,$93,$08,$96,$6b 615 | DATA BYTE $05,$09,$02,$9c,$06,$f8,$e8,$33 616 | DATA BYTE $1f,$5b,$00,$b7,$2e,$83,$ff,$54 617 | DATA BYTE $87,$1b,$0d,$74,$97,$1e,$14,$cc 618 | DATA BYTE $3d,$01,$ac,$00,$60,$66,$cd,$67 619 | DATA BYTE $c0,$96,$a8,$00,$10,$c7,$27,$0f 620 | DATA BYTE $e6,$03,$94,$e6,$ce,$00,$f7,$0d 621 | DATA BYTE $40,$fe,$c0,$f0,$42,$e6,$02,$61 622 | DATA BYTE $71,$61,$00,$82,$f9,$07,$e7,$00 623 | DATA BYTE $f1,$63,$09,$00,$ed,$01,$cb,$c1 624 | DATA BYTE $0c,$01,$c1,$43,$c4,$fc,$06,$51 625 | DATA BYTE $c1,$fc,$18,$03,$e4,$71,$fc,$1a 626 | DATA BYTE $06,$fe,$c1,$ea,$f0,$ef,$69,$0d 627 | DATA BYTE $6e,$0c,$78,$79,$05,$b6,$ce,$08 628 | DATA BYTE $df,$03,$61,$fd,$38,$00,$ea,$36 629 | DATA BYTE $f0,$0a,$3f,$06,$fa,$0c,$4e,$be 630 | DATA BYTE $08,$c5,$0f,$33,$00,$62,$c0,$e1 631 | DATA BYTE $e0,$f9,$f5,$0f,$97,$c1,$bc,$70 632 | DATA BYTE $e6,$de,$60,$cc,$70,$d7,$63,$59 633 | DATA BYTE $e6,$6e,$7a,$00,$db,$10,$40,$fc 634 | DATA BYTE $36,$b6,$eb,$00,$c7,$12,$a6,$d0 635 | DATA BYTE $00,$9d,$e0,$ee,$1c,$b1,$a6,$f1 636 | DATA BYTE $16,$04,$9b,$05,$77,$1c,$27,$06 637 | DATA BYTE $fb,$cc,$00,$f1,$01,$a0,$00,$c7 638 | DATA BYTE $db,$10,$87,$b9,$87,$99,$5b,$00 639 | DATA BYTE $6b,$6d,$02,$0b,$e2,$b3,$1b,$6c 640 | DATA BYTE $82,$c9,$97,$44,$b6,$00,$e6,$96 641 | DATA BYTE $9c,$4d,$32,$b6,$a5,$0f,$15,$b4 642 | DATA BYTE $19,$99,$2d,$8f,$fc,$3c,$10,$9f 643 | DATA BYTE $37,$fe,$e6,$00,$2e,$ab,$cf,$17 644 | DATA BYTE $fb,$14,$c2,$fb,$fb,$dd,$03,$ff 645 | DATA BYTE $ef,$2f,$03,$d6,$c6,$57,$a5,$1f 646 | DATA BYTE $e2,$81,$95,$c5,$eb,$a1,$f1,$6d 647 | DATA BYTE $20,$f1,$96,$e0,$ed,$41,$ea,$cd 648 | DATA BYTE $cb,$c1,$f0,$f6,$00,$c3,$97,$cd 649 | DATA BYTE $cb,$b6,$4c,$2b,$a6,$c1,$58,$fe 650 | DATA BYTE $39,$04,$f1,$f5,$0e,$59,$b5,$0e 651 | DATA BYTE $06,$f6,$0f,$d0,$09,$fd,$68,$81 652 | DATA BYTE $64,$61,$fe,$e9,$3a,$68,$00,$7a 653 | DATA BYTE $f6,$be,$00,$a0,$5f,$01,$f9,$da 654 | DATA BYTE $b1,$fd,$1b,$da,$da,$05,$f9,$22 655 | DATA BYTE $f0,$f6,$7c,$06,$ed,$d2,$00,$f3 656 | DATA BYTE $5f,$e1,$97,$d7,$02,$fb,$47,$95 657 | DATA BYTE $d1,$ed,$ac,$f2,$7e,$34,$c2,$dc 658 | DATA BYTE $14,$74,$7d,$e1,$d0,$fd,$20,$ca 659 | DATA BYTE $e8,$02,$9c,$1b,$e1,$90,$00,$f7 660 | DATA BYTE $62,$f5,$40,$ab,$ea,$b4,$18,$9a 661 | DATA BYTE $7e,$ef,$0d,$3c,$28,$9a,$7d,$02 662 | DATA BYTE $bc,$23,$90,$b7,$c5,$ea,$a4,$00 663 | DATA BYTE $24,$b1,$e0,$0d,$21,$87,$86,$23 664 | DATA BYTE $fc,$bb,$05,$08,$03,$f5,$c0,$fb 665 | DATA BYTE $bc,$13,$1b,$53,$f1,$a4,$d9,$01 666 | DATA BYTE $38,$e3,$00,$da,$c8,$00,$51,$f6 667 | DATA BYTE $da,$d7,$b8,$00,$9e,$7b,$07,$c4 668 | DATA BYTE $bf,$e5,$a5,$d1,$01,$53,$e6,$00 669 | DATA BYTE $83,$88,$b8,$a6,$ff,$c5,$f7,$8f 670 | DATA BYTE $cf,$a3,$d2,$b4,$ed,$ee,$8b,$43 671 | DATA BYTE $e4,$8b,$f0,$e7,$56,$71,$5d,$e3 672 | DATA BYTE $87,$6b,$35,$a4,$01,$81,$b2,$cd 673 | DATA BYTE $e7,$9a,$0e,$45,$27,$f4,$9e,$03 674 | DATA BYTE $72,$00,$ff,$7c,$bf,$06,$ba,$b1 675 | DATA BYTE $22,$00,$fa,$00,$a1,$b1,$09,$a3 676 | DATA BYTE $01,$07,$c1,$21,$63,$af,$c1,$86 677 | DATA BYTE $d0,$b9,$f6,$6d,$36,$f1,$fb,$ad 678 | DATA BYTE $98,$cd,$fe,$37,$fe,$ff,$0f,$fb 679 | DATA BYTE $00,$62,$92,$c0,$8f,$f2,$aa,$f4 680 | DATA BYTE $ee,$90,$e1,$43,$53,$e1,$c7,$e5 681 | DATA BYTE $c7,$e7,$f5,$03,$ff,$81,$fa,$c5 682 | DATA BYTE $cb,$f7,$c3,$a6,$8c,$03,$71,$c2 683 | DATA BYTE $af,$9b,$f6,$0b,$96,$d0,$00,$c4 684 | DATA BYTE $f6,$5c,$e6,$3f,$a9,$90,$b8,$45 685 | DATA BYTE $da,$81,$fd,$5e,$05,$00,$07,$e9 686 | DATA BYTE $8a,$b7,$e1,$e7,$b7,$d3,$e6,$3b 687 | DATA BYTE $13,$a0,$00,$f1,$95,$f8,$eb,$8b 688 | DATA BYTE $dd,$5e,$07,$08,$2d,$e3,$07,$c6 689 | DATA BYTE $91,$fe,$64,$e4,$00,$b8,$9b,$1b 690 | DATA BYTE $b7,$e6,$b4,$34,$b7,$9d,$c0,$f8 691 | DATA BYTE $77,$e6,$0f,$07,$db,$4f,$cd,$c5 692 | DATA BYTE $ed,$e9,$07,$9e,$18,$6a,$07,$71 693 | DATA BYTE $00,$81,$fc,$ff,$1c,$03,$c5,$c5 694 | DATA BYTE $84,$c0,$d6,$f2,$96,$66,$04,$f1 695 | DATA BYTE $f3,$a2,$c8,$bd,$ec,$e0,$d7,$eb 696 | DATA BYTE $d1,$c6,$b2,$73,$ed,$bd,$6d,$82 697 | DATA BYTE $56,$5f,$60,$04,$ed,$47,$94,$d9 698 | DATA BYTE $cb,$c8,$c9,$fe,$a3,$87,$a3,$fa 699 | DATA BYTE $c8,$fe,$3c,$b1,$f1,$df,$4b,$6f 700 | DATA BYTE $cb,$93,$d9,$93,$5c,$d6,$07,$a5 701 | DATA BYTE $e5,$b2,$f1,$16,$a5,$dc,$2e,$ef 702 | DATA BYTE $1b,$1c,$05,$ea,$21,$04,$a6,$47 703 | DATA BYTE $b1,$8d,$c1,$a4,$d3,$92,$4f,$22 704 | DATA BYTE $62,$91,$02,$bb,$07,$bf,$a3,$67 705 | DATA BYTE $c8,$86,$da,$d4,$0a,$d2,$e0,$f6 706 | DATA BYTE $8d,$13,$e6,$a6,$b9,$1b,$e6,$3a 707 | DATA BYTE $50,$96,$79,$16,$b6,$77,$01,$1a 708 | DATA BYTE $0f,$86,$9d,$1b,$05,$a9,$b1,$bb 709 | DATA BYTE $60,$05,$fd,$5b,$f4,$6d,$0c,$b8 710 | DATA BYTE $b5,$00,$67,$f4,$b1,$ec,$00,$ec 711 | DATA BYTE $e0,$f4,$83,$f9,$aa,$85,$00,$d6 712 | DATA BYTE $8b,$ee,$61,$90,$04,$eb,$da,$70 713 | DATA BYTE $85,$68,$ff,$f7,$02,$6c,$5c,$85 714 | DATA BYTE $0c,$f6,$a4,$fe,$05,$90,$00,$91 715 | DATA BYTE $8d,$65,$05,$77,$01,$bf,$db,$db 716 | DATA BYTE $9d,$05,$1c,$b1,$d7,$c0,$f8,$91 717 | DATA BYTE $d3,$09,$16,$47,$d6,$08,$a6,$ca 718 | DATA BYTE $03,$b6,$f1,$a1,$a1,$a6,$82,$fb 719 | DATA BYTE $05,$e9,$00,$05,$c1,$8a,$a3,$ea 720 | DATA BYTE $c1,$93,$b8,$37,$d8,$28,$01,$f9 721 | DATA BYTE $3d,$91,$f2,$61,$07,$ff,$cd,$df 722 | DATA BYTE $e8,$e7,$9d,$2f,$b1,$af,$e9,$39 723 | DATA BYTE $f1,$fa,$7d,$07,$67,$13,$aa,$75 724 | DATA BYTE $9e,$74,$c6,$48,$ca,$61,$65,$a5 725 | DATA BYTE $c8,$d6,$03,$cb,$78,$9f,$99,$d7 726 | DATA BYTE $3d,$06,$dd,$e1,$d9,$e6,$95,$bd 727 | DATA BYTE $d7,$ed,$84,$f4,$41,$d9,$be,$28 728 | DATA BYTE $d3,$d0,$81,$1f,$a6,$25,$87,$07 729 | DATA BYTE $8d,$bd,$c2,$db,$c1,$e1,$df,$d1 730 | DATA BYTE $a0,$bc,$bf,$5f,$06,$91,$0e,$ed 731 | DATA BYTE $03,$72,$00,$61,$da,$d1,$b8,$ed 732 | DATA BYTE $ab,$00,$59,$1c,$04,$b6,$8a,$fb 733 | DATA BYTE $01,$fe,$a1,$21,$0f,$8c,$0d,$e2 734 | DATA BYTE $54,$03,$c2,$b6,$81,$fc,$e6,$c1 735 | DATA BYTE $f6,$ab,$cd,$ef,$f7,$ff,$ff,$70 736 | DATA BYTE $17,$96,$f2,$03,$e1,$e2,$0d,$bb 737 | DATA BYTE $b2,$ab,$9f,$07,$fd,$83,$9d,$83 738 | DATA BYTE $b9,$c3,$a0,$7c,$71,$e7,$bb,$0f 739 | DATA BYTE $c6,$66,$10,$18,$35,$f2,$2b,$ec 740 | DATA BYTE $bf,$1f,$02,$d6,$21,$9a,$14,$41 741 | DATA BYTE $25,$51,$70,$51,$89,$86,$a5,$65 742 | DATA BYTE $64,$d6,$9d,$e8,$e6,$00,$c2,$8f 743 | DATA BYTE $71,$dd,$07,$80,$ab,$d4,$b4,$55 744 | DATA BYTE $f6,$35,$d1,$21,$9a,$7b,$67,$fb 745 | DATA BYTE $de,$66,$4b,$d5,$71,$93,$d5,$9b 746 | DATA BYTE $e9,$63,$f1,$6c,$a6,$f4,$5d,$07 747 | DATA BYTE $a2,$eb,$69,$0d,$7c,$1d,$f5,$db 748 | DATA BYTE $06,$b6,$9e,$7b,$0e,$88,$d8,$27 749 | DATA BYTE $13,$f6,$f0,$97,$77,$bd,$cd,$ed 750 | DATA BYTE $85,$e8,$01,$84,$d1,$41,$4f,$00 751 | DATA BYTE $e9,$62,$0d,$de,$9a,$d1,$51,$80 752 | DATA BYTE $b9,$e6,$fa,$ca,$be,$99,$39,$a0 753 | DATA BYTE $3a,$ff,$ef,$00,$11,$b1,$f1,$b0 754 | DATA BYTE $a8,$9e,$a6,$51,$73,$f0,$65,$c6 755 | DATA BYTE $e3,$f9,$e9,$3e,$c5,$05,$21,$00 756 | DATA BYTE $d9,$d8,$79,$03,$77,$5b,$13,$6d 757 | DATA BYTE $d3,$b3,$f6,$29,$69,$23,$a5,$ae 758 | DATA BYTE $f1,$06,$ea,$f7,$59,$e1,$5b,$35 759 | DATA BYTE $a7,$73,$03,$86,$a6,$f3,$00,$42 760 | DATA BYTE $ea,$bc,$06,$8c,$5e,$f8,$0f,$b7 761 | DATA BYTE $08,$38,$00,$c1,$f7,$0b,$cd,$83 762 | DATA BYTE $a0,$e0,$fb,$ee,$78,$08,$6d,$e4 763 | DATA BYTE $00,$b0,$b4,$f2,$c3,$68,$f2,$57 764 | DATA BYTE $19,$f5,$e0,$6b,$07,$d1,$64,$00 765 | DATA BYTE $80,$66,$ce,$f8,$e9,$1c,$a6,$51 766 | DATA BYTE $e7,$6c,$90,$3a,$c1,$f9,$f0,$87 767 | DATA BYTE $be,$c1,$ef,$4d,$db,$00,$9f,$ad 768 | DATA BYTE $b6,$00,$b7,$95,$e6,$c4,$fe,$9a 769 | DATA BYTE $00,$7e,$83,$5f,$57,$3e,$c1,$ff 770 | DATA BYTE $f3,$89,$da,$31,$c9,$df,$dc,$07 771 | DATA BYTE $98,$9c,$98,$2f,$61,$27,$27,$0d 772 | DATA BYTE $65,$d5,$f7,$fd,$a8,$dd,$82,$59 773 | DATA BYTE $71,$77,$05,$79,$94,$89,$eb,$a2 774 | DATA BYTE $0d,$d0,$ec,$0a,$9a,$0d,$27,$87 775 | DATA BYTE $41,$af,$53,$e4,$a6,$f0,$fb,$60 776 | DATA BYTE $d4,$68,$d8,$1e,$47,$d3,$69,$0a 777 | DATA BYTE $0d,$ff,$7a,$00,$0b,$c8,$71,$5a 778 | DATA BYTE $0f,$f9,$0d,$6e,$9f,$ed,$00,$82 779 | DATA BYTE $f6,$01,$d9,$02,$c1,$78,$27,$bf 780 | DATA BYTE $3b,$85,$d2,$b2,$ff,$6f,$9f,$00 781 | DATA BYTE $0f,$9f,$b1,$88,$e8,$bb,$0f,$b1 782 | DATA BYTE $b1,$63,$ce,$38,$f1,$34,$f7,$0f 783 | DATA BYTE $83,$f5,$bb,$04,$00,$ef,$0f,$3d 784 | DATA BYTE $8d,$fe,$06,$fa,$35,$00,$fd,$87 785 | DATA BYTE $b1,$e2,$de,$f8,$8c,$3d,$1f,$8c 786 | DATA BYTE $f4,$ff,$0d,$87,$c0,$61,$8a,$d6 787 | DATA BYTE $83,$5f,$01,$b6,$f6,$6d,$19,$e5 788 | DATA BYTE $9c,$f1,$5f,$2d,$90,$29,$dd,$36 789 | DATA BYTE $2e,$6d,$00,$45,$5b,$07,$71,$77 790 | DATA BYTE $6c,$34,$7d,$0b,$f6,$1f,$6f,$0f 791 | DATA BYTE $06,$fb,$c5,$96,$c9,$f3,$c1,$d8 792 | DATA BYTE $bb,$78,$00,$d6,$0c,$fe,$02,$d3 793 | DATA BYTE $82,$fb,$0b,$c0,$fb,$66,$fb,$00 794 | DATA BYTE $d1,$3f,$a6,$f9,$17,$f5,$2f,$00 795 | DATA BYTE $dc,$6a,$ef,$9b,$7a,$68,$d6,$00 796 | DATA BYTE $7a,$f2,$b7,$fc,$ff,$1a,$5f,$04 797 | DATA BYTE $05,$16,$ff,$27,$ff,$74,$46,$8b 798 | DATA BYTE $f8,$e6,$0b,$43,$02,$3f,$05,$bc 799 | DATA BYTE $00,$1c,$eb,$00,$79,$92,$89,$07 800 | DATA BYTE $fb,$7c,$fb,$07,$e1,$af,$f9,$09 801 | DATA BYTE $eb,$e2,$fe,$6e,$05,$f9,$01,$78 802 | DATA BYTE $04,$f5,$18,$00,$fb,$d3,$04,$4e 803 | DATA BYTE $05,$07,$e0,$fd,$a8,$35,$03,$f9 804 | DATA BYTE $37,$41,$af,$8f,$87,$7f,$3f,$00 805 | DATA BYTE $b4,$37,$fc,$2c,$e3,$0e,$f8,$7a 806 | DATA BYTE $bb,$59,$65,$d3,$f4,$84,$18,$43 807 | DATA BYTE $43,$f8,$01,$c4,$54,$54,$41,$fa 808 | DATA BYTE $66,$00,$3c,$7d,$03,$0d,$b1,$e9 809 | DATA BYTE $75,$ff,$fb,$1b,$00,$41,$51,$5b 810 | DATA BYTE $00,$29,$7c,$07,$be,$2c,$eb,$67 811 | DATA BYTE $de,$81,$78,$ec,$be,$f1,$0d,$0b 812 | DATA BYTE $ee,$c7,$0a,$f1,$96,$0f,$0c,$b8 813 | DATA BYTE $af,$6e,$e6,$03,$f8,$dd,$9a,$71 814 | DATA BYTE $ec,$8f,$3a,$15,$96,$2b,$6f,$a3 815 | DATA BYTE $f5,$18,$82,$88,$c4,$ef,$35,$fb 816 | DATA BYTE $00,$73,$37,$34,$0b,$0e,$f8,$d8 817 | DATA BYTE $35,$be,$68,$91,$1f,$a0,$00,$9b 818 | DATA BYTE $66,$75,$00,$cd,$1d,$51,$c0,$f7 819 | DATA BYTE $e5,$93,$dc,$ff,$0d,$64,$f5,$fb 820 | DATA BYTE $12,$43,$8d,$e3,$a7,$ef,$29,$8e 821 | DATA BYTE $b3,$af,$9f,$86,$87,$e4,$9b,$00 822 | DATA BYTE $79,$97,$f2,$9b,$75,$c1,$87,$83 823 | DATA BYTE $f2,$b1,$00,$fc,$fc,$00,$de,$1b 824 | DATA BYTE $ec,$ea,$81,$bc,$c4,$bf,$c1,$fa 825 | DATA BYTE $ae,$9a,$00,$02,$fa,$43,$01,$79 826 | DATA BYTE $75,$00,$83,$a7,$2f,$6c,$51,$01 827 | DATA BYTE $83,$ad,$9b,$f0,$e0,$fc,$de,$81 828 | DATA BYTE $19,$05,$f1,$f1,$8f,$db,$07,$cd 829 | DATA BYTE $f1,$5d,$08,$0b,$0f,$ec,$87,$b0 830 | DATA BYTE $81,$b6,$b6,$00,$d3,$0d,$97,$fb 831 | DATA BYTE $fb,$87,$7c,$16,$fe,$ff,$0d,$30 832 | DATA BYTE $2f,$98,$77,$70,$fb,$b5,$3f,$09 833 | DATA BYTE $41,$8f,$69,$71,$28,$04,$f8,$00 834 | DATA BYTE $e5,$ed,$00,$03,$fc,$9e,$6b,$51 835 | DATA BYTE $cf,$32,$fe,$93,$ff,$fe,$00,$fc 836 | DATA BYTE $23,$d6,$89,$56,$a6,$8e,$05,$b1 837 | DATA BYTE $fc,$0c,$8e,$ef,$47,$fd,$dc,$af 838 | DATA BYTE $fd,$ac,$16,$01,$fa,$0b,$27,$eb 839 | DATA BYTE $af,$f8,$8d,$70,$b1,$db,$41,$f8 840 | DATA BYTE $00,$f1,$de,$85,$7d,$70,$87,$5e 841 | DATA BYTE $41,$36,$ee,$06,$f9,$05,$fb,$05 842 | DATA BYTE $d1,$f4,$bd,$bf,$6c,$f1,$0c,$ea 843 | DATA BYTE $39,$15,$d9,$c4,$e4,$03,$f4,$6f 844 | DATA BYTE $fe,$f7,$00,$85,$fc,$f0,$85,$ec 845 | DATA BYTE $fd,$55,$b7,$5f,$67,$7f,$e0,$e3 846 | DATA BYTE $f8,$79,$bf,$db,$74,$95,$81,$3f 847 | DATA BYTE $1f,$87,$86,$ac,$71,$f4,$da,$0e 848 | DATA BYTE $01,$df,$cb,$00,$42,$d9,$9f,$7e 849 | DATA BYTE $17,$60,$74,$84,$a6,$65,$00,$c4 850 | DATA BYTE $2c,$df,$00,$43,$e9,$d9,$d8,$99 851 | DATA BYTE $7d,$a8,$8f,$d1,$41,$f9,$84,$75 852 | DATA BYTE $fb,$07,$53,$a3,$fb,$c2,$fa,$06 853 | DATA BYTE $00,$d7,$4b,$97,$c2,$fc,$d0,$a9 854 | DATA BYTE $70,$85,$d5,$a9,$00,$03,$0e,$a7 855 | DATA BYTE $c7,$84,$aa,$85,$ec,$c3,$95,$b1 856 | DATA BYTE $b9,$76,$06,$c9,$fb,$b8,$f5,$1f 857 | DATA BYTE $c7,$82,$f4,$3a,$f4,$0c,$a5,$00 858 | DATA BYTE $c0,$f8,$f1,$88,$5e,$51,$2d,$91 859 | DATA BYTE $21,$b7,$3e,$76,$51,$06,$fe,$13 860 | DATA BYTE $fd,$e1,$c9,$86,$dd,$3d,$c7,$b6 861 | DATA BYTE $99,$c5,$eb,$07,$ff,$40,$00,$ef 862 | DATA BYTE $a9,$d3,$00,$ba,$09,$00,$07,$ff 863 | DATA BYTE $ff,$ff,$ff,$c0 864 | --------------------------------------------------------------------------------