mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-27 02:31:00 +00:00
chiptune: update krw decoder
This commit is contained in:
parent
8dcc5a39e6
commit
f3b7a21ce2
@ -390,73 +390,26 @@ new_song:
|
||||
|
||||
jsr clear_bottoms ; clear bottom of page 0/1
|
||||
|
||||
lda #>LZ4_BUFFER
|
||||
lda #>LZ4_BUFFER ; point to LZ4 data
|
||||
sta OUTH
|
||||
lda #<LZ4_BUFFER
|
||||
sta OUTL
|
||||
|
||||
ldy #4 ; skip KRW at front
|
||||
ldy #3 ; skip KRW magic at front
|
||||
|
||||
; print title
|
||||
lda #20 ; VTAB 20: HTAB from file
|
||||
jsr print_header_info
|
||||
|
||||
; FIXME: optimize
|
||||
; Print Author
|
||||
lda #21 ; VTAB 21: HTAB from file
|
||||
jsr print_header_info
|
||||
|
||||
lda #20
|
||||
sta CV
|
||||
lda (OUTL),Y
|
||||
sta CH
|
||||
; Print clock
|
||||
lda #23 ; VTAB 23: HTAB from file
|
||||
jsr print_header_info
|
||||
|
||||
lda OUTL
|
||||
clc
|
||||
adc #5 ; point past header stuff
|
||||
sta OUTL
|
||||
lda OUTH
|
||||
adc #0
|
||||
sta OUTH
|
||||
|
||||
jsr print_both_pages
|
||||
|
||||
iny
|
||||
tya
|
||||
ldy #0
|
||||
clc
|
||||
adc OUTL
|
||||
sta OUTL
|
||||
lda OUTH
|
||||
adc #$0
|
||||
sta OUTH
|
||||
|
||||
lda #21
|
||||
sta CV
|
||||
lda (OUTL),Y
|
||||
sta CH
|
||||
|
||||
inc OUTL
|
||||
bne bloop2
|
||||
inc OUTH
|
||||
bloop2:
|
||||
|
||||
jsr print_both_pages
|
||||
|
||||
iny
|
||||
tya
|
||||
ldy #0
|
||||
clc
|
||||
adc OUTL
|
||||
sta OUTL
|
||||
lda OUTH
|
||||
adc #$0
|
||||
sta OUTH
|
||||
|
||||
lda #23
|
||||
sta CV
|
||||
lda (OUTL),Y
|
||||
sta CH
|
||||
|
||||
inc OUTL
|
||||
bne bloop3
|
||||
inc OUTH
|
||||
bloop3:
|
||||
jsr print_both_pages
|
||||
; Point LZ4 src at proper place
|
||||
|
||||
ldy #0
|
||||
lda #>(LZ4_BUFFER+3)
|
||||
@ -472,12 +425,7 @@ bloop3:
|
||||
adc #0
|
||||
sta LZ4_SRC+1
|
||||
|
||||
jsr next_subsong
|
||||
|
||||
; should tail call
|
||||
|
||||
rts
|
||||
|
||||
; Fall through to next_subsong
|
||||
|
||||
;=================
|
||||
; next sub-song
|
||||
@ -502,12 +450,53 @@ next_subsong:
|
||||
|
||||
jsr lz4_decode ; decode
|
||||
|
||||
; tail-call?
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;===================
|
||||
; print header info
|
||||
;===================
|
||||
; shortcut to print header info
|
||||
; a = VTAB
|
||||
|
||||
print_header_info:
|
||||
|
||||
sta CV
|
||||
|
||||
iny ; adjust pointer
|
||||
tya
|
||||
ldy #0
|
||||
clc
|
||||
adc OUTL
|
||||
sta OUTL
|
||||
lda OUTH
|
||||
adc #$0
|
||||
sta OUTH
|
||||
|
||||
lda (OUTL),Y ; get HTAB value
|
||||
sta CH
|
||||
|
||||
inc OUTL ; increment 16-bits
|
||||
bne bloop22
|
||||
inc OUTH
|
||||
bloop22:
|
||||
|
||||
jmp print_both_pages ; print, tail call
|
||||
|
||||
|
||||
|
||||
|
||||
;==========
|
||||
; filenames
|
||||
;==========
|
||||
krw_file:
|
||||
.asciiz "CHRISTMAS.KRW"
|
||||
.asciiz "CAMOUFLAGE.KRW"
|
||||
.asciiz "FIGHTING.KRW"
|
||||
.asciiz "UNIVERSE.KRW"
|
||||
.asciiz "INTRO2.KRW"
|
||||
.asciiz "TECHNO.KRW"
|
||||
|
||||
|
@ -126,3 +126,12 @@ void lsr(void) {
|
||||
a=(temp_a&0xff);
|
||||
// printf("LSR A=%x\n",a);
|
||||
}
|
||||
|
||||
unsigned char high(int value) {
|
||||
return (value>>8)&0xff;
|
||||
}
|
||||
|
||||
unsigned char low(int value) {
|
||||
return (value&0xff);
|
||||
}
|
||||
|
||||
|
@ -12,3 +12,7 @@ void cmp(int value);
|
||||
void pha(void);
|
||||
void pla(void);
|
||||
void lsr(void);
|
||||
|
||||
unsigned char high(int value);
|
||||
unsigned char low(int value);
|
||||
|
||||
|
@ -7,7 +7,7 @@ SDL_INCLUDE= `sdl-config --cflags`
|
||||
|
||||
all: fade fixed_point rainbow sparkle starfield starfield_fixed kaleido \
|
||||
tfv mode7_demo text text_demo tfv_multiply rasterbars rasterbars_fixed \
|
||||
lz4d_verbose 6502_test
|
||||
lz4d_verbose 6502_test krw_decode
|
||||
|
||||
|
||||
#### Library
|
||||
@ -38,6 +38,14 @@ lz4d_verbose.o: lz4d_verbose.c demo_title.c
|
||||
|
||||
####
|
||||
|
||||
krw_decode: krw_decode.o 6502_emulate.o
|
||||
$(CC) $(LFLAGS) $(SDL_LIBS) -o krw_decode krw_decode.o 6502_emulate.o
|
||||
|
||||
krw_decode.o: krw_decode.c demo_title.c
|
||||
$(CC) $(CFLAGS) -c krw_decode.c
|
||||
|
||||
####
|
||||
|
||||
fixed_point: fixed_point.o
|
||||
$(CC) $(LFLAGS) -o fixed_point fixed_point.o
|
||||
|
||||
@ -231,6 +239,6 @@ clean:
|
||||
rm -f *~ *.o gr-sim rainbow sparkle starfield starfield_fixed kaleido \
|
||||
tfv text mode7_demo fade fixed_point tfv_multiply \
|
||||
rasterbars rasterbars_fixed lookup_tables text_demo \
|
||||
lz4d_verbose 6502_test
|
||||
lz4d_verbose 6502_test krw_decode
|
||||
|
||||
|
||||
|
368
gr-sim/krw_decode.c
Normal file
368
gr-sim/krw_decode.c
Normal file
@ -0,0 +1,368 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "6502_emulate.h"
|
||||
|
||||
#define MAX_INPUT 65536
|
||||
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 CH 0x24
|
||||
#define CV 0x25
|
||||
|
||||
#define OUTL 0xFE
|
||||
#define OUTH 0xFF
|
||||
|
||||
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: ;
|
||||
|
||||
//+ 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 ++
|
||||
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
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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_end:;
|
||||
//+ rts
|
||||
|
||||
}
|
||||
|
||||
static void getput(void) {
|
||||
// getput:
|
||||
printf("GP ");
|
||||
getsrc(); // jsr getsrc
|
||||
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
|
||||
//rts
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int lz4_decode(void) {
|
||||
|
||||
FILE *fff;
|
||||
|
||||
int size;
|
||||
short orgoff,paksize,pakoff;
|
||||
|
||||
//LZ4 data decompressor for Apple II
|
||||
//Peter Ferrie (peter.ferrie@gmail.com)
|
||||
|
||||
//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)
|
||||
|
||||
//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?
|
||||
|
||||
//size of packed data, you must set this by yourself if hiunp=0
|
||||
pakoff = LZ4_BUFFER+11; // 11 byte offset to data?
|
||||
|
||||
|
||||
//LCBANK2 = $c083
|
||||
//MOVE = $fe2c
|
||||
|
||||
a=(pakoff&0xff); //lda #<pakoff ;packed data offset
|
||||
ram[src]=a; //sta src
|
||||
a=(pakoff+paksize)&0xff;//lda #<(pakoff+paksize) ;packed data size
|
||||
ram[end]=a; // sta end
|
||||
a=(pakoff>>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 #<orgoff
|
||||
ram[dst]=a; // sta dst
|
||||
|
||||
printf("packed size: raw=%x, adj=%x\n",size,paksize);
|
||||
printf("packed addr: %02X%02X\n",ram[src+1],ram[src]);
|
||||
printf("packed end : %02X%02X\n",ram[end+1],ram[end]);
|
||||
printf("dest addr : %02X%02X\n",ram[dst+1],ram[dst]);
|
||||
|
||||
// https://github.com/lz4/lz4/wiki/lz4_Frame_format.md
|
||||
|
||||
// Should: check for magic number 04 22 4d 18
|
||||
// FLG: 64 in our case (01=version, block.index=1, block.checksum=0
|
||||
// size=0, checksum=1, reserved
|
||||
// MAX Blocksize: 40 (64kB)
|
||||
// HEADER CHECKSUM: a7
|
||||
// BLOCK HEADER: 4 bytes (le) If highest bit set, uncompressed!
|
||||
|
||||
|
||||
//unpack: //;unpacker entrypoint
|
||||
// goto unpmain; // jmp unpmain
|
||||
|
||||
//unpack:
|
||||
y=0; // used for offset //ldy #0
|
||||
|
||||
parsetoken:
|
||||
printf("LOAD TOKEN: ");
|
||||
getsrc(); // jsr getsrc
|
||||
// get token
|
||||
pha(); // save for later // pha
|
||||
lsr(); // num literals in top 4 // lsr
|
||||
lsr(); // lsr
|
||||
lsr(); // lsr
|
||||
lsr(); // lsr
|
||||
if (a==0) goto copymatches; // if zero, no literals // beq copymatches
|
||||
|
||||
buildcount(); // otherwise, build the count // jsr buildcount
|
||||
|
||||
x=a; // tax
|
||||
docopy(); // jsr docopy
|
||||
a=ram[src]; // lda src
|
||||
cmp(ram[end]); // cmp end
|
||||
a=ram[src+1]; // lda src+1
|
||||
|
||||
sbc(ram[end+1]); // sbc end+1
|
||||
if (c) {
|
||||
printf("Done!\n");
|
||||
printf("src : %02X%02X\n",ram[src+1],ram[src]);
|
||||
printf("packed end : %02X%02X\n",ram[end+1],ram[end]);
|
||||
goto done; // bcs done
|
||||
}
|
||||
|
||||
copymatches:
|
||||
printf("\tDELTAL ");
|
||||
getsrc(); // jsr getsrc
|
||||
ram[delta]=a; // sta delta
|
||||
printf("\tDELTAH ");
|
||||
getsrc(); // jsr getsrc
|
||||
ram[delta+1]=a; // sta delta+1
|
||||
printf("\tDELTA is %02X%02X\n",ram[delta+1],ram[delta]);
|
||||
pla(); // restore token // pla
|
||||
a=a&0xf; // get bottom 4 bits // and #$0f
|
||||
buildcount(); // jsr buildcount
|
||||
|
||||
c=0; // clc
|
||||
adc(4); // adc #4
|
||||
x=a; // tax
|
||||
if (x==0) goto copy_skip; //BUGFIX // beq +
|
||||
if (c==0) goto copy_skip; // bcc +
|
||||
ram[count+1]++; // inc count+1
|
||||
copy_skip:
|
||||
a=ram[src+1]; //+ lda src+1
|
||||
pha(); // pha
|
||||
a=ram[src]; // lda src
|
||||
pha(); // pha
|
||||
printf("\tSAVED SRC: %02X%02X\n",ram[src+1],ram[src]);
|
||||
// printf("CALCULATING: DST %02X%02X - DELTA %02X%02X\n",ram[dst+1],ram[dst],ram[delta+1],ram[delta]);
|
||||
c=1; // sec
|
||||
a=ram[dst]; // lda dst
|
||||
sbc(ram[delta]); // sbc delta
|
||||
ram[src]=a; // sta src
|
||||
a=ram[dst+1]; // lda dst+1
|
||||
sbc(ram[delta+1]); // sbc delta+1
|
||||
ram[src+1]=a; // sta src+1
|
||||
printf("\tNEW SRC: %02X%02X\n",ram[src+1],ram[src]);
|
||||
docopy(); // jsr docopy
|
||||
pla(); // pla
|
||||
ram[src]=a; // sta src
|
||||
pla(); // pla
|
||||
ram[src+1]=a; // sta src+1
|
||||
printf("\tRESTORED SRC: %02X%02X\n",ram[src+1],ram[src]);
|
||||
goto parsetoken; // jmp parsetoken
|
||||
|
||||
done:
|
||||
pla(); // pla
|
||||
|
||||
|
||||
int out_size=(ram[dst+1]<<8)+ram[dst];
|
||||
out_size-=ORGOFFSET;
|
||||
|
||||
printf("dest addr : %02X%02X\n",ram[dst+1],ram[dst]);
|
||||
|
||||
int i,j,addr,temp;
|
||||
addr=ORGOFFSET;
|
||||
|
||||
printf("\n");
|
||||
for(i=0;i<256;i++) {
|
||||
if (i%16==0) printf("%04X: ",addr+i);
|
||||
printf("%02X ",ram[addr+i]);
|
||||
if (i%16==15) {
|
||||
for(j=0;j<16;j++) {
|
||||
temp=ram[((addr+i)&0xfff0)+j];
|
||||
if ((temp<' ') || (temp>127)) printf(".");
|
||||
else printf("%c",temp);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
// rts
|
||||
|
||||
fff=fopen("out.out","w");
|
||||
if (fff==NULL) {
|
||||
fprintf(stderr,"Error opening!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Out size=%d\n",out_size);
|
||||
|
||||
fwrite(&ram[ORGOFFSET],1,out_size,fff);
|
||||
|
||||
fclose(fff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_both_pages(void) {
|
||||
int i;
|
||||
|
||||
for(i=0;i<ram[CH];i++) printf(" ");
|
||||
|
||||
y=0;
|
||||
|
||||
while(1) {
|
||||
a=ram[y_indirect(OUTL,y)];
|
||||
if (a==0) break;
|
||||
printf("%c",a);
|
||||
y++;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
static void print_header_info(void) {
|
||||
|
||||
ram[CV]=a;
|
||||
|
||||
y++;
|
||||
a=y;
|
||||
y=0;
|
||||
c=0;
|
||||
adc(ram[OUTL]);
|
||||
ram[OUTL]=a;
|
||||
a=ram[OUTH];
|
||||
adc(0);
|
||||
ram[OUTH]=a;
|
||||
|
||||
a=ram[y_indirect(OUTL,y)];
|
||||
ram[CH]=a;
|
||||
|
||||
ram[OUTL]++;
|
||||
if (ram[OUTL]==0) ram[OUTH]++;
|
||||
|
||||
print_both_pages();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
FILE *fff;
|
||||
int size;
|
||||
|
||||
init_6502();
|
||||
|
||||
if (argc<2) {
|
||||
fprintf(stderr,"\nUsage: %s filename\n\n",argv[0]);
|
||||
}
|
||||
|
||||
fff=fopen(argv[1],"r");
|
||||
if (fff==NULL) {
|
||||
fprintf(stderr,"Error opening %s!\n",argv[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
size=fread(input,sizeof(unsigned char),MAX_INPUT,fff);
|
||||
printf("Read %d bytes\n",size);
|
||||
|
||||
fclose(fff);
|
||||
|
||||
memcpy(&ram[LZ4_BUFFER],input,size);
|
||||
|
||||
a=high(LZ4_BUFFER);
|
||||
ram[OUTH]=a;
|
||||
a=low(LZ4_BUFFER);
|
||||
ram[OUTL]=a;
|
||||
|
||||
y=3;
|
||||
|
||||
a=20;
|
||||
print_header_info();
|
||||
|
||||
a=21;
|
||||
print_header_info();
|
||||
printf("\n");
|
||||
|
||||
a=23;
|
||||
print_header_info();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user