| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent b65f09b commit 855662f
13 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -290,10 +290,10 @@ BasicLexer.prototype = { | |||
| 290 | 290 | addToken(sChar, sChar, iStartPos); | |
| 291 | 291 | sChar = advance(); | |
| 292 | 292 | } else if (isRsx(sChar)) { | |
| 293 | + sToken = sChar; | ||
| 293 | 294 | sChar = advance(); | |
| 294 | - sToken = ""; | ||
| 295 | 295 | if (isIdentifierMiddle(sChar)) { | |
| 296 | - sToken = advanceWhile(isIdentifierMiddle); | ||
| 296 | + sToken += advanceWhile(isIdentifierMiddle); | ||
| 297 | 297 | addToken("|", sToken, iStartPos); | |
| 298 | 298 | } | |
| 299 | 299 | } else if (isStream(sChar)) { // stream can be an expression | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -133,7 +133,7 @@ BasicParser.mKeywords = { | |||
| 133 | 133 | move: "c n n n0? n?", | |
| 134 | 134 | mover: "c n n n0? n?", | |
| 135 | 135 | "new": "c", | |
| 136 | - next: "c v*", // v* | ||
| 136 | + next: "c v*", | ||
| 137 | 137 | not: "o", | |
| 138 | 138 | on: "c", // on break cont, on break gosub, on break stop, on error goto, on <ex> gosub, on <ex> goto, on sq(n) gosub | |
| 139 | 139 | onBreakGosub: "c l", // special | |
@@ -519,12 +519,6 @@ BasicParser.prototype = { | |||
| 519 | 519 | if (oExpression.type !== "identifier") { | |
| 520 | 520 | throw new BasicParser.ErrorObject("Variable expected at", oExpression.value, oExpression.pos, that.iLine); | |
| 521 | 521 | } | |
| 522 | - /* | ||
| 523 | - if (oToken.type !== "identifier") { | ||
| 524 | - throw new BasicParser.ErrorObject("Variable expected at", oToken.value, oToken.pos, that.iLine); | ||
| 525 | - } | ||
| 526 | - oExpression = expression(0); | ||
| 527 | - */ | ||
| 528 | 522 | } else if (sType.substr(0, 1) === "r") { // character or range of characters (defint, defreal, defstr) | |
| 529 | 523 | if (oToken.type !== "identifier") { | |
| 530 | 524 | throw new BasicParser.ErrorObject("Letter expected at", oToken.value, oToken.pos, that.iLine); | |
@@ -702,20 +696,12 @@ BasicParser.prototype = { | |||
| 702 | 696 | left: oName, // identifier | |
| 703 | 697 | pos: oName.pos // same pos as identifier? | |
| 704 | 698 | }; | |
| 705 | - /* | ||
| 706 | - oValue = oPreviousToken; // identifier => fn | ||
| 707 | - oValue.type = "fn"; | ||
| 708 | - oValue.args = []; | ||
| 709 | - oValue.left = oName; // //sName; // .value | ||
| 710 | - */ | ||
| 711 | - | ||
| 712 | 699 | return oValue; | |
| 713 | 700 | } | |
| 714 | 701 | } | |
| 715 | 702 | ||
| 716 | 703 | if (oToken.type === "(" || oToken.type === "[") { | |
| 717 | 704 | oValue = oPreviousToken; | |
| 718 | - //TTT oValue.type = "array"; // identifier => array | ||
| 719 | 705 | oValue.args = (oToken.type === "(") ? fnGetArgsInParenthesis() : fnGetArgsInBrackets(); | |
| 720 | 706 | ||
| 721 | 707 | if (Utils.stringStartsWith(sName.toLowerCase(), "fn")) { | |
@@ -876,26 +862,6 @@ BasicParser.prototype = { | |||
| 876 | 862 | return oValue; | |
| 877 | 863 | }); | |
| 878 | 864 | ||
| 879 | - /* | ||
| 880 | - stmt("defint", function () { | ||
| 881 | - var oValue = fnCreateCmdCall(); | ||
| 882 | - | ||
| 883 | - return oValue; | ||
| 884 | - }); | ||
| 885 | - | ||
| 886 | - stmt("defreal", function () { | ||
| 887 | - var oValue = fnCreateCmdCall(); | ||
| 888 | - | ||
| 889 | - return oValue; | ||
| 890 | - }); | ||
| 891 | - | ||
| 892 | - stmt("defstr", function () { | ||
| 893 | - var oValue = fnCreateCmdCall(); | ||
| 894 | - | ||
| 895 | - return oValue; | ||
| 896 | - }); | ||
| 897 | - */ | ||
| 898 | - | ||
| 899 | 865 | stmt("else", function () { | |
| 900 | 866 | var oValue = oPreviousToken, | |
| 901 | 867 | oString = { | |
@@ -1131,10 +1097,8 @@ BasicParser.prototype = { | |||
| 1131 | 1097 | oValue2 = oToken; // identifier | |
| 1132 | 1098 | advance(); | |
| 1133 | 1099 | if (oToken.type === "(") { | |
| 1134 | - //oValue2.type = "array"; | ||
| 1135 | 1100 | oValue2.args = fnGetArgsInParenthesis(); | |
| 1136 | 1101 | } else if (oToken.type === "[") { | |
| 1137 | - //oValue2.type = "array"; | ||
| 1138 | 1102 | oValue2.args = fnGetArgsInBrackets(); | |
| 1139 | 1103 | } | |
| 1140 | 1104 | oValue.args.push(oValue2); | |
@@ -1213,10 +1177,8 @@ BasicParser.prototype = { | |||
| 1213 | 1177 | oValue2 = oToken; | |
| 1214 | 1178 | advance(); | |
| 1215 | 1179 | if (oToken.type === "(") { | |
| 1216 | - //oValue2.type = "array"; | ||
| 1217 | 1180 | oValue2.args = fnGetArgsInParenthesis(); | |
| 1218 | 1181 | } else if (oToken.type === "[") { | |
| 1219 | - //oValue2.type = "array"; | ||
| 1220 | 1182 | oValue2.args = fnGetArgsInBrackets(); | |
| 1221 | 1183 | } | |
| 1222 | 1184 | oValue.args.push(oValue2); | |
@@ -1254,23 +1216,6 @@ BasicParser.prototype = { | |||
| 1254 | 1216 | return oValue; | |
| 1255 | 1217 | }); | |
| 1256 | 1218 | ||
| 1257 | - /* | ||
| 1258 | - stmt("next", function () { | ||
| 1259 | - var oValue = oPreviousToken; | ||
| 1260 | - | ||
| 1261 | - oValue.args = []; | ||
| 1262 | - | ||
| 1263 | - while (oToken.type === "identifier") { | ||
| 1264 | - oValue.args.push(oToken); | ||
| 1265 | - advance(); | ||
| 1266 | - if (oToken.type === ",") { | ||
| 1267 | - advance(","); | ||
| 1268 | - } | ||
| 1269 | - } | ||
| 1270 | - return oValue; | ||
| 1271 | - }); | ||
| 1272 | - */ | ||
| 1273 | - | ||
| 1274 | 1219 | stmt("on", function () { | |
| 1275 | 1220 | var oValue = oPreviousToken, | |
| 1276 | 1221 | oLeft; | |
@@ -1449,14 +1394,16 @@ BasicParser.prototype = { | |||
| 1449 | 1394 | return fnCreateCmdCall(sName); | |
| 1450 | 1395 | }); | |
| 1451 | 1396 | ||
| 1397 | + /* | ||
| 1452 | 1398 | stmt("write", function () { | |
| 1453 | - var oValue, oStream; | ||
| 1399 | + var oValue; | ||
| 1454 | 1400 | ||
| 1455 | - oStream = fnGetOptionalStream(); | ||
| 1401 | + //oStream = fnGetOptionalStream(); | ||
| 1456 | 1402 | oValue = fnCreateCmdCall("write"); | |
| 1457 | - oValue.args.unshift(oStream); | ||
| 1403 | + //oValue.args.unshift(oStream); | ||
| 1458 | 1404 | return oValue; | |
| 1459 | 1405 | }); | |
| 1406 | + */ | ||
| 1460 | 1407 | ||
| 1461 | 1408 | ||
| 1462 | 1409 | // line | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -3,7 +3,7 @@ | |||
| 3 | 3 | // https://benchmarko.github.io/CPCBasic/ | |
| 4 | 4 | // | |
| 5 | 5 | /* globals Utils */ | |
| 6 | - /* globals ArrayBuffer Uint8ClampedArray Uint32Array Uint8Array */ | ||
| 6 | + /* globals ArrayBuffer Uint8Array */ | ||
| 7 | 7 | ||
| 8 | 8 | "use strict"; | |
| 9 | 9 | ||
@@ -88,7 +88,7 @@ Canvas.prototype = { | |||
| 88 | 88 | ||
| 89 | 89 | init: function (options) { | |
| 90 | 90 | var iBorderWidth = 4, | |
| 91 | - iWidth, iHeight, canvas, ctx; | ||
| 91 | + iWidth, iHeight, canvas, ctx, dataset; | ||
| 92 | 92 | ||
| 93 | 93 | this.options = Object.assign({}, options); | |
| 94 | 94 | ||
@@ -112,12 +112,18 @@ Canvas.prototype = { | |||
| 112 | 112 | ||
| 113 | 113 | ctx = this.canvas.getContext("2d"); | |
| 114 | 114 | this.imageData = ctx.getImageData(0, 0, iWidth, iHeight); | |
| 115 | - this.buf = new ArrayBuffer(this.imageData.data.length); | ||
| 116 | - this.buf8 = new Uint8ClampedArray(this.buf); | ||
| 117 | - this.data = new Uint32Array(this.buf); | ||
| 118 | - | ||
| 119 | - this.dataset = new ArrayBuffer(iWidth * iHeight); | ||
| 120 | - this.dataset8 = new Uint8Array(this.dataset); // array with pen values | ||
| 115 | + //buf = new ArrayBuffer(this.imageData.data.length); | ||
| 116 | + //this.buf8 = new Uint8ClampedArray(buf); | ||
| 117 | + //this.data = new Uint32Array(buf); | ||
| 118 | + this.buf8 = this.imageData.data; // use Uint8ClampedArray from canvas | ||
| 119 | + | ||
| 120 | + dataset = new ArrayBuffer(iWidth * iHeight); | ||
| 121 | + if (typeof Uint8Array !== "undefined") { // in modern browsers we have it | ||
| 122 | + this.dataset8 = new Uint8Array(dataset); // array with pen values | ||
| 123 | + } else { | ||
| 124 | + Utils.console.warn("Canvas:init: Uint8Array not available. Using fallback."); | ||
| 125 | + this.dataset8 = dataset; // fallbaCK | ||
| 126 | + } | ||
| 121 | 127 | ||
| 122 | 128 | this.bNeedUpdate = false; | |
| 123 | 129 | this.oUpdateRect = {}; | |
@@ -240,7 +246,7 @@ Canvas.prototype = { | |||
| 240 | 246 | buf8[i + 3] = 255; // a | |
| 241 | 247 | } | |
| 242 | 248 | } | |
| 243 | - this.imageData.data.set(buf8); | ||
| 249 | + // this.imageData.data.set(buf8); // already set | ||
| 244 | 250 | ctx.putImageData(this.imageData, 0, 0); | |
| 245 | 251 | }, | |
| 246 | 252 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -18,10 +18,11 @@ function CodeGeneratorJs(options) { | |||
| 18 | 18 | ||
| 19 | 19 | CodeGeneratorJs.prototype = { | |
| 20 | 20 | init: function (options) { | |
| 21 | - this.options = options || {}; // e.g. tron | ||
| 21 | + this.options = options || {}; // e.g. tron, rsx | ||
| 22 | 22 | ||
| 23 | 23 | this.lexer = this.options.lexer; | |
| 24 | 24 | this.parser = this.options.parser; | |
| 25 | + | ||
| 25 | 26 | this.reset(); | |
| 26 | 27 | }, | |
| 27 | 28 | ||
@@ -302,32 +303,6 @@ CodeGeneratorJs.prototype = { | |||
| 302 | 303 | }, | |
| 303 | 304 | ||
| 304 | 305 | mParseFunctions = { | |
| 305 | - /* | ||
| 306 | - fnParseDefIntRealStr: function (node) { | ||
| 307 | - var reVarLetters = /^[A-Za-z]( - [A-Za-z])?$/, | ||
| 308 | - aNodeArgs, i, sArg; | ||
| 309 | - | ||
| 310 | - oDevScopeArgs = {}; | ||
| 311 | - bDevScopeArgsCollect = true; | ||
| 312 | - aNodeArgs = fnParseArgs(node.args); | ||
| 313 | - bDevScopeArgsCollect = false; | ||
| 314 | - oDevScopeArgs = null; | ||
| 315 | - | ||
| 316 | - for (i = 0; i < aNodeArgs.length; i += 1) { | ||
| 317 | - sArg = aNodeArgs[i]; | ||
| 318 | - if (sArg.indexOf("oNo") >= 0) { // need to replace modified "o" variable! | ||
| 319 | - sArg = sArg.replace(/oNo/g, "o"); | ||
| 320 | - } | ||
| 321 | - if (!reVarLetters.test(sArg)) { | ||
| 322 | - throw new CodeGeneratorJs.ErrorObject("Wrong format for " + node.type, sArg, node.args.length ? node.args[0].pos : node.pos); | ||
| 323 | - // how to get correct position and length of expression? | ||
| 324 | - } | ||
| 325 | - aNodeArgs[i] = "o." + node.type + '("' + sArg + '")'; | ||
| 326 | - } | ||
| 327 | - node.pv = aNodeArgs.join("; "); | ||
| 328 | - return node.pv; | ||
| 329 | - }, | ||
| 330 | - */ | ||
| 331 | 306 | fnParseDefIntRealStr: function (node) { | |
| 332 | 307 | var aNodeArgs, i, sArg; | |
| 333 | 308 | ||
@@ -382,10 +357,18 @@ CodeGeneratorJs.prototype = { | |||
| 382 | 357 | }, | |
| 383 | 358 | ||
| 384 | 359 | "|": function (node) { // rsx | |
| 385 | - var sRsxName = "rsx" + Utils.stringCapitalize(node.value.toLowerCase()), | ||
| 386 | - aNodeArgs = fnParseArgs(node.args); | ||
| 360 | + var sRsxName, aNodeArgs, sLabel; | ||
| 387 | 361 | ||
| 388 | - node.pv = "o." + sRsxName + "(" + aNodeArgs.join(", ") + ")"; | ||
| 362 | + sRsxName = node.value.substr(1).toLowerCase().replace(/\./g, "_"); //sRsxName = "rsx" + Utils.stringCapitalize(node.value.toLowerCase()), | ||
| 363 | + aNodeArgs = fnParseArgs(node.args); | ||
| 364 | + if (that.options.rsx.rsxIsAvailable(sRsxName)) { // RSX available? | ||
| 365 | + sLabel = that.iLine + "s" + that.iStopCount; // we use stopCount | ||
| 366 | + that.iStopCount += 1; | ||
| 367 | + //node.pv = "o.rsx." + sAdaptedRsxName + "(" + aNodeArgs.join(", ") + ")"; | ||
| 368 | + node.pv = "o.rsx." + sRsxName + "(" + aNodeArgs.join(", ") + "); o.goto(\"" + sLabel + "\"); break;\ncase \"" + sLabel + "\":"; // most RSX commands need goto (era, renum,...) | ||
| 369 | + } else { | ||
| 370 | + throw new CodeGeneratorJs.ErrorObject("Unknown RSX command", node.value, node.pos, that.iLine); | ||
| 371 | + } | ||
| 389 | 372 | return node.pv; | |
| 390 | 373 | }, | |
| 391 | 374 | number: function (node) { | |
@@ -458,23 +441,6 @@ CodeGeneratorJs.prototype = { | |||
| 458 | 441 | node.pv = "null"; | |
| 459 | 442 | return node.pv; | |
| 460 | 443 | }, | |
| 461 | - /* | ||
| 462 | - array: function (node) { // identifier with array; TOTO: extend identifier? | ||
| 463 | - var aNodeArgs = fnParseArgs(node.args), | ||
| 464 | - sName = fnAdaptVariableName(node.value, aNodeArgs.length), | ||
| 465 | - sVarType = fnDetermineStaticVarType(sName), | ||
| 466 | - sValue = sName + aNodeArgs.map(function (val) { | ||
| 467 | - return "[" + val + "]"; | ||
| 468 | - }).join(""); | ||
| 469 | - | ||
| 470 | - if (sVarType.length > 1) { | ||
| 471 | - sVarType = sVarType.charAt(1); | ||
| 472 | - node.pt = sVarType; | ||
| 473 | - } | ||
| 474 | - node.pv = sValue; | ||
| 475 | - return node.pv; | ||
| 476 | - }, | ||
| 477 | - */ | ||
| 478 | 444 | assign: function (node) { | |
| 479 | 445 | // see also "let" | |
| 480 | 446 | var sName, sVarType, value, sValue; | |
@@ -550,6 +516,10 @@ CodeGeneratorJs.prototype = { | |||
| 550 | 516 | node.pv = this.fnCommandWithGoto(node); | |
| 551 | 517 | return node.pv; | |
| 552 | 518 | }, | |
| 519 | + closeout: function (node) { | ||
| 520 | + node.pv = this.fnCommandWithGoto(node); | ||
| 521 | + return node.pv; | ||
| 522 | + }, | ||
| 553 | 523 | commaTab: function (node) { | |
| 554 | 524 | var aNodeArgs = fnParseArgs(node.args); | |
| 555 | 525 | ||
@@ -979,6 +949,11 @@ CodeGeneratorJs.prototype = { | |||
| 979 | 949 | node.pv = "o.return(); break;"; | |
| 980 | 950 | return node.pv; | |
| 981 | 951 | }, | |
| 952 | + /* | ||
| 953 | + rsxEra: function (node) { | ||
| 954 | + return this.fnCommandWithGoto(node); | ||
| 955 | + }, | ||
| 956 | + */ | ||
| 982 | 957 | run: function (node) { // optional arg can be number or string | |
| 983 | 958 | if (node.args.length) { | |
| 984 | 959 | if (node.args[0].type === "linenumber" || node.args[0].type === "number") { // optional line number //TTT should be linenumber only | |
| Back | FazBrowse Home | New Git URL |
0 commit comments