ecs: shared init data

This commit is contained in:
Steven Hugg 2022-02-22 10:35:41 -06:00
parent 9351406450
commit 37edd8268a
2 changed files with 28 additions and 32 deletions

View File

@ -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<this.size - bytes.length; i++) {
for (var j=0; j<bytes.length; j++) {
if (this.initdata[i+j] !== bytes[j]) break;
}
if (j == bytes.length) return i;
}
return -1;
}
allocateInitData(name: string, bytes: Uint8Array) {
let ofs = this.allocateBytes(name, bytes.length);
for (let i = 0; i < bytes.length; i++) {
this.initdata[ofs + i] = bytes[i];
let ofs = this.findExistingInitData(bytes);
if (ofs >= 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.`);

View File

@ -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