├── .github └── workflows │ └── codeql.yml ├── LICENSE ├── README.md ├── doc ├── 10liner_fsnake.bas ├── Screenshot_2021-11-30_09-12-11.png ├── blink.gif ├── demodisk │ ├── demo-pgm.vd64 │ └── demodiskicon.png ├── fireworks.bas ├── guessing.bas ├── hangman.bas ├── helloworld.bas ├── mandelbrot.bas ├── maze.bas ├── screensaver1.bas ├── screenshot.png ├── scrn-powermenu.png ├── scrn-tablet.png ├── simplesnake-ingame.png ├── simplesnake.bas ├── spriteanim.bas ├── spriteanim2.bas ├── spriteanim_1b.bas ├── spriteanim_2b.bas ├── tictactoe.bas └── userguides.jpg ├── emulator ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ ├── kb │ │ └── commodore-white.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── c64basicpgm.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── kb.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── index.html ├── menu ├── fav.png ├── title.jpg └── title2.jpg └── versions ├── 0.8 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── 0.8p1 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── 0.8p2 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ ├── kb │ │ └── commodore-white.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── kb.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── 0.8p3 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ ├── kb │ │ └── commodore-white.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── kb.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── 0.8p4 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ ├── kb │ │ └── commodore-white.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── kb.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js ├── 0.8p5 ├── doc │ └── examples.json ├── index.html └── res │ ├── bas │ └── test │ │ └── unit1.bas │ ├── img │ ├── fav.png │ ├── kb │ │ └── commodore-white.png │ └── menu │ │ └── arrow.png │ └── script │ ├── basicarray.js │ ├── basiccommands.js │ ├── basiccontext.js │ ├── basicparser.js │ ├── basictokenizer.js │ ├── c64basicpgm.js │ ├── errorhandler.js │ ├── extendedcommands.js │ ├── g1 │ ├── core │ │ ├── blockfont.js │ │ ├── blockimage.js │ │ ├── boot.js │ │ ├── spriteimagemagic.js │ │ ├── spritemover.js │ │ └── tiles.js │ └── screens │ │ └── c64 │ │ ├── res │ │ └── petscii.png │ │ └── screen.js │ ├── kb.js │ ├── menu.js │ ├── menu_images.js │ ├── polyfix.js │ ├── statedefinitions.js │ ├── vdisk.js │ └── w64.js └── experimental ├── doc └── examples.json ├── index.html └── res ├── bas └── test │ └── unit1.bas ├── img ├── fav.png ├── kb │ └── commodore-white.png └── menu │ └── arrow.png └── script ├── basicarray.js ├── basiccommands.js ├── basiccontext.js ├── basicparser.js ├── basictokenizer.js ├── errorhandler.js ├── extendedcommands.js ├── g1 ├── core │ ├── blockfont.js │ ├── blockimage.js │ ├── boot.js │ ├── spriteimagemagic.js │ ├── spritemover.js │ └── tiles.js └── screens │ └── c64 │ ├── res │ └── petscii.png │ └── screen.js ├── kb.js ├── menu.js ├── menu_images.js ├── polyfix.js ├── statedefinitions.js ├── vdisk.js └── w64.js /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "main" ] 17 | pull_request: 18 | branches: [ "main" ] 19 | schedule: 20 | - cron: '21 5 * * 1' 21 | 22 | jobs: 23 | analyze: 24 | name: Analyze 25 | # Runner size impacts CodeQL analysis time. To learn more, please see: 26 | # - https://gh.io/recommended-hardware-resources-for-running-codeql 27 | # - https://gh.io/supported-runners-and-hardware-resources 28 | # - https://gh.io/using-larger-runners 29 | # Consider using larger runners for possible analysis time improvements. 30 | runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} 31 | timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} 32 | permissions: 33 | # required for all workflows 34 | security-events: write 35 | 36 | # only required for workflows in private repositories 37 | actions: read 38 | contents: read 39 | 40 | strategy: 41 | fail-fast: false 42 | matrix: 43 | language: [ 'javascript-typescript' ] 44 | # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] 45 | # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both 46 | # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both 47 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 48 | 49 | steps: 50 | - name: Checkout repository 51 | uses: actions/checkout@v4 52 | 53 | # Initializes the CodeQL tools for scanning. 54 | - name: Initialize CodeQL 55 | uses: github/codeql-action/init@v3 56 | with: 57 | languages: ${{ matrix.language }} 58 | # If you wish to specify custom queries, you can do so here or in a config file. 59 | # By default, queries listed here will override any specified in a config file. 60 | # Prefix the list here with "+" to use these queries and those in the config file. 61 | 62 | # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 63 | # queries: security-extended,security-and-quality 64 | 65 | 66 | # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). 67 | # If this step fails, then you should remove it and run the build manually (see below) 68 | - name: Autobuild 69 | uses: github/codeql-action/autobuild@v3 70 | 71 | # ℹ️ Command-line programs to run using the OS shell. 72 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 73 | 74 | # If the Autobuild fails above, remove it and uncomment the following three lines. 75 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 76 | 77 | # - run: | 78 | # echo "Run, Build Application using script" 79 | # ./location_of_script_within_repo/buildscript.sh 80 | 81 | - name: Perform CodeQL Analysis 82 | uses: github/codeql-action/analyze@v3 83 | with: 84 | category: "/language:${{matrix.language}}" 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # basic64-js 2 | Commodore 64 Basic Emulator for in the Browser 3 | 4 | Please check the Wiki (https://github.com/JoystickAndCursorKeys/basic64-js/wiki) for more information 5 | 6 | Or check out the webpage (https://joystickandcursorkeys.github.io/basic64-js) to run it in your browser 7 | -------------------------------------------------------------------------------- /doc/10liner_fsnake.bas: -------------------------------------------------------------------------------- 1 | 0 s=0:tp=0:poke53281,0:poke53280,0:print"{clear}use z,x keys":print "" 2 | 1 get a$ :if a$ =""then goto 1 3 | 2 br=53280:print "{clear}":x =19:s = 0:cr=55856 4 | 3 get a$ :s =s + 1: if peek (1584+x ) =42then 7 5 | 5 poke 1584+x,81:pokecr+x,7:bc=int(s/20):ifa$="z"ora$ ="x"thenx=x-(asc(a$)-89) 6 | 6 print:o=int(rnd(1)*40):poke1984+o,42:pokecr+o,3:pokebr,bcand255:goto 3 7 | 7 print"{home}{white}";spc(10);"gameover sc:";s;" top:";tp:ifs>tpthentp=s 8 | 8 geta$:ifa$=""then8 9 | 9 goto2 10 | -------------------------------------------------------------------------------- /doc/Screenshot_2021-11-30_09-12-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/Screenshot_2021-11-30_09-12-11.png -------------------------------------------------------------------------------- /doc/blink.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/blink.gif -------------------------------------------------------------------------------- /doc/demodisk/demodiskicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/demodisk/demodiskicon.png -------------------------------------------------------------------------------- /doc/fireworks.bas: -------------------------------------------------------------------------------- 1 | 100 print "{144}{147}"; 2 | 200 poke 53281,6:poke 53280,0 3 | 300 dim cl(7):cl(0)=1:cl(1)=4:cl(2)=13:cl(3)=3:cl(4)=7:cl(5)=10: cl(6)=14 4 | 400 dim bg(7):bg(0)=6:bg(1)=12:bg(2)=9:bg(3)=2 : bi=0:bw=0 5 | 500 dim hs(39) 6 | 600 for x=0 to 39 step 2 7 | 700 y2=23-int(rnd(1)*5) : hs(x)=y2: hs(x+1)=y2 8 | 800 for y=23 to y2 step -1 9 | 900 z0=x:z1=y+1:z2=160: z3=0: gosub 8300 10 | 1000 next 11 | 1100 next 12 | 1200 for t=1 to 20 13 | 1300 x=int(rnd(1)*40): y=int(rnd(0)*hs(x)) 14 | 1400 z0=x:z1=y:z2=46:z3=14:gosub 7700 15 | 1500 next 16 | 1600 x=20:y=25 17 | 1700 rem -- start top loop --------------- 18 | 1800 fort=1to1000000 19 | 1900 poke 53281,bg(bi) 20 | 2000 bw=bw+1:ifbw>4thenbw=0:bi=bi+1:ifbi>3then bi=0 21 | 2100 x=int(rnd(1)*40): y=int(rnd(0)*hs(x)) 22 | 2200 z0=x:z1=y:z2=46:z3=1:gosub 7700 23 | 2300 x=int(rnd(1)*40) 24 | 2400 y2=5+int(rnd(0)*5):cf=cl(int(rnd(1)*7)):z3=cf 25 | 2500 fory=hs(x)-5 toy2 step-1 26 | 2600 z0=x:z1=y:z2=46:gosub7700 27 | 2700 next 28 | 2800 print "{19}{5}":print spc(14);"happy 2022" 29 | 2900 z0=x:z1=y+1:z2=81:gosub6900 30 | 3000 z0=x:z1=y+1:z2=81:z3=cf:gosub7600 31 | 3100 rem --boom 32 | 3200 for b=1to49 :poke 53281,b 33 | 3300 next b: poke 53281,bg(bi) 34 | 3400 x1=x-1:y1=y: x2=x+1:y2=y 35 | 3500 x3=x-1:y3=y+2: x4=x+1:y4=y+2 36 | 3600 z3 = cf 37 | 3700 for ex=1 to 4 step 1 38 | 3800 z0=x1:z1=y1:z2=46:gosub7700 39 | 3900 z0=x2:z1=y2:z2=46:gosub7700 40 | 4000 z0=x3:z1=y3:z2=46:gosub7700 41 | 4100 z0=x4:z1=y4:z2=46:gosub7700 42 | 4200 x1=x1-1:y1=y1-1 43 | 4300 x2=x2+1:y2=y2-1 44 | 4400 x3=x3-1:y3=y3+1 45 | 4500 x4=x4+1:y4=y4+1 46 | 4600 next ex 47 | 4700 z0=x:z1=y+1:z2=32:z3=6:gosub7600 48 | 4800 foryy=hs(x)toy2 step-1 49 | 4900 z0=x:z1=yy:z2=32:gosub6900 50 | 5000 next 51 | 5100 x1=x-1:y1=y: x2=x+1:y2=y 52 | 5200 x3=x-1:y3=y+2: x4=x+1:y4=y+2 53 | 5300 for ex=1 to 4 step 1 54 | 5400 z0=x1:z1=y1:z2=32:gosub6900 55 | 5500 z0=x2:z1=y2:z2=32:gosub6900 56 | 5600 z0=x3:z1=y3:z2=32:gosub6900 57 | 5700 z0=x4:z1=y4:z2=32:gosub6900 58 | 5800 x1=x1-1:y1=y1-1 59 | 5900 x2=x2+1:y2=y2-1 60 | 6000 x3=x3-1:y3=y3+1 61 | 6100 x4=x4+1:y4=y4+1 62 | 6200 next ex 63 | 6300 z0=x:z1=y+1:z2=32:gosub6900 64 | 6400 print "{19}":print spc(14);" " 65 | 6500 next 66 | 6600 rem -- end top loop --------------- 67 | 6700 end 68 | 6800 rem plot char -------------- 69 | 6900 za=1024+z0+(z1*40) 70 | 7000 pokeza,z2 71 | 7100 return 72 | 7200 rem plot col -------------- 73 | 7300 za=55296+z0+(z1*40) 74 | 7400 pokeza,z2 75 | 7500 return 76 | 7600 rem plot char col -------------- 77 | 7700 za=55296+z0+(z1*40) 78 | 7800 pokeza,z3 79 | 7900 za=1024+z0+(z1*40) 80 | 8000 pokeza,z2 81 | 8100 return 82 | 8200 rem plot double char colr -------------- 83 | 8300 za=55296+z0+(z1*40) 84 | 8400 pokeza,z3: pokeza+1,z3 85 | 8500 za=1024+z0+(z1*40) 86 | 8600 pokeza,z2:pokeza+1,z2 87 | 8700 return 88 | -------------------------------------------------------------------------------- /doc/guessing.bas: -------------------------------------------------------------------------------- 1 | 10 rem - this number guessing game is based on guess and hi-lo 2 | 20 rem - from david h. ahl's book basic computer games. 3 | 30 print "=======" 4 | 40 print " zero!" 5 | 50 print "=======":print 6 | 60 print "i choose a number between 1 and 100.":print 7 | 70 print "you must zero in on it in 7 guesses.":print 8 | 80 print "i tell you to guess higher, or lower.":print 9 | 90 input "press enter to start. ready"; start$ 10 | 100 num = int(100*rnd(1)) 11 | 110 print:print "====================":print 12 | 120 print "i have chosen a number " 13 | 130 for count = 1 to 7 14 | 140 print "guess ";count; 15 | 150 input ": "; guess$ 16 | 160 guess = val(guess$) 17 | 170 if guess = num goto 250 18 | 180 if guess > num then print "guess lower" 19 | 190 if guess < num then print "guess higher" 20 | 200 print 21 | 210 next count 22 | 220 print:print "you've used all of your guesses." 23 | 230 print "the number was";num 24 | 240 goto 270 25 | 250 print "you got it in ";count; 26 | 260 print " guesses." 27 | 270 print 28 | 280 input "play again? (y/n) "; a$ 29 | 290 if a$ = "y" then goto 100 30 | 300 end 31 | -------------------------------------------------------------------------------- /doc/hangman.bas: -------------------------------------------------------------------------------- 1 | 10 print "{clear}{white}hang{red}man{white}" 2 | 20 print "{0}" :print "creative computing" 3 | 21 print " morristown, new jersey" 4 | 22 print : print "adapter by cursor keys retro computing" 5 | 23 poke 53280, 0:poke 53281, 0: print "{white}" 6 | 25 print :print :print 7 | 30 dim p$ (12,12),l$ (20),d$ (20),n$ (26),u (50) 8 | 40 c = 1:n =50 9 | 50 for i = 1to 20:d$ (i )="-":next i :m = 0 10 | 60 for i = 1to 26:n$ (i )="":next i 11 | 70 for i = 1to 12:for j = 1to 12:p$ (i ,j )=" ":next j :next i 12 | 80 for i = 1to 12:p$ (i , 1)="{reverse on} {reverse off}":next i 13 | 90 for i = 1to 7:p$ ( 1,i )="{reverse on} {reverse off}":next :p$ ( 2, 7)="{reverse on} {reverse off}" 14 | 95 if c 10then 170 71 | 600 print "sorry, you lose. the word was ";a$ 72 | 610 print "you missed that one. do you ";:goto 370 73 | 620 input "type yes or no";y$ :if left$ (y$ , 1)="y"then 50 74 | 700 data "gum","sin","for","cry","lug","bye","fly" 75 | 710 data "ugly","each","from","work","talk","with","self" 76 | 720 data "pizza","thing","feign","fiend","elbow","fault","dirty" 77 | 730 data "budget","spirit","quaint","maiden","escort","pickax" 78 | 740 data "example","tension","quinine","kidney","replica","sleeper" 79 | 750 data "triangle","kangaroo","mahogany","sergeant","sequence" 80 | 760 data "moustache","dangerous","scientist","different","quiescent" 81 | 770 data "magistrate","erroneously","loudspeaker","phytotoxic" 82 | 780 data "matrimonial","parasympathomimetic","thigmotropism" 83 | 990 print "bye now" 84 | 999 end -------------------------------------------------------------------------------- /doc/helloworld.bas: -------------------------------------------------------------------------------- 1 | 2 | 10 print chr$(147) 3 | 15 print chr$(5) 4 | 20 print "hello world" 5 | 25 poke 53280,0 : poke 53281,0 6 | -------------------------------------------------------------------------------- /doc/mandelbrot.bas: -------------------------------------------------------------------------------- 1 | 100 rem mandelbrot set in b & w 2 | 101 rem program adapted from version 3 | 102 rem at https://www.calormen.com/jsbasic/ 4 | 103 rem adapted by cursorkeys 2022 for basic64js 5 | 105 turbo: border 0 6 | 110 mode 2: gpen 1:gcolors 0,1 : gcls 7 | 120 for x = 0 to 279:for y = 0 to 95 8 | 130 x1 = x / 280 * 3 - 2:y1 = y / 191 * 2 - 1 9 | 140 i = 0:s = x1:t = y1:c = 0 10 | 150 s1 = s * s - t * t + x1 11 | 160 t = 2 * s * t + y1:s = s1:c = 1 - c:i = i + 1 12 | 170 if s * s + t * t < 4 and i < 117 then goto 150 13 | 180 if c = 0 then plot x,y:plot x,191 - y 14 | 190 next:next 15 | -------------------------------------------------------------------------------- /doc/maze.bas: -------------------------------------------------------------------------------- 1 | 200 for i = 1 to 30*40 2 | 300 print chr$(205.50+rnd(1)); 3 | 400 next 4 | -------------------------------------------------------------------------------- /doc/screensaver1.bas: -------------------------------------------------------------------------------- 1 | 100 mode 3 2 | 200 turbo 3 | 300 bgcolor 0:border 11 4 | 400 gcolors 1 5 | 500 gcls 6 | 600 dim x ( 2):dim y ( 2):dim dx ( 2):dim dy ( 2) 7 | 650 dim pc (16) 8 | 651 pc ( 0)=11:pc ( 1)=15:pc ( 2)=10:pc ( 3)=13 9 | 652 pc ( 4)=10:pc ( 5)=13:pc ( 6)=14:pc ( 7)= 8 10 | 653 pc ( 8)= 7:pc ( 9)= 8:pc (10)= 4:pc (11)=12 11 | 654 pc (12)=11 12 | 655 pc (13)= 3:pc (14)= 6:pc (15)= 1 13 | 660 dim rb (28) 14 | 661 for t = 0to 27:read c :rb (t )=c :next 15 | 700 x ( 0)= 0:dx ( 0)=4.01 16 | 800 y ( 0)= 0:dy ( 0)=2.1 17 | 900 x ( 1)=100:dx ( 1)=3.02 18 | 1000 y ( 1)=100:dy ( 1)=1.09 19 | 1100 c = 1:ci = 0:d =20:rc = 0 20 | 1200 tm =200 21 | 1300 x ( 0)=x ( 0)+dx ( 0) 22 | 1400 x ( 1)=x ( 1)+dx ( 1) 23 | 1500 y ( 0)=y ( 0)+dy ( 0) 24 | 1600 y ( 1)=y ( 1)+dy ( 1) 25 | 1700 if x ( 0)< 0then x ( 0)= 0:dx ( 0)=-dx ( 0) 26 | 1800 if x ( 1)< 0then x ( 1)= 0:dx ( 1)=-dx ( 1) 27 | 1900 if y ( 0)< 0then y ( 0)= 0:dy ( 0)=-dy ( 0) 28 | 2000 if y ( 1)< 0then y ( 1)= 0:dy ( 1)=-dy ( 1) 29 | 2100 if x ( 0)>159then x ( 0)=159:dx ( 0)=-dx ( 0) 30 | 2200 if x ( 1)>159then x ( 1)=159:dx ( 1)=-dx ( 1) 31 | 2300 if y ( 0)>199then y ( 0)=199:dy ( 0)=-dy ( 0) 32 | 2400 if y ( 1)>199then y ( 1)=199:dy ( 1)=-dy ( 1) 33 | 2500 line x ( 0),y ( 0),x ( 1),y ( 1),ci + 1 34 | 2600 line x ( 1),y ( 0),x ( 0),y ( 1),ci + 1 35 | 2700 line x ( 0),y ( 1),x ( 1),y ( 0),ci + 1 36 | 2800 line x ( 1),y ( 1),x ( 0),y ( 0),ci + 1 37 | 2900 d =d - 1:if d < 0then d =20:rc = 1 38 | 3000 if rc = 1then c =c + 1:ci =ci + 1 39 | 3100 if rc = 1then if ci > 2then ci = 0 40 | 3200 if rc = 1then if c >27then c = 0 41 | 3300 if rc = 1then gcoldef ci ,rb (c ) 42 | 3400 rc = 0 43 | 3500 tm =tm - 1:if tm < 0then tm =200:rf = 1 44 | 3600 if rf = 1then cc =int (rnd ( 1)*15) 45 | 3700 if rf = 1then bgcolor cc 46 | 3800 if rf = 1then cc =pc (cc ) 47 | 3900 if rf = 1then border cc :gcls :rf = 0 48 | 4000 wjiffy 49 | 4100 goto 1300 50 | 5000 data 0,11,12,15, 1, 7,10, 8, 4, 2, 4, 6,14 51 | 5001 data 3,13, 5, 7,15,12, 9, 8,15, 1, 3,15,12, 9,11 52 | -------------------------------------------------------------------------------- /doc/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/screenshot.png -------------------------------------------------------------------------------- /doc/scrn-powermenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/scrn-powermenu.png -------------------------------------------------------------------------------- /doc/scrn-tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/scrn-tablet.png -------------------------------------------------------------------------------- /doc/simplesnake-ingame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/simplesnake-ingame.png -------------------------------------------------------------------------------- /doc/simplesnake.bas: -------------------------------------------------------------------------------- 1 | 100 fort=0to39:poke1024+t,102:next 2 | 110 print"{clear}" 3 | 120 fort=0to39:poke1024+t,102:next 4 | 130 fort=0to39:poke1984+t,102:next 5 | 140 fort=0to23:poke1024+(t*40),102:next 6 | 150 fort=0to23:poke1063+(t*40),102:next 7 | 160 x=20:y=20:sc=0:dx=1:dy=0:sw=5:sl=sw 8 | 170 geta$ 9 | 180 ifa$="q"thendy=-1:dx=0 10 | 190 ifa$="a"thendy=1:dx=0 11 | 200 ifa$="o"thendy=0:dx=-1 12 | 210 ifa$="p"thendy=0:dx=1 13 | 220 sl=sl-1:ifsl>0thengoto170 14 | 230 sl=sw:sc=sc+1 15 | 240 poke1024+x+(y*40),81 16 | 250 print"{home}";sc:sl=sl-1 17 | 260 x=x+dx:y=y+dy 18 | 270 ad=1024+x+(y*40) 19 | 280 ifpeek(ad)<>32thengoto300 20 | 290 goto170 21 | 300 print" ** game over ** " 22 | 310 geta$ : ifa$<>" "thengoto310 23 | 320 goto110 24 | -------------------------------------------------------------------------------- /doc/spriteanim.bas: -------------------------------------------------------------------------------- 1 | 10 sprite 0,1 2 | 15 cls 3 | 20 scol 0,1 4 | 30 sframe 0,192: 5 | 40 for f=0to3 : for t=0to62:read b 6 | 45 spoke 192 + f,t,b : next : next 7 | 99 fc = 0 8 | 100 for t=20 to 200 step 1 9 | 101 spos 0,t,200 10 | 102 fc=fc+1:an=0 11 | 103 iffc>5 thenan=1:fc=0 12 | 104 if an=1 then f=f+1 13 | 105 if an=1 then iff>3thenf=0 14 | 106 if an=1 then sframe 0,192+f 15 | 119 wjiffy 16 | 120 next 17 | 300 goto 100 18 | 5000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 19 | 5001 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 20 | 5002 data 0, 45, 0, 0, 44, 0, 0, 10, 0, 0, 10, 0, 0, 18, 0, 0, 17, 0, 0, 25, 128 21 | 5003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 22 | 5004 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 23 | 5005 data 0, 30, 0, 0, 30, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 24 | 5006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0 25 | 5007 data 0, 127, 0, 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 30, 0 26 | 5008 data 0, 45, 0, 0, 44, 0, 0, 14, 0, 0, 14, 0, 0, 4, 0, 0, 12, 0, 0, 14, 0 27 | 5009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 28 | 5010 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 29 | 5011 data 0, 45, 128, 0, 76, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 30 | -------------------------------------------------------------------------------- /doc/spriteanim2.bas: -------------------------------------------------------------------------------- 1 | 0 turbo 2 | 1 dim ev(8) 3 | 2 ev(0)=1:ev(1)=0:ev(2)=1:ev(3)=0 4 | 3 ev(4)=1:ev(5)=0:ev(6)=1:ev(7)=0 5 | 4 bgcolor 11: border 12: cls 6 | 10 for t=0to7 7 | 15 sprite t,1: sprite t,1 8 | 20 scol t,1+t 9 | 25 next 10 | 40 for f=0to7:for t=0to62:read b 11 | 45 spoke 192+f,t,b : next : next 12 | 90 fc = 0 : 13 | 95 dx=1:x=30 14 | 100 for t=1 to 300 15 | 135 for s=0 to 7 16 | 136 gosub 1500 17 | 137 next 18 | 142 x=x+dx : fc=fc+1:an=0 19 | 143 if fc>5 thenan=1:fc=0 20 | 144 if an=1 then f=f+1 21 | 145 if an=1 then iff>3thenf=0 22 | 146 if an=1anddx=1then gosub 1000 23 | 147 if an=1anddx=-1then gosub 1000 24 | 169 wjiffy 25 | 170 next 26 | 180 dx=-dx 27 | 190 goto 100 28 | 1000 rem anim all sprites 29 | 1010 fors=0to7 30 | 1011 z0=192: z1=196: if dx<0then z0=196: z1=192 31 | 1012 if ev(s)=1 then sframe s,z0+f 32 | 1013 if ev(s)=0 then sframe s,z1+f 33 | 1014 next 34 | 1015 return 35 | 1500 rem move all sprites 36 | 1501 fors=0to7 37 | 1502 if ev(s)=1then spos s,x,200-(s*15)-(x/10) 38 | 1503 if ev(s)=0then spos s,330-x,200-(s*15)-(x/15) 39 | 1504 next 40 | 1505 return 41 | 5000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 42 | 5001 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 43 | 5002 data 0, 45, 0, 0, 44, 0, 0, 10, 0, 0, 10, 0, 0, 18, 0, 0, 17, 0, 0, 25, 128 44 | 5003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 45 | 5004 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 46 | 5005 data 0, 30, 0, 0, 30, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 47 | 5006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0 48 | 5007 data 0, 127, 0, 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 30, 0 49 | 5008 data 0, 45, 0, 0, 44, 0, 0, 14, 0, 0, 14, 0, 0, 4, 0, 0, 12, 0, 0, 14, 0 50 | 5009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 51 | 5010 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 52 | 5011 data 0, 45, 128, 0, 76, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 53 | 6000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 54 | 6001 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 55 | 6002 data 1, 180, 0, 0, 50, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 240, 0 56 | 6003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0 57 | 6004 data 0, 254, 0, 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 120, 0 58 | 6005 data 0, 180, 0, 0, 52, 0, 0, 112, 0, 0, 112, 0, 0, 32, 0, 0, 48, 0, 0, 112, 0 59 | 6006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 60 | 6007 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 61 | 6008 data 0, 120, 0, 0, 120, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 240, 0 62 | 6009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 63 | 6010 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 64 | 6011 data 0, 180, 0, 0, 52, 0, 0, 80, 0, 0, 80, 0, 0, 72, 0, 0, 136, 0, 1, 152, 0 65 | -------------------------------------------------------------------------------- /doc/spriteanim_1b.bas: -------------------------------------------------------------------------------- 1 | 5 turbo 2 | 10 sprite 0,1 3 | 15 cls 4 | 20 scol 0,1 5 | 30 sframe 0,192: 6 | 40 for f=0to3 : for t=0to62:read b 7 | 45 sfpoke 192 + f,t,b : next : next 8 | 99 fc = 0 9 | 100 for t=20 to 200 step 1 10 | 101 spos 0,t,200 11 | 102 fc=fc+1:an=0 12 | 103 iffc>5 thenan=1:fc=0 13 | 104 if an=1 then f=f+1 14 | 105 if an=1 then iff>3thenf=0 15 | 106 if an=1 then sframe 0,192+f 16 | 119 wjiffy 17 | 120 next 18 | 300 goto 100 19 | 5000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 20 | 5001 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 21 | 5002 data 0, 45, 0, 0, 44, 0, 0, 10, 0, 0, 10, 0, 0, 18, 0, 0, 17, 0, 0, 25, 128 22 | 5003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 23 | 5004 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 24 | 5005 data 0, 30, 0, 0, 30, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 25 | 5006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0 26 | 5007 data 0, 127, 0, 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 30, 0 27 | 5008 data 0, 45, 0, 0, 44, 0, 0, 14, 0, 0, 14, 0, 0, 4, 0, 0, 12, 0, 0, 14, 0 28 | 5009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 29 | 5010 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 30 | 5011 data 0, 45, 128, 0, 76, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 31 | -------------------------------------------------------------------------------- /doc/spriteanim_2b.bas: -------------------------------------------------------------------------------- 1 | 0 turbo 2 | 1 dim ev(8) 3 | 2 ev(0)=1:ev(1)=0:ev(2)=1:ev(3)=0 4 | 3 ev(4)=1:ev(5)=0:ev(6)=1:ev(7)=0 5 | 4 bgcolor 11: border 12: cls 6 | 10 for t=0to7 7 | 15 sprite t,1: sprite t,1 8 | 20 scol t,1+t 9 | 25 next 10 | 40 for f=0to7:for t=0to62:read b 11 | 45 sfpoke 192+f,t,b : next : next 12 | 90 fc = 0 : 13 | 95 dx=1:x=30 14 | 100 for t=1 to 300 15 | 135 for s=0 to 7 16 | 136 gosub 1500 17 | 137 next 18 | 142 x=x+dx : fc=fc+1:an=0 19 | 143 if fc>5 thenan=1:fc=0 20 | 144 if an=1 then f=f+1 21 | 145 if an=1 then iff>3thenf=0 22 | 146 if an=1anddx=1then gosub 1000 23 | 147 if an=1anddx=-1then gosub 1000 24 | 169 wjiffy 25 | 170 next 26 | 180 dx=-dx 27 | 190 goto 100 28 | 1000 rem anim all sprites 29 | 1010 fors=0to7 30 | 1011 z0=192: z1=196: if dx<0then z0=196: z1=192 31 | 1012 if ev(s)=1 then sframe s,z0+f 32 | 1013 if ev(s)=0 then sframe s,z1+f 33 | 1014 next 34 | 1015 return 35 | 1500 rem move all sprites 36 | 1501 fors=0to7 37 | 1502 if ev(s)=1then spos s,x,200-(s*15)-(x/10) 38 | 1503 if ev(s)=0then spos s,330-x,200-(s*15)-(x/15) 39 | 1504 next 40 | 1505 return 41 | 5000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 42 | 5001 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 43 | 5002 data 0, 45, 0, 0, 44, 0, 0, 10, 0, 0, 10, 0, 0, 18, 0, 0, 17, 0, 0, 25, 128 44 | 5003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 45 | 5004 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 46 | 5005 data 0, 30, 0, 0, 30, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 47 | 5006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0 48 | 5007 data 0, 127, 0, 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 30, 0 49 | 5008 data 0, 45, 0, 0, 44, 0, 0, 14, 0, 0, 14, 0, 0, 4, 0, 0, 12, 0, 0, 14, 0 50 | 5009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 127, 0, 0, 125, 0, 0, 127, 0 51 | 5010 data 0, 127, 0, 0, 96, 0, 0, 127, 0, 0, 62, 0, 0, 8, 0, 0, 8, 0, 0, 30, 0 52 | 5011 data 0, 45, 128, 0, 76, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 0, 15, 0 53 | 6000 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 54 | 6001 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 55 | 6002 data 1, 180, 0, 0, 50, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 240, 0 56 | 6003 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0 57 | 6004 data 0, 254, 0, 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 120, 0 58 | 6005 data 0, 180, 0, 0, 52, 0, 0, 112, 0, 0, 112, 0, 0, 32, 0, 0, 48, 0, 0, 112, 0 59 | 6006 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 60 | 6007 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 61 | 6008 data 0, 120, 0, 0, 120, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 80, 0, 0, 240, 0 62 | 6009 data 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 254, 0, 0, 190, 0, 0, 254, 0 63 | 6010 data 0, 254, 0, 0, 6, 0, 0, 254, 0, 0, 124, 0, 0, 16, 0, 0, 16, 0, 0, 120, 0 64 | 6011 data 0, 180, 0, 0, 52, 0, 0, 80, 0, 0, 80, 0, 0, 72, 0, 0, 136, 0, 1, 152, 0 65 | -------------------------------------------------------------------------------- /doc/tictactoe.bas: -------------------------------------------------------------------------------- 1 | 0 print "{147}{5}" 2 | 1 poke 53281,0: poke 53280,0 3 | 2 print tab(10);"tic-tac-toe" 4 | 4 print tab(0);"creative computing":print" morristown, new jersey" 5 | 5 print: print tab(0);"adapted by cursorkeys, 2022" 6 | 6 print:print:print 7 | 8 print "the board is numbered:" 8 | 10 print " 1 2 3" 9 | 12 print " 4 5 6" 10 | 14 print " 7 8 9" 11 | 16 print:print:print 12 | 20 dim s(9) 13 | 50 input"do you want 'x' or 'o'";c$ 14 | 55 if c$="x"then goto 475 15 | 60 p$="o":q$="x" 16 | 100 g=-1:h=1:if s(5)<>0 then 103 17 | 102 s(5)=-1:goto 195 18 | 103 if s(5)<>1 then 106 19 | 104 if s(1)<>0 then 110 20 | 105 s(1)=-1:goto 195 21 | 106 if s(2)=1 and s(1)=0 then 181 22 | 107 if s(4)=1 and s(1)=0 then 181 23 | 108 if s(6)=1 and s(9)=0 then 189 24 | 109 if s(8)=1 and s(9)=0 then 189 25 | 110 if g=1 then 112 26 | 111 goto 118 27 | 112 j=3*int((m-1)/3)+1 28 | 113 if 3*int((m-1)/3)+1=m then k=1 29 | 114 if 3*int((m-1)/3)+2=m then k=2 30 | 115 if 3*int((m-1)/3)+3=m then k=3 31 | 116 goto 120 32 | 118 for j=1 to 7 step 3:for k=1 to 3 33 | 120 if s(j)<>g then 130 34 | 122 if s(j+2)<>g then 135 35 | 126 if s(j+1)<>0 then 150 36 | 128 s(j+1)=-1:goto 195 37 | 130 if s(j)=h then 150 38 | 131 if s(j+2)<>g then 150 39 | 132 if s(j+1)<>g then 150 40 | 133 s(j)=-1:goto 195 41 | 135 if s(j+2)<>0 then 150 42 | 136 if s(j+1)<>g then 150 43 | 138 s(j+2)=-1:goto 195 44 | 150 if s(k)<>g then 160 45 | 152 if s(k+6)<>g then 165 46 | 156 if s(k+3)<>0 then 170 47 | 158 s(k+3)=-1:goto 195 48 | 160 if s(k)=h then 170 49 | 161 if s(k+6)<>g then 170 50 | 162 if s(k+3)<>g then 170 51 | 163 s(k)=-1:goto 195 52 | 165 if s(k+6)<>0 then 170 53 | 166 if s(k+3)<>g then 170 54 | 168 s(k+6)=-1:goto 195 55 | 170 goto 450 56 | 171 if s(3)=g and s(7)=0 then 187 57 | 172 if s(9)=g and s(1)=0 then 181 58 | 173 if s(7)=g and s(3)=0 then 183 59 | 174 if s(9)=0 and s(1)=g then 189 60 | 175 if g=-1 then g=1:h=-1:goto 110 61 | 176 if s(9)=1 and s(3)=0 then 182 62 | 177 for i=2 to 9:if s(i)<>0 then 179 63 | 178 s(i)=-1:goto 195 64 | 179 next i 65 | 181 s(1)=-1:goto 195 66 | 182 if s(1)=1 then 177 67 | 183 s(3)=-1:goto 195 68 | 187 s(7)=-1:goto 195 69 | 189 s(9)=-1 70 | 195 print:print"the computer moves to..." 71 | 202 gosub 1000 72 | 205 goto 500 73 | 450 if g=1 then 465 74 | 455 if j=7 and k=3 then 465 75 | 460 next k,j 76 | 465 if s(5)=g then 171 77 | 467 goto 175 78 | 475 p$="x":q$="o" : rem ----goto dest ---- 79 | 500 print:input"where do you move";m 80 | 502 if m=0 then print"thanks for the game.":goto 2000 81 | 503 if m>9 then 506 82 | 505 if s(m)=0 then 510 83 | 506 print"that square is occupied.":print:print:goto 500 84 | 510 g=1:s(m)=1 85 | 520 gosub 1000 86 | 530 goto 100 87 | 1000 print 88 | 1005 for i=1 to 9 : rem start for i ----- 89 | 1010 print" ";:if s(i)<>-1 then 1014 90 | 1012 print q$;" ";:goto 1020 91 | 1014 if s(i)<>0 then 1018 92 | 1016 print" ";:goto 1020 93 | 1018 print p$;" "; 94 | 1020 if i<>3 and i<>6 then 1050 95 | 1030 print:print"---+---+---" 96 | 1040 goto 1080 97 | 1050 if i=9 then 1080 98 | 1060 print"!"; 99 | 1080 next i : rem end for i ------- 100 | 1085 print:print:print 101 | 1095 for i=1 to 7 step 3 102 | 1100 if s(i)<>s(i+1)then 1115 103 | 1105 if s(i)<>s(i+2)then 1115 104 | 1110 if s(i)=-1 then 1350 105 | 1112 if s(i)=1 then 1200 106 | 1115 next i:for i=1 to 3:if s(i)<>s(i+3)then 1150 107 | 1130 if s(i)<>s(i+6)then 1150 108 | 1135 if s(i)=-1 then 1350 109 | 1137 if s(i)=1 then 1200 110 | 1150 next i:for i=1 to 9:if s(i)=0 then 1155 111 | 1152 next i:goto 1400 112 | 1155 if s(5)<>g then 1170 113 | 1160 if s(1)=g and s(9)=g then 1180 114 | 1165 if s(3)=g and s(7)=g then 1180 115 | 1170 return 116 | 1180 if g=-1 then 1350 117 | 1200 print"you beat me!! good game.":goto 2000 118 | 1350 print"i win, turkey!!!":goto 2000 119 | 1400 print"it's a draw. thank you." 120 | 2000 end 121 | 122 | -------------------------------------------------------------------------------- /doc/userguides.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/doc/userguides.jpg -------------------------------------------------------------------------------- /emulator/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /emulator/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /emulator/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/emulator/res/img/fav.png -------------------------------------------------------------------------------- /emulator/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/emulator/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /emulator/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/emulator/res/img/menu/arrow.png -------------------------------------------------------------------------------- /emulator/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /emulator/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /emulator/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | this.iconCanvas = null; 78 | this.iconContext = null; 79 | this.img = null; 80 | 81 | } 82 | 83 | mapChar( c0 ) { 84 | 85 | var c = c0.toLowerCase(); 86 | 87 | var map = []; 88 | var index; 89 | 90 | map['a'] = 0; map['b'] = 1; 91 | map['c'] = 2; map['d'] = 3; 92 | map['e'] = 4; map['f'] = 5; 93 | map['g'] = 6; map['h'] = 7; 94 | map['i'] = 8; map['j'] = 9; 95 | map['k'] = 10; map['l'] = 11; 96 | map['m'] = 12; map['n'] = 13; 97 | map['o'] = 14; map['p'] = 15; 98 | map['q'] = 16; map['r'] = 17; 99 | map['s'] = 18; map['t'] = 19; 100 | map['u'] = 20; map['v'] = 21; 101 | map['w'] = 22; map['x'] = 23; 102 | map['y'] = 24; map['z'] = 25; 103 | 104 | map['0'] = 26; map['1'] = 27; 105 | map['2'] = 28; map['3'] = 29; 106 | map['4'] = 30; map['5'] = 31; 107 | map['6'] = 32; map['7'] = 33; 108 | map['8'] = 34; map['9'] = 35; 109 | map['@'] = 36; map['&'] = 37; 110 | map['*'] = 38; map['+'] = 39; 111 | map['|'] = 40; map['_'] = 41; 112 | map['.'] = 42; map[','] = 43; 113 | map[':'] = 44; map['()'] = 45; 114 | map[')'] = 46; map['-'] = 47; 115 | map['#'] = 48; map['?'] = 49; 116 | map['%'] = 50; map['!'] = 51; 117 | 118 | index = map [ c ]; 119 | if( index == undefined ) { 120 | if( c == ' ' ) { 121 | return -1; 122 | } 123 | index = 49; 124 | } 125 | 126 | return index; 127 | } 128 | 129 | drawChar( ctx, x, y, c ) { 130 | var index = this.mapChar( c ); 131 | if( index > -1 ) { 132 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 133 | } 134 | } 135 | 136 | centerX( str, screenWidth ) { 137 | var txtW = str.length * this.gridw; 138 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 139 | } 140 | 141 | drawString( ctx, x0, y, str ) { 142 | var x = x0; 143 | for (var i = 0; i < str.length; i++) { 144 | this.drawChar( ctx, x, y, str.charAt(i) ); 145 | x+= this.gridw; 146 | } 147 | } 148 | 149 | } 150 | -------------------------------------------------------------------------------- /emulator/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /emulator/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /emulator/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/emulator/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /emulator/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /emulator/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /menu/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/menu/fav.png -------------------------------------------------------------------------------- /menu/title.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/menu/title.jpg -------------------------------------------------------------------------------- /menu/title2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/menu/title2.jpg -------------------------------------------------------------------------------- /versions/0.8/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8/res/script/basictokenizer.js: -------------------------------------------------------------------------------- 1 | class StringReader { 2 | 3 | constructor( strIn ) { 4 | this.buffer = strIn; 5 | this.index = 0; 6 | this.lineIndex = 1; 7 | this.line = 1; 8 | var a={}; a.b=strIn; 9 | 10 | } 11 | 12 | peek() { 13 | return this.buffer.substr( this.index,1 ); 14 | } 15 | peek2() { 16 | return this.buffer.substr( this.index,2 ); 17 | } 18 | 19 | 20 | unconsume( x ) { 21 | this.index -= x; 22 | } 23 | 24 | consume() { 25 | 26 | var c = this.buffer.substr( this.index,1 ); 27 | this.index ++; 28 | if( c == "\n") { 29 | this.line++; 30 | this.lineIndex = 1; 31 | } 32 | 33 | } 34 | 35 | EOF() { 36 | var len = this.buffer.length; 37 | if( this.index < len ) { 38 | return false; 39 | } 40 | return true; 41 | } 42 | } 43 | 44 | 45 | class Tokenizer { 46 | 47 | constructor( reader, keywords ) { 48 | this.tokens = []; 49 | this.reader = reader; 50 | this.keywords = keywords; 51 | } 52 | 53 | isOpChar( ctx ) { 54 | 55 | var rv = ctx.c.match("[+]|[-]|[*]|[/]|[\\^]|[;]") != null; 56 | 57 | return [rv,0]; 58 | 59 | } 60 | 61 | isCompChar( ctx ) { 62 | 63 | var rv = (ctx.c == "<" || ctx.c == ">"); 64 | return [rv,0]; 65 | } 66 | 67 | isEqChar( ctx ) { 68 | if( ctx.c == "=" ) { 69 | return [true,0]; 70 | } 71 | return [false,0]; 72 | } 73 | 74 | 75 | isNameChar( ctx ) { 76 | 77 | //console.log("SEQ: " + ctx.seq); 78 | if( ctx.endFound ) { 79 | return [false,0]; 80 | } 81 | var rv = ctx.c.match("[a-zA-Z0-9$%?]") != null; 82 | 83 | if( ctx.c=="$" || ctx.c== "%") { 84 | ctx.endFound = true; 85 | } 86 | 87 | if( this.keywords.indexOf( ctx.seq ) >-1 ) { 88 | //console.log("Found Keyword: " + ctx.seq ); 89 | ctx.endFound = true; 90 | } 91 | else if( ! (ctx.seq === undefined )) { 92 | var trappedKW = false; 93 | var trapped = null; 94 | for( var i=0; i 0 ) { 97 | trappedKW = true; 98 | trapped = kw; 99 | //console.log( "trapped-------------" ); 100 | //console.log( kw ); 101 | //console.log( ctx.seq ); 102 | //console.log( ctx ); 103 | return [rv, kw.length ]; 104 | } 105 | } 106 | 107 | } 108 | return [rv,0]; 109 | } 110 | 111 | isNumChar( ctx ) { 112 | return [(ctx.c.match("[0-9\.~]") != null),0]; 113 | } 114 | 115 | isPadChar( ctx ) { 116 | if( ctx.c == " " || ctx.c == "\t" || ctx.c == "\n" || ctx.c == "\r") { 117 | return [true,0]; 118 | } 119 | return [false,0]; 120 | } 121 | 122 | isCommandSepChar( ctx ) { 123 | if( ctx.c == ":" ) { 124 | return [true,0]; 125 | } 126 | return [false,0]; 127 | } 128 | 129 | 130 | isSepChar( ctx ) { 131 | if( ctx.c == "," ) { 132 | return [true,0]; 133 | } 134 | return [false,0]; 135 | } 136 | 137 | isAnyChar( ctx ) { 138 | return [true,0]; /* Will be executed last */ 139 | } 140 | 141 | 142 | isBracket( ctx ) { 143 | if( ctx.c == "(" || ctx.c == ")" || ctx.c == "[" || ctx.c == "]") { 144 | return [true,0]; 145 | } 146 | return [false,0]; 147 | } 148 | 149 | 150 | isStrChar( ctx ) { 151 | 152 | if( ctx.endFound ) { 153 | return [false,0]; 154 | } 155 | 156 | if( ctx.index == 0) { 157 | if( ctx.c=="\"" ) { 158 | ctx.inString = true; 159 | return [true,0]; 160 | } 161 | return [false,0]; 162 | } 163 | else if( ctx.inString ) { 164 | if ( ctx.index > 0 && ctx.c=="\"") { 165 | ctx.endFound = true; 166 | } 167 | return [true,0]; 168 | } 169 | 170 | return [false,0]; 171 | 172 | } 173 | 174 | normalizeToken( tok0 ) { 175 | var tok = tok0; 176 | 177 | tok.type = tok0.type; 178 | 179 | if( tok.type == "str" ) { 180 | tok.data = tok0.data.substr(1,tok0.data.length-2); 181 | } 182 | return tok; 183 | } 184 | 185 | readChars( read, type0, compareF, tokenType ) { 186 | var tok = { type: type0, data : "" } 187 | var ctx = { index:0, prev: null, seq: "" }; 188 | 189 | while(!read.EOF()) { 190 | 191 | var c = read.peek(); 192 | 193 | ctx.seq += c; 194 | ctx.c = c; 195 | 196 | var rv = this[compareF ] ( ctx ); 197 | if( rv[1] > 0 ) { 198 | read.unconsume( rv[1]-1 ); 199 | ctx.seq = ctx.seq.substr(0,ctx.seq.length-rv[1]) ; 200 | tok.data = ctx.seq; 201 | break; 202 | } 203 | 204 | if( !rv[0] ) { 205 | return this.normalizeToken( tok ); 206 | } 207 | tok.data += c; 208 | read.consume(); 209 | 210 | ctx.index++; 211 | ctx.prev = c; 212 | 213 | if( tokenType == "chr") { 214 | break; 215 | } 216 | } 217 | 218 | return this.normalizeToken( tok ); 219 | } 220 | 221 | 222 | tokenize() { 223 | var read = this.reader; 224 | 225 | var _this = this; 226 | var tokens = []; 227 | 228 | var parseRules = []; 229 | var TYPEIX = 0; 230 | var FUNCIX = 1; 231 | var STRINGTYPEIX = 2; 232 | 233 | parseRules.push(["pad", "isPadChar" , "str"] ); 234 | parseRules.push(["str", "isStrChar" , "str"] ); 235 | parseRules.push(["num", "isNumChar" , "str"] ); 236 | parseRules.push(["name", "isNameChar" , "str"] ); 237 | parseRules.push(["op", "isOpChar" , "chr"] ); 238 | parseRules.push(["comp", "isCompChar" , "chr"] ); 239 | parseRules.push(["eq", "isEqChar" , "chr"] ); 240 | parseRules.push(["bracket", "isBracket" , "chr"] ); 241 | parseRules.push(["sep", "isSepChar" , "chr"] ); 242 | parseRules.push(["cmdsep", "isCommandSepChar" , "chr"] ); 243 | parseRules.push(["trash", "isAnyChar" , "chr"] ); 244 | 245 | while( !read.EOF() ) { 246 | var c = read.peek(); 247 | var tokenFound = false; 248 | 249 | for( var i=0; i" + read.line + ":" + read.lineIndex; 267 | } 268 | } 269 | return tokens; 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /versions/0.8/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/0.8/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/0.8p1/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8p1/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8p1/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p1/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8p1/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p1/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8p1/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/basictokenizer.js: -------------------------------------------------------------------------------- 1 | class StringReader { 2 | 3 | constructor( strIn ) { 4 | this.buffer = strIn; 5 | this.index = 0; 6 | this.lineIndex = 1; 7 | this.line = 1; 8 | var a={}; a.b=strIn; 9 | 10 | } 11 | 12 | peek() { 13 | return this.buffer.substr( this.index,1 ); 14 | } 15 | peek2() { 16 | return this.buffer.substr( this.index,2 ); 17 | } 18 | 19 | 20 | unconsume( x ) { 21 | this.index -= x; 22 | } 23 | 24 | consume() { 25 | 26 | var c = this.buffer.substr( this.index,1 ); 27 | this.index ++; 28 | if( c == "\n") { 29 | this.line++; 30 | this.lineIndex = 1; 31 | } 32 | 33 | } 34 | 35 | EOF() { 36 | var len = this.buffer.length; 37 | if( this.index < len ) { 38 | return false; 39 | } 40 | return true; 41 | } 42 | } 43 | 44 | 45 | class Tokenizer { 46 | 47 | constructor( reader, keywords ) { 48 | this.tokens = []; 49 | this.reader = reader; 50 | this.keywords = keywords; 51 | } 52 | 53 | isOpChar( ctx ) { 54 | 55 | var rv = ctx.c.match("[+]|[-]|[*]|[/]|[\\^]|[;]") != null; 56 | 57 | return [rv,0]; 58 | 59 | } 60 | 61 | isCompChar( ctx ) { 62 | 63 | var rv = (ctx.c == "<" || ctx.c == ">"); 64 | return [rv,0]; 65 | } 66 | 67 | isEqChar( ctx ) { 68 | if( ctx.c == "=" ) { 69 | return [true,0]; 70 | } 71 | return [false,0]; 72 | } 73 | 74 | 75 | isNameChar( ctx ) { 76 | 77 | //console.log("SEQ: " + ctx.seq); 78 | if( ctx.endFound ) { 79 | return [false,0]; 80 | } 81 | var rv = ctx.c.match("[a-zA-Z0-9$%?]") != null; 82 | 83 | if( ctx.c=="$" || ctx.c== "%") { 84 | ctx.endFound = true; 85 | } 86 | 87 | if( this.keywords.indexOf( ctx.seq ) >-1 ) { 88 | //console.log("Found Keyword: " + ctx.seq ); 89 | ctx.endFound = true; 90 | } 91 | else if( ! (ctx.seq === undefined )) { 92 | var trappedKW = false; 93 | var trapped = null; 94 | for( var i=0; i 0 ) { 97 | trappedKW = true; 98 | trapped = kw; 99 | //console.log( "trapped-------------" ); 100 | //console.log( kw ); 101 | //console.log( ctx.seq ); 102 | //console.log( ctx ); 103 | return [rv, kw.length ]; 104 | } 105 | } 106 | 107 | } 108 | return [rv,0]; 109 | } 110 | 111 | isNumChar( ctx ) { 112 | return [(ctx.c.match("[0-9\.~]") != null),0]; 113 | } 114 | 115 | isPadChar( ctx ) { 116 | if( ctx.c == " " || ctx.c == "\t" || ctx.c == "\n" || ctx.c == "\r") { 117 | return [true,0]; 118 | } 119 | return [false,0]; 120 | } 121 | 122 | isCommandSepChar( ctx ) { 123 | if( ctx.c == ":" ) { 124 | return [true,0]; 125 | } 126 | return [false,0]; 127 | } 128 | 129 | 130 | isSepChar( ctx ) { 131 | if( ctx.c == "," ) { 132 | return [true,0]; 133 | } 134 | return [false,0]; 135 | } 136 | 137 | isAnyChar( ctx ) { 138 | return [true,0]; /* Will be executed last */ 139 | } 140 | 141 | 142 | isBracket( ctx ) { 143 | if( ctx.c == "(" || ctx.c == ")" || ctx.c == "[" || ctx.c == "]") { 144 | return [true,0]; 145 | } 146 | return [false,0]; 147 | } 148 | 149 | 150 | isStrChar( ctx ) { 151 | 152 | if( ctx.endFound ) { 153 | return [false,0]; 154 | } 155 | 156 | if( ctx.index == 0) { 157 | if( ctx.c=="\"" ) { 158 | ctx.inString = true; 159 | return [true,0]; 160 | } 161 | return [false,0]; 162 | } 163 | else if( ctx.inString ) { 164 | if ( ctx.index > 0 && ctx.c=="\"") { 165 | ctx.endFound = true; 166 | } 167 | return [true,0]; 168 | } 169 | 170 | return [false,0]; 171 | 172 | } 173 | 174 | normalizeToken( tok0 ) { 175 | var tok = tok0; 176 | 177 | tok.type = tok0.type; 178 | 179 | if( tok.type == "str" ) { 180 | tok.data = tok0.data.substr(1,tok0.data.length-2); 181 | } 182 | return tok; 183 | } 184 | 185 | readChars( read, type0, compareF, tokenType ) { 186 | var tok = { type: type0, data : "" } 187 | var ctx = { index:0, prev: null, seq: "" }; 188 | 189 | while(!read.EOF()) { 190 | 191 | var c = read.peek(); 192 | 193 | ctx.seq += c; 194 | ctx.c = c; 195 | 196 | var rv = this[compareF ] ( ctx ); 197 | if( rv[1] > 0 ) { 198 | read.unconsume( rv[1]-1 ); 199 | ctx.seq = ctx.seq.substr(0,ctx.seq.length-rv[1]) ; 200 | tok.data = ctx.seq; 201 | break; 202 | } 203 | 204 | if( !rv[0] ) { 205 | return this.normalizeToken( tok ); 206 | } 207 | tok.data += c; 208 | read.consume(); 209 | 210 | ctx.index++; 211 | ctx.prev = c; 212 | 213 | if( tokenType == "chr") { 214 | break; 215 | } 216 | } 217 | 218 | return this.normalizeToken( tok ); 219 | } 220 | 221 | 222 | tokenize() { 223 | var read = this.reader; 224 | 225 | var _this = this; 226 | var tokens = []; 227 | 228 | var parseRules = []; 229 | var TYPEIX = 0; 230 | var FUNCIX = 1; 231 | var STRINGTYPEIX = 2; 232 | 233 | parseRules.push(["pad", "isPadChar" , "str"] ); 234 | parseRules.push(["str", "isStrChar" , "str"] ); 235 | parseRules.push(["num", "isNumChar" , "str"] ); 236 | parseRules.push(["name", "isNameChar" , "str"] ); 237 | parseRules.push(["op", "isOpChar" , "chr"] ); 238 | parseRules.push(["comp", "isCompChar" , "chr"] ); 239 | parseRules.push(["eq", "isEqChar" , "chr"] ); 240 | parseRules.push(["bracket", "isBracket" , "chr"] ); 241 | parseRules.push(["sep", "isSepChar" , "chr"] ); 242 | parseRules.push(["cmdsep", "isCommandSepChar" , "chr"] ); 243 | parseRules.push(["trash", "isAnyChar" , "chr"] ); 244 | 245 | while( !read.EOF() ) { 246 | var c = read.peek(); 247 | var tokenFound = false; 248 | 249 | for( var i=0; i" + read.line + ":" + read.lineIndex; 267 | } 268 | } 269 | return tokens; 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p1/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8p1/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8p1/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/0.8p2/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8p2/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8p2/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p2/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8p2/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p2/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /versions/0.8p2/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p2/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8p2/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p2/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8p2/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8p2/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/0.8p3/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8p3/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8p3/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p3/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8p3/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p3/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /versions/0.8p3/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p3/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8p3/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p3/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8p3/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8p3/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/0.8p4/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8p4/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8p4/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p4/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8p4/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p4/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /versions/0.8p4/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p4/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8p4/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p4/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8p4/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8p4/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/0.8p5/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/0.8p5/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/0.8p5/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p5/res/img/fav.png -------------------------------------------------------------------------------- /versions/0.8p5/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p5/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /versions/0.8p5/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p5/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/0.8p5/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | this.iconCanvas = null; 78 | this.iconContext = null; 79 | this.img = null; 80 | 81 | } 82 | 83 | mapChar( c0 ) { 84 | 85 | var c = c0.toLowerCase(); 86 | 87 | var map = []; 88 | var index; 89 | 90 | map['a'] = 0; map['b'] = 1; 91 | map['c'] = 2; map['d'] = 3; 92 | map['e'] = 4; map['f'] = 5; 93 | map['g'] = 6; map['h'] = 7; 94 | map['i'] = 8; map['j'] = 9; 95 | map['k'] = 10; map['l'] = 11; 96 | map['m'] = 12; map['n'] = 13; 97 | map['o'] = 14; map['p'] = 15; 98 | map['q'] = 16; map['r'] = 17; 99 | map['s'] = 18; map['t'] = 19; 100 | map['u'] = 20; map['v'] = 21; 101 | map['w'] = 22; map['x'] = 23; 102 | map['y'] = 24; map['z'] = 25; 103 | 104 | map['0'] = 26; map['1'] = 27; 105 | map['2'] = 28; map['3'] = 29; 106 | map['4'] = 30; map['5'] = 31; 107 | map['6'] = 32; map['7'] = 33; 108 | map['8'] = 34; map['9'] = 35; 109 | map['@'] = 36; map['&'] = 37; 110 | map['*'] = 38; map['+'] = 39; 111 | map['|'] = 40; map['_'] = 41; 112 | map['.'] = 42; map[','] = 43; 113 | map[':'] = 44; map['()'] = 45; 114 | map[')'] = 46; map['-'] = 47; 115 | map['#'] = 48; map['?'] = 49; 116 | map['%'] = 50; map['!'] = 51; 117 | 118 | index = map [ c ]; 119 | if( index == undefined ) { 120 | if( c == ' ' ) { 121 | return -1; 122 | } 123 | index = 49; 124 | } 125 | 126 | return index; 127 | } 128 | 129 | drawChar( ctx, x, y, c ) { 130 | var index = this.mapChar( c ); 131 | if( index > -1 ) { 132 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 133 | } 134 | } 135 | 136 | centerX( str, screenWidth ) { 137 | var txtW = str.length * this.gridw; 138 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 139 | } 140 | 141 | drawString( ctx, x0, y, str ) { 142 | var x = x0; 143 | for (var i = 0; i < str.length; i++) { 144 | this.drawChar( ctx, x, y, str.charAt(i) ); 145 | x+= this.gridw; 146 | } 147 | } 148 | 149 | } 150 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/0.8p5/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/0.8p5/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/0.8p5/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /versions/experimental/doc/examples.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "section": "text", 4 | "list": ["guessing.bas", "fireworks.bas", "tictactoe.bas", "simplesnake.bas"] 5 | }, 6 | { 7 | "section": "extended graphics", 8 | "list": ["mandelbrot.bas", "screensaver1.bas"] 9 | }, 10 | { 11 | "section": "extended sprite", 12 | "list": ["spriteanim.bas", "spriteanim2.bas"] 13 | }, 14 | { 15 | "section": "short", 16 | "list": ["10liner_fsnake.bas"] 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /versions/experimental/res/bas/test/unit1.bas: -------------------------------------------------------------------------------- 1 | 1 xon :cls 2 | 10 gosub 1010:gosub 500 3 | 11 gosub 1020:gosub 500 4 | 12 gosub 1030:gosub 500 5 | 13 gosub 1040:gosub 500 6 | 14 gosub 1050:gosub 500 7 | 15 gosub 1060:gosub 500 8 | 16 gosub 1070:gosub 500 9 | 17 gosub 1080:gosub 500 10 | 18 gosub 1090:gosub 500 11 | 19 gosub 1100:gosub 500 12 | 20 gosub 1110:gosub 500 13 | 21 gosub 1120:gosub 500 14 | 22 gosub 1130:gosub 500 15 | 499 end 16 | 500 print "{5}testcase ";tc ;" "; 17 | 505 if i = 1then print "ignore":return 18 | 510 if r =e then re$ ="{30}ok" 19 | 520 if r <>e then re$ ="{28}error" 20 | 530 ? re$ ;"{144}";tc$ 21 | 534 if r <>e then print "{28}"; 22 | 535 if r <>e then print "r(";r ;")<>"; 23 | 536 if r <>e then print "e(";e ;")" 24 | 1010 rem testcase 1--- 25 | 1011 tc = 1:tc$ ="addition":i = 0 26 | 1012 r =100+100 27 | 1019 e =200:return 28 | 1020 rem testcase 2--- 29 | 1021 tc = 2:tc$ ="substraction":i = 0 30 | 1022 r =100-100 31 | 1029 e = 0:return 32 | 1030 rem testcase 3--- 33 | 1031 tc = 3:tc$ ="multiplication":i = 0 34 | 1032 r =100/100 35 | 1039 e = 1:return 36 | 1040 rem testcase 4--- 37 | 1041 tc = 4:tc$ ="division":i = 0 38 | 1042 r =100/100 39 | 1049 e = 1:return 40 | 1050 rem testcase 5--- 41 | 1051 tc = 5:tc$ ="add&multiply":i = 0 42 | 1052 r =15+15*16+17 43 | 1059 e =272:return 44 | 1060 rem testcase 6--- 45 | 1061 tc = 6:tc$ ="add&multiply2":i = 0 46 | 1062 r =15*15+16*17 47 | 1069 e =497:return 48 | 1070 rem testcase 7--- 49 | 1071 tc = 7:tc$ ="sub&multiply":i = 0 50 | 1072 r =15*15-16*17 51 | 1079 e =-47:return 52 | 1080 rem testcase 8--- 53 | 1081 tc = 8:tc$ ="sub&multiply2":i = 0 54 | 1082 r =15-15*16-17 55 | 1089 e =-242:return 56 | 1090 rem testcase 7--- 57 | 1091 tc = 7:tc$ ="sub&div":i = 1 58 | 1092 r =15/15-16/17 59 | 1099 e =-47:return 60 | 1100 rem testcase 8--- 61 | 1101 tc = 8:tc$ ="sub&div2":i = 1 62 | 1102 r =15-15/16-17 63 | 1109 e =-242:return 64 | 1110 rem testcase 9--- 65 | 1111 tc = 9:tc$ ="sub&div2":i = 0 66 | 1112 r =15-33/ 3-17 67 | 1119 e =-13:return 68 | 1120 rem testcase 10--- 69 | 1121 tc =10:tc$ ="add+pow":i = 0 70 | 1122 r =15+15{94} 2+13{94} 3 71 | 1129 e =2437:return 72 | 1130 rem testcase 11--- 73 | 1131 tc =11:tc$ ="def fn":i = 0 74 | 1132 def fn f11 (x )=3.5*x 75 | 1135 r =fn f11 (15) 76 | 1139 e =52.5:return 77 | -------------------------------------------------------------------------------- /versions/experimental/res/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/experimental/res/img/fav.png -------------------------------------------------------------------------------- /versions/experimental/res/img/kb/commodore-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/experimental/res/img/kb/commodore-white.png -------------------------------------------------------------------------------- /versions/experimental/res/img/menu/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/experimental/res/img/menu/arrow.png -------------------------------------------------------------------------------- /versions/experimental/res/script/basicarray.js: -------------------------------------------------------------------------------- 1 | class BasicArray { 2 | 3 | constructor( name, indices, defaultValue ) { 4 | this.name = name; 5 | this.indices = indices; 6 | this.buffer = null; 7 | this.defaultValue = defaultValue; 8 | } 9 | 10 | getIndexCount() { 11 | return this.indices.length; 12 | } 13 | 14 | _check( indices ) { 15 | if( indices.length != this.indices.length ) { 16 | throw "00:index dimension mismatch for array " + this.name; 17 | } 18 | for( var i=0; i this.indices[ i ]) { 20 | throw "01:index " + indices[i] + " out of bounds for array " + this.name + " for index " + i; 21 | } 22 | else if ( indices[i] < 0) { 23 | throw "02:index smaller then zero for array " + this.name; 24 | } 25 | 26 | } 27 | } 28 | 29 | set( indices, val ) { 30 | this._check( indices ); 31 | if( this.buffer == null ) { 32 | this.buffer = []; 33 | } 34 | var ptr = this.buffer; 35 | var last = indices.length - 1; 36 | for( var i=0; i<=last; i++) { 37 | 38 | if( i == last ) { 39 | ptr[ indices[ i ]] = val; 40 | } 41 | else { 42 | if( (ptr [ indices[i] ] === undefined )) { 43 | ptr[ indices[ i ]] = []; 44 | } 45 | ptr = ptr[ indices[ i ]]; 46 | } 47 | } 48 | } 49 | 50 | get( indices ) { 51 | this._check( indices ); 52 | 53 | if( this.buffer == null ) { 54 | return this.defaultValue; 55 | } 56 | var ptr = this.buffer; 57 | var last = indices.length - 1; 58 | for( var i=0; i<=last; i++) { 59 | 60 | if( i == last ) { 61 | return ptr[ indices[ i ]]; 62 | } 63 | else { 64 | if( (ptr [ indices[i] ] === undefined )) { 65 | return this.defaultValue; 66 | } 67 | ptr = ptr[ indices[ i ]]; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /versions/experimental/res/script/errorhandler.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler { 2 | 3 | newError( clazz, detail, context, lineNr ) { 4 | return { context: context, clazz: clazz, detail: detail, lineNr: lineNr }; 5 | } 6 | 7 | throwError( clazz, detail, context, lineNr ) { 8 | throw this.newError( clazz, detail, context, lineNr ); 9 | } 10 | 11 | fromSerializedError( s, context, lineNr0 ) { 12 | 13 | var lineNr = lineNr0; 14 | if( lineNr === undefined ) { 15 | lineNr = -1; 16 | } 17 | if( ! this.isSerializedError( s ) ) { 18 | return this.newError( "unknown", null, context, lineNr ); 19 | } 20 | var parts = s.substr(1).split("@"); 21 | if( parts.length == 1 ) { 22 | return this.newError( parts[0], null, context, lineNr ); 23 | } 24 | return this.newError( parts[0], parts[1], context, lineNr ); 25 | 26 | } 27 | 28 | isSerializedError( e ) { 29 | if( typeof e != "string" ) { 30 | return false; 31 | } 32 | return e.startsWith( "@" ); 33 | } 34 | 35 | isError( e ) { 36 | if( Object.prototype.toString.call( e ) === '[object Object]' ) { 37 | var ctx = e[ "context" ]; 38 | var clss = e[ "clazz" ]; 39 | var dtl = e[ "detail" ]; 40 | 41 | if( !( clss === undefined ) ) { 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /versions/experimental/res/script/g1/core/blockfont.js: -------------------------------------------------------------------------------- 1 | class BlockFont { 2 | 3 | constructor( img, gridw, gridh, transCol ) { 4 | 5 | this.img = img; 6 | this.gridw = gridw; 7 | this.gridh = gridh; 8 | 9 | this.iconsCanvas = []; 10 | this.iconsContext = []; 11 | 12 | var w = this.img.width; 13 | var h = this.img.height; 14 | 15 | this.iconCanvas = document.createElement('canvas'); 16 | this.iconContext = this.iconCanvas.getContext('2d'); 17 | 18 | this.iconCanvas.width = w; 19 | this.iconCanvas.height = h; 20 | 21 | this.iconContext.drawImage( this.img, 0, 0, w, h); 22 | 23 | this.xiconcount = w / this.gridw; 24 | this.xiconrowcount = h / this.gridh; 25 | 26 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 27 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 28 | 29 | var sx = (xicon * this.gridw); 30 | var sy = (yicon * this.gridh); 31 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 32 | var sd = imgdata.data; 33 | 34 | var dcanvas = document.createElement('canvas'); 35 | dcanvas.width = this.gridw; 36 | dcanvas.height = this.gridh; 37 | 38 | var dcontext = dcanvas.getContext('2d'); 39 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 40 | var dd = dimgdata.data; 41 | 42 | var xoffset = 0; 43 | var yoffset = 0; 44 | var rowoffset = this.gridw * 4; 45 | var offset; 46 | 47 | for (var y = 0; y < this.gridh; y++) { 48 | xoffset = 0; 49 | for (var x = 0; x < this.gridw; x++) { 50 | offset = yoffset + xoffset; 51 | 52 | dd[ offset + 0] = sd[ offset + 0]; 53 | dd[ offset + 1] = sd[ offset + 1]; 54 | dd[ offset + 2] = sd[ offset + 2]; 55 | dd[ offset + 3] = sd[ offset + 3]; 56 | 57 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 58 | { 59 | dd[ offset + 0] = 0; 60 | dd[ offset + 1] = 0; 61 | dd[ offset + 2] = 0; 62 | dd[ offset + 3] = 0; /* Make transparent */ 63 | } 64 | 65 | xoffset += 4; 66 | } 67 | 68 | yoffset += rowoffset; 69 | } 70 | 71 | dcontext.putImageData( dimgdata, 0, 0); 72 | this.iconsCanvas.push( dcanvas ); 73 | this.iconsContext.push( dcontext ); 74 | } 75 | } 76 | 77 | 78 | this.iconCanvas = null; 79 | this.iconContext = null; 80 | this.img = null; 81 | 82 | } 83 | 84 | mapChar( c0 ) { 85 | 86 | var c = c0.toLowerCase(); 87 | 88 | var map = []; 89 | var index; 90 | 91 | map['a'] = 0; map['b'] = 1; 92 | map['c'] = 2; map['d'] = 3; 93 | map['e'] = 4; map['f'] = 5; 94 | map['g'] = 6; map['h'] = 7; 95 | map['i'] = 8; map['j'] = 9; 96 | map['k'] = 10; map['l'] = 11; 97 | map['m'] = 12; map['n'] = 13; 98 | map['o'] = 14; map['p'] = 15; 99 | map['q'] = 16; map['r'] = 17; 100 | map['s'] = 18; map['t'] = 19; 101 | map['u'] = 20; map['v'] = 21; 102 | map['w'] = 22; map['x'] = 23; 103 | map['y'] = 24; map['z'] = 25; 104 | 105 | map['0'] = 26; map['1'] = 27; 106 | map['2'] = 28; map['3'] = 29; 107 | map['4'] = 30; map['5'] = 31; 108 | map['6'] = 32; map['7'] = 33; 109 | map['8'] = 34; map['9'] = 35; 110 | map['@'] = 36; map['&'] = 37; 111 | map['*'] = 38; map['+'] = 39; 112 | map['|'] = 40; map['_'] = 41; 113 | map['.'] = 42; map[','] = 43; 114 | map[':'] = 44; map['()'] = 45; 115 | map[')'] = 46; map['-'] = 47; 116 | map['#'] = 48; map['?'] = 49; 117 | map['%'] = 50; map['!'] = 51; 118 | 119 | index = map [ c ]; 120 | if( index == undefined ) { 121 | if( c == ' ' ) { 122 | return -1; 123 | } 124 | index = 49; 125 | } 126 | 127 | return index; 128 | } 129 | 130 | drawChar( ctx, x, y, c ) { 131 | var index = this.mapChar( c ); 132 | if( index > -1 ) { 133 | ctx.drawImage( this.iconsCanvas[ index ], x, y, ); 134 | } 135 | } 136 | 137 | centerX( str, screenWidth ) { 138 | var txtW = str.length * this.gridw; 139 | return Math.floor( (screenWidth/2) - ( txtW/2)) ; 140 | } 141 | 142 | drawString( ctx, x0, y, str ) { 143 | var x = x0; 144 | for (var i = 0; i < str.length; i++) { 145 | this.drawChar( ctx, x, y, str.charAt(i) ); 146 | x+= this.gridw; 147 | } 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /versions/experimental/res/script/g1/core/spriteimagemagic.js: -------------------------------------------------------------------------------- 1 | 2 | class SpriteImageMagic { 3 | 4 | mkShadow1( srcCtx, 5 | dstCtx, 6 | transCol ) { 7 | 8 | var w = srcCtx.canvas.width; 9 | var h = srcCtx.canvas.height; 10 | 11 | var imgdata = srcCtx.getImageData(0, 0, w, h); 12 | var dd = imgdata.data; 13 | 14 | var rowoffset = w * 4; 15 | 16 | var xoffset = 0; 17 | var yoffset = 0; 18 | var offset; 19 | 20 | for (var y = 0; y < h; y++) { 21 | yoffset = y * rowoffset; 22 | xoffset = 0; 23 | for (var x = 0; x < w; x++) { 24 | offset = yoffset + xoffset; 25 | 26 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 27 | { 28 | dd[ offset + 0] = 0; 29 | dd[ offset + 1] = 0; 30 | dd[ offset + 2] = 0; 31 | dd[ offset + 3] = 0; /* Make transparent */ 32 | } 33 | else { 34 | if( (x+y) % 2 == 0 ) { 35 | dd[ offset + 0] = 0; 36 | dd[ offset + 1] = 0; 37 | dd[ offset + 2] = 0; 38 | dd[ offset + 3] = 255; 39 | } 40 | else { 41 | dd[ offset + 0] = 0; 42 | dd[ offset + 1] = 0; 43 | dd[ offset + 2] = 0; 44 | dd[ offset + 3] = 0; 45 | } 46 | } 47 | xoffset += 4; 48 | } 49 | yoffset += rowoffset; 50 | } 51 | 52 | dstCtx.putImageData( imgdata, 0, 0); 53 | } 54 | 55 | 56 | scale( srcCtx, 57 | dstCtx, 58 | factor ) { 59 | 60 | var w = srcCtx.canvas.width; 61 | var h = srcCtx.canvas.height; 62 | 63 | var w2 = Math.floor(w * factor); 64 | var h2 = Math.floor(h * factor); 65 | 66 | dstCtx.canvas.width = w2; 67 | dstCtx.canvas.height = h2; 68 | 69 | var imgdata = srcCtx.getImageData(0, 0, w, h); 70 | var dd = imgdata.data; 71 | 72 | var imgdata2 = dstCtx.getImageData(0, 0, w2, h2); 73 | var dd2 = imgdata2.data; 74 | 75 | var rowoffset = w * 4; 76 | var rowoffset2 = w2 * 4; 77 | 78 | var xoffset = 0; 79 | var yoffset = 0; 80 | var xoffset2 = 0; 81 | var yoffset2 = 0; 82 | var offset; 83 | var offset2; 84 | 85 | for (var y2 = 0; y2 < h2; y2++) { 86 | yoffset2 = y2 * rowoffset2; 87 | xoffset2 = 0; 88 | for (var x2 = 0; x2 < w2; x2++) { 89 | offset2 = yoffset2 + xoffset2; 90 | 91 | var x = Math.floor( x2 / factor); 92 | var y = Math.floor( y2 / factor); 93 | 94 | yoffset = y * rowoffset; 95 | xoffset = x * 4; 96 | 97 | offset = yoffset + xoffset; 98 | 99 | dd2[ offset2 + 0] = dd[ offset + 0]; 100 | dd2[ offset2 + 1] = dd[ offset + 1]; 101 | dd2[ offset2 + 2] = dd[ offset + 2]; 102 | dd2[ offset2 + 3] = dd[ offset + 3]; 103 | 104 | xoffset2 += 4; 105 | } 106 | yoffset2 += rowoffset2; 107 | } 108 | 109 | dstCtx.putImageData( imgdata2, 0, 0); 110 | } 111 | 112 | 113 | colorize( srcCtx, 114 | dstCtx, 115 | rec ) { 116 | 117 | var f = 1-rec.effect; 118 | var nR = rec.r; 119 | var nG = rec.g; 120 | var nB = rec.b; 121 | 122 | var w = srcCtx.canvas.width; 123 | var h = srcCtx.canvas.height; 124 | 125 | var imgdata = srcCtx.getImageData(0, 0, w, h); 126 | var dd = imgdata.data; 127 | 128 | var rowoffset = w * 4; 129 | 130 | var xoffset = 0; 131 | var yoffset = 0; 132 | var offset; 133 | 134 | for (var y = 0; y < h; y++) { 135 | yoffset = y * rowoffset; 136 | xoffset = 0; 137 | for (var x = 0; x < w; x++) { 138 | offset = yoffset + xoffset; 139 | 140 | dd[ offset + 0] = dd[ offset + 0] * f + 141 | (nR * (1-f)); 142 | 143 | dd[ offset + 1] = dd[ offset + 1] * f + 144 | (nG * (1-f)); 145 | 146 | dd[ offset + 2] = dd[ offset + 2] * f + 147 | (nB * (1-f)); 148 | 149 | xoffset += 4; 150 | } 151 | yoffset += rowoffset; 152 | 153 | } 154 | 155 | dstCtx.putImageData( imgdata, 0, 0); 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /versions/experimental/res/script/g1/core/tiles.js: -------------------------------------------------------------------------------- 1 | class TileMap { 2 | 3 | constructor( w, h, _nullTile ) { 4 | 5 | this.data = []; 6 | var nullTile = 0; 7 | if( typeof _nullTile !== 'undefined' ) { 8 | nullTile = _nullTile; 9 | } 10 | 11 | for (var y = 0; y < h; y++) { 12 | var row = []; 13 | for (var x = 0; x < w; x++) { 14 | row[ x ] = nullTile; 15 | } 16 | this.data[ y ] = row; 17 | } 18 | } 19 | 20 | /*replaceTiles( fromTile, replaceTile ) { 21 | 22 | var data = this.data; 23 | for (var y = 0; y < data.length; y++) { 24 | var row = []; 25 | for (var x = 0; x < data[ y ].length ; x++) { 26 | if( data[ y ][ x ] == fromTile ) { 27 | data[ y ][ x ] = replaceTile; 28 | } 29 | } 30 | } 31 | }*/ 32 | 33 | replaceTiles( fromTile, replaceTile ) { 34 | 35 | var data = this.data; 36 | for (var y = 0; y < data.length; y++) { 37 | var row = []; 38 | for (var x = 0; x < data[ y ].length ; x++) { 39 | if( data[ y ][ x ] == fromTile ) { 40 | data[ y ][ x ] = replaceTile; 41 | } 42 | } 43 | } 44 | } 45 | 46 | 47 | getTiles( fromTile ) { 48 | var array = []; 49 | var data = this.data; 50 | for (var y = 0; y < data.length; y++) { 51 | var row = []; 52 | for (var x = 0; x < data[ y ].length ; x++) { 53 | if( data[ y ][ x ] == fromTile ) { 54 | array.push( [x, y] ); 55 | } 56 | } 57 | } 58 | return array; 59 | } 60 | 61 | getTile( x, y ) { 62 | return this.data[ y ][ x ]; 63 | } 64 | 65 | AppendTextMap( textMap, ignoreTile, conversionList ) { 66 | for (var y = 0; y < textMap.length; y++) { 67 | 68 | for (var x = 0; x < textMap[y].length; x++) { 69 | var char = textMap[y].charAt( x ) 70 | if( char != ignoreTile ) { 71 | this.data[ y ][ x ] = conversionList[ char ]; 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | 79 | 80 | class Tiles { 81 | constructor( img, gridw, gridh, transCol ) { 82 | 83 | this.img = img; 84 | this.gridw = gridw; 85 | this.gridh = gridh; 86 | 87 | this.iconsCanvas = []; 88 | this.iconsContext = []; 89 | 90 | var w = this.img.width; 91 | var h = this.img.height; 92 | 93 | this.iconCanvas = document.createElement('canvas'); 94 | this.iconContext = this.iconCanvas.getContext('2d'); 95 | 96 | this.iconCanvas.width = w; 97 | this.iconCanvas.height = h; 98 | 99 | this.iconContext.drawImage( this.img, 0, 0, w, h); 100 | 101 | this.xiconcount = w / this.gridw; 102 | this.xiconrowcount = h / this.gridh; 103 | 104 | for (var yicon = 0; yicon < this.xiconrowcount; yicon++) { 105 | for (var xicon = 0; xicon < this.xiconcount; xicon++) { 106 | 107 | var sx = (xicon * this.gridw); 108 | var sy = (yicon * this.gridh); 109 | var imgdata = this.iconContext.getImageData(sx, sy, this.gridw, this.gridh); 110 | var sd = imgdata.data; 111 | 112 | var dcanvas = document.createElement('canvas'); 113 | dcanvas.width = this.gridw; 114 | dcanvas.height = this.gridh; 115 | 116 | var dcontext = dcanvas.getContext('2d'); 117 | var dimgdata = dcontext.createImageData( this.gridw, this.gridh ); 118 | var dd = dimgdata.data; 119 | 120 | var xoffset = 0; 121 | var yoffset = 0; 122 | var rowoffset = this.gridw * 4; 123 | var offset; 124 | 125 | for (var y = 0; y < this.gridh; y++) { 126 | xoffset = 0; 127 | for (var x = 0; x < this.gridw; x++) { 128 | offset = yoffset + xoffset; 129 | 130 | dd[ offset + 0] = sd[ offset + 0]; 131 | dd[ offset + 1] = sd[ offset + 1]; 132 | dd[ offset + 2] = sd[ offset + 2]; 133 | dd[ offset + 3] = sd[ offset + 3]; 134 | 135 | if( transCol ) { 136 | if( dd[ offset + 0] == transCol.r && dd[ offset + 1] == transCol.g && dd[ offset + 2] == transCol.b ) 137 | { 138 | dd[ offset + 0] = 0; 139 | dd[ offset + 1] = 0; 140 | dd[ offset + 2] = 0; 141 | dd[ offset + 3] = 0; /* Make transparent */ 142 | } 143 | } 144 | 145 | xoffset += 4; 146 | } 147 | 148 | yoffset += rowoffset; 149 | } 150 | 151 | dcontext.putImageData( dimgdata, 0, 0); 152 | this.iconsCanvas.push( dcanvas ); 153 | this.iconsContext.push( dcontext ); 154 | } 155 | } 156 | 157 | 158 | this.iconCanvas = undefined; 159 | this.iconContext = undefined; 160 | this.img = undefined; 161 | 162 | } 163 | 164 | drawTile( ctx, x, y, index ) { 165 | ctx.drawImage( this.iconsCanvas[ index ], x, y ); 166 | } 167 | 168 | drawTiles( ctx, px, py, mapdata ) { 169 | 170 | var xoffset=0; 171 | var yoffset=0; 172 | for (var y = 0; y < mapdata.length; y++) { 173 | for (var x = 0; x < mapdata[y].length; x++) { 174 | ctx.drawImage( this.iconsCanvas[ mapdata[y][x] ], xoffset+px, yoffset+py ); 175 | xoffset+=this.gridw; 176 | } 177 | xoffset=0; 178 | yoffset+=this.gridh; 179 | } 180 | 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /versions/experimental/res/script/g1/screens/c64/res/petscii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoystickAndCursorKeys/basic64-js/87a68b8c3a4d52afbd9e78191a4ee45dcd6a1069/versions/experimental/res/script/g1/screens/c64/res/petscii.png -------------------------------------------------------------------------------- /versions/experimental/res/script/polyfix.js: -------------------------------------------------------------------------------- 1 | function polyfix() { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /versions/experimental/res/script/statedefinitions.js: -------------------------------------------------------------------------------- 1 | class StateDefinitions { 2 | 3 | constructor ( pgm ) { 4 | 5 | this.startPlaybook = "pgm"; 6 | 7 | /* ----------------------------------------------------- 8 | Playbooks 9 | ----------------------------------------------------- */ 10 | 11 | this.playbooks = { 12 | pgm: { object: pgm, enter: 'load', definition: this }, 13 | }; 14 | 15 | /* ----------------------------------------------------- 16 | Global state setup 17 | ----------------------------------------------------- */ 18 | 19 | this.stateTypes = { 20 | LOAD: ['LOAD', 'RENDER' ], 21 | PLAY: ['INIT','CLEANUP','RENDER','PROCESS','HANDLEINPUT'], 22 | WATCH: ['INIT','CLEANUP','RENDER','PROCESS'], 23 | INIT: ['INIT'], 24 | BRANCH: ['BRANCH'] 25 | }; 26 | 27 | this.stateMethodSuffix = { 28 | LSRENDER: 'LSRender', 29 | LSPROCESS: undefined, 30 | RENDER: 'Render', 31 | PROCESS: 'Run', 32 | HANDLEINPUT: 'Handle' 33 | }; 34 | 35 | /* ----------------------------------------------------- 36 | Demo playbook 37 | ----------------------------------------------------- */ 38 | 39 | /* no branch functions */ 40 | 41 | /* demo playbook */ 42 | var demoPlaybook = this.playbooks.pgm; 43 | demoPlaybook.states = { 44 | 45 | /* Only load, play and repeat since this is a demo, not a game */ 46 | 47 | 'loadexample': { _type: "LOAD", next: 'load'}, 48 | 'load': { _type: "LOAD", next: 'play'}, 49 | 'play': { _type: "PLAY", loadExample: 'loadexample' }, 50 | 51 | 52 | } ; 53 | } 54 | } 55 | --------------------------------------------------------------------------------