├── Makefile ├── README.md ├── basic.vim ├── decbpp ├── demo.bas ├── disable.bas └── images ├── code.png └── demo.png /Makefile: -------------------------------------------------------------------------------- 1 | all: demo 2 | 3 | demo: demo.bas 4 | cp decbpp /usr/local/bin 5 | cp basic.vim ~/.vim/basic.vim 6 | decbpp < demo.bas > /tmp/demo.bas 7 | ifneq ("$(wildcard /media/share1/COCO/drive0.dsk)", "") 8 | decb copy -tr /tmp/demo.bas /media/share1/COCO/drive0.dsk,DEMO.BAS 9 | endif 10 | cat /tmp/demo.bas 11 | rm -f /tmp/demo.bas 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DECBPP: DECB Preprocessor 2 | ========== 3 | 4 | I'm using my CocoPI in command line mode to edit BASIC programs, drivewire to 5 | mount them on a real Coco3, because entering and editing BASIC code on a Coco makes me rage and scream. 6 | 7 | So it occurred to me that this would be a dandy place to put in a preprocessor to minify and optimize the 8 | code being transferred over. And then once I got that done, why not make it so you don't have to enter all those line numbers? 9 | 10 | And so I did! 11 | 12 | ![](images/demo.png) 13 | 14 | The code that actually gets sent over is: 15 | 16 | ![](images/code.png) 17 | 18 | Note that there is syntax highlighting for BASIC code on the CocoPI right out of the box. 19 | But it's for QBASIC, not DECB. To fix that, copy the basic.vim file to _~/.vim/basic.vim_. 20 | This is not necessary for later versions of CocoPI. 21 | 22 | Copy decbpp to _/usr/local/bin_. 23 | -------------------------------------------------------------------------------- /basic.vim: -------------------------------------------------------------------------------- 1 | " Vim syntax file 2 | " Tandy Color Computer Disk Extended Color Basic 3 | " Rick Adams 4 | 5 | let s:cpo_save = &cpo 6 | set cpo&vim 7 | set iskeyword=a-z,A-Z,48-57,\$ 8 | 9 | " For version 5.x: Clear all syntax items 10 | " For version 6.x: Quit when a syntax file was already loaded 11 | if version < 600 12 | syntax clear 13 | elseif exists("b:current_syntax") 14 | finish 15 | endif 16 | 17 | " BASIC keywords 18 | syn keyword basicStatement attr Attr ATTR 19 | syn keyword basicStatement audio Audio AUDIO 20 | syn keyword basicStatement backup Backup BACKUP 21 | syn keyword basicStatement brk Brk BRK 22 | syn keyword basicStatement circle Circle CIRCLE 23 | syn keyword basicStatement clear Clear CLEAR 24 | syn keyword basicStatement cload Cload CLOAD 25 | syn keyword basicStatement close Close CLOSE 26 | syn keyword basicStatement cls Cls CLS 27 | syn keyword basicStatement cmp Cmp CMP 28 | syn keyword basicStatement color Color COLOR 29 | syn keyword basicStatement cont Cont CONT 30 | syn keyword basicStatement copy Copy COPY 31 | syn keyword basicStatement csave Csave CSAVE 32 | syn keyword basicStatement data Data DATA 33 | syn keyword basicStatement def Def DEF 34 | syn keyword basicStatement defusr0 Defusr0 DEFUSR0 35 | syn keyword basicStatement defusr1 Defusr1 DEFUSR1 36 | syn keyword basicStatement defusr2 Defusr2 DEFUSR2 37 | syn keyword basicStatement defusr3 Defusr3 DEFUSR3 38 | syn keyword basicStatement defusr4 Defusr4 DEFUSR4 39 | syn keyword basicStatement defusr5 Defusr5 DEFUSR5 40 | syn keyword basicStatement defusr6 Defusr6 DEFUSR6 41 | syn keyword basicStatement defusr7 Defusr7 DEFUSR7 42 | syn keyword basicStatement defusr8 Defusr8 DEFUSR8 43 | syn keyword basicStatement defusr9 Defusr9 DEFUSR9 44 | syn keyword basicStatement del Del DEL 45 | syn keyword basicStatement dim Dim DIM 46 | syn keyword basicStatement dir Dir DIR 47 | syn keyword basicStatement dload Dload DLOAD 48 | syn keyword basicStatement dos Dos DOS 49 | syn keyword basicStatement draw Draw DRAW 50 | syn keyword basicStatement drive Drive DRIVE 51 | syn keyword basicStatement dski$ Dski$ DSKI$ 52 | syn keyword basicStatement dskini Dskini DSKINI 53 | syn keyword basicStatement dsko$ Dsko$ DSKO$ 54 | syn keyword basicStatement edit Edit EDIT 55 | syn keyword basicStatement else Else ELSE 56 | syn keyword basicStatement end End END 57 | syn keyword basicStatement err Err ERR 58 | syn keyword basicStatement exec Exec EXEC 59 | syn keyword basicStatement exp Exp EXP 60 | syn keyword basicStatement field Field FIELD 61 | syn keyword basicStatement files Files FILES 62 | syn keyword basicStatement for For FOR 63 | syn keyword basicStatement get Get GET 64 | syn keyword basicStatement go Go GO 65 | syn keyword basicStatement gosub Gosub GOSUB 66 | syn keyword basicStatement goto Goto GOTO 67 | syn keyword basicStatement hbuff Hbuff HBUFF 68 | syn keyword basicStatement hcircle Hcircle HCIRCLE 69 | syn keyword basicStatement hcls Hcls HCLS 70 | syn keyword basicStatement hcolor Hcolor HCOLOR 71 | syn keyword basicStatement hdraw Hdraw HDRAW 72 | syn keyword basicStatement hget Hget HGET 73 | syn keyword basicStatement hline Hline HLINE 74 | syn keyword basicStatement hpaint Hpaint HPAINT 75 | syn keyword basicStatement hprint Hprint HPRINT 76 | syn keyword basicStatement hput Hput HPUT 77 | syn keyword basicStatement hreset Hreset HRESET 78 | syn keyword basicStatement hscreen Hscreen HSCREEN 79 | syn keyword basicStatement hset Hset HSET 80 | syn keyword basicStatement hstat Hstat HSTAT 81 | syn keyword basicStatement if If IF 82 | syn keyword basicStatement include Include INCLUDE 83 | syn keyword basicStatement input Input INPUT 84 | syn keyword basicStatement kill Kill KILL 85 | syn keyword basicStatement let Let LET 86 | syn keyword basicStatement line Line LINE 87 | syn keyword basicStatement list List LIST 88 | syn keyword basicStatement llist Llist LLIST 89 | syn keyword basicStatement load Load LOAD 90 | syn keyword basicStatement loadm Loadm LOADM 91 | syn keyword basicStatement locate Locate LOCATE 92 | syn keyword basicStatement lpoke Lpoke LPOKE 93 | syn keyword basicStatement lset Lset LSET 94 | syn keyword basicStatement merge Merge MERGE 95 | syn keyword basicStatement motor Motor MOTOR 96 | syn keyword basicStatement new New NEW 97 | syn keyword basicStatement next Next NEXT 98 | syn keyword basicStatement not Not NOT 99 | syn keyword basicStatement off Off OFF 100 | syn keyword basicStatement on On ON 101 | syn keyword basicStatement open Open OPEN 102 | syn keyword basicStatement paint Paint PAINT 103 | syn keyword basicStatement palette Palette PALETTE 104 | syn keyword basicStatement pclear Pclear PCLEAR 105 | syn keyword basicStatement pcls Pcls PCLS 106 | syn keyword basicStatement pcopy Pcopy PCOPY 107 | syn keyword basicStatement play Play PLAY 108 | syn keyword basicStatement pmode Pmode PMODE 109 | syn keyword basicStatement poke Poke POKE 110 | syn keyword basicStatement preset Preset PRESET 111 | syn keyword basicStatement print Print PRINT 112 | syn keyword basicStatement pset Pset PSET 113 | syn keyword basicStatement put Put PUT 114 | syn keyword basicStatement read Read READ 115 | " Don't declare this a statement so it'll be caught by basicComment below 116 | "syn keyword basicStatement rem Rem REM 117 | syn keyword basicStatement rename Rename RENAME 118 | syn keyword basicStatement renum Renum RENUM 119 | syn keyword basicStatement reset Reset RESET 120 | syn keyword basicStatement restore Restore RESTORE 121 | syn keyword basicStatement return Return RETURN 122 | syn keyword basicStatement rgb Rgb RGB 123 | syn keyword basicStatement rset Rset RSET 124 | syn keyword basicStatement run Run RUN 125 | syn keyword basicStatement save Save SAVE 126 | syn keyword basicStatement screen Screen SCREEN 127 | syn keyword basicStatement set Set SET 128 | syn keyword basicStatement skipf Skipf SKIPF 129 | syn keyword basicStatement sound Sound SOUND 130 | syn keyword basicStatement step Step STEP 131 | syn keyword basicStatement stop Stop STOP 132 | syn keyword basicStatement then Then THEN 133 | syn keyword basicStatement to To TO 134 | syn keyword basicStatement troff Troff TROFF 135 | syn keyword basicStatement tron Tron TRON 136 | syn keyword basicStatement unload Unload UNLOAD 137 | syn keyword basicStatement using Using USING 138 | syn keyword basicStatement verify Verify VERIFY 139 | syn keyword basicStatement while While WHILE 140 | syn keyword basicStatement width Width WIDTH 141 | syn keyword basicStatement write Write WRITE 142 | 143 | " BASIC functions 144 | syn keyword basicFunction abs Abs ABS 145 | syn keyword basicFunction asc Asc ASC 146 | syn keyword basicFunction atn Atn ATN 147 | syn keyword basicFunction button Button BUTTON 148 | syn keyword basicFunction chr$ Chr$ CHR$ 149 | syn keyword basicFunction cos Cos COS 150 | syn keyword basicFunction cvn Cvn CVN 151 | syn keyword basicFunction eof Eof EOF 152 | syn keyword basicFunction erlin Erlin ERLIN 153 | syn keyword basicFunction errno Errno ERRNO 154 | syn keyword basicFunction exp Exp EXP 155 | syn keyword basicFunction fix Fix FIX 156 | syn keyword basicFunction free Free FREE 157 | syn keyword basicFunction hex$ Hex$ HEX\$ 158 | syn keyword basicFunction hpoint Hpoint HPOINT 159 | syn keyword basicFunction inkey$ Inkey$ INKEY$ 160 | syn keyword basicFunction instr Instr INSTR 161 | syn keyword basicFunction int Int INT 162 | syn keyword basicFunction joystk Joystk JOYSTK 163 | syn keyword basicFunction left$ Left$ LEFT$ 164 | syn keyword basicFunction len Len LEN 165 | syn keyword basicFunction loc Loc LOC 166 | syn keyword basicFunction lof Lof LOF 167 | syn keyword basicFunction log Log LOG 168 | syn keyword basicFunction lpeek Lpeek LPEEK 169 | syn keyword basicFunction mem Mem MEM 170 | syn keyword basicFunction mid$ Mid$ MID$ 171 | syn keyword basicFunction mkn$ Mkn$ MKN$ 172 | syn keyword basicFunction peek Peek PEEK 173 | syn keyword basicFunction point Point POINT 174 | syn keyword basicFunction pos Pos POS 175 | syn keyword basicFunction ppoint Ppoint PPOINT 176 | syn keyword basicFunction right$ Right$ RIGHT$ 177 | syn keyword basicFunction rnd Rnd RND 178 | syn keyword basicFunction sgn Sgn SGN 179 | syn keyword basicFunction sin Sin SIN 180 | syn keyword basicFunction sqr Sqr SQR 181 | syn keyword basicFunction str$ Str$ STR$ 182 | syn keyword basicFunction string String STRING 183 | syn keyword basicFunction tab Tab TAB 184 | syn keyword basicFunction tan Tan TAN 185 | syn keyword basicFunction timer Timer TIMER 186 | syn keyword basicFunction usr0 Usr0 USR0 187 | syn keyword basicFunction usr1 Usr1 USR1 188 | syn keyword basicFunction usr2 Usr2 USR2 189 | syn keyword basicFunction usr3 Usr3 USR3 190 | syn keyword basicFunction usr4 Usr4 USR4 191 | syn keyword basicFunction usr5 Usr5 USR5 192 | syn keyword basicFunction usr6 Usr6 USR6 193 | syn keyword basicFunction usr7 Usr7 USR7 194 | syn keyword basicFunction usr8 Usr8 USR8 195 | syn keyword basicFunction usr9 Usr9 USR9 196 | syn keyword basicFunction val Val VAL 197 | syn keyword basicFunction varptr Varptr VARPTR 198 | 199 | syn keyword basicTodo contained TODO 200 | 201 | " Integer number, or floating point number without a dot. 202 | syn match basicNumber "\<\d\+\>" 203 | " Floating point number, with dot 204 | syn match basicNumber "\<\d\+\.\d*\>" 205 | " Floating point number, starting with a dot 206 | syn match basicNumber "\.\d\+\>" 207 | " Color Basic hex number 208 | syn match basicNumber "&[hH]\x\+\>" 209 | 210 | " String and Character contstants 211 | syn match basicSpecial contained "\\\d\d\d\|\\." 212 | syn region basicString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=basicSpecial 213 | 214 | syn region basicComment start="REM" end="$" contains=basicTodo 215 | syn region basicComment start="rem" end="$" contains=basicTodo 216 | syn region basicComment start="Rem" end="$" contains=basicTodo 217 | syn region basicComment start="^[ \t]*'" end="$" contains=basicTodo 218 | syn region basicComment start="'" end="$" contains=basicTodo 219 | syn region basicLineNumber start="^\d" end="\s" 220 | syn match basicTypeSpecifier "[a-zA-Z0-9][\$%&!#]"ms=s+1 221 | " Used with OPEN statement 222 | syn match basicFilenumber "#\d\+" 223 | syn match basicMathsOperator "-\|=\|[:<>+\*^/\\]\|AND\|OR" 224 | 225 | " Define the default highlighting. 226 | " For version 5.7 and earlier: only when not done already 227 | " For version 5.8 and later: only when an item doesn't have highlighting yet 228 | if version >= 508 || !exists("did_basic_syntax_inits") 229 | 230 | if version < 508 231 | let did_basic_syntax_inits = 1 232 | command -nargs=+ HiLink hi link 233 | else 234 | command -nargs=+ HiLink hi def link 235 | endif 236 | 237 | HiLink basicLabel Label 238 | HiLink basicConditional Conditional 239 | HiLink basicRepeat Repeat 240 | "HiLink basicLineNumber Comment 241 | HiLink basicLineNumber Identifier 242 | HiLink basicNumber Number 243 | HiLink basicError Error 244 | HiLink basicStatement Statement 245 | HiLink basicString String 246 | HiLink basicComment Comment 247 | HiLink basicSpecial Special 248 | HiLink basicTodo Todo 249 | HiLink basicFunction Identifier 250 | HiLink basicTypeSpecifier Type 251 | HiLink basicFilenumber basicTypeSpecifier 252 | 253 | delcommand HiLink 254 | 255 | endif 256 | 257 | hi Comment term=bold ctermfg=White guifg=#80a0ff gui=bold 258 | hi Constant term=bold cterm=NONE ctermfg=LightBlue ctermbg=NONE gui=NONE guifg=Magenta guibg=NONE 259 | hi Identifier term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=DarkCyan guibg=NONE 260 | hi Statement term=bold cterm=NONE ctermfg=Yellow ctermbg=NONE gui=bold guifg=Yellow guibg=NONE 261 | hi Special term=bold cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=SlateBlue guibg=NONE 262 | hi Underlined term=bold cterm=underline ctermfg=DarkMagenta gui=underline guifg=SlateBlue 263 | hi PreProc term=bold cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=Purple guibg=NONE 264 | hi Type term=underline cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=bold guifg=SeaGreen guibg=NONE 265 | hi Todo term=underline cterm=NONE ctermfg=White ctermbg=NONE gui=bold guifg=SeaGreen guibg=NONE 266 | 267 | let b:current_syntax = "basic" 268 | 269 | let &cpo = s:cpo_save 270 | unlet s:cpo_save 271 | -------------------------------------------------------------------------------- /decbpp: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import sys 4 | import re 5 | 6 | # 'READ', 'ON', 'ONBRK', 'ONERR', 'ATTR', 'DIM', 'FOR', 'PRINT', 'IF', 'NEXT', 'INPUT', 7 | 8 | keywords = [ 9 | 'ATTR', 'AUDIO', 'BACKUP', 'CIRCLE', 'CLEAR', 'CLOAD', 'CLOSE', 'CLS', 'CMP', 'COLOR', 'CONT', 'COPY', 'CSAVE', 'DATA', 10 | 'DEF', 'DIM', 'DIR', 'DLOAD', 'DOS', 'DRAW', 'DRIVE', 'DSKI$', 'DSKINI', 'DSKO$', 'END', 'EXEC', 'EXP', 'FIELD', 'FILES', 11 | 'FOR', 'GET', 'GO', 'GOSUB', 'GOTO', 'HBUFF', 'HCIRCLE', 'HCLS', 'HCOLOR', 'HDRAW', 'HGET', 'HLINE', 'HPAINT', 'HPRINT', 12 | 'HPUT', 'HRESET', 'HSCREEN', 'HSET', 'HSTAT', 'IF', 'INPUT', 'KILL', 'LET', 'LINE', 'LOAD', 'LOADM', 'LOCATE', 'LPOKE', 13 | 'LSET', 'MERGE', 'MOTOR', 'NEW', 'NEXT', 'ON', 'ONBRK', 'ONERR', 'OPEN', 'PAINT', 'PALETTE', 'PCLEAR', 'PCLS', 'PCOPY', 14 | 'PLAY', 'PMODE', 'POKE', 'PRESET', 'PRINT', 'PSET', 'PUT', 'READ', 'RENAME', 'RESET', 'RESTORE', 'RETURN', 'RGB', 'RSET', 15 | 'SCREEN', 'SET', 'SKIPF', 'SOUND', 'STEP', 'STOP', 'TROFF', 'TRON', 'UNLOAD', 'USING', 'VERIFY', 'WIDTH', 'WRITE' 16 | ] 17 | 18 | def minify(text): 19 | arr = text.strip().split('"') 20 | for i, item in enumerate(arr): 21 | if not i % 2: 22 | # not inside quotes 23 | s = item.upper().strip() # upper case, strip leading and trailing whitespace 24 | s = re.sub(r'([^A-Z])\s+', r'\1', s) # eliminate whitespace after constants and operators 25 | s = re.sub(r'\s+([^A-Z])', r'\1', s) # eliminate whitespace before constants and operators 26 | arr[i] = s 27 | if "'" in arr[i]: 28 | # remove ' comments 29 | j = i + 1 30 | del arr[j:] 31 | arr[i] = arr[i].split("'")[0].strip() 32 | if re.match(r'^REM.+$', arr[i]): 33 | # remove REM comments 34 | j = i + 1 35 | del arr[j:] 36 | arr[i] = '' 37 | r = '"'.join(arr) 38 | m = re.search(r'[A-Z]', r, re.I) # find keyword 39 | if m is not None: 40 | c = r[m.start()] 41 | for keyword in keywords: 42 | if keyword[0] == c: 43 | r = re.sub(r'(^\d*' + keyword + ') ', r'\1', r) # eliminate whitespace after keywords 44 | return r 45 | 46 | def optimize(text): 47 | 48 | r = re.sub(r' ?:?ELSE:?', r' ELSE', text) # strip trailing colon after ELSE 49 | r = re.sub(r' ?:?THEN:?', r' THEN', r) # strip trailing colon after THEN 50 | if len(r) > 0 and r[0] == ":": 51 | value = r[1:] # strip leading colon 52 | if len(r) > 0 and r[-1] == ":": 53 | r = r[:-1] # strip trailing colon 54 | r = re.sub(r'IF1 THEN', r'', r) # optimize "while 1" loop 55 | return r 56 | 57 | # read BASIC file 58 | linelist = sys.stdin.read().split('\n') 59 | 60 | # process INCLUDEs 61 | i = 0 62 | for line in linelist: 63 | i = i + 1 64 | line = minify(line.strip()) 65 | if line.startswith("INCLUDE"): 66 | filename = line[7:].strip().replace('"', '') 67 | inslist = open(filename, "r").readlines() 68 | linelist[i-1:i] = inslist 69 | line = minify(line.strip()) 70 | 71 | # process BASIC lines 72 | lines = "" 73 | linenum = 0 74 | data = "" 75 | inwhile = 0 76 | for line in linelist: 77 | 78 | line = minify(line) 79 | 80 | # WHILE 81 | if re.match("^.*\d*.*WHILE.+$", line): 82 | inwhile = linenum + 1 83 | line = line.replace("WHILE", "IF", 1) 84 | line = str(linenum + 1) + line 85 | line = minify(line); 86 | # DATA 87 | if line.startswith("DATA"): 88 | data = data + ',' + minify(line[4:]) 89 | # END IF 90 | elif line.endswith("ENDIF"): 91 | line = line[:-6] 92 | if len(lines) > 0: 93 | if len(line) > 0 and line[0].isdigit(): 94 | # line with line number 95 | linenum = int(re.findall(r'^\D*(\d+)', line)[0]) 96 | print(optimize(lines)) 97 | print(optimize(line)) 98 | else: 99 | # line without line number 100 | print(optimize(lines + ":" + line)) 101 | lines = "" 102 | # END WHILE 103 | elif line.endswith("ENDWHILE"): 104 | line = line[:-9] 105 | lines = lines + ":GOTO" + str(inwhile) 106 | inwhile = 0 107 | if len(lines) > 0: 108 | if len(line) > 0 and line[0].isdigit(): 109 | # line with line number 110 | linenum = int(re.findall(r'^\D*(\d+)', line)[0]) 111 | print(optimize(lines)) 112 | print(optimize(line)) 113 | else: 114 | # line without line number 115 | print(optimize(lines + ":" + line)) 116 | lines = "" 117 | elif len(line) > 0: 118 | if line[0].isdigit(): 119 | # line with line number 120 | linenum = int(re.findall(r'^\D*(\d+)', line)[0]) 121 | if len(lines) > 0: 122 | print(optimize(lines)) 123 | lines = line 124 | else: 125 | # line without line number 126 | if len(lines) == 0: 127 | # generate line number 128 | linenum = linenum + 1 129 | lines = str(linenum) + line 130 | else: 131 | # concatenate line 132 | if len(lines) > 200: 133 | print(optimize(lines)) 134 | linenum = linenum + 1 135 | lines = str(linenum) + line 136 | else: 137 | lines = lines + ":" + line 138 | 139 | # finish up 140 | if len(lines) > 0: 141 | print(optimize(lines)) 142 | if len(data) > 0: 143 | data = data[1:] 144 | arr = data.split(',') 145 | data = "" 146 | for i, item in enumerate(arr): 147 | data = data + ',' + item 148 | if len(data) > 200: 149 | linenum = linenum + 1 150 | print(str(linenum) + 'DATA' + data[1:]) 151 | data = "" 152 | if len(data) > 0: 153 | linenum = linenum + 1 154 | print(str(linenum) + 'DATA' + data[1:]) 155 | -------------------------------------------------------------------------------- /demo.bas: -------------------------------------------------------------------------------- 1 | 2 | ' Reset machine on BREAK 3 | pclear 1 4 | on brk goto 1000 5 | 6 | ' Disable cursor 7 | include "disable.bas" 8 | 9 | rem this is a useless remark 10 | 11 | ' Set up video mode and palette colors 12 | rgb 13 | width 80 14 | palette 0, 0 ' background color 15 | for i = 8 to 15 16 | read c 17 | palette i, c ' 8 foreground colors 18 | next i 19 | 20 | ' Palette color values: 21 | ' yellow, red, green, blue, orange, cyan, magenta, white 22 | data 54, 36, 18, 11, 38, 25, 45, 63 23 | 24 | ' Set up text items 25 | dim a$(8) 26 | for i = 0 to 7 27 | read a$(i) 28 | next i 29 | 30 | ' Text items 31 | data "Yellow", "Red", "Green", "Blue" 32 | data "Orange", "Cyan", "Magenta", "White" 33 | 34 | ' Display text in different colors 35 | cls 1 36 | for i = 0 to 7 37 | locate 0, i * 2 38 | attr i, 0 39 | if rnd(0) < .5 then 40 | print "Color "; 41 | else 42 | print "Colour "; 43 | end if 44 | print a$(i) 45 | next i 46 | 47 | ' Display joystick values until BREAK is hit 48 | locate 0, 19 49 | print "Joystick X Joystick Y"; 50 | attr 2, 0 51 | ox = -1 52 | oy = -1 53 | while 1 then 54 | x = joystk(0) 55 | y = joystk(1) 56 | if ox <> x or oy <> y then 57 | locate 4, 20 58 | print using "## ##"; x; y; 59 | end if 60 | ox = x 61 | oy = y 62 | end while 63 | 64 | ' Reset the machine 65 | 1000 poke &H71, 0 66 | exec &H8C1B 67 | -------------------------------------------------------------------------------- /disable.bas: -------------------------------------------------------------------------------- 1 | ' Disable cursor 2 | poke &HF905, &H21 3 | poke &HF91C, &H21 4 | poke &HF812, &H21 5 | poke &HF850, &H21 6 | poke &HF89D, &H21 7 | poke &HF7EC, 0 8 | -------------------------------------------------------------------------------- /images/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yggdrasilradio/preprocessor/62c4ace79eeffa48817f429363816d79abea77c3/images/code.png -------------------------------------------------------------------------------- /images/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yggdrasilradio/preprocessor/62c4ace79eeffa48817f429363816d79abea77c3/images/demo.png --------------------------------------------------------------------------------