@moonbase-machines/c64 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/moonbase-c64.js +1 -1
- package/package.json +6 -3
package/dist/moonbase-c64.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @moonbase-machines/c64 0.
|
|
1
|
+
/*! @moonbase-machines/c64 0.6.1: MIT, (c) 2026 Mark Wharton (its LICENSE) */
|
|
2
2
|
var Ce=Object.defineProperty;var X=(x,t)=>{for(var e in t)Ce(x,e,{get:t[e],enumerable:!0})};var zt={};X(zt,{compile:()=>Ht,evaluator:()=>Y0,instantiate:()=>bt});var jt={};X(jt,{TOKENS:()=>C0,crunch:()=>_0,dataItems:()=>lt,direct:()=>ut,expression:()=>S0,lines:()=>X0,list:()=>v0,program:()=>G0,store:()=>dt});var Yt={};X(Yt,{BasicError:()=>j,ERRORS:()=>p0,fail:()=>M,fout:()=>K0,int16:()=>Q,nextRandom:()=>M0,scanNumber:()=>$0,seedRandom:()=>U0,val:()=>m0});var Pt={};X(Pt,{ARG:()=>Ie,ARGOV:()=>Le,ARISGN:()=>Ne,BITS:()=>$e,CONSTANTS:()=>N0,FAC:()=>Se,FACOV:()=>Fe,FloatError:()=>b0,Floats:()=>l0,RESHO:()=>Ue,pack:()=>W0,setFac:()=>q0,unpack:()=>nt});var Se=97,Ie=105,Fe=112,Le=86,Ne=111,$e=104,Ue=38,Me=x=>x.flatMap(t=>[t>>>24&255,t>>>16&255,t>>>8&255,t&255]),N0={47548:[129,0,0,0,0],48913:[128,0,0,0,0],47865:[132,32,0,0,0],47553:[3,127,94,86,203,121,128,19,155,11,100,128,118,56,147,22,130,56,170,59,32],47574:[128,53,4,243,52],47579:[129,53,4,243,52],47584:[128,128,0,0,0],47589:[128,49,114,23,248],49087:[129,56,170,59,41],49092:[7,113,52,88,62,86,116,22,126,179,27,119,47,238,227,133,122,29,132,28,42,124,99,89,88,10,126,117,253,231,198,128,49,114,24,16,129,0,0,0,0],48918:Me([-1e8,1e7,-1e6,1e5,-1e4,1e3,-100,10,-1,-216e4,216e3,-36e3,3600,-600,60]),48563:[155,62,188,31,253],48568:[158,110,107,39,253],48573:[158,110,107,40,0],58080:[129,73,15,218,162],58085:[131,73,15,218,162],58090:[127,0,0,0,0],58095:[5,132,230,26,45,27,134,40,7,251,248,135,153,104,137,1,135,35,53,223,225,134,165,93,231,40,131,73,15,218,162]};function W0(x){if(x===0)return[0,0,0,0,0];let t=Math.abs(x),e=Math.floor(Math.log2(t))+1,s=t/2**e;s>=1?(s/=2,e++):s<.5&&(s*=2,e--);let f=Math.round(s*2**32);return f>=2**32&&(f/=2,e++),[e+128,f>>>24&127|(x<0?128:0),f>>>16&255,f>>>8&255,f&255]}function q0(x,t){let e=W0(t);if(x.write(112,0),!e[0]){for(let s=97;s<=102;s++)x.write(s,0);return}x.write(97,e[0]),x.write(98,e[1]|128),x.write(99,e[2]),x.write(100,e[3]),x.write(101,e[4]),x.write(102,t<0?255:0)}function nt(x){if(!x[0])return 0;let t=(x[1]|128)*2**24+x[2]*65536+x[3]*256+x[4];return(x[1]&128?-1:1)*t/2**32*2**(x[0]-128)}var l0=class{constructor(t){this.mem=t}r(t){return this.mem.read(t&65535)}w(t,e){this.mem.write(t&65535,e&255)}mant(t){return((this.r(t)*256+this.r(t+1))*256+this.r(t+2))*256+this.r(t+3)}setMant(t,e){this.w(t,e/2**24),this.w(t+1,e/65536),this.w(t+2,e/256),this.w(t+3,e)}fac(){let t=this.r(97);return t?(this.r(102)&128?-1:1)*(this.mant(98)+this.r(112)/256)/2**32*2**(t-128):0}conupk(t){this.w(34,t),this.w(35,t>>8);let e=[0,1,2,3,4].map(s=>this.r(t+s));return this.w(109,e[4]),this.w(108,e[3]),this.w(107,e[2]),this.w(110,e[1]),this.w(111,e[1]^this.r(102)),this.w(106,e[1]|128),this.w(105,e[0]),{a:this.r(97),y:0}}movfm(t){this.w(34,t),this.w(35,t>>8);let e=[0,1,2,3,4].map(s=>this.r(t+s));return this.w(101,e[4]),this.w(100,e[3]),this.w(99,e[2]),this.w(102,e[1]),this.w(98,e[1]|128),this.w(97,e[0]),this.w(112,0),{a:e[0],y:0}}movmf(t){return this.round(),this.w(34,t),this.w(35,t>>8),this.w(t+4,this.r(101)),this.w(t+3,this.r(100)),this.w(t+2,this.r(99)),this.w(t+1,(this.r(102)|127)&this.r(98)),this.w(t,this.r(97)),this.w(112,0),{a:this.r(97),y:0}}movfa(){this.w(102,this.r(110));for(let t=5;t>=1;t--)this.w(96+t,this.r(104+t));return this.w(112,0),{a:this.r(105),x:0}}movaf(){return this.round(),this.movef()}movef(){for(let t=6;t>=1;t--)this.w(104+t,this.r(96+t));return this.w(112,0),{a:this.r(97),x:0}}round(){if(!this.r(97))return;let t=this.r(112);if(this.w(112,t<<1),!(t&128))return;let e=this.mant(98)+1;if(e<2**32){this.setMant(98,e);return}this.setMant(98,0),this.carryIn(1)}carryIn(t){let e=this.r(97)+1;if(e>255)throw R0();this.w(97,e);let s=this.mant(98),f=this.r(112);this.setMant(98,Math.floor(s/2)+(t?2**31:0)),this.w(112,f>>1|(s&1)<<7)}sign(){return this.r(97)?this.r(102)&128?255:1:0}fcomp(t){return this.compare(t).a}compare(t){this.w(36,t),this.w(37,t>>8);let e=this.r(t);if(!e)return{a:this.sign(),y:1};let s=this.r(t+1),f=this.r(102),n=(r,h)=>{let p=f&128?1:0;return{a:(r?p^1:p)?255:1,y:h}};if((s^f)&128)return{a:f&128?255:1,y:1};if(e!==this.r(97))return n(e>this.r(97),1);for(let[r,h]of[[1,98],[2,99],[3,100]]){let p=r===1?s|128:this.r(t+r),d=this.r(h);if(p!==d)return n(p>d,r)}let o=this.r(112)>127?1:0,c=this.r(t+4)-this.r(101)-o;return(c&255)===0?{a:0,y:4}:n(c>=0,4)}fadd(t){return this.conupk(t),this.faddt()}fsub(t){return this.conupk(t),this.fsubt()}fsubt(){return this.w(102,this.r(102)^255),this.w(111,this.r(102)^this.r(110)),this.faddt()}faddt(){if(!this.r(97))return this.movfa();this.w(86,this.r(112));let t=this.r(105);if(!t)return{a:0};let e=t-this.r(97)&255,s=105,f=t>=this.r(97)?1:0,n=0;if(e!==0&&(f?(this.w(97,t),this.w(102,this.r(110)),e=~e+1&255,this.w(86,0),s=97):this.w(112,0),n=e-249&128?this.shift(s,e,0):this.bitShift(s,e,this.r(112),!1)),this.r(111)&128){let r=s===105?97:105,h=this.r(86)-n,p=h&255,d=h<0?1:0,l=this.mant(r+1)-this.mant(s+1)-d;return this.w(112,p),this.setMant(98,(l+2**32)%2**32),l<0&&this.negate(),this.normal()}let o=n+this.r(86)+(e===0?1:0),c=this.mant(98)+this.mant(106)+(o>255?1:0);return this.w(112,o),this.setMant(98,c%2**32),c>=2**32&&this.carryIn(1),{a:this.r(97)}}negate(){this.w(102,this.r(102)^255),this.complement()}complement(){let t=(~this.r(112)&255)+1,e=2**32-1-this.mant(98)+(t>255?1:0);this.w(112,t),this.setMant(98,e%2**32)}normal(){let t=0;for(;!this.r(98);)if(this.w(98,this.r(99)),this.w(99,this.r(100)),this.w(100,this.r(101)),this.w(101,this.r(112)),this.w(112,0),t+=8,t===32)return this.zero();for(;!(this.r(98)&128);){let e=this.r(112),s=this.mant(98);this.w(112,e<<1),this.setMant(98,(s*2+(e>>7))%2**32),t++}return t>=this.r(97)?this.zero():(this.w(97,this.r(97)-t),{a:this.r(97)})}zero(){return this.w(97,0),this.w(102,0),{a:0}}shift(t,e,s=0){for(;;){let f=e+8+s;if(e=f&255,s=f>255?1:0,e&128||!e){this.byteShift(t);continue}let n=e-8-(1-s);return e=n&255,s=n>=0?1:0,s?this.r(112):this.bitShift(t,e,this.r(112),!0)}}byteShift(t){this.w(112,this.r(t+4)),this.w(t+4,this.r(t+3)),this.w(t+3,this.r(t+2)),this.w(t+2,this.r(t+1)),this.w(t+1,this.r(104))}bitShift(t,e,s,f){for(;e!==0;e=e+1&255){let n=this.r(t+1),o=this.mant(t+1),c=f?n&128:0;this.setMant(t+1,Math.floor(o/2)+c*2**24),s=s>>1|(o&1)<<7,f=!0}return s}fmult(t){return this.conupk(t),this.fmultt()}fmultt(){if(!this.r(97))return{a:0};let t=this.muldiv();if(t.zero)return{a:0};for(let s of[38,39,40,41])this.w(s,0);let e=t.c;for(let s of[112,101,100,99,98])e=this.mltply(this.r(s),e,s===98);return this.w(98,this.r(38)),this.w(99,this.r(39)),this.w(100,this.r(40)),this.w(101,this.r(41)),this.normal()}mltply(t,e,s){if(!t&&!s)return this.byteShift(37),this.shift(37,0,e),0;for(let f=t>>1|128,n=t&1;;){let o=this.mant(38),c=0;n&&(o+=this.mant(106),c=o>=2**32?1:0,o%=2**32);let r=this.r(112);if(this.w(112,r>>1|(o&1)<<7),this.setMant(38,Math.floor(o/2)+c*2**31),n=f&1,f>>=1,!f)return 1}}muldiv(t=this.r(105)){if(!t)return this.zero(),{zero:!0};let e=t+this.r(97),s=e&255;if(e<256&&s<128)return this.zero(),{zero:!0};if(e>=256&&s&128)throw R0();let f=s+128&255,n=e<256?1:0;return this.w(97,f),this.w(102,f?this.r(111):0),{zero:!1,c:n}}fdiv(t){return this.conupk(t),this.fdivt()}fdivt(){if(!this.r(97))throw new b0(20);if(this.round(),this.w(97,0-this.r(97)&255),this.muldiv().zero)return{a:0};let t=this.r(97)+1;if(t>255)throw R0();this.w(97,t);let e=this.mant(106),s=0,f=0,n=this.mant(98);for(let o=0;o<34;o++){let c=s||e>=n?1:0;c&&(e=(e-n+2**32)%2**32),f=f*2+c,s=e>=2**31?1:0,e=e*2%2**32}return this.setMant(106,e),this.w(112,f%4<<6),this.setMant(98,Math.floor(f/4)),this.normal()}qint(){if(!this.r(97)){for(let e of[98,99,100,101])this.w(e,0);return{a:0,y:0}}let t=this.r(97)-160&255;if(this.r(102)&128&&(this.w(104,255),this.complement()),t-249&255&128)this.shift(97,t,0);else{let e=this.mant(98);this.setMant(98,Math.floor(e/2)+(this.r(102)&128?2**31:0)),this.bitShift(97,t+1&255,0,!0)}return this.w(104,0),{y:0}}int(){if(this.r(97)>=160)return{a:this.r(97)};this.qint(),this.w(112,0);let t=this.r(102);return this.w(102,0),this.float32(t)}float32(t){return this.w(97,160),this.w(7,this.r(101)),t&128&&this.negate(),this.normal()}};Object.assign(l0.prototype,{mul10(){this.movaf();let x=this.r(97);if(!x)return{a:0};if(x+2>255)throw R0();return this.addDoubled(x+2)},addDoubled(x){let t=this.r(105)-x&255;this.w(111,0),this.w(97,x),this.w(102,this.r(110)),this.w(86,0);let e=this.bitShift(97,t,this.r(112),!1)+this.r(86),s=this.mant(98)+this.mant(106)+(e>255?1:0);this.w(112,e),this.setMant(98,s%2**32),s>=2**32&&this.carryIn(1);let f=this.r(97)+1;if(f>255)throw R0();return this.w(97,f),{a:f}},div10(){return this.movaf(),this.divInto(47865,0)},divInto(x,t){return this.w(111,t),this.movfm(x),this.fdivt()},byte(x){this.w(98,x),this.w(99,0);for(let t of[100,101,112,102])this.w(t,0);return this.w(97,136),x&128&&this.negate(),this.normal()},addDigit(x){return this.movaf(),this.byte(x),this.w(111,this.r(110)^this.r(102)),this.faddt()},poly2(x){return this.w(113,x),this.w(114,x>>8),this.poly()},poly(){this.movmf(92);let x=this.r(113)|this.r(114)<<8;this.w(103,this.r(x)),x++,this.w(113,x),this.w(114,x>>8);for(let t=x;;t=92)if(this.fmult(t),x=(this.r(113)|this.r(114)<<8)+5,this.w(113,x),this.w(114,x>>8),this.fadd(x),this.w(103,this.r(103)-1),!this.r(103))return{a:this.r(97)}},poly1(x){return this.w(113,x),this.w(114,x>>8),this.movmf(87),this.fmult(87),this.poly(),this.fmult(87)},log(){if(this.sign()!==1)throw new b0(14);let x=this.r(97)-128&255;return this.w(97,128),this.fadd(47574),this.fdiv(47579),this.fsub(47548),this.poly1(47553),this.fadd(47584),this.addDigit(x),this.fmult(47589)},exp(x=0){let t=this.r(97);if(this.fmult(49087),t&&this.r(97))x=0;else if(t){let o=129+t;x=o<256&&(o&255)<128?0:1}let e=this.r(112)+80+x;if(e>255){let o=this.mant(98)+1;this.setMant(98,o%2**32),o>=2**32&&this.carryIn(1)}this.w(86,e),this.movef();let s=()=>{if(!(this.r(102)&128))throw R0();return this.zero()};if(this.r(97)>=136)return s();this.int();let f=this.r(7)+129&255;if(!f)return s();for(let o=0;o<6;o++){let c=this.r(105+o);this.w(105+o,this.r(97+o)),this.w(97+o,c)}this.w(112,this.r(86)),this.fsubt(),this.negop(),this.poly2(49092),this.w(111,0);let n=f-1&255;return n?(this.muldiv(n),{a:0}):this.zero()},fpwrt(x,t){if(x)return this.exp(t);if(!this.r(105))return this.w(97,0),this.w(102,0),{a:0};this.movmf(78);let e=this.r(110),s=0;if(e&128){this.int();let{a:f,y:n}=this.compare(78);f?(e=f,s=n&1):(e=n,s=this.r(7)&1)}this.w(102,e);for(let f=5;f>=1;f--)this.w(96+f,this.r(104+f));return this.w(112,0),this.log(),this.fmult(78),this.exp(0),s&&this.r(97)&&this.w(102,this.r(102)^255),{a:this.r(97)}},sin(){this.movaf(),this.divInto(58085,this.r(110)),this.movaf(),this.int(),this.w(111,0),this.fsubt(),this.fsub(58090);let x=this.r(102);return x&128?(this.fadd(48913),this.r(102)&128||(this.w(18,this.r(18)^255),this.negop())):this.negop(),this.fadd(58090),x&128&&this.negop(),this.poly1(58095)},cos(){return this.fadd(58080),this.sin()},fout(){let x=(d,l)=>this.w(255+d,l),t=1;if(x(t,this.r(102)&128?45:32),this.w(102,this.r(255+t)),this.w(113,t),t++,!this.r(97))return x(t,48),x(t+1,0),{a:0,y:1};let e=0;this.r(97)<=128&&(this.fmult(48573),e=247),this.w(93,e);let s="FOUT4";for(;;)if(s==="FOUT4"){let d=this.fcomp(48568);if(d===0){s="BIGGES";break}s=d===1?"FOUT9":"FOUT3"}else if(s==="FOUT3"){if(this.fcomp(48563)===1){s="FOUT5";break}this.mul10(),this.w(93,this.r(93)-1&255),s=this.r(93)?"FOUT3":"FOUT9"}else if(this.div10(),this.w(93,this.r(93)+1&255),this.r(93))s="FOUT4";else{s="FOUT5";break}s==="FOUT5"&&this.fadd(48913),this.qint();let f=1,n;for(e=this.r(93)+10&255,e&128||e>=11?n=e-2:(f=e-1&255,n=0),this.w(94,n&255),this.w(93,f),(f===0||f&128)&&(t=this.r(113),t++,x(t,46),f&&(t++,x(t,48)),this.w(113,t)),t=0,f=128;;){let d=0;for(let l of[3,2,1,0]){let y=this.r(98+l)+this.r(48918+t+l)+d;this.w(98+l,y&255),d=y>>8}if(f=f+1&255,!(d?f&128:!(f&128))){if(e=f,d){let l=(e^255)+10+1;e=l&255,d=l>>8}if(e=e+47+d&255,t+=4,this.w(71,t),t=this.r(113)+1,f=e,x(t,e&127),this.w(93,this.r(93)-1&255),this.r(93)||(t++,x(t,46)),this.w(113,t),t=this.r(71),f=(f^255)&128,t===36||t===60)break}}t=this.r(113);let o;do o=this.r(255+t),t--;while(o===48);o!==46&&t++;let c=this.r(94);if(!c)return x(t+1,0),{a:0,y:1};let r=43;c&128&&(c=0-c&255,r=45),x(t+2,r),x(t+1,69);let h=47,p=1;do{h++;let d=c-10-(1-p);p=d>=0?1:0,c=d&255}while(p);return x(t+4,c+58&255),x(t+3,h),x(t+5,0),{a:0,y:1}},negop(){return this.r(97)&&this.w(102,this.r(102)^255),{a:this.r(102)}}});var b0=class extends Error{constructor(t){super("BASIC error "+t),this.x=t}},R0=()=>new b0(15);var j=class extends Error{},p0=["TOO MANY FILES","FILE OPEN","FILE NOT OPEN","FILE NOT FOUND","DEVICE NOT PRESENT","NOT INPUT FILE","NOT OUTPUT FILE","MISSING FILE NAME","ILLEGAL DEVICE NUMBER","NEXT WITHOUT FOR","SYNTAX","RETURN WITHOUT GOSUB","OUT OF DATA","ILLEGAL QUANTITY","OVERFLOW","OUT OF MEMORY","UNDEF'D STATEMENT","BAD SUBSCRIPT","REDIM'D ARRAY","DIVISION BY ZERO","ILLEGAL DIRECT","TYPE MISMATCH","STRING TOO LONG","FILE DATA","FORMULA TOO COMPLEX","CAN'T CONTINUE","UNDEF'D FUNCTION","VERIFY","LOAD","BREAK"],M=x=>{throw new j("?"+x+" ERROR")},o0=new Uint8Array(65536),De=new l0({read:x=>o0[x],write:(x,t)=>{o0[x]=t}});for(let[x,t]of Object.entries(N0))o0.set(t,+x);function K0(x){let t=W0(x);if(!t[0]||Math.abs(x)<2**-128)return" 0";t[0]>255&&M("OVERFLOW"),o0[97]=t[0],o0[98]=t[1]|128,o0.set(t.slice(2),99),o0[102]=x<0?255:0,o0[112]=0,De.fout();let e="";for(let s=256;o0[s];s++)e+=String.fromCharCode(o0[s]);return e}function m0(x){let t=x.replace(/ /g,""),e=/^[+-]?(\d*\.?\d*)(E[+-]?\d+)?/.exec(t),s=e&&e[1]&&e[1]!=="."?Number(e[0].replace(/E$/,"")):0;return Number.isFinite(s)?s:0}function $0(x,t){let e="",s=()=>{for(;x[t]===" ";)t++},f=()=>{for(;x[t]>="0"&&x[t]<="9";)e+=x[t++],s()};return s(),(x[t]==="-"||x[t]==="+")&&(e+=x[t++],s()),f(),x[t]==="."&&(e+=x[t++],s(),f()),x[t]==="E"&&(e+=x[t++],s(),(x[t]==="-"||x[t]==="+")&&(e+=x[t++],s()),f()),{text:e,end:t}}var Q=x=>{let t=Math.floor(x);return(t<-32768||t>32767)&&M("ILLEGAL QUANTITY"),t},U0=x=>Math.imul(x,2654435761)>>>0,M0=x=>(Math.imul(x,1664525)+1013904223>>>0&4294967294)>>>0;var ot=x=>Object.assign(new j("?SYNTAX ERROR"),{detail:x}),C0="END FOR NEXT DATA INPUT# INPUT DIM READ LET GOTO RUN IF RESTORE GOSUB RETURN REM STOP ON WAIT LOAD SAVE VERIFY DEF POKE PRINT# PRINT CONT LIST CLR CMD SYS OPEN CLOSE GET NEW TAB( TO FN SPC( THEN NOT STEP + - * / ^ AND OR > = < SGN INT ABS USR FRE POS SQR RND LOG EXP COS SIN TAN ATN PEEK LEN STR$ VAL ASC CHR$ LEFT$ RIGHT$ MID$ GO".split(" "),H=Object.fromEntries(C0.map((x,t)=>[x,128+t])),ve=new Set(["SGN","INT","ABS","USR","FRE","POS","SQR","RND","LOG","EXP","COS","SIN","TAN","ATN","PEEK","LEN","STR$","VAL","ASC","CHR$","LEFT$","RIGHT$","MID$"]),rt={[H.OR]:["or",1],[H.AND]:["and",2],[H[">"]]:[">",4],[H["="]]:["=",4],[H["<"]]:["<",4],[H["+"]]:["+",5],[H["-"]]:["-",5],[H["*"]]:["*",6],[H["/"]]:["/",6],[H["^"]]:["^",8]};function ct(x,t){let e={at:t,peek(){for(;x[e.at]===32;)e.at++;return x[e.at]},next(){let s=e.peek();return e.at++,s},end(){let s=e.peek();return s===0||s===58},expect(s){if(e.next()!==s)throw ot(`$${(e.at-1).toString(16)}: expected $${s.toString(16)}`)}};return e}var ht=x=>x>=65&&x<=90,w0=x=>x>=48&&x<=57;function T0(x){let t=String.fromCharCode(x.next());for(;ht(Q0(x))||w0(Q0(x));){let e=String.fromCharCode(x.next());t.length<2&&(t+=e)}return(Q0(x)===36||Q0(x)===37)&&(t+=String.fromCharCode(x.next())),t}var Q0=x=>x.peek();function n0(x,t){let e=x.peek();if(e===34){x.at++;let s=x.at;for(;t[x.at]&&t[x.at]!==34;)x.at++;let f=String.fromCharCode(...t.subarray(s,x.at));return t[x.at]===34&&x.at++,{k:"str",s:f,at:s}}if(w0(e)||e===46){let s="",f=()=>{s+=String.fromCharCode(x.next())};for(;w0(x.peek())||x.peek()===46;)f();if(x.peek()===69)for(f(),(x.peek()===H["-"]||x.peek()===H["+"])&&(x.at++,s+=t[x.at-1]===H["-"]?"-":"+");w0(x.peek());)f();return{k:"num",v:Number(s)}}if(e===40){x.at++;let s=r0(x,t,0);return x.expect(41),s}if(e===H["-"])return x.at++,{k:"neg",a:r0(x,t,7)};if(e===H["+"])return x.at++,r0(x,t,7);if(e===H.NOT)return x.at++,{k:"not",a:r0(x,t,3)};if(e===H.FN){x.at++;let s=T0(x);x.expect(40);let f=r0(x,t,0);return x.expect(41),{k:"fn-call",n:s,a:f}}if(e>=128&&ve.has(C0[e-128])){x.at++,x.expect(40);let s=[r0(x,t,0)];for(;x.peek()===44;)x.at++,s.push(r0(x,t,0));return x.expect(41),{k:"fn",n:C0[e-128].toLowerCase(),args:s}}if(ht(e)){let s=T0(x);if(s==="TI"||s==="ST"||s==="TI$")return{k:"special",n:s.toLowerCase()};if(x.peek()===40){x.at++;let f=[r0(x,t,0)];for(;x.peek()===44;)x.at++,f.push(r0(x,t,0));return x.expect(41),{k:"elem",n:s,i:f}}return{k:"var",n:s}}throw ot(`$${x.at.toString(16)}: not an expression ($${e.toString(16)})`)}function r0(x,t,e){let s=n0(x,t);for(;;){let f=x.peek(),n=rt[f];if(!n||n[1]<e)return s;x.at++;let o=n[0];n[1]===4&&rt[x.peek()]?.[1]===4&&(o={"<>":"<>","><":"<>","<=":"<=","=<":"<=",">=":">=","=>":">="}[o+rt[x.peek()][0]],x.at++),s={k:"op",o,a:s,b:r0(x,t,n[1]+1)}}}function lt(x,t){let e=[];for(let s of G0(x,t)){let f=s.bytes;for(let n=0,o=!1;f[n];n++)if(f[n]===34&&(o=!o),!o){if(f[n]===Bt)break;if(f[n]===at){for(n++;;n++){for(;f[n]===32;)n++;let c="",r=!1;if(f[n]===34){for(r=!0,n++;f[n]&&f[n]!==34;n++)c+=String.fromCharCode(f[n]);for(f[n]===34&&n++;f[n]&&f[n]!==44&&f[n]!==58;)n++}else for(;f[n]&&f[n]!==44&&f[n]!==58;n++)c+=String.fromCharCode(f[n]);if(e.push({text:c,quoted:r,line:s.n}),f[n]!==44)break}if(!f[n])break}}}return e}function ut(x,t,e){let s=X0(x,t),f=new Map(s.filter(n=>n.label!==void 0).map(n=>[n.line,n.label]));return s.push({at:0,k:"end",args:[]},{label:"direct",line:65535}),Vt(ct(x,e),x,s,n=>f.has(n)?f.get(n):{missing:n},null),s.push({at:0,k:"end",args:[]}),s}function S0(x,t){let e=ct(x,t);return{e:r0(e,x,0),end:e.at}}function X0(x,t){let e=[],s=new Map,f=[];for(let o=t;x[o]|x[o+1]<<8;o=x.indexOf(0,o+4)+1)s.set(x[o+2]|x[o+3]<<8,o),f.push(o);let n=o=>s.has(o)?s.get(o):{missing:o};for(let[o,c]of f.entries()){e.push({label:c,line:x[c+2]|x[c+3]<<8});let r=f[o+1]??null,h=ct(x,c+4);Vt(h,x,e,n,r)}return e}function Vt(x,t,e,s,f){for(;!x.end()||x.peek()===58;){if(x.peek()===58){x.at++;continue}let n=x.at;try{Ge(x,t,e,s,f,n)}catch(o){if(!(o instanceof j))throw o;for(e.push({at:n,k:"fail",what:/^\?(.*) ERROR$/.exec(o.message)[1],args:[]});t[x.at];)x.at++}}}function Ge(x,t,e,s,f,n){{let o=x.next(),c=o>=128?C0[o-128]:null,r=d=>e.push({at:n,...d}),h=()=>{let d=S0(t,x.at);return x.at=d.end,d.e},p=()=>{if(x.end()){r({k:"newline",args:[]});return}for(;!x.end();){let d=x.peek();if(d===H["TAB("]||d===H["SPC("]){x.at++;let l=h();x.expect(41),r({k:d===H["TAB("]?"tab":"spc",args:[l]})}else if(d===59){x.at++;continue}else if(d===44){x.at++,r({k:"print-comma",args:[]});continue}else r({k:"print",args:[h()]});if(x.end()){r({k:"newline",args:[]});break}if(x.peek()===59&&(x.at++,x.end()))break}};if(!c||c==="LET"){c?x.peek():x.at--;let d=n0(x,t);x.expect(H["="]),r({k:"let",t:d,e:h()})}else if(c==="IF"){let d=h();if(x.peek()===H.GOTO){x.at++,r({k:"if-goto",e:d,to:s(u0(x))});return}if(x.expect(H.THEN),w0(x.peek())){r({k:"if-goto",e:d,to:s(u0(x))});return}r({k:"unless",e:d,to:f??-1})}else if(c==="GOTO"||c==="GOSUB")r({k:c.toLowerCase(),to:s(u0(x))});else if(c==="GO")x.expect(H.TO),r({k:"goto",to:s(u0(x))});else{if(o>=163)throw ot(`$${n.toString(16)}: ${c} begins no statement`);if(c==="DATA"){let d=!1;for(;t[x.at]&&(d||t[x.at]!==58);)t[x.at]===34&&(d=!d),x.at++}else if(c==="REM")for(;t[x.at];)x.at++;else if(c==="RESTORE")r({k:"restore",args:[]});else if(c==="DIM")for(;;){let d=n0(x,t);if(d.k!=="elem"&&M("SYNTAX"),r({k:"dim",n:d.n,sizes:d.i}),x.peek()!==44)break;x.at++}else if(c==="DEF"){x.expect(H.FN);let d=T0(x);x.expect(40);let l=T0(x);x.expect(41),x.expect(H["="]),r({k:"def",n:d,p:l,e:h()})}else if(c==="INPUT"){let d=null;x.peek()===34&&(d=n0(x,t).s,x.next()!==59&&M("SYNTAX"));let l=[];for(;;){let y=n0(x,t);if(y.k!=="var"&&y.k!=="elem"&&M("SYNTAX"),l.push(y),x.peek()!==44)break;x.at++}r({k:"input-keys",prompt:d,targets:l})}else if(c==="READ")for(;;){let d=n0(x,t);if(d.k!=="var"&&d.k!=="elem"&&M("SYNTAX"),r({k:d.n.endsWith("$")?"read$":"read",t:d}),x.peek()!==44)break;x.at++}else if(c==="ON"){let d=h(),l=x.next();l!==H.GOTO&&l!==H.GOSUB&&M("SYNTAX");let y=[s(u0(x))];for(;x.peek()===44;)x.at++,y.push(s(u0(x)));r({k:"on",e:d,to:y,gosub:l===H.GOSUB})}else if(c==="RETURN"||c==="CLR"||c==="END"||c==="STOP"||c==="NEW"||c==="CONT")r({k:c.toLowerCase(),args:[]});else if(c==="RUN")r(w0(x.peek())?{k:"run",to:s(u0(x)),args:[]}:{k:"run",args:[]});else if(c==="LIST"){let d=u0(x),l=d;x.peek()===H["-"]&&(x.at++,l=u0(x)),x.end()||M("SYNTAX"),r({k:"list",args:[{k:"num",v:d},{k:"num",v:l||65535}]})}else if(c==="POKE"){let d=h();x.expect(44),r({k:"poke",a:d,v:h()})}else if(c==="SYS"){let d=h(),l=x.at;for(;t[x.at]&&t[x.at]!==58;)x.at++;r({k:"sys",e:d,text:l,end:x.at,words:""})}else if(c==="LOAD"){let d=[h()];for(;x.peek()===44;)x.at++,d.push(h());r({k:"load",args:d})}else if(c==="GET"&&x.peek()===35){x.at++;let d=h();x.expect(44);let l=[n0(x,t)];for(;x.peek()===44;)x.at++,l.push(n0(x,t));r({k:"get#",args:[d],targets:l})}else if(c==="GET")r({k:"get",t:n0(x,t)});else if(c==="INPUT#"){let d=h();x.expect(44);let l=[n0(x,t)];for(;x.peek()===44;)x.at++,l.push(n0(x,t));r({k:"input#",args:[d]}),l.forEach((y,E)=>r({k:E?"input-item":"input",t:y,last:E===l.length-1}))}else if(c==="WAIT"){let d=[h()];x.expect(44),d.push(h()),x.peek()===44&&(x.at++,d.push(h())),r({k:"wait",args:d})}else if(c==="SAVE"||c==="VERIFY"){let d=x.end()?[]:[h()];for(;x.peek()===44;)x.at++,d.push(h());r({k:c.toLowerCase(),args:d})}else if(c==="FOR"){let d=T0(x);x.expect(H["="]);let l=h();x.expect(H.TO);let y=h(),E=x.peek()===H.STEP?(x.at++,h()):void 0;r({k:"let",t:{k:"var",n:d},e:l}),e.push({at:n,k:"for",v:d,to:y,...E?{step:E}:{}})}else if(c==="NEXT"){if(!ht(x.peek())){r({k:"next",v:null,args:[]});return}for(;r({k:"next-var",v:T0(x),args:[]}),x.peek()===44;)x.at++}else if(c==="PRINT")p();else if(c==="CMD"||c==="PRINT#")r({k:"print#",args:[h()]}),x.peek()===44?x.at++:x.end()||M("SYNTAX"),p(),c==="PRINT#"&&r({k:"clrchn",args:[]});else if(c==="OPEN"){let d=x.end()?[]:[h()];for(;x.peek()===44;)x.at++,d.push(h());r({k:"open",args:d})}else if(c==="CLOSE")r({k:"close",args:[h()]});else throw new Error(`$${n.toString(16)}: ${c} is not handled`)}}}var u0=x=>{let t=0;for(;w0(x.peek());)t=t*10+x.next()-48;return t},D0=[...C0.flatMap(x=>[...x].map((t,e,s)=>t.charCodeAt(0)|(e===s.length-1?128:0))),0],Pe=H.PRINT,at=H.DATA,Bt=H.REM;function _0(x){let t=[...x,0],e=[],s=0,f=0,n=c=>(e.push(c),s++,c===0?"done":(c===58?f=0:c===at&&(f=at-58),c===Bt?"rem":null)),o=c=>{for(;;){let r=t[s];if(r===0||r===c)return n(r);e.push(r),s++}};for(;;){let c=t[s],r=null;if(c>=128){if(c!==255){s++;continue}r=n(c)}else if(c===32)r=n(c);else if(c===34)e.push(c),s++,r=o(34);else if(f&64)r=n(c);else if(c===63)r=n(Pe);else if(c>=48&&c<60)r=n(c);else{let h=0,p=0,d=null;for(;;){let l=s;for(;;){let y=t[l]-D0[h]&255;if(y===0){l++,h++;continue}y===128&&(d={token:128|p,end:l});break}if(d)break;p++;do h++;while(!(D0[h-1]&128));if(D0[h]===0)break}d?(s=d.end,r=n(d.token)):r=n(c)}if(r==="done"||r==="rem"&&o(0)==="done")return e}}function v0(x){let t=[],e=!1;for(let s of x){if(s===0)break;if(s<128||s===255||e){s===34&&(e=!e),t.push(s);continue}let f=s-127,n=255;for(;--f;)do n=n+1&255;while(!(D0[n]&128));for(;;){n=n+1&255;let o=D0[n];if(o&128){t.push(o&127);break}if(t.push(o),!o)break}}return t}function G0(x,t){let e=[];for(let s=t;x[s]|x[s+1]<<8;){let f=x.indexOf(0,s+4);e.push({n:x[s+2]|x[s+3]<<8,bytes:[...x.subarray(s+4,f+1)]}),s=f+1}return e}function dt(x,t,e,s){let f=G0(x,t).filter(o=>o.n!==e);s.length>1&&f.push({n:e,bytes:s}),f.sort((o,c)=>o.n-c.n);let n=t;for(let o of f){let c=n+4+o.bytes.length;x.set([c&255,c>>8,o.n&255,o.n>>8,...o.bytes],n),n=c}return x[n]=0,x[n+1]=0,n+2}var g0=(x,t=4)=>x.toString(16).toUpperCase().padStart(t,"0"),t0=x=>JSON.stringify(x),x0=x=>x.op!==void 0?`, b.here(0x${x.op.toString(16)})`:"";function B(x){switch(x.k){case"num":return String(x.v);case"str":return t0(x.s);case"special":return{ti:"b.ti()",ti$:"b.tis()",st:"b.st()",pi:String(Math.PI)}[x.n];case"var":return`b.get(${t0(x.n)})`;case"elem":return`b.elem(${t0(x.n)}, [${x.i.map(B).join(", ")}]${x0(x)})`;case"neg":return`-b.num(${B(x.a)})`;case"not":return`b.not(${B(x.a)})`;case"op":{let t=B(x.a),e=B(x.b);switch(x.o){case"+":return`b.add(${t}, ${e}${x0(x)})`;case"-":return`(b.num(${t}) - b.num(${e}))`;case"*":return`(b.num(${t}) * b.num(${e}))`;case"/":return`b.div(${t}, ${e}${x0(x)})`;case"^":return`b.pow(${t}, ${e}${x0(x)})`;case"and":return`b.and(${t}, ${e}${x0(x)})`;case"or":return`b.or(${t}, ${e}${x0(x)})`;default:return`b.cmp(${t}, ${e}, ${t0(x.o)}${x0(x)})`}}case"fn-call":return`b.fn(${t0(x.n)}, ${B(x.a)})`;case"fn":{let t=x.args.map(B);return`b.${{str$:"str",chr$:"chr",left$:"left",right$:"right",mid$:"mid"}[x.n]??x.n}(${t.join(", ")}${t.length<3&&x.n==="mid$"?", undefined":""}${x0(x)})`}}throw new Error("no expression "+x.k)}var P0=(x,t,e)=>x.k==="elem"?`b.setElem(${t0(x.n)}, [${x.i.map(B).join(", ")}], ${t}${e?x0(e):""})`:`b.set(${t0(x.n)}, ${t}${e?x0(e):""})`,J0=x=>x.n.endsWith("$");function Ht(x,{name:t,source:e,mem:s,cost:f=0,render:n}){let o={},c=[];for(let l of x)l.label!==void 0?o["L"+g0(typeof l.label=="number"?l.label:parseInt(l.label.slice(1),16))]=c.length:c.push(l);let r=l=>{if(l?.missing!==void 0)return null;let y=o["L"+g0(l)];if(y===void 0)throw new Error("no label for $"+g0(l));return y},h=new Map,p=c.map((l,y)=>{let E=O=>O?.missing!==void 0?"b.undef();":`e.pc = ${r(O)};`,u;switch(l.k){case"let":u=P0(l.t,B(l.e),l);break;case"dim":u=`b.dim(${t0(l.n)}, [${l.sizes.map(B).join(", ")}]);`;break;case"poke":u=`b.poke(${B(l.a)}, ${B(l.v)}${x0(l)});`;break;case"for":u=`b.for(${t0(l.v)}, ${B(l.to)}, ${l.step?B(l.step):1}, ${y+1});`;break;case"next":case"next-var":u=`{ const back = b.next(${l.v?t0(l.v):"null"}); if (back !== null) e.pc = back; }`;break;case"goto":u=E(l.to);break;case"gosub":u=`b.gosub(${y+1}); ${E(l.to)}`;break;case"return":u="e.pc = b.ret();";break;case"on":u=`{ const n = b.on(${B(l.e)}${x0(l)}); if (n >= 1 && n <= ${l.to.length}) { const to = [${l.to.map(r).join(", ")}][n - 1]; if (to === null) b.undef(); ${l.gosub?`b.gosub(${y+1}); `:""}e.pc = to; } }`;break;case"unless":u=l.to<0?`if (!b.num(${B(l.e)})) e.pc = ${c.length};`:`if (!b.num(${B(l.e)})) ${E(l.to)}`;break;case"if-goto":u=`if (b.num(${B(l.e)})) ${E(l.to)}`;break;case"if-return":u=`if (b.num(${B(l.e)})) e.pc = b.ret();`;break;case"print":u=`b.print(${B(l.args[0])});`;break;case"print,":u=`b.print(${B(l.args[0])}); b.comma();`;break;case"print-line":u=`b.print(${B(l.args[0])}); b.newline();`;break;case"print-line#":u=`b.print(${B(l.args[0])}); b.newline(); b.clrchn();`;break;case"print#":u=`b.output(${B(l.args[0])});`;break;case"print#-line":u=`b.output(${B(l.args[0])}); b.newline(); b.clrchn();`;break;case"clrchn":u="b.clrchn();";break;case"input#":u=`b.input(${B(l.args[0])});`;break;case"get#":u=`b.input(${B(l.args[0])}); ${l.targets.map(O=>P0(O,J0(O)?"b.getFrom()":"b.val(b.getFrom())")).join("; ")}; b.clrchn();`;break;case"input":case"input-item":u=`{ const v = b.item(${J0(l.t)}, ${l.k==="input"}); if (v !== undefined) ${P0(l.t,"v")}; }`+(l.last?" b.inputDone();":"");break;case"input-start":u="";break;case"open":u=`b.open([${l.args.map(B).join(", ")}]);`;break;case"close":u=`b.close(${B(l.args[0])});`;break;case"wait":u=`if (!b.wait(${l.args.map(B).join(", ")})) { e.pc = ${y}; if (++e.idle > (e.routines.polls ?? 200) && !e.clock) e.polled = true; }`;break;case"print-comma":u="b.comma();";break;case"newline":u="b.newline();";break;case"tab":u=`b.tab(${B(l.args[0])}${x0(l)});`;break;case"spc":u=`b.spc(${B(l.args[0])}${x0(l)});`;break;case"get":u=`{ const k = b.key(); if (k === null) { e.pc = ${y}; return; } ${P0(l.t,J0(l.t)?"k":"b.val(k)")} }`;break;case"read":case"read$":u=P0(l.t,`b.read(${J0(l.t)})`);break;case"clr":u="b.clr();";break;case"restore":u="b.restore();";break;case"def":u=`b.def(${t0(l.n)}, ${t0(l.p)}, b => ${B(l.e)});`;break;case"end":case"stop":u="e.ended = true;";break;case"ti$=":u=`b.setTis(${B(l.args[0])});`;break;case"run":u=`b.run(${y+1}); ${l.to!==void 0?E(l.to):"e.pc = 0;"}`;break;case"fail":u=`b.failWith(${t0(l.what)});`;break;case"run-main":u=`e.pc = b.resume ?? ${c.length?r(l.to):0}; b.resume = undefined;`;break;case"nop":case"flag+40":case"flag-40":case"flag+80":case"flag-80":u="";break;case"sys":{if(u=`return b.sys(${B(l.e)}, 0x${g0(l.text)}, s[${y}]);`,s)for(let O=l.text;O<l.end;){for(;s[O]===32||s[O]===44;)O++;if(O>=l.end)break;let I;try{I=S0(s,O)}catch{break}h.set(O,[I.end,B(I.e),I.e.k==="str"?I.e.at:null]),O=I.end}break}default:u=`return b.statement(${t0(l.k)}, [${(l.args??[]).map(B).join(", ")}]${l.t?", "+t0(l.t.n):""}, s[${y}]);`}return(l.op!==void 0?`b.here(0x${l.op.toString(16)}); `:"")+u}),d=[];d.push(`// ${t}, compiled from ${e} by @moonbase-machines/c64/basic-compile.js: compiled again, never edited`),d.push("export default {"),d.push(` labels: ${JSON.stringify(o)},`),d.push(" data: [],"),d.push(" steps: [");for(let[l,y]of c.entries())d.push(` [0x${g0(y.at)}, ${l}, ${t0(n(y))}],`);d.push(" ],"),d.push(" run: {");for(let[l,y]of p.entries())d.push(` ${l}: (e, s) => { const b = e.basic;${f?` b.cost(${f});`:""} ${y} },`);d.push(" },"),d.push(" params: {");for(let[l,[y,E,u]]of[...h].sort((O,I)=>O[0]-I[0]))d.push(` 0x${g0(l)}: [0x${g0(y)}, b => ${E}${u!==null?`, 0x${g0(u)}`:""}],`);return d.push(" },"),d.push("};"),d.join(`
|
|
3
3
|
`)+`
|
|
4
4
|
`}function bt(x,t){let e=Ht(x,t);return new Function("return "+e.slice(e.indexOf("export default ")+15).replace(/;\s*$/,""))()}var Y0=x=>new Function("b","return "+B(x));var qt={};X(qt,{listing:()=>Be});var Wt={};X(Wt,{CONTROLS:()=>pt,bytes:()=>Ve,text:()=>mt});var pt={WHT:5,"DISABLE SHIFT":8,"ENABLE SHIFT":9,RETURN:13,LOWER:14,DOWN:17,"RVS ON":18,HOME:19,DEL:20,RED:28,RIGHT:29,GRN:30,BLU:31,ORNG:129,F1:133,F3:134,F5:135,F7:136,F2:137,F4:138,F6:139,F8:140,UPPER:142,BLK:144,UP:145,"RVS OFF":146,CLR:147,INST:148,BRN:149,LRED:150,GRY1:151,GRY2:152,LGRN:153,LBLU:154,GRY3:155,PUR:156,LEFT:157,YEL:158,CYN:159,"SHIFT SPACE":160,PI:255},Ye=Object.fromEntries(Object.entries(pt).map(([x,t])=>[t,x]));function Ve(x,{lower:t=!1}={}){let e=[];for(let s=0;s<x.length;s++){let f=x[s];if(f==="{"){let o=x.indexOf("}",s),c=x.slice(s+1,o);if(o<0)throw new Error("a { with no }: "+x);let r=/^\$([0-9A-F]{2})$/i.exec(c)?parseInt(c.slice(1),16):pt[c.toUpperCase()];if(r===void 0)throw new Error(`no control character {${c}}`);e.push(r),s=o;continue}let n=f.charCodeAt(0);f==="\xA3"?e.push(92):f==="\u2191"?e.push(94):f==="\u2190"?e.push(95):f==="\u03C0"?e.push(255):n>=97&&n<=122?e.push(n-32):t&&n>=65&&n<=90?e.push(n+128):e.push(n&255)}return e}function mt(x,{lower:t=!1}={}){let e="";for(let s of x)t&&s>=65&&s<=90?e+=String.fromCharCode(s+32):t&&s>=193&&s<=218?e+=String.fromCharCode(s-128):s===13?e+="\r":s>=32&&s<91||s===93?e+=String.fromCharCode(s):s===92?e+="\xA3":s===94?e+="\u2191":s===95?e+="\u2190":s===91?e+="[":e+=`{${Ye[s]??"$"+s.toString(16).toUpperCase().padStart(2,"0")}}`;return e}function Be(x,{lower:t=!1}={}){let e=[];for(let s=0;s+4<=x.length&&x[s]|x[s+1]<<8;){let f=x[s+2]|x[s+3]<<8,n=s+4;for(;n<x.length&&x[n];)n++;e.push(f+" "+mt(v0(x.subarray(s+4,n)),{lower:t})),s=n+1}return e.join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moonbase-machines/c64",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "A Commodore 64 as far as the games use it: the VIC-II, the SID, a 1541, a printer, and Moonbase's own KERNAL and BASIC in place of Commodore's ROMs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
"./*": "./*"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@moonbase-machines/mos6502": "0.6.
|
|
14
|
-
"@moonbase-machines/charset": "0.6.
|
|
13
|
+
"@moonbase-machines/mos6502": "0.6.1",
|
|
14
|
+
"@moonbase-machines/charset": "0.6.1"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"prepack": "node ../../tools/package-files.mjs c64"
|
|
15
18
|
}
|
|
16
19
|
}
|