diff --git a/src/common/ecs/ecs.ts b/src/common/ecs/ecs.ts index 6c6bee9a..374d11f0 100644 --- a/src/common/ecs/ecs.ts +++ b/src/common/ecs/ecs.ts @@ -44,7 +44,7 @@ export interface ComponentType extends SourceLocated { } export interface Query extends SourceLocated { - include: ComponentType[]; // TODO: make ComponentType + include: ComponentType[]; exclude?: ComponentType[]; entities?: Entity[]; limit?: number; @@ -256,19 +256,6 @@ export class Dialect_CA65 { {{%code}} ` - // TODO - ASM_MAP_RANGES = ` - txa - pha - lda {{%mapping}},x - jmi @__mapskip - tax - {{%code}} -@__mapskip: - pla - tax -`; - INIT_FROM_ARRAY = ` ldy #{{%nbytes}} : lda {{%src}}-1,y @@ -311,7 +298,6 @@ export class Dialect_CA65 { } endScope(name: string) { return `.endscope\n${this.scopeSymbol(name)} = ${name}::__Start` - // TODO: scope__start = scope::start } scopeSymbol(name: string) { return `${name}__Start`; @@ -340,7 +326,7 @@ export class Dialect_CA65 { if (segtype == 'bss') { return `.zeropage`; } else if (segtype == 'rodata') { - return '.rodata'; // TODO? + return '.rodata'; } else { return `.code`; } @@ -357,11 +343,11 @@ export class Dialect_CA65 { } else { if (b.bitofs == 0) return `.byte <${b.symbol}` else if (b.bitofs == 8) return `.byte >${b.symbol}` - else return `.byte (${b.symbol} >> ${b.bitofs})` // TODO? + else return `.byte ((${b.symbol} >> ${b.bitofs})&255)` } } tempLabel(inst: SystemInstance) { - return `${inst.system.name}__${inst.id}__tmp`; // TODO: multiple instances? + return `${inst.system.name}__${inst.id}__tmp`; } equate(symbol: string, value: string): string { return `${symbol} = ${value}`; @@ -429,11 +415,24 @@ class DataSegment { this.ofs2sym.set(ofs, []); this.ofs2sym.get(ofs)?.push(name); } - // TODO: optimize shared data + findExistingInitData(bytes: Uint8Array) { + for (let i=0; i= 0) { + this.declareSymbol(name, ofs); + } else { + ofs = this.allocateBytes(name, bytes.length); + for (let i = 0; i < bytes.length; i++) { + this.initdata[ofs + i] = bytes[i]; + } } } dump(file: SourceFileExport, dialect: Dialect_CA65) { @@ -461,7 +460,6 @@ class DataSegment { if (ofs !== undefined) { return ofs + entityID - range.elo; } - // TODO: show entity name? throw new ECSError(`cannot find field access for ${access.symbol}`); } getOriginSymbol() { @@ -1175,6 +1173,8 @@ export class EntityScope implements SourceLocated { array = segment.fieldranges[cfname] = { component: c, field: f, elo: i, ehi: i }; } else { array.ehi = i; + if (array.ehi - array.elo + 1 >= 256) + throw new ECSError(`too many entities have field ${cfname}, limit is 256`); } // set default values for entity/field if (ftype == 'init') { @@ -1236,7 +1236,6 @@ export class EntityScope implements SourceLocated { let loofs = segment.allocateBytes(ptrlosym, entcount); let hiofs = segment.allocateBytes(ptrhisym, entcount); let datasym = this.dialect.datasymbol(c, f, e.id, 0); - // TODO: share shared data segment.allocateInitData(datasym, v); if (f.baseoffset) datasym = `(${datasym}+${f.baseoffset})`; segment.initdata[loofs + e.id - range.elo] = { symbol: datasym, bitofs: 0 }; @@ -1278,7 +1277,7 @@ export class EntityScope implements SourceLocated { //console.log(segment.initdata) } allocateInitData(segment: DataSegment) { - if (segment.size == 0) return ''; // TODO: warning for no init data? + if (segment.size == 0) return ''; let initbytes = new Uint8Array(segment.size); let iter = this.iterateEntityFields(this.entities); for (var o = iter.next(); o.value; o = iter.next()) { @@ -1319,7 +1318,6 @@ export class EntityScope implements SourceLocated { getFieldRange(c: ComponentType, fn: string) { return this.bss.getFieldRange(c, fn) || this.rodata.getFieldRange(c, fn); } - // TODO: check type/range of value setConstValue(e: Entity, component: ComponentType, field: DataField, value: DataValue) { this.setConstInitValue(e, component, field, value, 'const'); } @@ -1329,7 +1327,7 @@ export class EntityScope implements SourceLocated { setConstInitValue(e: Entity, component: ComponentType, field: DataField, value: DataValue, type: 'const'|'init') { - this.checkValueType(field, value); + this.checkFieldValue(field, value); let fieldName = field.name; let cfname = mksymbol(component, fieldName); let ecfname = mkscopesymbol(this, component, fieldName); @@ -1342,7 +1340,7 @@ export class EntityScope implements SourceLocated { isConstOrInit(component: ComponentType, fieldName: string) : 'const' | 'init' { return this.fieldtypes[mksymbol(component, fieldName)]; } - checkValueType(field: DataField, value: DataValue) { + checkFieldValue(field: DataField, value: DataValue) { if (field.dtype == 'array') { if (!(value instanceof Uint8Array)) throw new ECSError(`This "${field.name}" value should be an array.`); diff --git a/test/ecs/superman.txt b/test/ecs/superman.txt index e26502e7..7446ae34 100644 --- a/test/ecs/superman.txt +++ b/test/ecs/superman.txt @@ -60,6 +60,8 @@ Bitmap_bitmapdata_b8: .byte >(Bitmap_bitmapdata_e2_b0+31) .byte >(Bitmap_bitmapdata_e3_b0+31) Bitmap_bitmapdata_e1_b0: +Colormap_colormapdata_e1_b0: +VersatilePlayfield_data_e4_b0: .byte 0 Bitmap_height_b0: .byte 0 @@ -73,8 +75,6 @@ Colormap_colormapdata_b8: .byte >(Colormap_colormapdata_e1_b0+31) .byte >(Colormap_colormapdata_e2_b0+31) .byte >(Colormap_colormapdata_e3_b0+31) -Colormap_colormapdata_e1_b0: -.byte 0 Bitmap_bitmapdata_e2_b0: .byte 128 .byte 192 @@ -203,8 +203,6 @@ VersatilePlayfield_data_b8: .byte >(VersatilePlayfield_data_e4_b0+-1) .byte >(VersatilePlayfield_data_e5_b0+-1) .byte >(VersatilePlayfield_data_e6_b0+-1) -VersatilePlayfield_data_e4_b0: -.byte 0 VersatilePlayfield_data_e5_b0: .byte 0 .byte 63