From 00d6cad17971aad92035508e04d95941ed72e184 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Fri, 13 Sep 2019 20:05:31 +0200 Subject: [PATCH] Moved kickasm data to data chunk. --- .../dk/camelot64/kickc/asm/AsmDataChunk.java | 53 +++++++++++++++---- .../kickc/passes/Pass4CodeGeneration.java | 31 +++++------ 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmDataChunk.java b/src/main/java/dk/camelot64/kickc/asm/AsmDataChunk.java index 4a00d8d98..d3c6161de 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmDataChunk.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmDataChunk.java @@ -84,7 +84,7 @@ public class AsmDataChunk { } } - /** A string data elements. */ + /** A string data element. */ public static class AsmDataStringElement implements AsmDataElement { /** The string value. */ String value; @@ -105,6 +105,35 @@ public class AsmDataChunk { } } + /** A kickasm data element. */ + public static class AsmDataKickAsmElement implements AsmDataElement { + + /** The size in bytes. */ + int byteSize; + /** The kickasm code initializing the value. */ + String kickAsmCode; + /** The string encoding used in the string value */ + Set encoding; + + public AsmDataKickAsmElement(int byteSize, String kickAsmCode, Set encoding) { + this.byteSize = byteSize; + this.kickAsmCode = kickAsmCode; + this.encoding = encoding; + } + + public int getByteSize() { + return byteSize; + } + + public String getKickAsmCode() { + return kickAsmCode; + } + + public Set getEncoding() { + return encoding; + } + } + /** A sequence of data elements. */ private List elements; @@ -124,6 +153,11 @@ public class AsmDataChunk { elements.add(new AsmDataStringElement(string, encoding)); } + public void addDataKickAsm(int byteSize, String kickAsmCode, Set encoding) { + elements.add(new AsmDataKickAsmElement(byteSize, kickAsmCode, encoding)); + } + + public List getElements() { return elements; } @@ -139,24 +173,25 @@ public class AsmDataChunk { AsmDataNumeric.Type currentNumericType = null; List currentNumericElements = null; for(AsmDataChunk.AsmDataElement element : this.getElements()) { - if(element instanceof AsmDataFilledElement) { - if(currentNumericElements!=null && currentNumericElements.size() > 0) { + if(element instanceof AsmDataFilledElement || element instanceof AsmDataStringElement || element instanceof AsmDataKickAsmElement) { + if(currentNumericElements != null && currentNumericElements.size() > 0) { asm.addDataNumeric(label, currentNumericType, currentNumericElements); label = null; // Only output label once currentNumericElements = null; currentNumericType = null; } + } + if(element instanceof AsmDataFilledElement) { AsmDataFilledElement filledElement = (AsmDataFilledElement) element; asm.ensureEncoding(filledElement.getEncoding()); asm.addDataFilled(label, filledElement.getType(), filledElement.getTotalSizeBytesAsm(), filledElement.getNumElements(), filledElement.getFillValue()); label = null; // Only output label once + } else if(element instanceof AsmDataKickAsmElement) { + AsmDataKickAsmElement kickAsmElement = (AsmDataKickAsmElement) element; + asm.ensureEncoding(kickAsmElement.getEncoding()); + asm.addDataKickAsm(label, kickAsmElement.getByteSize(), kickAsmElement.getKickAsmCode()); + label = null; // Only output label once } else if(element instanceof AsmDataStringElement) { - if(currentNumericElements!=null && currentNumericElements.size() > 0) { - asm.addDataNumeric(label, currentNumericType, currentNumericElements); - label = null; // Only output label once - currentNumericElements = null; - currentNumericType = null; - } AsmDataStringElement stringElement = (AsmDataStringElement) element; asm.ensureEncoding(stringElement.getEncoding()); asm.addDataString(label, stringElement.getValue()); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 91c23a274..b270daa56 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -460,21 +460,9 @@ public class Pass4CodeGeneration { addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef); asmDataChunk.addToAsm(asmName, asm); } else if(constantValue instanceof ConstantArrayKickAsm) { - ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) constantValue; - SymbolType type = constantVar.getType(); - // default - larger then 256 - int bytes = 1023; - if(type instanceof SymbolTypeArray) { - SymbolType elementType = ((SymbolTypeArray) type).getElementType(); - RValue size = ((SymbolTypeArray) type).getSize(); - if(size instanceof ConstantValue) { - ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope()); - if(sizeLiteral instanceof ConstantInteger) { - bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes()); - } - } - } - asm.addDataKickAsm(AsmFormat.asmFix(asmName), bytes, kickAsm.getKickAsmCode()); + AsmDataChunk asmDataChunk = new AsmDataChunk(); + addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef); + asmDataChunk.addToAsm(asmName, asm); } else { try { ConstantLiteral literal = constantValue.calculateLiteral(getScope()); @@ -584,6 +572,19 @@ public class Pass4CodeGeneration { int totalSizeBytes = elementSizeBytes*dataNumElements; dataChunk.addDataFilled(AsmDataNumeric.Type.BYTE, totalSizeBytesAsm, totalSizeBytes, "0", null); } + } else if(value instanceof ConstantArrayKickAsm) { + ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) value; + // default - larger then 256 + int bytes = 1023; + RValue size = constTypeArray.getSize(); + if(size instanceof ConstantValue) { + ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope()); + if(sizeLiteral instanceof ConstantInteger) { + bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes()); + } + } + dataChunk.addDataKickAsm(bytes, kickAsm.getKickAsmCode(), getEncoding(value)); + dataNumElements = bytes; } else if(dataType.equals(SymbolType.STRING)) { try { ConstantLiteral literal = value.calculateLiteral(getScope());