mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-23 08:32:39 +00:00
added hex2dec test
This commit is contained in:
parent
6246871538
commit
2ec68d6fd5
@ -64,6 +64,11 @@ public class TestPrograms {
|
||||
*/
|
||||
|
||||
|
||||
@Test
|
||||
public void testHex2Dec() throws IOException, URISyntaxException {
|
||||
compileAndCompare("hex2dec");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTernaryInference() throws IOException, URISyntaxException {
|
||||
compileAndCompare("ternary-inference");
|
||||
|
56
src/test/kc/hex2dec.kc
Normal file
56
src/test/kc/hex2dec.kc
Normal file
@ -0,0 +1,56 @@
|
||||
// Testing hex to decimal conversion
|
||||
|
||||
const unsigned char *control = 0xd011;
|
||||
const unsigned char *raster = 0xd012;
|
||||
const unsigned char *bordercol = 0xd020;
|
||||
|
||||
void main() {
|
||||
asm { sei }
|
||||
cls();
|
||||
while(true) {
|
||||
do {
|
||||
unsigned char rst = (*control&0x80)|(*raster>>1);
|
||||
} while (rst!=0x30);
|
||||
unsigned char *screen = 0x0400;
|
||||
*bordercol = 1;
|
||||
utoa(00000, screen); (*bordercol)++; screen += 40;
|
||||
utoa(01234, screen); (*bordercol)++; screen += 40;
|
||||
utoa(05678, screen); (*bordercol)++; screen += 40;
|
||||
utoa(09999, screen); (*bordercol)++; screen += 40;
|
||||
utoa(59999, screen);
|
||||
*bordercol = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cls() {
|
||||
unsigned char *screen = 0x0400;
|
||||
for( unsigned char *sc: screen..screen+999) *sc=' ';
|
||||
}
|
||||
|
||||
unsigned char[] DIGITS = "0123456789abcdef";
|
||||
const unsigned char RADIX_BINARY = 2;
|
||||
const unsigned char RADIX_OCTAL = 8;
|
||||
const unsigned char RADIX_DECIMAL = 10;
|
||||
const unsigned char RADIX_HEX = 16;
|
||||
|
||||
|
||||
|
||||
// simple 'utoa' without using multiply or divide
|
||||
unsigned int append(unsigned char *dst, unsigned int value, unsigned int sub){
|
||||
*dst = '0';
|
||||
unsigned int sub3 = sub*2+sub;
|
||||
while (value >= sub3){ *dst += 3; value -= sub3; }
|
||||
while (value >= sub){ ++*dst; value -= sub; }
|
||||
return value;
|
||||
}
|
||||
|
||||
void utoa(unsigned int value, unsigned char *dst){
|
||||
unsigned char bStarted = 0;
|
||||
if (bStarted == 1 || value >= 10000){ value = append(dst++, value, 10000); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 1000){ value = append(dst++, value, 1000); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 100){ value = append(dst++, value, 100); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 10){ value = append(dst++, value, 10); bStarted = 1; }
|
||||
*dst++ = '0' + (unsigned char) value;
|
||||
*dst = 0;
|
||||
}
|
282
src/test/ref/hex2dec.asm
Normal file
282
src/test/ref/hex2dec.asm
Normal file
@ -0,0 +1,282 @@
|
||||
// Testing hex to decimal conversion
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
.label control = $d011
|
||||
.label raster = $d012
|
||||
.label bordercol = $d020
|
||||
main: {
|
||||
.label _1 = 8
|
||||
sei
|
||||
jsr cls
|
||||
b1:
|
||||
lda #$80
|
||||
and control
|
||||
sta _1
|
||||
lda raster
|
||||
lsr
|
||||
ora _1
|
||||
cmp #$30
|
||||
bne b1
|
||||
lda #1
|
||||
sta bordercol
|
||||
lda #<$400
|
||||
sta utoa.dst
|
||||
lda #>$400
|
||||
sta utoa.dst+1
|
||||
lda #0
|
||||
sta utoa.value
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
inc bordercol
|
||||
lda #<$400+$28
|
||||
sta utoa.dst
|
||||
lda #>$400+$28
|
||||
sta utoa.dst+1
|
||||
lda #<$4d2
|
||||
sta utoa.value
|
||||
lda #>$4d2
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28
|
||||
sta utoa.dst
|
||||
lda #>$400+$28+$28
|
||||
sta utoa.dst+1
|
||||
lda #<$162e
|
||||
sta utoa.value
|
||||
lda #>$162e
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28+$28
|
||||
sta utoa.dst
|
||||
lda #>$400+$28+$28+$28
|
||||
sta utoa.dst+1
|
||||
lda #<$270f
|
||||
sta utoa.value
|
||||
lda #>$270f
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28+$28+$28
|
||||
sta utoa.dst
|
||||
lda #>$400+$28+$28+$28+$28
|
||||
sta utoa.dst+1
|
||||
lda #<$ea5f
|
||||
sta utoa.value
|
||||
lda #>$ea5f
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
lda #0
|
||||
sta bordercol
|
||||
jmp b1
|
||||
}
|
||||
// utoa(word zeropage(2) value, byte* zeropage(4) dst)
|
||||
utoa: {
|
||||
.label value = 2
|
||||
.label dst = 4
|
||||
lda value+1
|
||||
cmp #>$2710
|
||||
bcc !+
|
||||
beq !b5+
|
||||
jmp b5
|
||||
!b5:
|
||||
lda value
|
||||
cmp #<$2710
|
||||
bcc !b5+
|
||||
jmp b5
|
||||
!b5:
|
||||
!:
|
||||
ldx #0
|
||||
b1:
|
||||
cpx #1
|
||||
beq b6
|
||||
lda value+1
|
||||
cmp #>$3e8
|
||||
bcc !+
|
||||
bne b6
|
||||
lda value
|
||||
cmp #<$3e8
|
||||
bcs b6
|
||||
!:
|
||||
b2:
|
||||
cpx #1
|
||||
beq b7
|
||||
lda value+1
|
||||
cmp #>$64
|
||||
bcc !+
|
||||
bne b7
|
||||
lda value
|
||||
cmp #<$64
|
||||
bcs b7
|
||||
!:
|
||||
b3:
|
||||
cpx #1
|
||||
beq b8
|
||||
lda value+1
|
||||
cmp #>$a
|
||||
bcc !+
|
||||
bne b8
|
||||
lda value
|
||||
cmp #<$a
|
||||
bcs b8
|
||||
!:
|
||||
b4:
|
||||
lda value
|
||||
clc
|
||||
adc #'0'
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
lda #0
|
||||
tay
|
||||
sta (dst),y
|
||||
rts
|
||||
b8:
|
||||
lda #$a
|
||||
sta append.sub
|
||||
lda #0
|
||||
sta append.sub+1
|
||||
jsr append
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
jmp b4
|
||||
b7:
|
||||
lda #$64
|
||||
sta append.sub
|
||||
lda #0
|
||||
sta append.sub+1
|
||||
jsr append
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
ldx #1
|
||||
jmp b3
|
||||
b6:
|
||||
lda #<$3e8
|
||||
sta append.sub
|
||||
lda #>$3e8
|
||||
sta append.sub+1
|
||||
jsr append
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
ldx #1
|
||||
jmp b2
|
||||
b5:
|
||||
lda #<$2710
|
||||
sta append.sub
|
||||
lda #>$2710
|
||||
sta append.sub+1
|
||||
jsr append
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
ldx #1
|
||||
jmp b1
|
||||
}
|
||||
// simple 'utoa' without using multiply or divide
|
||||
// append(byte* zeropage(4) dst, word zeropage(2) value, word zeropage(6) sub)
|
||||
append: {
|
||||
.label _0 = 9
|
||||
.label sub3 = 9
|
||||
.label value = 2
|
||||
.label dst = 4
|
||||
.label return = 2
|
||||
.label sub = 6
|
||||
lda #'0'
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
lda sub
|
||||
asl
|
||||
sta _0
|
||||
lda sub+1
|
||||
rol
|
||||
sta _0+1
|
||||
lda sub3
|
||||
clc
|
||||
adc sub
|
||||
sta sub3
|
||||
lda sub3+1
|
||||
adc sub+1
|
||||
sta sub3+1
|
||||
b1:
|
||||
lda sub3+1
|
||||
cmp value+1
|
||||
bne !+
|
||||
lda sub3
|
||||
cmp value
|
||||
!:
|
||||
bcc b2
|
||||
beq b2
|
||||
b3:
|
||||
lda sub+1
|
||||
cmp value+1
|
||||
bne !+
|
||||
lda sub
|
||||
cmp value
|
||||
!:
|
||||
bcc b4
|
||||
beq b4
|
||||
rts
|
||||
b4:
|
||||
ldy #0
|
||||
lda (dst),y
|
||||
clc
|
||||
adc #1
|
||||
sta (dst),y
|
||||
lda value
|
||||
sec
|
||||
sbc sub
|
||||
sta value
|
||||
lda value+1
|
||||
sbc sub+1
|
||||
sta value+1
|
||||
jmp b3
|
||||
b2:
|
||||
lda #3
|
||||
clc
|
||||
ldy #0
|
||||
adc (dst),y
|
||||
sta (dst),y
|
||||
lda value
|
||||
sec
|
||||
sbc sub3
|
||||
sta value
|
||||
lda value+1
|
||||
sbc sub3+1
|
||||
sta value+1
|
||||
jmp b1
|
||||
}
|
||||
cls: {
|
||||
.label screen = $400
|
||||
.label sc = 2
|
||||
lda #<screen
|
||||
sta sc
|
||||
lda #>screen
|
||||
sta sc+1
|
||||
b1:
|
||||
lda #' '
|
||||
ldy #0
|
||||
sta (sc),y
|
||||
inc sc
|
||||
bne !+
|
||||
inc sc+1
|
||||
!:
|
||||
lda sc+1
|
||||
cmp #>screen+$3e7+1
|
||||
bne b1
|
||||
lda sc
|
||||
cmp #<screen+$3e7+1
|
||||
bne b1
|
||||
rts
|
||||
}
|
Loading…
Reference in New Issue
Block a user