From 51ee5526c9beff36c0cc24bfaee4a87a8eba925f Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Mon, 12 Jul 2021 13:08:34 -0500 Subject: [PATCH] nanoasm: added "endian":"little" attribute to variable defs --- Makefile | 9 +-- package-lock.json | 145 +++++++++++++++++++++++++++++++++------- package.json | 2 +- src/worker/assembler.ts | 26 ++++++- test/cli/testasm.js | 24 +++++-- 5 files changed, 168 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index f10d5257..ca5d6b80 100644 --- a/Makefile +++ b/Makefile @@ -2,9 +2,12 @@ TSC=./node_modules/typescript/bin/tsc --build TMP=./tmp/dist -all: +buildtsc: + $(TSC) tsconfig.json + +prepare: buildtsc patch -i meta/electron.diff -o electron.html - cp nanoasm/src/assembler.ts src/worker/ + #cp nanoasm/src/assembler.ts src/worker/ cp node_modules/jquery/dist/jquery.min.js ./jquery/ cp -r node_modules/bootstrap/dist/* ./bootstrap/ cp node_modules/bootstrap-tourist/*.css node_modules/bootstrap-tourist/*.js ./lib/ @@ -19,8 +22,6 @@ all: cp unicorn.js/dist/unicorn-arm.min.js ./unicorn.js/demos/externals/capstone-arm.min.js ./lib/ cp gif.js/dist/* ./lib/ cd jsnes && npm i - $(TSC) -v - $(TSC) npm run mkdoc distro: diff --git a/package-lock.json b/package-lock.json index 31698813..9c97faca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "mocha-simple-html-reporter": "^2.0.0", "mousetrap": "^1.6.5", "nightwatch": "^1.6.4", - "octokat": "^0.8.0", + "octokat": "^0.10.0", "pngjs": "^3.4.0", "rgbquant": "^1.1.2", "split.js": "^1.6.2", @@ -3630,6 +3630,27 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3905,6 +3926,26 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-vcr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fetch-vcr/-/fetch-vcr-1.1.2.tgz", + "integrity": "sha512-bFOx3+5YtViximcqhG05tqMlsyPRXNOmiToDCf6TyVUCKHYP/vGPmn0HUhGVNd1jI0KpElwz+RH3X/ZQo0Asfg==", + "dev": true, + "dependencies": { + "node-fetch": "^1.6.3", + "whatwg-fetch": "^2.0.3" + } + }, + "node_modules/fetch-vcr/node_modules/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node_modules/file-saver": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", @@ -6781,6 +6822,15 @@ "semver": "bin/semver" } }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true, + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7058,13 +7108,14 @@ } }, "node_modules/octokat": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/octokat/-/octokat-0.8.0.tgz", - "integrity": "sha1-UIQcolV0P5GnFdEaG9528u782Xo=", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/octokat/-/octokat-0.10.0.tgz", + "integrity": "sha512-VJ21L1gMlByYMurduLYiOcI8AwlZkUV8OXRN8pMXsbkIqIVqn0tgdTfxzWM9spX4VJTTG02OgqwDTqQsOmDing==", "dev": true, "dependencies": { + "fetch-vcr": "^1.1.0", "lodash": "^4.16.4", - "xmlhttprequest": "~1.8.0" + "node-fetch": "^2.0.0" } }, "node_modules/once": { @@ -9445,6 +9496,12 @@ "iconv-lite": "0.4.24" } }, + "node_modules/whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", + "dev": true + }, "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -9707,15 +9764,6 @@ "node": ">=10.0.0" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -12729,6 +12777,26 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "optional": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -12934,6 +13002,28 @@ "pend": "~1.2.0" } }, + "fetch-vcr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fetch-vcr/-/fetch-vcr-1.1.2.tgz", + "integrity": "sha512-bFOx3+5YtViximcqhG05tqMlsyPRXNOmiToDCf6TyVUCKHYP/vGPmn0HUhGVNd1jI0KpElwz+RH3X/ZQo0Asfg==", + "dev": true, + "requires": { + "node-fetch": "^1.6.3", + "whatwg-fetch": "^2.0.3" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, "file-saver": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", @@ -15200,6 +15290,12 @@ } } }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -15418,13 +15514,14 @@ } }, "octokat": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/octokat/-/octokat-0.8.0.tgz", - "integrity": "sha1-UIQcolV0P5GnFdEaG9528u782Xo=", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/octokat/-/octokat-0.10.0.tgz", + "integrity": "sha512-VJ21L1gMlByYMurduLYiOcI8AwlZkUV8OXRN8pMXsbkIqIVqn0tgdTfxzWM9spX4VJTTG02OgqwDTqQsOmDing==", "dev": true, "requires": { + "fetch-vcr": "^1.1.0", "lodash": "^4.16.4", - "xmlhttprequest": "~1.8.0" + "node-fetch": "^2.0.0" } }, "once": { @@ -17265,6 +17362,12 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", + "dev": true + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", @@ -17483,12 +17586,6 @@ "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", "dev": true }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true - }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", diff --git a/package.json b/package.json index 105f0bfe..2b8956dd 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "mocha-simple-html-reporter": "^2.0.0", "mousetrap": "^1.6.5", "nightwatch": "^1.6.4", - "octokat": "^0.8.0", + "octokat": "^0.10.0", "pngjs": "^3.4.0", "rgbquant": "^1.1.2", "split.js": "^1.6.2", diff --git a/src/worker/assembler.ts b/src/worker/assembler.ts index 0c208000..58686a48 100644 --- a/src/worker/assembler.ts +++ b/src/worker/assembler.ts @@ -2,6 +2,7 @@ type AssemblerVar = { bits : number, toks : string[], + endian? : 'big' | 'little', iprel? : boolean, ipofs? : number, ipmul? : number, @@ -219,12 +220,31 @@ export class Assembler { return parseInt(s); } + changeEndian(endian: 'big'|'little', x: number, nbits: number) { + if (endian == null || endian == 'big') { + return x; + } else if (endian == 'little') { + var y = 0; + while (nbits > 0) { + var n = Math.min(nbits, this.width); + var mask = (1 << n) - 1; + y <<= n; + y |= (x & mask); + x >>>= n; + nbits -= n; + } + return y; + } else { + this.fatal('Endian must be "big" or "little"'); + } + } + buildInstruction(rule:AssemblerRule, m:string[]) : AssemblerLineResult { var opcode = 0; var oplen = 0; // iterate over each component of the rule output ("bits") - for (var b of rule.bits) { - var n,x; + for (let b of rule.bits) { + let n,x; // is a string? then it's a bit constant // TODO if (typeof b === "string") { @@ -253,6 +273,7 @@ export class Assembler { } else { // otherwise, parse it as a constant x = this.parseConst(id, n); + x = this.changeEndian(v.endian, x, v.bits); // is it a label? add fixup if (isNaN(x)) { this.fixups.push({ @@ -267,6 +288,7 @@ export class Assembler { return {error:"Value " + x + " does not fit in " + v.bits + " bits"}; } } + // is it an array slice? slice the bits if (typeof b !== "number") { x = (x >>> shift) & ((1 << b.n)-1); } diff --git a/test/cli/testasm.js b/test/cli/testasm.js index dec98544..49c00db9 100644 --- a/test/cli/testasm.js +++ b/test/cli/testasm.js @@ -40,7 +40,7 @@ var BEAKER8_SPEC = { "cond": { "bits": 3, "toks": ["♦", "♦", ".z", ".nz", ".c", ".nc", ".s", ".ns"] }, "ic": { "bits": 3 }, "abs8": { "bits": 8 }, - "abs16": { "bits": 16 }, + "abs16": { "bits": 16, "endian": "little" }, "rel8": { "bits": 8, "iprel": true, "ipofs": 2 } }, "rules": [ @@ -317,7 +317,6 @@ WaitVsync: .define vdpReg1 $41 .define vdpReg2 $42 - boot: di jump Init @@ -325,21 +324,16 @@ init: call setTextMode halt setTextMode: -; // set vdp0 border 1, mode 4 (Text) send vdpReg0, $14 const.w $2000 ;// length const.w.0 ;// address call clrVram ret -; // w length -; // w address clrVram: -; // send address to vdp send vdpReg1 send vdpReg2 -; // send 0 to vram _loop: const.0 send vramWrite @@ -348,7 +342,23 @@ _loop: `; let asm = new assembler.Assembler(BEAKER8_SPEC); let result = asm.assembleFile(source); + console.log(result.lines); assert.deepEqual(result.lines, [ + { line: 13, offset: 0, nbits: 8, insns: 'E4' }, + { line: 14, offset: 1, nbits: 24, insns: 'E9 00 00' }, + { line: 16, offset: 4, nbits: 24, insns: 'EB 00 00' }, + { line: 17, offset: 7, nbits: 8, insns: 'E1' }, + { line: 20, offset: 8, nbits: 32, insns: '06 40 29 40' }, + { line: 21, offset: 12, nbits: 24, insns: '0E 00 20' }, + { line: 22, offset: 15, nbits: 8, insns: '08' }, + { line: 23, offset: 16, nbits: 24, insns: 'EB 00 00' }, + { line: 24, offset: 19, nbits: 8, insns: 'F8' }, + { line: 27, offset: 20, nbits: 16, insns: '29 41' }, + { line: 28, offset: 22, nbits: 16, insns: '29 42' }, + { line: 31, offset: 24, nbits: 8, insns: '00' }, + { line: 32, offset: 25, nbits: 16, insns: '29 00' }, + { line: 33, offset: 27, nbits: 8, insns: 'EF' }, + { line: 34, offset: 28, nbits: 8, insns: 'F8' } ]); })