mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-11-20 02:32:36 +00:00
Created utoa10 with smaller memory footprint.
This commit is contained in:
parent
2ec68d6fd5
commit
9864995afb
@ -0,0 +1,8 @@
|
||||
lda {c1}+1,x
|
||||
cmp {z1}+1
|
||||
bne !+
|
||||
lda {c1},x
|
||||
cmp {z1}
|
||||
beq {la1}
|
||||
!:
|
||||
bcc {la1}
|
@ -0,0 +1,8 @@
|
||||
lda {c1}+1,y
|
||||
cmp {z1}+1
|
||||
bne !+
|
||||
lda {c1},y
|
||||
cmp {z1}
|
||||
beq {la1}
|
||||
!:
|
||||
bcc {la1}
|
@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda {z1}
|
||||
sbc {c1},x
|
||||
sta {z1}
|
||||
lda {z1}+1
|
||||
sbc {c1}+1,x
|
||||
sta {z1}+1
|
@ -0,0 +1,7 @@
|
||||
sec
|
||||
lda {z1}
|
||||
sbc {c1},y
|
||||
sta {z1}
|
||||
lda {z1}+1
|
||||
sbc {c1}+1,y
|
||||
sta {z1}+1
|
@ -3,6 +3,6 @@ cmp {z2}+1
|
||||
bne !+
|
||||
lda {z1}
|
||||
cmp {z2}
|
||||
beq {la1}
|
||||
!:
|
||||
bcc {la1}
|
||||
beq {la1}
|
@ -13,12 +13,19 @@ void main() {
|
||||
} 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);
|
||||
unsigned char time_start = *raster;
|
||||
utoa10b(00000, screen); (*bordercol)++; screen += 40;
|
||||
utoa10b(01234, screen); (*bordercol)++; screen += 40;
|
||||
utoa10b(05678, screen); (*bordercol)++; screen += 40;
|
||||
utoa10b(09999, screen); (*bordercol)++; screen += 40;
|
||||
utoa10b(58888, screen);
|
||||
unsigned char time_end = *raster;
|
||||
*bordercol = 0;
|
||||
unsigned char time = time_end - time_start;
|
||||
utoa10b((unsigned int)time, screen+80);
|
||||
byte[] msg = "raster lines";
|
||||
for( byte i=0; msg[i]!=0; i++ ) (screen+80+3)[i] = msg[i];
|
||||
//for( byte* m="lines", s=screen+80+6 ;*m!=0;m++,s++) *s = *m;
|
||||
}
|
||||
|
||||
}
|
||||
@ -28,29 +35,70 @@ void cls() {
|
||||
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 utoa_digit(unsigned char *dst, unsigned int value, unsigned int sub){
|
||||
unsigned char digit = 0;
|
||||
unsigned int sub3 = sub*2+sub;
|
||||
while (value >= sub3){ *dst += 3; value -= sub3; }
|
||||
while (value >= sub){ ++*dst; value -= sub; }
|
||||
while (value >= sub3){ digit += 3; value -= sub3; }
|
||||
while (value >= sub){ ++digit; value -= sub; }
|
||||
*dst = DIGITS[digit];
|
||||
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; }
|
||||
if (bStarted == 1 || value >= 10000){ value = utoa_digit(dst++, value, 10000); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 1000){ value = utoa_digit(dst++, value, 1000); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 100){ value = utoa_digit(dst++, value, 100); bStarted = 1; }
|
||||
if (bStarted == 1 || value >= 10){ value = utoa_digit(dst++, value, 10); bStarted = 1; }
|
||||
*dst++ = '0' + (unsigned char) value;
|
||||
*dst = 0;
|
||||
//*dst = 0;
|
||||
}
|
||||
|
||||
unsigned char[] DIGITS = "0123456789abcdef";
|
||||
unsigned int[] SUB3 = { 30000, 3000, 300, 30 };
|
||||
unsigned int[] SUB1 = { 10000, 1000, 100, 10 };
|
||||
|
||||
// Simple decimal utoa() without using multiply or divide
|
||||
void utoa10(unsigned int value, unsigned char* dst) {
|
||||
unsigned char bStarted = 0;
|
||||
for( unsigned char i: 0..3) {
|
||||
unsigned char digit = 0;
|
||||
unsigned int sub1 = SUB1[i];
|
||||
if(value>=sub1) {
|
||||
unsigned int sub3 = SUB3[i];
|
||||
while(value>=sub3) { digit += 3; value -= sub3; bStarted = 1; }
|
||||
while(value>=sub1) { digit += 1; value -= sub1; bStarted = 1; }
|
||||
}
|
||||
if(bStarted!=0) {
|
||||
*dst++ = DIGITS[digit];
|
||||
}
|
||||
}
|
||||
*dst++ = DIGITS[(unsigned char) value];
|
||||
//*dst = 0;
|
||||
}
|
||||
|
||||
unsigned int[] SUB = { 30000, 10000, 3000, 1000, 300, 100, 30, 10 };
|
||||
unsigned char[] VAL = { 3, 1, 3, 1, 3, 1, 3, 1 };
|
||||
|
||||
// Decimal utoa() without using multiply or divide
|
||||
void utoa10b(unsigned int value, unsigned char* dst) {
|
||||
unsigned char bStarted = 0;
|
||||
unsigned char digit = 0;
|
||||
for( unsigned char i: 0..7) {
|
||||
while(value>=SUB[i]) { digit += VAL[i]; value -= SUB[i]; bStarted = 1; }
|
||||
if((i&1)!=0) {
|
||||
if(bStarted!=0) {
|
||||
*dst++ = DIGITS[digit];
|
||||
}
|
||||
digit = 0;
|
||||
}
|
||||
}
|
||||
*dst++ = DIGITS[(unsigned char) value];
|
||||
*dst = 0;
|
||||
}
|
@ -6,7 +6,8 @@
|
||||
.label raster = $d012
|
||||
.label bordercol = $d020
|
||||
main: {
|
||||
.label _1 = 8
|
||||
.label _1 = 4
|
||||
.label time_start = 8
|
||||
sei
|
||||
jsr cls
|
||||
b1:
|
||||
@ -20,112 +21,129 @@ main: {
|
||||
bne b1
|
||||
lda #1
|
||||
sta bordercol
|
||||
lda raster
|
||||
sta time_start
|
||||
lda #<$400
|
||||
sta utoa.dst
|
||||
sta utoa10b.dst
|
||||
lda #>$400
|
||||
sta utoa.dst+1
|
||||
sta utoa10b.dst+1
|
||||
lda #0
|
||||
sta utoa.value
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
sta utoa10b.value
|
||||
sta utoa10b.value+1
|
||||
jsr utoa10b
|
||||
inc bordercol
|
||||
lda #<$400+$28
|
||||
sta utoa.dst
|
||||
sta utoa10b.dst
|
||||
lda #>$400+$28
|
||||
sta utoa.dst+1
|
||||
sta utoa10b.dst+1
|
||||
lda #<$4d2
|
||||
sta utoa.value
|
||||
sta utoa10b.value
|
||||
lda #>$4d2
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
sta utoa10b.value+1
|
||||
jsr utoa10b
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28
|
||||
sta utoa.dst
|
||||
sta utoa10b.dst
|
||||
lda #>$400+$28+$28
|
||||
sta utoa.dst+1
|
||||
sta utoa10b.dst+1
|
||||
lda #<$162e
|
||||
sta utoa.value
|
||||
sta utoa10b.value
|
||||
lda #>$162e
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
sta utoa10b.value+1
|
||||
jsr utoa10b
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28+$28
|
||||
sta utoa.dst
|
||||
sta utoa10b.dst
|
||||
lda #>$400+$28+$28+$28
|
||||
sta utoa.dst+1
|
||||
sta utoa10b.dst+1
|
||||
lda #<$270f
|
||||
sta utoa.value
|
||||
sta utoa10b.value
|
||||
lda #>$270f
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
sta utoa10b.value+1
|
||||
jsr utoa10b
|
||||
inc bordercol
|
||||
lda #<$400+$28+$28+$28+$28
|
||||
sta utoa.dst
|
||||
sta utoa10b.dst
|
||||
lda #>$400+$28+$28+$28+$28
|
||||
sta utoa.dst+1
|
||||
lda #<$ea5f
|
||||
sta utoa.value
|
||||
lda #>$ea5f
|
||||
sta utoa.value+1
|
||||
jsr utoa
|
||||
sta utoa10b.dst+1
|
||||
lda #<$e608
|
||||
sta utoa10b.value
|
||||
lda #>$e608
|
||||
sta utoa10b.value+1
|
||||
jsr utoa10b
|
||||
ldx raster
|
||||
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:
|
||||
!:
|
||||
txa
|
||||
sec
|
||||
sbc time_start
|
||||
sta utoa10b.value
|
||||
lda #0
|
||||
sta utoa10b.value+1
|
||||
lda #<$400+$28+$28+$28+$28+$50
|
||||
sta utoa10b.dst
|
||||
lda #>$400+$28+$28+$28+$28+$50
|
||||
sta utoa10b.dst+1
|
||||
jsr utoa10b
|
||||
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
|
||||
lda msg,x
|
||||
sta $400+$28+$28+$28+$28+$50+3,x
|
||||
inx
|
||||
lda msg,x
|
||||
cmp #0
|
||||
bne b3
|
||||
jmp b1
|
||||
msg: .text "raster lines@"
|
||||
}
|
||||
// Decimal utoa() without using multiply or divide
|
||||
// utoa10b(word zeropage(2) value, byte* zeropage(6) dst)
|
||||
utoa10b: {
|
||||
.label value = 2
|
||||
.label digit = 4
|
||||
.label dst = 6
|
||||
.label bStarted = 5
|
||||
lda #0
|
||||
sta bStarted
|
||||
sta digit
|
||||
tax
|
||||
b1:
|
||||
txa
|
||||
asl
|
||||
tay
|
||||
lda SUB+1,y
|
||||
cmp value+1
|
||||
bne !+
|
||||
lda SUB,y
|
||||
cmp value
|
||||
beq b2
|
||||
!:
|
||||
b4:
|
||||
bcc b2
|
||||
txa
|
||||
and #1
|
||||
cmp #0
|
||||
beq b6
|
||||
lda bStarted
|
||||
cmp #0
|
||||
beq b7
|
||||
ldy digit
|
||||
lda DIGITS,y
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
inc dst
|
||||
bne !+
|
||||
inc dst+1
|
||||
!:
|
||||
b7:
|
||||
lda #0
|
||||
sta digit
|
||||
b6:
|
||||
inx
|
||||
cpx #8
|
||||
bne b1
|
||||
lda value
|
||||
clc
|
||||
adc #'0'
|
||||
tay
|
||||
lda DIGITS,y
|
||||
ldy #0
|
||||
sta (dst),y
|
||||
inc dst
|
||||
@ -136,125 +154,23 @@ utoa: {
|
||||
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
|
||||
lda VAL,x
|
||||
clc
|
||||
ldy #0
|
||||
adc (dst),y
|
||||
sta (dst),y
|
||||
lda value
|
||||
adc digit
|
||||
sta digit
|
||||
txa
|
||||
asl
|
||||
tay
|
||||
sec
|
||||
sbc sub3
|
||||
lda value
|
||||
sbc SUB,y
|
||||
sta value
|
||||
lda value+1
|
||||
sbc sub3+1
|
||||
sbc SUB+1,y
|
||||
sta value+1
|
||||
lda #1
|
||||
sta bStarted
|
||||
jmp b1
|
||||
}
|
||||
cls: {
|
||||
@ -280,3 +196,6 @@ cls: {
|
||||
bne b1
|
||||
rts
|
||||
}
|
||||
DIGITS: .text "0123456789abcdef@"
|
||||
SUB: .word $7530, $2710, $bb8, $3e8, $12c, $64, $1e, $a
|
||||
VAL: .byte 3, 1, 3, 1, 3, 1, 3, 1
|
||||
|
Loading…
Reference in New Issue
Block a user