1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-27 21:57:28 +00:00

Moved constant value to SymbolVariable.

This commit is contained in:
jespergravgaard 2019-10-31 22:48:08 +01:00
parent acb71114e2
commit db60a5e2a4
6 changed files with 27 additions and 49 deletions

View File

@ -29,7 +29,7 @@ public class DirectiveParserContext {
/** The different scopes deciding directive defaults. */
public enum DirectiveScope {
GLOBAL, LOCAL, PARAMETER, STRUCT_MEMBER;
GLOBAL, LOCAL, PARAMETER, MEMBER;
public static DirectiveScope getFor(SymbolVariable lValue, boolean isParameter) {
if(isParameter) {
@ -45,7 +45,7 @@ public class DirectiveParserContext {
} else if(scope instanceof Procedure) {
return LOCAL;
} else if(scope instanceof StructDefinition) {
return STRUCT_MEMBER;
return MEMBER;
} else if(scope instanceof BlockScope) {
return getFor(scope.getScope());
} else {

View File

@ -8,20 +8,9 @@ import dk.camelot64.kickc.model.values.ConstantValue;
/** A named constant or a variable that has been inferred to be constant in the symbol table */
public class ConstantVar extends SymbolVariable {
/** The constant value. */
private ConstantValue value;
public ConstantVar(String name, Scope scope, SymbolType type, ConstantValue value, String dataSegment) {
super(name, scope, type, StorageStrategy.CONSTANT, MemoryArea.MAIN_MEMORY, dataSegment);
this.value = value;
}
public ConstantValue getValue() {
return value;
}
public void setValue(ConstantValue value) {
this.value = value;
setValue(value);
}
@Override
@ -45,21 +34,4 @@ public class ConstantVar extends SymbolVariable {
return toString(null);
}
@Override
public boolean equals(Object o) {
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
if(!super.equals(o)) return false;
ConstantVar that = (ConstantVar) o;
return value != null ? value.equals(that.value) : that.value == null;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}

View File

@ -4,6 +4,7 @@ import dk.camelot64.kickc.model.Comment;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.Registers;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.values.ConstantValue;
import java.util.ArrayList;
import java.util.List;
@ -83,6 +84,9 @@ public abstract class SymbolVariable implements Symbol {
/** The data segment to put the variable into (if it is allocated in memory). */
private String dataSegment;
/** The constant value if the variable is a constant. Null otherwise. */
private ConstantValue value;
public SymbolVariable(String name, Scope scope, SymbolType type, StorageStrategy storageStrategy, MemoryArea memoryArea, String dataSegment) {
this.name = name;
this.scope = scope;
@ -101,6 +105,14 @@ public abstract class SymbolVariable implements Symbol {
fullName = (scopeName.length() > 0) ? scopeName + "::" + name : name;
}
public ConstantValue getValue() {
return value;
}
public void setValue(ConstantValue value) {
this.value = value;
}
public String getDataSegment() {
return dataSegment;
}
@ -325,10 +337,6 @@ public abstract class SymbolVariable implements Symbol {
}
SymbolVariable variable = (SymbolVariable) o;
if(inferredType != variable.inferredType) {
return false;
}
if(name != null ? !name.equals(variable.name) : variable.name != null) {
return false;
}
@ -346,7 +354,6 @@ public abstract class SymbolVariable implements Symbol {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (scope != null ? scope.hashCode() : 0);
result = 31 * result + (type != null ? type.hashCode() : 0);
result = 31 * result + (inferredType ? 1 : 0);
result = 31 * result + (asmName != null ? asmName.hashCode() : 0);
return result;
}

View File

@ -98,19 +98,18 @@ directive
: CONST #directiveConst
| NOTCONST #directiveNotConst
| MAYBECONST #directiveMaybeConst
| EXTERN #directiveExtern
| EXPORT #directiveExport
| ALIGN PAR_BEGIN NUMBER PAR_END #directiveAlign
| REGISTER ( PAR_BEGIN ( NAME ) PAR_END)? #directiveRegister
| ADDRESS_ZEROPAGE #directiveMemoryAreaZp
| ADDRESS_MAINMEM #directiveMemoryAreaMain
| ADDRESS PAR_BEGIN ( NUMBER ) PAR_END #directiveMemoryAreaAddress
| FORM_SSA #directiveFormSsa
| FORM_NOTSSA #directiveFormNotSsa
| ADDRESS PAR_BEGIN ( NUMBER ) PAR_END #directiveMemoryAreaAddress
| INLINE #directiveInline
| VOLATILE #directiveVolatile
| NOTVOLATILE #directiveNotVolatile
| FORM_SSA #directiveFormSsa
| FORM_NOTSSA #directiveFormNotSsa
| EXTERN #directiveExtern
| EXPORT #directiveExport
| INLINE #directiveInline
| INTERRUPT ( PAR_BEGIN NAME PAR_END )? #directiveInterrupt
| RESERVE PAR_BEGIN NUMBER ( COMMA NUMBER )* PAR_END #directiveReserveZp
| CALLINGCONVENTION #directiveCallingConvention

View File

@ -64,7 +64,7 @@
.label irq_cnt = 9
.label sin_idx = 3
__b1:
// The screen currently being showed to the user. $00 for screen 1 / $20 for screen 2.
// The screen currently being showed to the user. 0x00 for screen 1 / 0x20 for screen 2.
lda #0
sta.z render_screen_showing
// The raster line of the next IRQ

View File

@ -2100,7 +2100,7 @@ __bbegin:
// @1
__b1:
// [1] (byte) render_screen_showing#0 ← (byte) 0 -- vbuz1=vbuc1
// The screen currently being showed to the user. $00 for screen 1 / $20 for screen 2.
// The screen currently being showed to the user. 0x00 for screen 1 / 0x20 for screen 2.
lda #0
sta.z render_screen_showing
// kickasm(location (const byte*) PLAYFIELD_SPRITES) {{ .var sprites = LoadPicture("playfield-sprites.png", List().add($010101, $000000)) // Put the sprites into memory .for(var sy=0;sy<10;sy++) { .var sprite_gfx_y = sy*20 .for(var sx=0;sx<3;sx++) { .for (var y=0;y<21; y++) { .var gfx_y = sprite_gfx_y + mod(2100+y-sprite_gfx_y,21) .for (var c=0; c<3; c++) { .byte sprites.getSinglecolorByte(sx*3+c,gfx_y) } } .byte 0 } } }}
@ -2978,7 +2978,7 @@ __bbegin:
// @1
__b1:
// [1] (byte) render_screen_showing#0 ← (byte) 0 -- vbuz1=vbuc1
// The screen currently being showed to the user. $00 for screen 1 / $20 for screen 2.
// The screen currently being showed to the user. 0x00 for screen 1 / 0x20 for screen 2.
lda #0
sta.z render_screen_showing
// kickasm(location (const byte*) PLAYFIELD_SPRITES) {{ .var sprites = LoadPicture("playfield-sprites.png", List().add($010101, $000000)) // Put the sprites into memory .for(var sy=0;sy<10;sy++) { .var sprite_gfx_y = sy*20 .for(var sx=0;sx<3;sx++) { .for (var y=0;y<21; y++) { .var gfx_y = sprite_gfx_y + mod(2100+y-sprite_gfx_y,21) .for (var c=0; c<3; c++) { .byte sprites.getSinglecolorByte(sx*3+c,gfx_y) } } .byte 0 } } }}
@ -3903,7 +3903,7 @@ Score: 11662
__b1:
// render_screen_showing = 0
// [1] (byte) render_screen_showing#0 ← (byte) 0 -- vbuz1=vbuc1
// The screen currently being showed to the user. $00 for screen 1 / $20 for screen 2.
// The screen currently being showed to the user. 0x00 for screen 1 / 0x20 for screen 2.
lda #0
sta.z render_screen_showing
// kickasm
@ -3973,7 +3973,7 @@ main: {
// [18] call sprites_init
jsr sprites_init
// main::@5
// *SPRITES_ENABLE = $ff
// *SPRITES_ENABLE = 0xff
// [19] *((const byte*) SPRITES_ENABLE) ← (byte) $ff -- _deref_pbuc1=vbuc2
lda #$ff
sta SPRITES_ENABLE
@ -4062,7 +4062,7 @@ loop: {
// loop::@1
// loop::@2
__b2:
// while (*RASTER!=$ff)
// while (*RASTER!=0xff)
// [39] if(*((const byte*) RASTER)!=(byte) $ff) goto loop::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
@ -4137,7 +4137,7 @@ sprites_irq_init: {
// Disable CIA 1 Timer IRQ
lda #CIA_INTERRUPT_CLEAR
sta CIA1_INTERRUPT
// *VIC_CONTROL &=$7f
// *VIC_CONTROL &=0x7f
// [54] *((const byte*) VIC_CONTROL) ← *((const byte*) VIC_CONTROL) & (byte) $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
// Set raster line
lda #$7f