From abfa6f875f640f337abdcb51bbc8716c7b4ce348 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sat, 18 May 2019 22:40:46 +0200 Subject: [PATCH] Added a few tests --- .../dk/camelot64/kickc/test/TestPrograms.java | 5 + src/test/kc/number-inference-sum.kc | 16 ++ src/test/ref/c64dtv-blitter-box.asm | 148 ++++++++++++++++++ src/test/ref/number-inference-sum.asm | 20 +++ 4 files changed, 189 insertions(+) create mode 100644 src/test/kc/number-inference-sum.kc create mode 100644 src/test/ref/c64dtv-blitter-box.asm create mode 100644 src/test/ref/number-inference-sum.asm diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 508e25cee..112535fab 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -63,6 +63,11 @@ public class TestPrograms { */ + @Test + public void testNumberInferenceSum() throws IOException, URISyntaxException { + compileAndCompare("number-inference-sum"); + } + @Test public void testGfxBankOptimization() throws IOException, URISyntaxException { compileAndCompare("gfxbank"); diff --git a/src/test/kc/number-inference-sum.kc b/src/test/kc/number-inference-sum.kc new file mode 100644 index 000000000..b0aa72f6a --- /dev/null +++ b/src/test/kc/number-inference-sum.kc @@ -0,0 +1,16 @@ +// Test inference of number types using a long sum +// Currently fails - because the compiler does not handle byte+byte correctly (not truncating the result to 8 bits) + +void main() { + const word* screen = 0x0400; + const byte* bgcol = 0xd020; + const byte RED = 2; + + byte b1 = 250; + byte b2 = b1+250; + word w = b2+1; + screen[0] = w; + + if((w)>255) *bgcol = RED; + +} \ No newline at end of file diff --git a/src/test/ref/c64dtv-blitter-box.asm b/src/test/ref/c64dtv-blitter-box.asm new file mode 100644 index 000000000..36d9a9a77 --- /dev/null +++ b/src/test/ref/c64dtv-blitter-box.asm @@ -0,0 +1,148 @@ +// Fill a box on the screen using the blitter +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Feature enables or disables the extra C64 DTV features + .label DTV_FEATURE = $d03f + .const DTV_FEATURE_ENABLE = 1 + // Blitter Source A Start + .label DTV_BLITTER_SRCA_LO = $d320 + .label DTV_BLITTER_SRCA_MI = $d321 + .label DTV_BLITTER_SRCA_HI = $d322 + // Blitter Source A Modulo + .label DTV_BLITTER_SRCA_MOD_LO = $d323 + .label DTV_BLITTER_SRCA_MOD_HI = $d324 + // Blitter Source A Line Length + .label DTV_BLITTER_SRCA_LIN_LO = $d325 + .label DTV_BLITTER_SRCA_LIN_HI = $d326 + // Blitter Source A Step ([7:4] integral part, [3:0] fractional part) + .label DTV_BLITTER_SRCA_STEP = $d327 + // Blitter Source B Start + .label DTV_BLITTER_SRCB_LO = $d328 + .label DTV_BLITTER_SRCB_MI = $d329 + .label DTV_BLITTER_SRCB_HI = $d32a + // Blitter Source B Modulo + .label DTV_BLITTER_SRCB_MOD_LO = $d32b + .label DTV_BLITTER_SRCB_MOD_HI = $d32c + // Blitter Source B Line Length + .label DTV_BLITTER_SRCB_LIN_LO = $d32d + .label DTV_BLITTER_SRCB_LIN_HI = $d32e + // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) + .label DTV_BLITTER_SRCB_STEP = $d32f + // Blitter Destination Start + .label DTV_BLITTER_DEST_LO = $d330 + .label DTV_BLITTER_DEST_MI = $d331 + .label DTV_BLITTER_DEST_HI = $d332 + // Blitter Source B Modulo + .label DTV_BLITTER_DEST_MOD_LO = $d333 + .label DTV_BLITTER_DEST_MOD_HI = $d334 + // Blitter Source B Line Length + .label DTV_BLITTER_DEST_LIN_LO = $d335 + .label DTV_BLITTER_DEST_LIN_HI = $d336 + // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) + .label DTV_BLITTER_DEST_STEP = $d337 + // Blitter Blit Length + .label DTV_BLITTER_LEN_LO = $d338 + .label DTV_BLITTER_LEN_HI = $d339 + // Blitter Control + .label DTV_BLITTER_CONTROL = $d33a + // Bit[0] Force Start Strobe when set + .const DTV_BLIT_FORCE_START = 1 + // Bit[1] Source A Direction Positive when set + .const DTV_BLIT_SRCA_FWD = 2 + // Bit[2] Source B Direction Positive when set + .const DTV_BLIT_SRCB_FWD = 4 + // Bit[3] Destination Direction Positive when set + .const DTV_BLIT_DEST_FWD = 8 + // Blitter Transparency + .label DTV_BLITTER_TRANSPARANCY = $d33b + // No transparancy + // Bit[2]==Bit[1]==0: write in any case + .const DTV_BLIT_TRANSPARANCY_NONE = 0 + // Controls the ALU operation + .label DTV_BLITTER_ALU = $d33e + .const DTV_BLIT_ADD = $30 + // Blitter Control 2 + .label DTV_BLITTER_CONTROL2 = $d33f + // Bit[0] Clear Blitter IRQ + .const DTV_BLIT_CLEAR_IRQ = 1 + // Bit[3] Destination Continue + .const DTV_BLIT_DEST_CONT = 8 + // Bit[0] Busy when set (When reading) + .const DTV_BLIT_STATUS_BUSY = 1 + .label SCREEN = $400 +main: { + lda #DTV_FEATURE_ENABLE + sta DTV_FEATURE + // Instruct blitter not to continue previous blit + lda #DTV_BLIT_CLEAR_IRQ + sta DTV_BLITTER_CONTROL2 + lda #SRCA + sta DTV_BLITTER_SRCA_MI + lda #0 + sta DTV_BLITTER_SRCA_HI + sta DTV_BLITTER_SRCA_MOD_LO + sta DTV_BLITTER_SRCA_MOD_HI + sta DTV_BLITTER_SRCA_LIN_LO + lda #>$100 + sta DTV_BLITTER_SRCA_LIN_HI + lda #1 + sta DTV_BLITTER_SRCA_STEP + // Step 0.0 + lda #SRCB + sta DTV_BLITTER_SRCB_MI + lda #0 + sta DTV_BLITTER_SRCB_HI + sta DTV_BLITTER_SRCB_MOD_LO + sta DTV_BLITTER_SRCB_MOD_HI + sta DTV_BLITTER_SRCB_LIN_LO + lda #>$100 + sta DTV_BLITTER_SRCB_LIN_HI + lda #0 + sta DTV_BLITTER_SRCB_STEP + // Step 0.0 + lda #SCREEN+$28+5 + sta DTV_BLITTER_DEST_MI + lda #0 + sta DTV_BLITTER_DEST_HI + lda #<$15 + sta DTV_BLITTER_DEST_MOD_LO + lda #0 + sta DTV_BLITTER_DEST_MOD_HI + lda #<$13 + sta DTV_BLITTER_DEST_LIN_LO + lda #0 + sta DTV_BLITTER_DEST_LIN_HI + lda #$10 + sta DTV_BLITTER_DEST_STEP + // Step 1.0 + lda #<$14*$a + sta DTV_BLITTER_LEN_LO + lda #0 + sta DTV_BLITTER_LEN_HI + lda #DTV_BLIT_ADD + sta DTV_BLITTER_ALU + lda #DTV_BLIT_TRANSPARANCY_NONE + sta DTV_BLITTER_TRANSPARANCY + // Start blitter + lda #DTV_BLIT_FORCE_START|DTV_BLIT_SRCA_FWD|DTV_BLIT_SRCB_FWD|DTV_BLIT_DEST_FWD + sta DTV_BLITTER_CONTROL + // Instruct blitter to continue at DEST and restart SRC A/B + lda #DTV_BLIT_DEST_CONT + sta DTV_BLITTER_CONTROL2 + // wait til blitter is ready + b1: + lda #DTV_BLIT_STATUS_BUSY + and DTV_BLITTER_CONTROL2 + cmp #0 + bne b1 + rts +} + SRCA: .text "camelot rules!@" + SRCB: .byte $80 diff --git a/src/test/ref/number-inference-sum.asm b/src/test/ref/number-inference-sum.asm new file mode 100644 index 000000000..9715ba4f5 --- /dev/null +++ b/src/test/ref/number-inference-sum.asm @@ -0,0 +1,20 @@ +// Test inference of number types using a long sum +// Currently fails - because the compiler does not handle byte+byte correctly (not truncating the result to 8 bits) +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +main: { + .label screen = $400 + .label bgcol = $d020 + .const RED = 2 + .const b1 = $fa + .const b2 = b1+$fa + .const w = b2+1 + lda #w + sta screen+1 + lda #RED + sta bgcol + rts +}