1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-14 23:04:57 +00:00

Added array-based bresenham

This commit is contained in:
jespergravgaard 2017-05-29 22:43:05 +02:00
parent 38408825cd
commit 1540439d36
13 changed files with 150 additions and 45 deletions

View File

@ -3,17 +3,17 @@ package dk.camelot64.kickc.asm;
/** 6502 Assembler Instruction Addressing Modes. */
public enum AsmAddressingMode {
NON("", "%i", 1),
IMM("#imm", "%i.imm #%p", 2),
ZP("zp", "%i.zp %p", 2),
ZPX("zp,x", "%i.zpx %p,x", 2),
ZPY("zp,y", "%i.zpy %p,y", 2),
ABS("abs", "%i.abs %p", 3),
ABX("abs,x", "%i.abx %p,x", 3),
ABY("abs,y", "%i.aby %p,y", 4),
IZX("(zp,x)", "%i.izx (%p,x)", 2),
IZY("(zp),y", "%i.izy (%p),y", 2),
REL("rel", "%i.rel %p", 2),
IND("(ind)", "%i.ind (%p)", 3);
IMM("#imm", "%i #%p", 2),
ZP("zp", "%i %p", 2),
ZPX("zp,x", "%i %p,x", 2),
ZPY("zp,y", "%i %p,y", 2),
ABS("abs", "%i %p", 3),
ABX("abs,x", "%i %p,x", 3),
ABY("abs,y", "%i %p,y", 4),
IZX("(zp,x)", "%i (%p,x)", 2),
IZY("(zp),y", "%i (%p),y", 2),
REL("rel", "%i %p", 2),
IND("(ind)", "%i (%p)", 3);
private String name;

View File

@ -139,29 +139,12 @@ public class AsmFragment {
this.signature = signature;
}
/**
* Zero page byte register name indexing.
*/
/** Zero page register name indexing. */
private int nextZpByteIdx = 1;
/**
* Zero page bool register name indexing.
*/
private int nextZpWordIdx = 1;
private int nextZpBoolIdx = 1;
/**
* Zero page ptr register name indexing.
*/
private int nextZpPtrIdx = 1;
/**
* Constant byte indexing.
*/
private int nextConstByteIdx = 1;
/**
* Label indexing.
*/
private int nextLabelIdx = 1;
/**
@ -192,6 +175,10 @@ public class AsmFragment {
String name = "zpby" + nextZpByteIdx++;
bindings.put(name, value);
return name;
} else if (RegisterAllocation.RegisterType.ZP_WORD.equals(register.getType())) {
String name = "zpwo" + nextZpWordIdx++;
bindings.put(name, value);
return name;
} else if (RegisterAllocation.RegisterType.ZP_BOOL.equals(register.getType())) {
String name = "zpbo" + nextZpBoolIdx++;
bindings.put(name, value);
@ -259,6 +246,8 @@ public class AsmFragment {
RegisterAllocation.Register register = (RegisterAllocation.Register) boundValue;
if (register instanceof RegisterAllocation.RegisterZpByte) {
bound = Integer.toString(((RegisterAllocation.RegisterZpByte) register).getZp());
} else if (register instanceof RegisterAllocation.RegisterZpWord) {
bound = Integer.toString(((RegisterAllocation.RegisterZpWord) register).getZp());
} else if (register instanceof RegisterAllocation.RegisterZpBool) {
bound = Integer.toString(((RegisterAllocation.RegisterZpBool) register).getZp());
} else if (register instanceof RegisterAllocation.RegisterZpPointerByte) {

View File

@ -0,0 +1,7 @@
lda #<{cowo1}
clc
adc {zpwo1}
sta {zpptrby1}
lda #>{cowo1}
adc {zpwo1}+1
sta {zpptrby1}+1

View File

@ -0,0 +1,4 @@
lda {zpptrby2}
sta {zpptrby1}
lda {zpptrby2}+1
sta {zpptrby1}+1

View File

@ -0,0 +1,4 @@
lda #{coby1}
sta {zpwo1}
lda #0
sta {zpwo1}+1

View File

@ -0,0 +1,4 @@
inc {zpwo1}
bne !+
inc {zpwo1}+1
!:

View File

@ -0,0 +1,7 @@
lda {zpwo1}
clc
adc #<{coby1}
sta {zpwo1}
bcc !+
inc {zpwo1}+1
!:

View File

@ -0,0 +1,4 @@
lda {zpwo2}
sta {zpwo1}
lda {zpwo2}+1
sta {zpwo1}+1

View File

@ -0,0 +1,7 @@
lda {zpwo2}
clc
adc #1
sta {zpwo1}
lda {zpwo2}+1
adc #0
sta {zpwo1}+1

View File

@ -0,0 +1,7 @@
lda {zpwo2}
clc
adc #<{coby1}
sta {zpwo1}
lda {zpwo2}+1
adc #0
sta {zpwo1}+1

View File

@ -18,13 +18,19 @@ public class Pass3RegisterAllocation {
if(var instanceof VariableIntermediate || var instanceof VariableVersion)
if(var.getType().equals(SymbolTypeBasic.BYTE)) {
allocation.allocate(var, new RegisterAllocation.RegisterZpByte(currentZp++));
} else if(var.getType().equals(SymbolTypeBasic.WORD)) {
allocation.allocate(var, new RegisterAllocation.RegisterZpWord(currentZp));
currentZp = currentZp +2;
} else if(var.getType().equals(SymbolTypeBasic.BOOLEAN)) {
allocation.allocate(var, new RegisterAllocation.RegisterZpBool(currentZp++));
} else if(var.getType() instanceof SymbolTypePointer) {
allocation.allocate(var, new RegisterAllocation.RegisterZpPointerByte(currentZp));
currentZp = currentZp +2;
} else {
throw new RuntimeException("Unhandled variable type "+var);
}
}
/*
allocation.allocate(symbols.getVariable("i#0"), RegisterAllocation.getRegisterX());
allocation.allocate(symbols.getVariable("i#1"), RegisterAllocation.getRegisterX());
allocation.allocate(symbols.getVariable("i#2"), RegisterAllocation.getRegisterX());
@ -34,19 +40,24 @@ public class Pass3RegisterAllocation {
allocation.allocate(symbols.getVariable("ptr#1"), new RegisterAllocation.RegisterZpPointerByte(2));
allocation.allocate(symbols.getVariable("ptr#2"), new RegisterAllocation.RegisterZpPointerByte(2));
allocation.allocate(symbols.getVariable("ptr#3"), new RegisterAllocation.RegisterZpPointerByte(2));
allocation.allocate(symbols.getVariable("y#1"), new RegisterAllocation.RegisterZpByte(4));
allocation.allocate(symbols.getVariable("y#2"), new RegisterAllocation.RegisterZpByte(4));
allocation.allocate(symbols.getVariable("y#5"), new RegisterAllocation.RegisterZpByte(4));
allocation.allocate(symbols.getVariable("x#2"), new RegisterAllocation.RegisterZpByte(8));
allocation.allocate(symbols.getVariable("x#5"), new RegisterAllocation.RegisterZpByte(8));
allocation.allocate(symbols.getVariable("cursor#2"), new RegisterAllocation.RegisterZpPointerByte(5));
allocation.allocate(symbols.getVariable("cursor#3"), new RegisterAllocation.RegisterZpPointerByte(5));
allocation.allocate(symbols.getVariable("cursor#4"), new RegisterAllocation.RegisterZpPointerByte(5));
allocation.allocate(symbols.getVariable("cursor#5"), new RegisterAllocation.RegisterZpPointerByte(5));
allocation.allocate(symbols.getVariable("e#2"), new RegisterAllocation.RegisterZpByte(7));
allocation.allocate(symbols.getVariable("e#3"), new RegisterAllocation.RegisterZpByte(7));
allocation.allocate(symbols.getVariable("e#4"), new RegisterAllocation.RegisterZpByte(7));
allocation.allocate(symbols.getVariable("e#5"), new RegisterAllocation.RegisterZpByte(7));
*/
allocation.allocate(symbols.getVariable("e#2"), new RegisterAllocation.RegisterZpByte(128));
allocation.allocate(symbols.getVariable("e#3"), new RegisterAllocation.RegisterZpByte(128));
allocation.allocate(symbols.getVariable("e#4"), new RegisterAllocation.RegisterZpByte(128));
allocation.allocate(symbols.getVariable("e#5"), new RegisterAllocation.RegisterZpByte(128));
allocation.allocate(symbols.getVariable("idx#2"), new RegisterAllocation.RegisterZpWord(129));
allocation.allocate(symbols.getVariable("idx#3"), new RegisterAllocation.RegisterZpWord(129));
allocation.allocate(symbols.getVariable("idx#4"), new RegisterAllocation.RegisterZpWord(129));
allocation.allocate(symbols.getVariable("idx#5"), new RegisterAllocation.RegisterZpWord(129));
allocation.allocate(symbols.getVariable("x#2"), new RegisterAllocation.RegisterZpByte(131));
allocation.allocate(symbols.getVariable("x#5"), new RegisterAllocation.RegisterZpByte(131));
allocation.allocate(symbols.getVariable("y#1"), new RegisterAllocation.RegisterZpByte(132));
allocation.allocate(symbols.getVariable("y#2"), new RegisterAllocation.RegisterZpByte(132));
allocation.allocate(symbols.getVariable("y#5"), new RegisterAllocation.RegisterZpByte(132));
allocation.allocate(symbols.getVariable("cursor#2"), new RegisterAllocation.RegisterZpPointerByte(133));
allocation.allocate(symbols.getVariable("cursor#3"), new RegisterAllocation.RegisterZpPointerByte(133));
allocation.allocate(symbols.getVariable("cursor#4"), new RegisterAllocation.RegisterZpPointerByte(133));
allocation.allocate(symbols.getVariable("cursor#5"), new RegisterAllocation.RegisterZpPointerByte(133));
symbols.setAllocation(allocation);
}

