1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2026-01-22 07:19:49 +00:00

vcs: atari2600-ecs.cfg, better alignment for ecs critical fit sections

This commit is contained in:
Steven Hugg
2025-10-22 10:29:12 -05:00
parent 704fa29eef
commit 4db533d055
10 changed files with 61 additions and 58 deletions

View File

@@ -386,24 +386,15 @@ export class Dialect_CA65 {
return `${name}__Start`;
}
align(value: number) {
return `.align ${value}`;
}
alignSegmentStart() {
return this.label('__ALIGNORIGIN');
return value > 0 ? `.align ${value}` : '';
}
warningIfPageCrossed(startlabel: string) {
return `
.assert >(${startlabel}) = >(*), error, "${startlabel} crosses a page boundary!"`
.assert >(${startlabel}) = >(*), warning, "${startlabel} crosses a page boundary!"`
}
warningIfMoreThan(bytes: number, startlabel: string) {
return `
.assert (* - ${startlabel}) <= ${bytes}, error, .sprintf("${startlabel} does not fit in ${bytes} bytes, it took %d!", (* - ${startlabel}))`
}
alignIfLessThan(bytes: number) {
return `
.if <(* - __ALIGNORIGIN) > 256-${bytes}
.align $100
.endif`
.assert (* - ${startlabel}) <= ${bytes}, warning, .sprintf("${startlabel} does not fit in ${bytes} bytes, it took %d!", (* - ${startlabel}))`
}
segment(segtype: 'rodata' | 'bss' | 'code') {
if (segtype == 'bss') {
@@ -1725,10 +1716,7 @@ export class EntityScope implements SourceLocated {
if (allsubs.length == 0) {
allsubs = [
this.dialect.segment('rodata'),
this.dialect.alignSegmentStart()
]
} else if (stats.action.fitbytes) {
allsubs.push(this.dialect.alignIfLessThan(stats.action.fitbytes));
}
let subcall = this.dialect.call(stats.labels[0]);
for (let label of stats.labels) {
@@ -1741,8 +1729,10 @@ export class EntityScope implements SourceLocated {
}
}
let substart = stats.labels[0];
let alignment = this.getAlignment(stats.action.fitbytes || 0);
let sublines = [
this.dialect.segment('rodata'),
this.dialect.align(alignment),
this.dialect.label(substart),
stats.eventcode,
this.dialect.return(),
@@ -1759,6 +1749,14 @@ export class EntityScope implements SourceLocated {
code += allsubs.join('\n');
return code;
}
getAlignment(len: number) {
if (!len) return 0;
let align = 2;
while (align < len) {
align *= 2;
}
return align;
}
showStats() {
for (let inst of this.instances) {
// TODO?

View File

@@ -387,7 +387,7 @@ export function fixParamsWithDefines(path: string, params) {
}
}
// find #defines and replace them
var re = /^[;]?#define\s+(\w+)\s+(\S+)/gmi; // TODO: empty string?
var re = /^[;/]?#define\s+(\w+)\s+(\S+)/gmi; // TODO: empty string?
var m;
while (m = re.exec(code)) {
var ident = m[1];

View File

@@ -15,6 +15,9 @@ export function assembleECS(step: BuildStep): BuildStepResult {
var destpath = step.prefix + '.ca65';
if (staleFiles(step, [destpath])) {
let code = getWorkFileAsString(step.path);
// TODO
step.params.cfgfile = 'atari2600-ecs.cfg';
step.params.extra_link_files.push('atari2600-ecs.cfg');
fixParamsWithDefines(step.path, step.params);
// remove crt0.o from libargs
step.params.libargs = step.params.libargs.filter((arg: string) => {
@@ -36,9 +39,9 @@ export function assembleECS(step: BuildStep): BuildStepResult {
if (name == 'start') break;
compiler.addError(`... ${name}`, obj.$loc); // TODO?
}
return { errors: compiler.errors };
return { errors: compiler.errors, listings, debuginfo };
} else if (e instanceof CompileError) {
return { errors: compiler.errors };
return { errors: compiler.errors, listings, debuginfo };
} else {
throw e;
}

View File

@@ -707,8 +707,8 @@ VecBRK: .word __BRK
;;; end action Init__main_init__1
.rodata
__ALIGNORIGIN:
.rodata
.align 32
SetHorizPos__SetHorizPos__20:
; SetHorizPos routine
@@ -730,10 +730,11 @@ SetHorizPos__SetHorizPos__20:
rts
.assert >(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert >(SetHorizPos__SetHorizPos__20) = >(*), warning, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, warning, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.rodata
.align 256
Kernel2Sprite__kernel__31:
ldy #168
@@ -814,12 +815,11 @@ Kernel2Sprite__scanline__38__DoDraw2:
rts
.assert >(Kernel2Sprite__kernel__31) = >(*), error, "Kernel2Sprite__kernel__31 crosses a page boundary!"
.assert >(Kernel2Sprite__kernel__31) = >(*), warning, "Kernel2Sprite__kernel__31 crosses a page boundary!"
.if <(* - __ALIGNORIGIN) > 256-72
.align $100
.endif
.assert (* - Kernel2Sprite__kernel__31) <= 256, warning, .sprintf("Kernel2Sprite__kernel__31 does not fit in 256 bytes, it took %d!", (* - Kernel2Sprite__kernel__31))
.rodata
.align 128
Kernel6Digit__kernel__45:
; Display the resulting 48x8 bitmap
@@ -865,9 +865,9 @@ Kernel6Digit__kernel__47__Temp = Kernel6Digit__10__tmp+13
rts
.assert >(Kernel6Digit__kernel__45) = >(*), error, "Kernel6Digit__kernel__45 crosses a page boundary!"
.assert >(Kernel6Digit__kernel__45) = >(*), warning, "Kernel6Digit__kernel__45 crosses a page boundary!"
.assert (* - Kernel6Digit__kernel__45) <= 72, error, .sprintf("Kernel6Digit__kernel__45 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__45))
.assert (* - Kernel6Digit__kernel__45) <= 72, warning, .sprintf("Kernel6Digit__kernel__45 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__45))
FontTable:
;;; start action FontTable__FontTable__82

View File

@@ -93,7 +93,7 @@ system Kernel2Sprite
iny
sty VDELP1
---
on kernel do critical with [KernelSection]
on kernel do critical fit $100 with [KernelSection]
---
ldy {{<lines}}
@LVScan:

View File

@@ -476,8 +476,8 @@ VecBRK: .word __BRK
;;; end action Init__main_init__1
.rodata
__ALIGNORIGIN:
.rodata
.align 32
SetHorizPos__SetHorizPos__20:
; SetHorizPos routine
@@ -499,10 +499,11 @@ SetHorizPos__SetHorizPos__20:
rts
.assert >(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert >(SetHorizPos__SetHorizPos__20) = >(*), warning, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, warning, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.rodata
.align 256
Kernel2Sprite__kernel__28:
ldy #192
@@ -583,6 +584,8 @@ Kernel2Sprite__scanline__35__DoDraw2:
rts
.assert >(Kernel2Sprite__kernel__28) = >(*), error, "Kernel2Sprite__kernel__28 crosses a page boundary!"
.assert >(Kernel2Sprite__kernel__28) = >(*), warning, "Kernel2Sprite__kernel__28 crosses a page boundary!"
.assert (* - Kernel2Sprite__kernel__28) <= 256, warning, .sprintf("Kernel2Sprite__kernel__28 does not fit in 256 bytes, it took %d!", (* - Kernel2Sprite__kernel__28))
.endscope
Main__Start = Main::__Start

View File

@@ -247,8 +247,8 @@ VecBRK: .word __BRK
;;; end action Init__main_init__1
.rodata
__ALIGNORIGIN:
.rodata
MusicPlayer__playmusic__10:
lda #<^SampleMusic
@@ -260,6 +260,7 @@ MusicPlayer__playmusic__10:
rts
.rodata
MusicPlayer__playmusic__13:
lda #<SampleMusic
@@ -271,6 +272,7 @@ MusicPlayer__playmusic__13:
rts
.rodata
MusicPlayer__musicframe__36:
ldx #0

View File

@@ -258,8 +258,8 @@ VecBRK: .word __BRK
;;; end action Init__main_init__1
.rodata
__ALIGNORIGIN:
.rodata
.align 128
Kernel6Digit__kernel__13:
; Display the resulting 48x8 bitmap
@@ -305,14 +305,11 @@ Kernel6Digit__kernel__15__Temp = Kernel6Digit__2__tmp+13
rts
.assert >(Kernel6Digit__kernel__13) = >(*), error, "Kernel6Digit__kernel__13 crosses a page boundary!"
.assert >(Kernel6Digit__kernel__13) = >(*), warning, "Kernel6Digit__kernel__13 crosses a page boundary!"
.assert (* - Kernel6Digit__kernel__13) <= 72, error, .sprintf("Kernel6Digit__kernel__13 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__13))
.if <(* - __ALIGNORIGIN) > 256-98
.align $100
.endif
.assert (* - Kernel6Digit__kernel__13) <= 72, warning, .sprintf("Kernel6Digit__kernel__13 does not fit in 72 bytes, it took %d!", (* - Kernel6Digit__kernel__13))
.rodata
.align 128
Kernel2Digit__kernel__19:
lda #7
@@ -470,9 +467,9 @@ Kernel2Digit__kernel__21__Loop:
rts
.assert >(Kernel2Digit__kernel__19) = >(*), error, "Kernel2Digit__kernel__19 crosses a page boundary!"
.assert >(Kernel2Digit__kernel__19) = >(*), warning, "Kernel2Digit__kernel__19 crosses a page boundary!"
.assert (* - Kernel2Digit__kernel__19) <= 98, error, .sprintf("Kernel2Digit__kernel__19 does not fit in 98 bytes, it took %d!", (* - Kernel2Digit__kernel__19))
.assert (* - Kernel2Digit__kernel__19) <= 98, warning, .sprintf("Kernel2Digit__kernel__19 does not fit in 98 bytes, it took %d!", (* - Kernel2Digit__kernel__19))
FontTable:
;;; start action FontTable__FontTable__53

View File

@@ -1063,8 +1063,8 @@ VecBRK: .word __BRK
;;; end action Init__main_init__1
.rodata
__ALIGNORIGIN:
.rodata
.align 32
SetHorizPos__SetHorizPos__20:
; SetHorizPos routine
@@ -1086,10 +1086,11 @@ SetHorizPos__SetHorizPos__20:
rts
.assert >(SetHorizPos__SetHorizPos__20) = >(*), error, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert >(SetHorizPos__SetHorizPos__20) = >(*), warning, "SetHorizPos__SetHorizPos__20 crosses a page boundary!"
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, error, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.assert (* - SetHorizPos__SetHorizPos__20) <= 22, warning, .sprintf("SetHorizPos__SetHorizPos__20 does not fit in 22 bytes, it took %d!", (* - SetHorizPos__SetHorizPos__20))
.rodata
.align 256
Kernel2Sprite__kernel__31:
ldy #190
@@ -1206,6 +1207,8 @@ Kernel2Sprite__scanline__42__DoDraw2:
rts
.assert >(Kernel2Sprite__kernel__31) = >(*), error, "Kernel2Sprite__kernel__31 crosses a page boundary!"
.assert >(Kernel2Sprite__kernel__31) = >(*), warning, "Kernel2Sprite__kernel__31 crosses a page boundary!"
.assert (* - Kernel2Sprite__kernel__31) <= 256, warning, .sprintf("Kernel2Sprite__kernel__31 does not fit in 256 bytes, it took %d!", (* - Kernel2Sprite__kernel__31))
.endscope
Main__Start = Main::__Start

View File

@@ -797,8 +797,8 @@ JoyButton__postframe__72__NotPressed:
;;; end action FrameLoop__start__5
.rodata
__ALIGNORIGIN:
.rodata
.align 64
Kernel48Pixel__kerneldraw__58:
cpx #2+1
@@ -844,14 +844,11 @@ Kernel48Pixel__kerneldraw__59____skipxhi:
rts
.assert >(Kernel48Pixel__kerneldraw__58) = >(*), error, "Kernel48Pixel__kerneldraw__58 crosses a page boundary!"
.assert >(Kernel48Pixel__kerneldraw__58) = >(*), warning, "Kernel48Pixel__kerneldraw__58 crosses a page boundary!"
.assert (* - Kernel48Pixel__kerneldraw__58) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__58 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__58))
.if <(* - __ALIGNORIGIN) > 256-63
.align $100
.endif
.assert (* - Kernel48Pixel__kerneldraw__58) <= 63, warning, .sprintf("Kernel48Pixel__kerneldraw__58 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__58))
.rodata
.align 64
Kernel48Pixel__kerneldraw__63:
cpx #3+1
@@ -897,9 +894,9 @@ Kernel48Pixel__kerneldraw__64____skipxhi:
rts
.assert >(Kernel48Pixel__kerneldraw__63) = >(*), error, "Kernel48Pixel__kerneldraw__63 crosses a page boundary!"
.assert >(Kernel48Pixel__kerneldraw__63) = >(*), warning, "Kernel48Pixel__kerneldraw__63 crosses a page boundary!"
.assert (* - Kernel48Pixel__kerneldraw__63) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__63 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__63))
.assert (* - Kernel48Pixel__kerneldraw__63) <= 63, warning, .sprintf("Kernel48Pixel__kerneldraw__63 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__63))
.endscope
Title__Start = Title::__Start
.scope Title2
@@ -1474,8 +1471,8 @@ Colors__postframe__127____exit:
;;; end action FrameLoop__start__75
.rodata
__ALIGNORIGIN:
.rodata
.align 64
Kernel48Pixel__kerneldraw__111:
cpx #2+1
@@ -1521,9 +1518,9 @@ Kernel48Pixel__kerneldraw__112____skipxhi:
rts
.assert >(Kernel48Pixel__kerneldraw__111) = >(*), error, "Kernel48Pixel__kerneldraw__111 crosses a page boundary!"
.assert >(Kernel48Pixel__kerneldraw__111) = >(*), warning, "Kernel48Pixel__kerneldraw__111 crosses a page boundary!"
.assert (* - Kernel48Pixel__kerneldraw__111) <= 63, error, .sprintf("Kernel48Pixel__kerneldraw__111 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__111))
.assert (* - Kernel48Pixel__kerneldraw__111) <= 63, warning, .sprintf("Kernel48Pixel__kerneldraw__111 does not fit in 63 bytes, it took %d!", (* - Kernel48Pixel__kerneldraw__111))
.endscope
Title2__Start = Title2::__Start
.endscope