diff --git a/doc/notes.txt b/doc/notes.txt index 2120588f..f3d477ec 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -107,6 +107,8 @@ TODO: - separate Scope View - Audio doesn't work if clock != default - change the input values for a module? + - Silice rototexture.ice example bitmap corrupted? + - scope: zoom in on cursor - single-stepping vector games makes screen fade - break on stack overflow, illegal op, bad access, BRK, etc - show in scope instead? diff --git a/src/ide/waveform.ts b/src/ide/waveform.ts index 4cf1255b..6ede26f3 100644 --- a/src/ide/waveform.ts +++ b/src/ide/waveform.ts @@ -223,7 +223,7 @@ export class WaveformView { var b1 = fh+4; var b2 = 4; var h2 = h-b1-b2; - var yrange = ((1< 1 && this.zoom >= 32; diff --git a/src/worker/assembler.ts b/src/worker/assembler.ts index b028b2c3..498f7099 100644 --- a/src/worker/assembler.ts +++ b/src/worker/assembler.ts @@ -3,12 +3,19 @@ type AssemblerVar = { bits : number, toks : string[], iprel? : boolean, - ipofs? : number + ipofs? : number, + ipmul? : number, +} + +type AssemblerRuleSlice = { + a : number; // argument index + b : number; // bit index + n : number; // # of bits } type AssemblerRule = { fmt : string, - bits : (string | number)[], + bits : (string | number | AssemblerRuleSlice)[], // added at runtime re? : RegExp, prefix? : string, @@ -22,11 +29,14 @@ type AssemblerLine = {line:number, offset:number, nbits:number, insns?:string}; type AssemblerFixup = { sym:string, ofs:number, - bitlen:number, - bitofs:number, + size:number; + srcofs:number, + dstofs:number, + dstlen:number, line:number, iprel:boolean, - ipofs:number + ipofs:number, + ipmul:number, }; type AssemblerSpec = { @@ -59,6 +69,9 @@ const isError = (o: AssemblerLineResult): o is AssemblerErrorResult => (>16)&0xffff,4) + hex(v&0xffff,4); + } var s = v.toString(16).toUpperCase(); while (s.length < nd) s = "0" + s; @@ -161,7 +174,10 @@ export class Assembler { var op = result.opcode; var nb = result.nbits/this.width; for (var i=0; i> (nb-1-i)*this.width) & ((1<> (nb-1-i)*this.width) & ((1<>> shift) & ((1 << b.n)-1); + } } - var mask = (1< mask || value < -mask) - this.warning("Symbol " + fix.sym + " (" + value + ") does not fit in " + fix.bitlen + " bits", fix.line); - value &= mask; + value = (value - fix.ofs) * fix.ipmul - fix.ipofs; + if (fix.srcofs == 0 && (value > mask || value < -mask)) + this.warning("Symbol " + fix.sym + " (" + value + ") does not fit in " + fix.dstlen + " bits", fix.line); + //console.log(hex(value,8), fix.srcofs, fix.dstofs, fix.dstlen); + if (fix.srcofs > 0) + value >>>= fix.srcofs; + value &= (1 << fix.dstlen) - 1; + // TODO: make it work for all widths + if (this.width == 32) { + var shift = 32 - fix.dstofs - fix.dstlen; + value <<= shift; + //console.log(fix, shift, fix.dstlen, hex(value,8)); + } // TODO: check range // TODO: span multiple words? + if (value & this.outwords[ofs - this.origin]) { + //this.warning("Instruction bits overlapped: " + hex(this.outwords[ofs - this.origin],8), hex(value,8)); + } this.outwords[ofs - this.origin] ^= value; // TODO: << shift? } else { this.warning("Symbol '" + fix.sym + "' not found");