diff --git a/src/libraw2crtc.c b/src/libraw2crtc.c index fab2c5eb..fac698d8 100644 --- a/src/libraw2crtc.c +++ b/src/libraw2crtc.c @@ -31,14 +31,16 @@ unsigned short addrCalc(unsigned char vcc, unsigned char rcc, unsigned char hcc, unsigned char mode0interlace(T_IO_Context * context, unsigned char x, unsigned char y) { + // bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + // p0b0 p1b0 p0b2 p1b2 p0b1 p1b1 p0b3 p1b3 unsigned char mode0pixel[] = {0, 64, 4, 68, 16, 80, 20, 84, 1, 65, 5, 69, 17, 81, 21, 85}; - return mode0pixel[Get_pixel(context,x,y)] << 1 | mode0pixel[Get_pixel(context,x+1,y)]; + return mode0pixel[Get_pixel(context,x,y) & 0xf] << 1 | mode0pixel[Get_pixel(context,x+1,y) & 0xf]; } unsigned char mode1interlace(T_IO_Context * context, unsigned char x, unsigned char y) { unsigned char mode1pixel[] = {0, 16, 1, 17}; - return mode1pixel[Get_pixel(context,x,y)] << 3 | mode1pixel[Get_pixel(context,x+1,y)] << 2 | mode1pixel[Get_pixel(context,x+2,y)] << 1 | mode1pixel[Get_pixel(context,x+3,y)]; + return mode1pixel[Get_pixel(context,x,y) & 3] << 3 | mode1pixel[Get_pixel(context,x+1,y) & 3] << 2 | mode1pixel[Get_pixel(context,x+2,y) & 3] << 1 | mode1pixel[Get_pixel(context,x+3,y) & 3]; } unsigned char mode2interlace(T_IO_Context * context, unsigned char x, unsigned char y) @@ -52,11 +54,9 @@ unsigned char mode2interlace(T_IO_Context * context, unsigned char x, unsigned c unsigned char mode3interlace(T_IO_Context * context, unsigned char x, unsigned char y) { unsigned char mode3pixel[] = {0, 16, 1, 17}; - return mode3pixel[Get_pixel(context, x,y)] << 3 | mode3pixel[Get_pixel(context,x+1,y)] << 2; + return mode3pixel[Get_pixel(context, x,y) & 3] << 3 | mode3pixel[Get_pixel(context,x+1,y) & 3] << 2; } -unsigned char (*ptrMode)(T_IO_Context * context, unsigned char x, unsigned char y); - unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char r9, unsigned long *outSize, unsigned char *r1, unsigned char r12, unsigned char r13) { unsigned char *outBuffer; @@ -66,11 +66,8 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char unsigned char minAddrIsDefined = 0; unsigned short maxAddr = 0; - int y,x; + int i, y,x; unsigned char r6; - unsigned short i; - unsigned char *ptrTmp; - unsigned char *ptrOut; unsigned char vcc; unsigned char rcc; unsigned char hcc; @@ -78,7 +75,9 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char int width = context->Width; int height = context->Height; - + + unsigned char (*ptrMode)(T_IO_Context * context, unsigned char x, unsigned char y); + switch(mode) { case 0: @@ -111,14 +110,14 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char } } - tmpBuffer = (unsigned char*)malloc(0xFFFF); + tmpBuffer = (unsigned char*)malloc(0x10000); if (tmpBuffer == NULL) { fprintf(stderr, "failed to allocate tmpBuffer\n"); exit(4); } - allocationBuffer = (unsigned char*)malloc(0xFFFF); + allocationBuffer = (unsigned char*)malloc(0x10000); if(allocationBuffer == NULL) { fprintf(stderr, "failed to allocate allocationBuffer\n"); @@ -136,16 +135,18 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char { for(cclk = 0; cclk < 2; cclk++) { + unsigned short addr; x = (hcc << 1 | cclk); y = vcc*(r9+1) + rcc; - *(tmpBuffer + addrCalc(vcc, rcc, hcc, cclk, *r1, r12, r13)) = (*ptrMode)(context,x,y); - *(allocationBuffer + addrCalc(vcc, rcc, hcc, cclk, *r1, r12, r13)) += 1; + addr = addrCalc(vcc, rcc, hcc, cclk, *r1, r12, r13); + tmpBuffer[addr] = (*ptrMode)(context,x,y); + allocationBuffer[addr] += 1; } } } } - for(i = 0; i < 0xFFFF; i++) + for(i = 0; i < 0x10000; i++) { if(*(allocationBuffer + i) > 1) { @@ -154,11 +155,11 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char if(*(allocationBuffer + i) > 0) { maxAddr = i; - } - if((*(allocationBuffer + i) == 1) && (minAddrIsDefined == 0)) - { - minAddr = i; - minAddrIsDefined = 1; + if(minAddrIsDefined == 0) + { + minAddr = i; + minAddrIsDefined = 1; + } } } @@ -171,13 +172,7 @@ unsigned char *raw2crtc(T_IO_Context *context, unsigned char mode, unsigned char exit(4); } - ptrTmp = tmpBuffer + minAddr; - ptrOut = outBuffer; - - for(i = minAddr; i <= maxAddr; i++) - { - *(ptrOut++) = *(ptrTmp++); - } + memcpy(outBuffer, tmpBuffer + minAddr, *outSize); free(tmpBuffer); tmpBuffer = NULL;