ecs: system instance, with #entity.field

This commit is contained in:
Steven Hugg 2022-02-10 15:51:03 -06:00
parent acb50ac4b9
commit 4584cc778f
6 changed files with 295 additions and 223 deletions

View File

@ -2,7 +2,7 @@
import { mergeLocs, Token, Tokenizer, TokenType } from "../tokenizer";
import { SourceLocated, SourceLocation } from "../workertypes";
import { newDecoder } from "./decoder";
import { Action, ActionOwner, ActionNode, ActionWithJoin, ArrayType, CodeLiteralNode, CodePlaceholderNode, ComponentType, DataField, DataType, DataValue, ECSError, Entity, EntityArchetype, EntityManager, EntityScope, IntType, Query, RefType, SelectType, SELECT_TYPE, SourceFileExport, System } from "./ecs";
import { Action, ActionOwner, ActionNode, ActionWithJoin, ArrayType, CodeLiteralNode, CodePlaceholderNode, ComponentType, DataField, DataType, DataValue, ECSError, Entity, EntityArchetype, EntityManager, EntityScope, IntType, Query, RefType, SelectType, SELECT_TYPE, SourceFileExport, System, SystemInstance, SystemInstanceParameters, ComponentFieldPair } from "./ecs";
export enum ECSTokenType {
Ellipsis = 'ellipsis',
@ -37,7 +37,7 @@ export class ECSCompiler extends Tokenizer {
{ type: ECSTokenType.Integer, regex: /[-]?\$[A-Fa-f0-9]+/ },
{ type: ECSTokenType.Integer, regex: /[-]?\d+/ },
{ type: ECSTokenType.Integer, regex: /[%][01]+/ },
{ type: ECSTokenType.Operator, regex: /[#=,:(){}\[\]\-]/ },
{ type: ECSTokenType.Operator, regex: /[.#=,:(){}\[\]\-]/ },
{ type: TokenType.Ident, regex: /[A-Za-z_][A-Za-z0-9_]*/ },
{ type: TokenType.Ignore, regex: /\/\/.*?[\n\r]/ },
{ type: TokenType.Ignore, regex: /\/\*.*?\*\// },
@ -300,12 +300,11 @@ export class ECSCompiler extends Tokenizer {
// TODO: add $loc
let tok = this.expectTokenTypes([ECSTokenType.CodeFragment]);
let code = tok.str.substring(3, tok.str.length-3);
/*
let lines = code.split('\n');
// TODO: add after parsing maybe?
let lines = code.split('\n');
if (this.debuginfo) this.addDebugInfo(lines, tok.$loc.line);
code = lines.join('\n');
*/
let acomp = new ECSActionCompiler(context);
let nodes = acomp.parseFile(code, this.path);
// TODO: return nodes
@ -342,7 +341,7 @@ export class ECSCompiler extends Tokenizer {
if (cmd == 'system') {
let sys = this.annotate(() => this.parseSystem());
this.em.defineSystem(sys);
this.currentScope.addUsingSystem(sys);
this.currentScope.newSystemInstanceWithDefaults(sys);
}
}
this.currentScope = scope.parent || null;
@ -350,9 +349,9 @@ export class ECSCompiler extends Tokenizer {
}
parseScopeUsing() {
let syslist = this.parseList(this.parseSystemRef, ',');
for (let sys of syslist) {
this.currentScope?.addUsingSystem(sys);
let instlist = this.parseList(this.parseSystemInstanceRef, ',');
for (let inst of instlist) {
this.currentScope?.newSystemInstance(inst);
}
}
@ -374,21 +373,21 @@ export class ECSCompiler extends Tokenizer {
if (cmd == 'init' || cmd == 'const') {
// TODO: check data types
let name = this.expectIdent().str;
let { component, field } = this.getEntityField(entity, name);
let symtype = this.currentScope.isConstOrInit(component, name);
let { c, f } = this.getEntityField(entity, name);
let symtype = this.currentScope.isConstOrInit(c, name);
if (symtype && symtype != cmd)
this.compileError(`I can't mix const and init values for a given field in a scope.`);
this.expectToken('=');
let valueOrRef = this.parseDataValue(field);
let valueOrRef = this.parseDataValue(f);
if ((valueOrRef as ForwardRef).token != null) {
this.deferred.push(() => {
let refvalue = this.resolveEntityRef(scope, valueOrRef as ForwardRef);
if (cmd == 'const') scope.setConstValue(entity, component, name, refvalue);
if (cmd == 'init') scope.setInitValue(entity, component, name, refvalue);
if (cmd == 'const') scope.setConstValue(entity, c, name, refvalue);
if (cmd == 'init') scope.setInitValue(entity, c, name, refvalue);
});
} else {
if (cmd == 'const') scope.setConstValue(entity, component, name, valueOrRef as DataValue);
if (cmd == 'init') scope.setInitValue(entity, component, name, valueOrRef as DataValue);
if (cmd == 'const') scope.setConstValue(entity, c, name, valueOrRef as DataValue);
if (cmd == 'init') scope.setInitValue(entity, c, name, valueOrRef as DataValue);
}
} else if (cmd == 'decode') {
let decoderid = this.expectIdent().str;
@ -398,15 +397,15 @@ export class ECSCompiler extends Tokenizer {
if (!decoder) { this.compileError(`I can't find a "${decoderid}" decoder.`); throw new Error() }
let result = decoder.parse();
for (let entry of Object.entries(result.properties)) {
let { component, field } = this.getEntityField(entity, entry[0]);
scope.setConstValue(entity, component, field.name, entry[1]);
let { c, f } = this.getEntityField(entity, entry[0]);
scope.setConstValue(entity, c, f.name, entry[1]);
}
}
}
return entity;
}
getEntityField(e: Entity, name: string) {
getEntityField(e: Entity, name: string) : ComponentFieldPair {
if (!this.currentScope) { this.internalError(); throw new Error(); }
let comps = this.em.componentsWithFieldName([e.etype], name);
if (comps.length == 0) this.compileError(`I couldn't find a field named "${name}" for this entity.`)
@ -414,7 +413,7 @@ export class ECSCompiler extends Tokenizer {
let component = comps[0];
let field = component.fields.find(f => f.name == name);
if (!field) { this.internalError(); throw new Error(); }
return { component, field };
return { c: component, f: field };
}
parseEntityArchetype() : EntityArchetype {
@ -431,14 +430,18 @@ export class ECSCompiler extends Tokenizer {
return cref;
}
resolveEntityRef(scope: EntityScope, ref: ForwardRef) : number {
let name = ref.token.str;
findEntityByName(scope: EntityScope, token: Token) {
let name = token.str;
let eref = scope.entities.find(e => e.name == name);
if (!eref) {
this.compileError(`I couldn't find an entity named "${name}" in this scope.`, ref.token.$loc)
this.compileError(`I couldn't find an entity named "${name}" in this scope.`, token.$loc)
throw new Error();
}
let id = eref.id;
return eref;
}
resolveEntityRef(scope: EntityScope, ref: ForwardRef) : number {
let id = this.findEntityByName(scope, ref.token).id;
if (ref.reftype) {
// TODO: make this a function? elo ehi etc?
let atypes = this.em.archetypesMatching(ref.reftype.query);
@ -450,11 +453,29 @@ export class ECSCompiler extends Tokenizer {
return id;
}
parseSystemRef() : System {
parseSystemInstanceRef() : SystemInstance {
let name = this.expectIdent().str;
let sys = this.em.getSystemByName(name);
if (!sys) this.compileError(`I couldn't find a system named "${name}".`, this.lasttoken.$loc);
return sys;
let system = this.em.getSystemByName(name);
if (!system) this.compileError(`I couldn't find a system named "${name}".`, this.lasttoken.$loc);
let params = {};
if (this.peekToken().str == 'with') {
this.consumeToken();
params = this.parseSystemInstanceParameters();
}
let inst = { system, params, id: 0 };
return inst;
}
parseSystemInstanceParameters() : SystemInstanceParameters {
let scope = this.currentScope;
if (scope == null) throw new Error();
this.expectToken('#');
let entname = this.expectIdent();
this.expectToken('.');
let fieldname = this.expectIdent();
let entity = this.findEntityByName(scope, entname);
let cf = this.getEntityField(entity, fieldname.str);
return { refEntity: entity, refField: cf };
}
exportToFile(src: SourceFileExport) {

View File

@ -59,6 +59,17 @@ export interface System extends SourceLocated {
tempbytes?: number;
}
export interface SystemInstanceParameters {
refEntity?: Entity;
refField?: ComponentFieldPair;
}
export interface SystemInstance extends SourceLocated {
system: System;
params: SystemInstanceParameters;
id: number;
}
export const SELECT_TYPE = ['once', 'foreach', 'join', 'with', 'if', 'select'] as const;
export type SelectType = typeof SELECT_TYPE[number];
@ -166,7 +177,7 @@ interface ConstByte {
bitofs: number;
}
interface ComponentFieldPair {
export interface ComponentFieldPair {
c: ComponentType;
f: DataField;
}
@ -227,6 +238,11 @@ export class Dialect_CA65 {
@__skipxhi:
`
ASM_LOOKUP_REF_X = `
ldx {{%reffield}}
{{%code}}
`
// TODO
ASM_MAP_RANGES = `
txa
@ -312,8 +328,8 @@ export class Dialect_CA65 {
else return `.byte (${b.symbol} >> ${b.bitofs})` // TODO?
}
}
tempLabel(sys: System) {
return `${sys.name}__tmp`;
tempLabel(inst: SystemInstance) {
return `${inst.system.name}__${inst.id}__tmp`; // TODO: multiple instances?
}
equate(symbol: string, value: string): string {
return `${symbol} = ${value}`;
@ -517,15 +533,25 @@ class ActionEval {
constructor(
readonly scope: EntityScope,
readonly sys: System,
readonly instance: SystemInstance,
readonly action: Action)
{
this.em = scope.em;
this.dialect = scope.em.dialect;
this.oldState = scope.state;
this.tmplabel = this.dialect.tempLabel(this.instance);
let q = (action as ActionWithQuery).query;
if (q) this.qr = new EntitySet(scope, q);
else this.qr = new EntitySet(scope, undefined, [], []);
// TODO? error if none?
if (instance.params.refEntity && instance.params.refField) {
let rf = instance.params.refField;
if (rf.f.dtype == 'ref') {
let rq = rf.f.query;
this.qr = this.qr.intersection(new EntitySet(scope, rq));
//console.log('with', instance.params, rq, this.qr);
}
}
this.entities = this.qr.entities;
//let query = (this.action as ActionWithQuery).query;
//TODO? if (query && this.entities.length == 0)
@ -565,8 +591,11 @@ class ActionEval {
this.entities = int.entities; // TODO?
}
} else if (this.action.select == 'with') {
if (this.qr.entities.length != 1)
throw new ECSError(`${this.sys.name} query outside of loop must match exactly one entity`, this.action); //TODO
if (this.instance.params.refEntity && this.instance.params.refField) {
state.x = this.qr;
// ???
} else if (this.qr.entities.length != 1)
throw new ECSError(`${this.instance.system.name} query outside of loop must match exactly one entity`, this.action); //TODO
}
break;
}
@ -583,7 +612,7 @@ class ActionEval {
return '';
let action = this.action;
let sys = this.sys;
let sys = this.instance.system;
let code = action.text;
let label = `${sys.name}__${action.event}__${this.em.seq++}`; // TODO: better label that won't conflict (seq?)
let props: { [name: string]: string } = {};
@ -612,7 +641,18 @@ class ActionEval {
// filter entities from loop?
// TODO: when to ignore if entities.length == 1 and not in for loop?
if (action.select == 'with') {
code = this.wrapCodeInFilter(code);
// TODO? when to load x?
if (this.instance.params.refEntity && this.instance.params.refField) {
let re = this.instance.params.refEntity;
let rf = this.instance.params.refField;
code = this.wrapCodeInRefLookup(code);
// TODO: only fetches 1st entity in list, need offset
let range = this.scope.bss.getFieldRange(rf.c, rf.f.name) || this.scope.rodata.getFieldRange(rf.c, rf.f.name);
let eidofs = re.id - range.elo;
props['%reffield'] = `${this.dialect.fieldsymbol(rf.c, rf.f, 0)}+${eidofs}`;
} else {
code = this.wrapCodeInFilter(code);
}
}
if (action.select == 'if') {
code = this.wrapCodeInFilter(code);
@ -699,10 +739,11 @@ class ActionEval {
}
__local(args: string[]) {
let tempinc = parseInt(args[0]);
let tempbytes = this.instance.system.tempbytes;
if (isNaN(tempinc)) throw new ECSError(`bad temporary offset`, this.action);
if (!this.sys.tempbytes) throw new ECSError(`this system has no locals`, this.action);
if (tempinc < 0 || tempinc >= this.sys.tempbytes) throw new ECSError(`this system only has ${this.sys.tempbytes} locals`, this.action);
this.scope.updateTempLiveness(this.sys);
if (!tempbytes) throw new ECSError(`this system has no locals`, this.action);
if (tempinc < 0 || tempinc >= tempbytes) throw new ECSError(`this system only has ${tempbytes} locals`, this.action);
this.scope.updateTempLiveness(this.instance);
return `${this.tmplabel}+${tempinc}`;
}
__bss_init(args: string[]) {
@ -735,6 +776,10 @@ class ActionEval {
}
return code;
}
wrapCodeInRefLookup(code: string) {
code = this.dialect.ASM_LOOKUP_REF_X.replace('{{%code}}', code);
return code;
}
generateCodeForField(fieldName: string, bitofs: number, canWrite: boolean): string {
const action = this.action;
const qr = this.jr || this.qr; // TODO: why not both!
@ -841,10 +886,10 @@ class ActionEval {
export class EntityScope implements SourceLocated {
$loc: SourceLocation;
childScopes: EntityScope[] = [];
systems: System[] = [];
instances: SystemInstance[] = [];
entities: Entity[] = [];
fieldtypes: { [name: string]: 'init' | 'const' } = {};
sysstats = new Map<System, SystemStats>();
sysstats = new Map<SystemInstance, SystemStats>();
actionstats = new Map<Action, ActionStats>();
bss = new UninitDataSegment();
rodata = new ConstDataSegment();
@ -876,9 +921,14 @@ export class EntityScope implements SourceLocated {
this.entities.push(entity);
return entity;
}
addUsingSystem(system: System) {
if (!system) throw new Error();
this.systems.push(system);
newSystemInstance(inst: SystemInstance) {
if (!inst) throw new Error();
inst.id = this.instances.length+1;
this.instances.push(inst);
return inst;
}
newSystemInstanceWithDefaults(system: System) {
return this.newSystemInstance({ system, params: {}, id:0 });
}
getEntityByName(name: string) {
return this.entities.find(e => e.name == name);
@ -1093,18 +1143,18 @@ export class EntityScope implements SourceLocated {
// generate code
let s = this.dialect.code();
//s += `\n; event ${event}\n`;
systems = systems.filter(s => this.systems.includes(s));
for (let sys of systems) {
let instances = this.instances.filter(inst => systems.includes(inst.system));
for (let inst of instances) {
let sys = inst.system;
for (let action of sys.actions) {
if (action.event == event) {
// TODO: use Tokenizer so error msgs are better
// TODO: keep event tree
let codeeval = new ActionEval(this, sys, action);
codeeval.tmplabel = this.dialect.tempLabel(sys);
let codeeval = new ActionEval(this, inst, action);
codeeval.begin();
s += this.dialect.comment(`start action ${sys.name} ${event}`); // TODO
s += this.dialect.comment(`start action ${sys.name} ${inst.id} ${event}`); // TODO
s += codeeval.codeToString();
s += this.dialect.comment(`end action ${sys.name} ${event}`);
s += this.dialect.comment(`end action ${sys.name} ${inst.id} ${event}`);
// TODO: check that this happens once?
codeeval.end();
this.getActionStats(action).callcount++;
@ -1113,11 +1163,11 @@ export class EntityScope implements SourceLocated {
}
return s;
}
getSystemStats(sys: System) : SystemStats {
let stats = this.sysstats.get(sys);
getSystemStats(inst: SystemInstance) : SystemStats {
let stats = this.sysstats.get(inst);
if (!stats) {
stats = new SystemStats();
this.sysstats.set(sys, stats);
this.sysstats.set(inst, stats);
}
return stats;
}
@ -1129,8 +1179,8 @@ export class EntityScope implements SourceLocated {
}
return stats;
}
updateTempLiveness(sys: System) {
let stats = this.getSystemStats(sys);
updateTempLiveness(inst: SystemInstance) {
let stats = this.getSystemStats(inst);
let n = this.eventSeq;
if (stats.tempstartseq && stats.tempendseq) {
stats.tempstartseq = Math.min(stats.tempstartseq, n);
@ -1148,14 +1198,14 @@ export class EntityScope implements SourceLocated {
let maxTempBytes = 128 - this.bss.size; // TODO: multiple data segs
let bssbin = new Bin({ left:0, top:0, bottom: this.eventSeq+1, right: maxTempBytes });
pack.bins.push(bssbin);
for (let sys of this.systems) {
let stats = this.getSystemStats(sys);
if (sys.tempbytes && stats.tempstartseq && stats.tempendseq) {
for (let instance of this.instances) {
let stats = this.getSystemStats(instance);
if (instance.system.tempbytes && stats.tempstartseq && stats.tempendseq) {
let v = {
sys,
inst: instance,
top: stats.tempstartseq,
bottom: stats.tempendseq+1,
width: sys.tempbytes,
width: instance.system.tempbytes,
height: stats.tempendseq - stats.tempstartseq + 1,
};
pack.boxes.push(v);
@ -1166,9 +1216,9 @@ export class EntityScope implements SourceLocated {
if (bssbin.extents.right > 0) {
this.bss.allocateBytes('TEMP', bssbin.extents.right);
for (let b of pack.boxes) {
let sys : System = (b as any).sys;
console.log(sys.name, b.box?.left);
this.bss.equates[this.dialect.tempLabel(sys)] = `TEMP+${b.box?.left}`;
let inst : SystemInstance = (b as any).inst;
console.log(inst.system.name, b.box?.left);
this.bss.equates[this.dialect.tempLabel(inst)] = `TEMP+${b.box?.left}`;
}
}
}
@ -1184,7 +1234,7 @@ export class EntityScope implements SourceLocated {
let start;
let initsys = this.em.getSystemByName('Init');
if (isMainScope && initsys) {
this.addUsingSystem(initsys); //TODO: what if none?
this.newSystemInstanceWithDefaults(initsys); //TODO: what if none?
start = this.generateCodeForEvent('main_init');
} else {
start = this.generateCodeForEvent('start');
@ -1197,8 +1247,9 @@ export class EntityScope implements SourceLocated {
//this.showStats();
}
showStats() {
for (let sys of this.systems) {
console.log(sys.name, this.getSystemStats(sys));
for (let inst of this.instances) {
// TODO?
console.log(inst.system.name, this.getSystemStats(inst));
}
for (let action of Array.from(this.actionstats.keys())) {
console.log(action.event, this.getActionStats(action));

View File

@ -118,7 +118,7 @@ export class Tokenizer {
switch (rule.type) {
case TokenType.CatchAll:
if (this.errorOnCatchAll) {
this.compileError(`I didn't expect the character "${m[0]}" here.`);
this.compileError(`I didn't expect the character "${m[0]}" here.`, loc);
}
default:
this.pushToken({ str: s, type: rule.type, $loc: loc });

View File

@ -39,10 +39,10 @@ TEMP:
.res 1
.res 1
.res 1
Kernel2Sprite__tmp = TEMP+0
Joystick__tmp = TEMP+0
SpriteShuffler__tmp = TEMP+1
SpriteHider__tmp = TEMP+3
Kernel2Sprite__2__tmp = TEMP+0
Joystick__3__tmp = TEMP+0
SpriteShuffler__8__tmp = TEMP+1
SpriteHider__9__tmp = TEMP+3
.code
KernelSection_lines_b0:
.byte 192
@ -117,7 +117,7 @@ Main__INITDATA:
__Start:
.code
;;; start action Init main_init
;;; start action Init 10 main_init
.include "vcs-ca65.h"
.macpack longbranch
@ -135,20 +135,20 @@ __BRK:
; initialize data segment
.code
;;; start action FrameLoop start
;;; start action FrameLoop 1 start
FrameLoop__start__2__NextFrame:
FRAME_START
.code
;;; start action Kernel2Sprite preframe
;;; start action Kernel2Sprite 2 preframe
.define KLINES #192
.define KPAD 32
;;; end action Kernel2Sprite preframe
;;; end action Kernel2Sprite 2 preframe
;;; start action Kernel2Sprite preframe
;;; start action Kernel2Sprite 2 preframe
ldy #0
Kernel2Sprite__preframe__4____each:
@ -162,76 +162,76 @@ Kernel2Sprite__preframe__4____each:
lda KLINES+KPAD
sec
sbc HasYpos_ypos_b0,x
sta Kernel2Sprite__tmp+11
sta Kernel2Sprite__2__tmp+11
; calculate bitmap pointer
stx Kernel2Sprite__tmp+12 ; save X (Sprite index)
stx Kernel2Sprite__2__tmp+12 ; save X (Sprite index)
lda HasBitmap_bitmap_b0,x ; deref bitmap
tax
lda Bitmap_bitmapdata_b0,x
sec
sbc Kernel2Sprite__tmp+11
sta Kernel2Sprite__tmp+0,y ; Y = sprite slot index
sbc Kernel2Sprite__2__tmp+11
sta Kernel2Sprite__2__tmp+0,y ; Y = sprite slot index
lda Bitmap_bitmapdata_b8,x
sbc #0
sta Kernel2Sprite__tmp+2,y
sta Kernel2Sprite__2__tmp+2,y
; get bitmap height
lda Bitmap_height_b0,x
sta Kernel2Sprite__tmp+8,y
sta Kernel2Sprite__2__tmp+8,y
; calculate colormap pointer
ldx Kernel2Sprite__tmp+12 ; restore X
ldx Kernel2Sprite__2__tmp+12 ; restore X
lda HasColormap_colormap_b0,x ; deref colormap
tax
lda Colormap_colormapdata_b0,x
sec
sbc Kernel2Sprite__tmp+11
sta Kernel2Sprite__tmp+4,y
sbc Kernel2Sprite__2__tmp+11
sta Kernel2Sprite__2__tmp+4,y
lda Colormap_colormapdata_b8,x
sbc #0
sta Kernel2Sprite__tmp+6,y
sta Kernel2Sprite__2__tmp+6,y
; save ypos
ldx Kernel2Sprite__tmp+12 ; restore X
ldx Kernel2Sprite__2__tmp+12 ; restore X
lda HasYpos_ypos_b0,x
sta Kernel2Sprite__tmp+10,y
sta Kernel2Sprite__2__tmp+10,y
iny
cpy #2
jne Kernel2Sprite__preframe__4____each
Kernel2Sprite__preframe__4____exit:
;;; end action Kernel2Sprite preframe
;;; end action Kernel2Sprite 2 preframe
;;; start action Kernel2Sprite preframe
;;; start action Kernel2Sprite 2 preframe
; L0 L1 H0 H1 -> L0 H0 L1 H1
lda Kernel2Sprite__tmp+1
ldy Kernel2Sprite__tmp+2
sty Kernel2Sprite__tmp+1
sta Kernel2Sprite__tmp+2
lda Kernel2Sprite__tmp+5
ldy Kernel2Sprite__tmp+6
sty Kernel2Sprite__tmp+5
sta Kernel2Sprite__tmp+6
lda Kernel2Sprite__2__tmp+1
ldy Kernel2Sprite__2__tmp+2
sty Kernel2Sprite__2__tmp+1
sta Kernel2Sprite__2__tmp+2
lda Kernel2Sprite__2__tmp+5
ldy Kernel2Sprite__2__tmp+6
sty Kernel2Sprite__2__tmp+5
sta Kernel2Sprite__2__tmp+6
;;; end action Kernel2Sprite preframe
;;; end action Kernel2Sprite 2 preframe
;;; start action Kernel2Sprite preframe
;;; start action Kernel2Sprite 2 preframe
lda #162
sta COLUBK
;;; end action Kernel2Sprite preframe
;;; end action Kernel2Sprite 2 preframe
;;; start action Kernel2Sprite preframe
;;; start action Kernel2Sprite 2 preframe
;;; end action Kernel2Sprite preframe
;;; end action Kernel2Sprite 2 preframe
;;; start action SetXPos preframe
;;; start action SetXPos 6 preframe
sta HMCLR
;;; end action SetXPos preframe
;;; end action SetXPos 6 preframe
;;; start action SetXPos preframe
;;; start action SetXPos 6 preframe
ldy #0
SetXPos__preframe__8____each:
@ -240,7 +240,7 @@ SetXPos__preframe__8____each:
lda HasXpos_xpos_b0,x
.code
;;; start action SetHorizPos SetHorizPos
;;; start action SetHorizPos 7 SetHorizPos
; SetHorizPos routine
; A = X coordinate
@ -259,7 +259,7 @@ SetHorizPos__SetHorizPos__9__DivideLoop:
sta RESP0,y ; fix coarse position
sta HMP0,y ; set fine offset
;;; end action SetHorizPos SetHorizPos
;;; end action SetHorizPos 7 SetHorizPos
iny
@ -267,61 +267,61 @@ SetHorizPos__SetHorizPos__9__DivideLoop:
jne SetXPos__preframe__8____each
SetXPos__preframe__8____exit:
;;; end action SetXPos preframe
;;; end action SetXPos 6 preframe
;;; start action SetXPos preframe
;;; start action SetXPos 6 preframe
;;; end action SetXPos preframe
;;; end action SetXPos 6 preframe
;;; start action SetXPos preframe
;;; start action SetXPos 6 preframe
sta WSYNC
sta HMOVE
;;; end action SetXPos preframe
;;; end action SetXPos 6 preframe
KERNEL_START
.code
;;; start action Kernel2Sprite kernel
;;; start action Kernel2Sprite 2 kernel
ldy #0
sty VDELP0
iny
sta VDELP1
;;; end action Kernel2Sprite kernel
;;; end action Kernel2Sprite 2 kernel
;;; start action Kernel2Sprite kernel
;;; start action Kernel2Sprite 2 kernel
; define macro for each line
.macro Kernel2Sprite__kernel__12__DrawLine do_wsync
.local DoDraw1
.local DoDraw2
; draw player 0
lda Kernel2Sprite__tmp+8 ; height
dcp Kernel2Sprite__tmp+10 ; ypos
lda Kernel2Sprite__2__tmp+8 ; height
dcp Kernel2Sprite__2__tmp+10 ; ypos
bcs DoDraw1
lda #0
.byte $2C
DoDraw1:
lda (Kernel2Sprite__tmp+0),y
lda (Kernel2Sprite__2__tmp+0),y
.if do_wsync
sta WSYNC
.endif
sta GRP0
lda (Kernel2Sprite__tmp+4),y
lda (Kernel2Sprite__2__tmp+4),y
sta COLUP0
; draw player 1
lda Kernel2Sprite__tmp+9 ; height
dcp Kernel2Sprite__tmp+11 ; ypos
lda Kernel2Sprite__2__tmp+9 ; height
dcp Kernel2Sprite__2__tmp+11 ; ypos
bcs DoDraw2
lda #0
.byte $2C
DoDraw2:
lda (Kernel2Sprite__tmp+2),y
lda (Kernel2Sprite__2__tmp+2),y
sta GRP1
lda (Kernel2Sprite__tmp+6),y
lda (Kernel2Sprite__2__tmp+6),y
sta COLUP1
.endmacro
@ -329,9 +329,9 @@ DoDraw2:
Kernel2Sprite__kernel__12__LVScan:
.code
;;; start action Kernel2Sprite scanline1
;;; start action Kernel2Sprite 2 scanline1
;;; end action Kernel2Sprite scanline1
;;; end action Kernel2Sprite 2 scanline1
Kernel2Sprite__kernel__12__DrawLine 1 ; macro: draw scanline w/ WSYNC
dey ; next scanline
@ -341,9 +341,9 @@ Kernel2Sprite__kernel__12__LVScan:
dey ; next scanline
bne Kernel2Sprite__kernel__12__LVScan ; repeat until out of lines
;;; end action Kernel2Sprite kernel
;;; end action Kernel2Sprite 2 kernel
;;; start action Kernel2Sprite kernel
;;; start action Kernel2Sprite 2 kernel
lda #0
sta GRP0
@ -351,29 +351,29 @@ Kernel2Sprite__kernel__12__LVScan:
sta GRP0
sta GRP1
;;; end action Kernel2Sprite kernel
;;; end action Kernel2Sprite 2 kernel
KERNEL_END
.code
;;; start action Joystick postframe
;;; start action Joystick 3 postframe
; 2 control inputs share a single byte, 4 bits each
lda SWCHA
sta Joystick__tmp+0
sta Joystick__3__tmp+0
;;; end action Joystick postframe
;;; end action Joystick 3 postframe
;;; start action Joystick postframe
;;; start action Joystick 3 postframe
ldx #0
Joystick__postframe__15____each:
asl Joystick__tmp+0
asl Joystick__3__tmp+0
bcs Joystick__postframe__15__SkipMoveRight
.code
;;; start action MoveJoyX joyright
;;; start action MoveJoyX 4 joyright
lda HasXpos_xpos_b0,x
clc
@ -383,14 +383,14 @@ Joystick__postframe__15____each:
sta HasXpos_xpos_b0,x
MoveJoyX__joyright__16__nomove:
;;; end action MoveJoyX joyright
;;; end action MoveJoyX 4 joyright
Joystick__postframe__15__SkipMoveRight:
asl Joystick__tmp+0
asl Joystick__3__tmp+0
bcs Joystick__postframe__15__SkipMoveLeft
.code
;;; start action MoveJoyX joyleft
;;; start action MoveJoyX 4 joyleft
lda HasXpos_xpos_b0,x
sec
@ -399,14 +399,14 @@ Joystick__postframe__15__SkipMoveRight:
sta HasXpos_xpos_b0,x
MoveJoyX__joyleft__17__nomove:
;;; end action MoveJoyX joyleft
;;; end action MoveJoyX 4 joyleft
Joystick__postframe__15__SkipMoveLeft:
asl Joystick__tmp+0
asl Joystick__3__tmp+0
bcs Joystick__postframe__15__SkipMoveDown
.code
;;; start action MoveJoyY joydown
;;; start action MoveJoyY 5 joydown
lda HasYpos_ypos_b0,x
clc
@ -416,14 +416,14 @@ Joystick__postframe__15__SkipMoveLeft:
sta HasYpos_ypos_b0,x
MoveJoyY__joydown__18__nomove:
;;; end action MoveJoyY joydown
;;; end action MoveJoyY 5 joydown
Joystick__postframe__15__SkipMoveDown:
asl Joystick__tmp+0
asl Joystick__3__tmp+0
bcs Joystick__postframe__15__SkipMoveUp
.code
;;; start action MoveJoyY joyup
;;; start action MoveJoyY 5 joyup
lda HasYpos_ypos_b0,x
sec
@ -432,7 +432,7 @@ Joystick__postframe__15__SkipMoveDown:
sta HasYpos_ypos_b0,x
MoveJoyY__joyup__19__nomove:
;;; end action MoveJoyY joyup
;;; end action MoveJoyY 5 joyup
Joystick__postframe__15__SkipMoveUp:
@ -441,15 +441,15 @@ Joystick__postframe__15__SkipMoveUp:
jne Joystick__postframe__15____each
Joystick__postframe__15____exit:
;;; end action Joystick postframe
;;; end action Joystick 3 postframe
;;; start action SpriteShuffler postframe
;;; start action SpriteShuffler 8 postframe
; load two sprite slots at left side of array
lda SpriteSlot_sprite_b0
sta SpriteShuffler__tmp+0
sta SpriteShuffler__8__tmp+0
lda SpriteSlot_sprite_b0+1
sta SpriteShuffler__tmp+1
sta SpriteShuffler__8__tmp+1
; move two slots to the left
ldx #0
SpriteShuffler__postframe__20__loop:
@ -459,21 +459,21 @@ SpriteShuffler__postframe__20__loop:
cpx #4-2
bne SpriteShuffler__postframe__20__loop
; store two sprite slots at right side of array
lda SpriteShuffler__tmp+0
lda SpriteShuffler__8__tmp+0
sta SpriteSlot_sprite_b0+4-2
lda SpriteShuffler__tmp+1
lda SpriteShuffler__8__tmp+1
sta SpriteSlot_sprite_b0+4-1
;;; end action SpriteShuffler postframe
;;; end action SpriteShuffler 8 postframe
;;; start action SpriteHider postframe
;;; start action SpriteHider 9 postframe
lda #4-1
sta SpriteHider__tmp+0
sta SpriteHider__9__tmp+0
;;; end action SpriteHider postframe
;;; end action SpriteHider 9 postframe
;;; start action SpriteHider postframe
;;; start action SpriteHider 9 postframe
ldy #0
SpriteHider__postframe__22____each:
@ -485,12 +485,12 @@ SpriteHider__postframe__22____each:
; swap this sprite slot with slot at end of array
lda SpriteSlot_sprite_b0,y
pha
ldx SpriteHider__tmp+0 ; clobbers X, but no longer used
ldx SpriteHider__9__tmp+0 ; clobbers X, but no longer used
lda SpriteSlot_sprite_b0,x
sta SpriteSlot_sprite_b0,y
pla
sta SpriteSlot_sprite_b0,x
dec SpriteHider__tmp+0
dec SpriteHider__9__tmp+0
SpriteHider__postframe__22__skip:
iny
@ -498,14 +498,14 @@ SpriteHider__postframe__22__skip:
jne SpriteHider__postframe__22____each
SpriteHider__postframe__22____exit:
;;; end action SpriteHider postframe
;;; end action SpriteHider 9 postframe
FRAME_END
.code
jmp FrameLoop__start__2__NextFrame ; loop to next frame
;;; end action FrameLoop start
;;; end action FrameLoop 1 start
; start main routine
.segment "VECTORS"
Return: .word $6060
@ -513,7 +513,7 @@ VecNMI:
VecReset: .word Main::__Reset
VecBRK: .word Main::__BRK
;;; end action Init main_init
;;; end action Init 10 main_init
.endscope
Main__Start = Main::__Start

View File

@ -5,7 +5,7 @@ PFColor_pfcolor_b0:
.res 1
TEMP:
.res 1
Local__tmp = TEMP+0
Local__6__tmp = TEMP+0
.code
KernelSection_lines_b0:
.byte 2
@ -46,7 +46,7 @@ Main__INITDATA:
__Start:
.code
;;; start action Init main_init
;;; start action Init 7 main_init
.include "vcs-ca65.h"
.define PAL 0
@ -63,24 +63,24 @@ __BRK:
; initialize data segment
.code
;;; start action FrameLoop start
;;; start action FrameLoop 1 start
FrameLoop__start__2__NextFrame:
FRAME_START
.code
;;; start action StaticKernel preframe
;;; start action StaticKernel 4 preframe
.code
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
lda #24
sta COLUBK
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #0+2
jcs StaticKernel__kernelsetup__5____skipxhi
@ -95,9 +95,9 @@ StaticKernel__kernelsetup__5____skipxlo:
StaticKernel__kernelsetup__5____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #0+4
jcs StaticKernel__kernelsetup__6____skipxhi
@ -116,15 +116,15 @@ StaticKernel__kernelsetup__6____skipxlo:
StaticKernel__kernelsetup__6____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; end action StaticKernel preframe
;;; end action StaticKernel 4 preframe
KERNEL_START
.code
;;; start action StaticKernel kernel
;;; start action StaticKernel 4 kernel
ldx #0
StaticKernel__kernel__7____each:
@ -132,14 +132,14 @@ StaticKernel__kernel__7____each:
sta WSYNC
.code
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
lda BGColor_bgcolor_b0,x
sta COLUBK
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #5+2
jcs StaticKernel__kernelsetup__9____skipxhi
@ -154,9 +154,9 @@ StaticKernel__kernelsetup__9____skipxlo:
StaticKernel__kernelsetup__9____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #4
jcc StaticKernel__kernelsetup__10____skipxlo
@ -170,7 +170,7 @@ StaticKernel__kernelsetup__9____skipxhi:
StaticKernel__kernelsetup__10____skipxlo:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
ldy KernelSection_lines_b0,x
StaticKernel__kernel__7__loop:
@ -185,50 +185,50 @@ StaticKernel__kernel__7__loop:
jne StaticKernel__kernel__7____each
StaticKernel__kernel__7____exit:
;;; end action StaticKernel kernel
;;; end action StaticKernel 4 kernel
KERNEL_END
.code
;;; start action JoyButton postframe
;;; start action JoyButton 5 postframe
lda INPT4 ;read button input
bmi JoyButton__postframe__11__NotPressed
.code
;;; start action Local joybutton
;;; start action Local 6 joybutton
inc Local__tmp+0
inc Local__6__tmp+0
inc PFColor_pfcolor_b0
;;; end action Local joybutton
;;; end action Local 6 joybutton
JoyButton__postframe__11__NotPressed:
;;; end action JoyButton postframe
;;; end action JoyButton 5 postframe
FRAME_END
.code
;;; start action ResetSwitch nextframe
;;; start action ResetSwitch 2 nextframe
lsr SWCHB ; test Game Reset switch
bcs ResetSwitch__nextframe__13__NoStart
.code
;;; start action ResetConsole resetswitch
;;; start action ResetConsole 3 resetswitch
jmp Main::__Reset ; jump to Reset handler
;;; end action ResetConsole resetswitch
;;; end action ResetConsole 3 resetswitch
ResetSwitch__nextframe__13__NoStart:
;;; end action ResetSwitch nextframe
;;; end action ResetSwitch 2 nextframe
jmp FrameLoop__start__2__NextFrame ; loop to next frame
;;; end action FrameLoop start
;;; end action FrameLoop 1 start
; start main routine
.segment "VECTORS"
Return: .word $6060
@ -236,7 +236,7 @@ VecNMI:
VecReset: .word Main::__Reset
VecBRK: .word Main::__BRK
;;; end action Init main_init
;;; end action Init 7 main_init
.endscope
Main__Start = Main::__Start

View File

@ -5,7 +5,7 @@ PFColor_pfcolor_b0:
.res 1
TEMP:
.res 1
Local__tmp = TEMP+0
Local__6__tmp = TEMP+0
.code
KernelSection_lines_b0:
.byte 2
@ -46,7 +46,7 @@ Main__INITDATA:
__Start:
.code
;;; start action Init main_init
;;; start action Init 7 main_init
.include "vcs-ca65.h"
.macpack longbranch
@ -64,24 +64,24 @@ __BRK:
; initialize data segment
.code
;;; start action FrameLoop start
;;; start action FrameLoop 1 start
FrameLoop__start__2__NextFrame:
FRAME_START
.code
;;; start action StaticKernel preframe
;;; start action StaticKernel 4 preframe
.code
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
lda #24
sta COLUBK
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #0+2
jcs StaticKernel__kernelsetup__5____skipxhi
@ -96,9 +96,9 @@ StaticKernel__kernelsetup__5____skipxlo:
StaticKernel__kernelsetup__5____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #0+4
jcs StaticKernel__kernelsetup__6____skipxhi
@ -117,15 +117,15 @@ StaticKernel__kernelsetup__6____skipxlo:
StaticKernel__kernelsetup__6____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; end action StaticKernel preframe
;;; end action StaticKernel 4 preframe
KERNEL_START
.code
;;; start action StaticKernel kernel
;;; start action StaticKernel 4 kernel
ldx #0
StaticKernel__kernel__7____each:
@ -133,14 +133,14 @@ StaticKernel__kernel__7____each:
sta WSYNC
.code
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
lda BGColor_bgcolor_b0,x
sta COLUBK
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #5+2
jcs StaticKernel__kernelsetup__9____skipxhi
@ -155,9 +155,9 @@ StaticKernel__kernelsetup__9____skipxlo:
StaticKernel__kernelsetup__9____skipxhi:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
;;; start action StaticKernel kernelsetup
;;; start action StaticKernel 4 kernelsetup
cpx #4
jcc StaticKernel__kernelsetup__10____skipxlo
@ -171,11 +171,11 @@ StaticKernel__kernelsetup__9____skipxhi:
StaticKernel__kernelsetup__10____skipxlo:
;;; end action StaticKernel kernelsetup
;;; end action StaticKernel 4 kernelsetup
.code
;;; start action StaticKernel kerneldraw
;;; start action StaticKernel 4 kerneldraw
ldy KernelSection_lines_b0,x
StaticKernel__kerneldraw__11__loop:
@ -184,7 +184,7 @@ StaticKernel__kerneldraw__11__loop:
dey
bne StaticKernel__kerneldraw__11__loop
;;; end action StaticKernel kerneldraw
;;; end action StaticKernel 4 kerneldraw
@ -193,50 +193,50 @@ StaticKernel__kerneldraw__11__loop:
jne StaticKernel__kernel__7____each
StaticKernel__kernel__7____exit:
;;; end action StaticKernel kernel
;;; end action StaticKernel 4 kernel
KERNEL_END
.code
;;; start action JoyButton postframe
;;; start action JoyButton 5 postframe
lda INPT4 ;read button input
bmi JoyButton__postframe__12__NotPressed
.code
;;; start action Local joybutton
;;; start action Local 6 joybutton
inc Local__tmp+0
inc Local__6__tmp+0
inc PFColor_pfcolor_b0
;;; end action Local joybutton
;;; end action Local 6 joybutton
JoyButton__postframe__12__NotPressed:
;;; end action JoyButton postframe
;;; end action JoyButton 5 postframe
FRAME_END
.code
;;; start action ResetSwitch nextframe
;;; start action ResetSwitch 2 nextframe
lsr SWCHB ; test Game Reset switch
bcs ResetSwitch__nextframe__14__NoStart
.code
;;; start action ResetConsole resetswitch
;;; start action ResetConsole 3 resetswitch
jmp Main::__Reset ; jump to Reset handler
;;; end action ResetConsole resetswitch
;;; end action ResetConsole 3 resetswitch
ResetSwitch__nextframe__14__NoStart:
;;; end action ResetSwitch nextframe
;;; end action ResetSwitch 2 nextframe
jmp FrameLoop__start__2__NextFrame ; loop to next frame
;;; end action FrameLoop start
;;; end action FrameLoop 1 start
; start main routine
.segment "VECTORS"
Return: .word $6060
@ -244,7 +244,7 @@ VecNMI:
VecReset: .word Main::__Reset
VecBRK: .word Main::__BRK
;;; end action Init main_init
;;; end action Init 7 main_init
.endscope
Main__Start = Main::__Start