From 4ae00f4e9d93b334fd4c49e533783e5fc195cf3d Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Wed, 14 Feb 2018 00:41:23 -0500 Subject: [PATCH] mockingboard: work on lz4 decoder --- gr-sim/Makefile | 14 +++- gr-sim/l4d.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 gr-sim/l4d.c diff --git a/gr-sim/Makefile b/gr-sim/Makefile index a86bab26..8a18ff46 100644 --- a/gr-sim/Makefile +++ b/gr-sim/Makefile @@ -6,7 +6,8 @@ SDL_LIBS= `sdl-config --libs` 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 + tfv mode7_demo text text_demo tfv_multiply rasterbars rasterbars_fixed \ + l4d #### Library @@ -29,6 +30,14 @@ fade.o: fade.c demo_title.c #### +l4d: l4d.o gr-sim.o tfv_utils.o gr_fast_clear.o + $(CC) $(LFLAGS) $(SDL_LIBS) -o l4d l4d.o gr-sim.o gr_fast_clear.o tfv_utils.o + +l4d.o: l4d.c demo_title.c + $(CC) $(CFLAGS) -c l4d.c + +#### + fixed_point: fixed_point.o $(CC) $(LFLAGS) -o fixed_point fixed_point.o @@ -211,6 +220,7 @@ gr-sim.o: gr-sim.c gr-sim.h apple2_font.h 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 + rasterbars rasterbars_fixed lookup_tables text_demo \ + l4d diff --git a/gr-sim/l4d.c b/gr-sim/l4d.c new file mode 100644 index 00000000..1dd76ba7 --- /dev/null +++ b/gr-sim/l4d.c @@ -0,0 +1,204 @@ +#include +#include + +#include "gr-sim.h" + +#define MAX_INPUT 65536 +static unsigned char input[MAX_INPUT]; + +#define src 0x0 +#define dst 0x2 +#define end 0x4 +#define count 0x6 +#define delta 0x8 +#define A1L 0x3c +#define A1H 0x3d +#define A2L 0x3e +#define A2H 0x3f +#define A4L 0x42 +#define A4H 0x43 + +static short s; + +void getsrc(void) { +//getsrc: + a=ram[y_indirect(src,y)]; // lda (src), y + ram[src]++; //inc src + if (ram[src]!=0) goto done_getsrc; //bne + + ram[src+1]++; //inc src+1 +done_getsrc: ; + //+ rts +} + +static void pha(void) { + + s--; + ram[s]=a; +} + +static void pla(void) { + + a=ram[s]; + s++; +} + +void buildcount(void) { + + int cnew,c; + +//buildcount: + x=1; // ldx #1 + ram[count+1]=x; //stx count+1 + if (a!=0xf) goto done_buildcount; //cmp #$0f + //bne ++ +minus_buildcount: + ram[count]=a; //- sta count + getsrc(); //jsr getsrc + x=a; //tax + c=0; //clc + cnew=(a+ram[count]+c)>0xff; + a=a+ram[count]+c; //adc count + if (cnew) goto skip_buildcount; // bcc + + ram[count+1]++; //inc count+1 +skip_buildcount: + x++; //+ inx + x&=0xf; + if (x==0) goto minus_buildcount; //beq - +done_buildcount: ; //++ rts +} + +int main(int argc, char **argv) { + + FILE *fff; + int size; + short orgoff,paksize,pakoff; + + fff=fopen("../mockingboard/outi.raw.lz4","r"); + if (fff==NULL) { + fprintf(stderr,"Error opening!\n"); + return -1; + } + + size=fread(input,sizeof(unsigned char),MAX_INPUT,fff); + printf("Read %d bytes\n",size); + + fclose(fff); + + memcpy(&ram[0x2000],input,size); + + s=0x1ff; + + //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 = 0x8000; //offset of first unpacked byte, you must set this by yourself + paksize = size; //size of packed data, you must set this by yourself if hiunp=0 + pakoff = 0x2000; + + +//LCBANK2 = $c083 +//MOVE = $fe2c + + a=(pakoff&0xff); //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 #