From b6e4b5ac8c4c85693f953ad920bee4451236d500 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 23 Feb 2018 01:03:18 -0500 Subject: [PATCH] chiptune_ update krw decode lz4 is taking 0.6s! --- gr-sim/krw_decode.c | 374 +++++++++++++++++++++++--------------------- 1 file changed, 192 insertions(+), 182 deletions(-) diff --git a/gr-sim/krw_decode.c b/gr-sim/krw_decode.c index 01e0d0e0..b967da9c 100644 --- a/gr-sim/krw_decode.c +++ b/gr-sim/krw_decode.c @@ -8,13 +8,14 @@ static unsigned char input[MAX_INPUT]; #define LZ4_BUFFER 0x2000 #define ORGOFFSET 0x6000 - - -#define src 0x0 -#define dst 0x2 #define end 0x4 -#define count 0x6 -#define delta 0x8 + +#define LZ4_SRC 0x00 +#define LZ4_DST 0x02 +#define LZ4_END 0x04 +#define COUNT 0x06 +#define DELTA 0x08 + #define CH 0x24 #define CV 0x25 @@ -22,249 +23,221 @@ static unsigned char input[MAX_INPUT]; #define OUTL 0xFE #define OUTH 0xFF +static int cycles; + static void getsrc(void) { //getsrc: - a=ram[y_indirect(src,y)]; // lda (src), y - - printf("LOAD %02X%02X: %02X\n",ram[src+1],ram[src],a); - - ram[src]++; //inc src - if (ram[src]!=0) goto done_getsrc; //bne + - ram[src+1]++; //inc src+1 -done_getsrc: ; - + a=ram[y_indirect(LZ4_SRC,y)]; cycles+=5; // lda (LZ4_SRC), y + ram[LZ4_SRC]++; cycles+=5; //inc LZ4_SRC + cycles+=2; + if (ram[LZ4_SRC]!=0) { + cycles+=1; + goto done_getsrc; //bne + + } + ram[LZ4_SRC+1]++; cycles+=5; //inc LZ4_SRC+1 +done_getsrc: + cycles+=6; //+ rts } void buildcount(void) { - printf("\tBUILDCOUNT: A=0x%x\n",a); //buildcount: - x=1; // ?? // ldx #1 - ram[count+1]=x; // ?? // stx count+1 - cmp(0xf); // if 15, more complicated // cmp #$0f - if (z==0) goto done_buildcount; // otherwise A is count // bne ++ + x=1; cycles+=2; // ?? // ldx #1 + ram[COUNT+1]=x; cycles+=3; // ?? // stx COUNT+1 + cmp(0xf); cycles+=2; // if 15, more complicated // cmp #$0f + cycles+=2; + if (z==0) { + cycles+=1; + goto done_buildcount; // otherwise A is count // bne ++ + } buildcount_loop: - ram[count]=a; //- sta count -// printf("MBC "); - getsrc(); //jsr getsrc - printf("\tADDITIONAL BUILDCOUNT 0x%x, adding 0x%x\n",a,ram[count]); - x=a; //tax - c=0; //clc - adc(ram[count]); //adc count - printf("\tGOT 0x%x c=%d\n",a,c); - if (c==0) goto skip_buildcount; // bcc + - ram[count+1]++; //inc count+1 + ram[COUNT]=a; cycles+=3; //- sta count + getsrc(); cycles+=6; //jsr getsrc + x=a; cycles+=2; //tax + c=0; cycles+=2; //clc + adc(ram[COUNT]);cycles+=3; //adc COUNT + cycles+=2; + if (c==0) { + cycles+=1; + goto skip_buildcount; // bcc + + } + ram[COUNT+1]++; cycles+=5; //inc COUNT+1 skip_buildcount: - printf("\tUPDATED COUNT %02X%02X\n",ram[count+1],a); - x++; // check if x is 255 //+ inx - if (x==0) goto buildcount_loop; // if so, add in next byte //beq - -done_buildcount: ; //++ rts - printf("\tBUILDCOUNT= %02X%02X r[c+1]=%02X r[c]=%02X a=%02X x=%02X\n", - ram[count+1],a,ram[count+1],ram[count],a,x); + x++; cycles+=2; // check if x is 255 //+ inx + if (x==0) { + cycles+=1; + goto buildcount_loop; // if so, add in next byte //beq - + } +done_buildcount: + cycles+=6; //++ rts + } static void putdst(void) { -// printf("PUTADDR=%04X\n",y_indirect(dst,y)); - // putdst: - ram[y_indirect(dst,y)]=a; // sta (dst), y - if (y!=0) printf("ERROR ERROR ERROR ERROR ERROR\n"); - printf("\t\tPUT: %02X%02X = %02X\n",ram[dst+1],ram[dst],a); - ram[dst]++; // inc dst - if (ram[dst]!=0) goto putdst_end; // bne + - ram[dst+1]++; // inc dst+1 + // putdst: + ram[y_indirect(LZ4_DST,y)]=a; cycles+=6; // sta (LZ4_DST), y + ram[LZ4_DST]++; cycles+=5; // inc LZ4_DST + cycles+=2; + if (ram[LZ4_DST]!=0) { + cycles+=1; + goto putdst_end; // bne + + } + ram[LZ4_DST+1]++; cycles+=5; // inc LZ4_DST+1 putdst_end:; - //+ rts + cycles+=6; //+ rts } static void getput(void) { // getput: - printf("GP "); + getsrc(); // jsr getsrc + cycles+=6; putdst(); // ; fallthrough } -// 202 -> 201 -> 100 -> 1FF -// 201 -> 100 -> 1FF -// 200 -> 2ff -> 2fe -// 1ff -> 1fe static void docopy(void) { - printf("\tDOCOPY ENTRY: %02X%02X\n",ram[count+1],x); // docopy: docopy_label: - printf("\tDOCOPY %02X%02X: ",ram[count+1],x); - getput(); // jsr getput - x--; // dex - if (x!=0) goto docopy_label; // bne docopy - ram[count+1]--; // dec count+1 - if (ram[count+1]!=0) goto docopy_label; //bne docopy + getput(); cycles+=6; // jsr getput + x--; cycles+=2; // dex + cycles+=2; + if (x!=0) { + cycles+=1; + goto docopy_label; // bne docopy + } + ram[COUNT+1]--; cycles+=5; // dec COUNT+1 + cycles+=2; + if (ram[COUNT+1]!=0) { + cycles++; + goto docopy_label; //bne docopy + } + cycles+=6; //rts } - +#define orgoff 0x6000 int lz4_decode(void) { FILE *fff; - int size; - short orgoff,paksize,pakoff; + cycles=0; //LZ4 data decompressor for Apple II //Peter Ferrie (peter.ferrie@gmail.com) +// lz4_decode: - //init = 0 ;set to 1 if you know the values - //hiunp = 0 ;unpacker entirely in high memory - //hipak = 0 ;packed data entirely in high memory (requires hiunp) + a=ram[LZ4_SRC]; cycles+=3; // lda LZ4_SRC + c=0; cycles+=2; // clc + adc(ram[LZ4_END]); cycles+=3; // adc LZ4_END + ram[LZ4_END]=a; cycles+=3; // sta LZ4_END + a=ram[LZ4_SRC+1]; cycles+=3; // lda LZ4_SRC+1 + adc(ram[LZ4_END+1]); cycles+=3; // adc LZ4_END+1 + ram[LZ4_END+1]=a; cycles+=3; // sta LZ4_END+1 - //oep = 0; //first unpacked byte to run, you must set this by yourself - orgoff = ORGOFFSET; //offset of first unpacked byte, you must set this by yourself - paksize = size-0xb-8; - // minus 4 for checksum at end - // not sure what other 4 is from? - // block checksum? though had that disabled? + a=high(orgoff); cycles+=2; // lda #>orgoff ; original unpacked data offset + ram[LZ4_DST+1]=a; cycles+=3; // sta LZ4_DST+1 + a=low(orgoff); cycles+=2; // lda #>8); //lda #>pakoff - ram[src+1]=a; //sta src+1 - a=(pakoff+paksize)>>8; //lda #>(pakoff+paksize) - ram[end+1]=a; // sta end+1 - a=(orgoff>>8); //lda #>orgoff ;original unpacked data offset - ram[dst+1]=a; //sta dst+1 - a=(orgoff&0xff); //lda #127)) printf("."); - else printf("%c",temp); - } - printf("\n"); - } - } - - printf("\n"); - // rts + printf("dest addr : %02X%02X\n",ram[LZ4_DST+1],ram[LZ4_DST]); fff=fopen("out.out","w"); if (fff==NULL) { @@ -278,6 +251,9 @@ done: fclose(fff); + printf("Cycles: %d\t %lfs\n",cycles,(double)cycles/1023000.0); + printf("\t50Hz\t %lfs\n",(double)1/50.0); + return 0; } @@ -362,6 +338,40 @@ int main(int argc, char **argv) { a=23; print_header_info(); + y=0; + a=high(LZ4_BUFFER+3); + ram[LZ4_SRC+1]=a; + a=low(LZ4_BUFFER+3); + ram[LZ4_SRC]=a; + + a=ram[y_indirect(LZ4_SRC,y)]; + c=0; + adc(ram[LZ4_SRC]); + ram[LZ4_SRC]=a; + a=ram[LZ4_SRC+1]; + adc(0); + ram[LZ4_SRC+1]=a; + +// next_subsong: + + y=0; + + a=ram[y_indirect(LZ4_SRC,y)]; + ram[LZ4_END]=a; + y++; + a=ram[y_indirect(LZ4_SRC,y)]; + ram[LZ4_END+1]=a; + y++; + + a=2; + c=0; + adc(ram[LZ4_SRC]); + ram[LZ4_SRC]=a; + a=(ram[LZ4_SRC+1]); + adc(0); + ram[LZ4_SRC+1]=a; + + lz4_decode(); return 0; }