diff --git a/gr-sim/6502_emulate.c b/gr-sim/6502_emulate.c index 9ad47a92..d7ab117a 100644 --- a/gr-sim/6502_emulate.c +++ b/gr-sim/6502_emulate.c @@ -89,13 +89,19 @@ void cmp(int value) { int temp_a; int temp_value; + int result; temp_a=a&0xff; - temp_value=value&0xff; - temp_a=temp_a-temp_value; - c=(temp_a&0x100)>>8; - n=(temp_a&0x80)>>7; - z=(a==0); + temp_value=(~value)&0xff; + + result=temp_a+temp_value+1; + + c=(result&0x100)>>8; + + result&=0xff; + + n=(result&0x80)>>7; + z=(result==0); } void pha(void) { @@ -109,3 +115,14 @@ void pla(void) { a=ram[sp]; sp++; } + +void lsr(void) { + int temp_a; + + temp_a=a; + temp_a&=0xff; + temp_a=temp_a>>1; + + a=(temp_a&0xff); +// printf("LSR A=%x\n",a); +} diff --git a/gr-sim/6502_emulate.h b/gr-sim/6502_emulate.h index 321eb39f..4eeaeb69 100644 --- a/gr-sim/6502_emulate.h +++ b/gr-sim/6502_emulate.h @@ -11,4 +11,4 @@ void sbc(int value); void cmp(int value); void pha(void); void pla(void); - +void lsr(void); diff --git a/gr-sim/l4d.c b/gr-sim/l4d.c index 023c314a..33cd9aee 100644 --- a/gr-sim/l4d.c +++ b/gr-sim/l4d.c @@ -38,6 +38,7 @@ void buildcount(void) { if (z==0) goto done_buildcount; // bne ++ minus_buildcount: ram[count]=a; //- sta count + printf("MBC "); getsrc(); //jsr getsrc x=a; //tax c=0; //clc @@ -46,14 +47,13 @@ minus_buildcount: ram[count+1]++; //inc count+1 skip_buildcount: x++; //+ inx - x&=0xff; if (x==0) goto minus_buildcount; //beq - done_buildcount: ; //++ rts } static void putdst(void) { - printf("PUTADDR=%04X\n",y_indirect(dst,y)); +// printf("PUTADDR=%04X\n",y_indirect(dst,y)); // putdst: ram[y_indirect(dst,y)]=a; // sta (dst), y ram[dst]++; // inc dst @@ -61,12 +61,12 @@ static void putdst(void) { ram[dst+1]++; // inc dst+1 putdst_end:; //+ rts - printf("PUT: %02X%02X-1,%02X = %02X\n",ram[dst+1],ram[dst],y,a); - printf("0x8000 = %02X\n",ram[0x8000]); + printf("\tPUT: %02X%02X-1,%02X = %02X\n",ram[dst+1],ram[dst],y,a); } static void getput(void) { // getput: + printf("GP "); getsrc(); // jsr getsrc putdst(); // ; fallthrough } @@ -117,8 +117,8 @@ int main(int argc, char **argv) { //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 = 0x2008; // 8 byte offset to data? + paksize = size-0xb-8; //size of packed data, you must set this by yourself if hiunp=0 + pakoff = 0x200b; // 11 byte offset to data? //LCBANK2 = $c083 @@ -137,10 +137,20 @@ int main(int argc, char **argv) { a=(orgoff&0xff); //lda #>=1; // lsr - a>>=1; // lsr - a>>=1; // lsr - a>>=1; // lsr - a&=0xff; + lsr(); // lsr + lsr(); // lsr + lsr(); // lsr + lsr(); // lsr if (a==0) goto copymatches; // beq copymatches buildcount(); // jsr buildcount @@ -173,10 +183,13 @@ parsetoken: } copymatches: + printf("CM1 "); getsrc(); // jsr getsrc ram[delta]=a; // sta delta + printf("CM1 "); getsrc(); // jsr getsrc ram[delta+1]=a; // sta delta+1 + printf("DELTA is %02X%02X\n",ram[delta+1],ram[delta]); pla(); // pla a=a&0xf; // and #$0f buildcount(); // jsr buildcount @@ -190,31 +203,64 @@ copy_skip: pha(); // pha a=ram[src]; // lda src pha(); // pha + printf("SAVED 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+a]=a; // sta src+1 + ram[src+1]=a; // sta src+1 + printf("NEW 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("RESTORED SRC: %02X%02X\n",ram[src+1],ram[src]); goto parsetoken; // jmp parsetoken done: pla(); // pla - int i; + int out_size=(ram[dst+1]<<8)+ram[dst]; + out_size-=0x8000; + + printf("dest addr : %02X%02X\n",ram[dst+1],ram[dst]); + + int i,j,addr,temp; + addr=0x8000; + + printf("\n"); for(i=0;i<256;i++) { - if (i%16==0) printf("\n%04X: ",0x8000+i); - printf("%02X ",ram[0x8000+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[0x8000],1,out_size,fff); + + fclose(fff); + return 0; }