#include #include #include "6502_emulate.h" #define MAX_INPUT 65536 static unsigned char input[MAX_INPUT]; #define LZ4_BUFFER 0x2000 #define ORGOFFSET 0x6000 #define end 0x4 #define LZ4_SRC 0x00 #define LZ4_DST 0x02 #define LZ4_END 0x04 #define COUNT 0x06 #define DELTA 0x08 #define CH 0x24 #define CV 0x25 #define OUTL 0xFE #define OUTH 0xFF static int cycles; static void getsrc(void) { //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) { //buildcount: 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; 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: 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) { // 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:; cycles+=6; //+ rts } static void getput(void) { // getput: getsrc(); // jsr getsrc cycles+=6; putdst(); // ; fallthrough } static void docopy(void) { // docopy: docopy_label: 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; cycles=0; //LZ4 data decompressor for Apple II //Peter Ferrie (peter.ferrie@gmail.com) // lz4_decode: 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 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 #