View File

@ -36,7 +36,7 @@ public class RegisterAllocation {
/** The register type. */
public enum RegisterType {
ZP_BYTE, ZP_BOOL, REG_Y_BYTE, REG_X_BYTE, ZP_PTR_BYTE
ZP_BYTE, ZP_BOOL, REG_Y_BYTE, REG_X_BYTE, ZP_PTR_BYTE, ZP_WORD
}
/** A zero page address used as a register for a single byte variable. */
@ -76,6 +76,44 @@ public class RegisterAllocation {
}
}
/** Two zero page addresses used as a register for a single word variable. */
public static class RegisterZpWord implements Register {
private int zp;
public RegisterZpWord(int zp) {
this.zp = zp;
}
public int getZp() {
return zp;
}
@Override
public RegisterType getType() {
return RegisterType.ZP_WORD;
}
@Override
public String toString() {
return "zp word :"+zp;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
RegisterZpWord that = (RegisterZpWord) o;
return zp == that.zp;
}
@Override
public int hashCode() {
return zp;
}
}
/** A zero page address used as a register for a boolean variable. */
public static class RegisterZpBool implements Register {
private int zp;
@ -127,7 +165,7 @@ public class RegisterAllocation {
@Override
public String toString() {
return "zp ptrbyte:"+zp;
return "zp ptr byte:"+zp;
}
@Override

View File

@ -0,0 +1,23 @@
byte STAR = 81;
byte[40*25] screen = $0400;
byte x0 = 0;
byte y0 = 0;
byte x1 = 39;
byte y1 = 24;
byte xd = x1-x0;
byte yd = y1-y0;
byte x = x0;
byte y = y0;
byte e = yd/2;
word idx = x+y*40;
do {
screen[idx] = STAR;
x = x + 1;
idx = idx + 1;
e = e+yd;
if(xd<e) {
y = y+1;
idx = idx + 40;
e = e - xd;
}
} while (x<(x1+1))