diff src/gb/gbPrinter.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/gb/gbPrinter.cpp	Sat Mar 03 10:31:27 2012 -0600
     1.3 @@ -0,0 +1,234 @@
     1.4 +#include <cstdio>
     1.5 +#include <cstring>
     1.6 +
     1.7 +#include "../common/System.h"
     1.8 +#include "gbPrinter.h"
     1.9 +
    1.10 +u8  gbPrinterStatus = 0;
    1.11 +int gbPrinterState  = 0;
    1.12 +u8  gbPrinterData[0x280*9];
    1.13 +u8  gbPrinterPacket[0x400];
    1.14 +int gbPrinterCount     = 0;
    1.15 +int gbPrinterDataCount = 0;
    1.16 +int gbPrinterDataSize  = 0;
    1.17 +int gbPrinterResult    = 0;
    1.18 +
    1.19 +bool gbPrinterCheckCRC()
    1.20 +{
    1.21 +	u16 crc = 0;
    1.22 +
    1.23 +	for (int i = 2; i < (6+gbPrinterDataSize); i++)
    1.24 +	{
    1.25 +		crc += gbPrinterPacket[i];
    1.26 +	}
    1.27 +
    1.28 +	int msgCrc = gbPrinterPacket[6+gbPrinterDataSize] +
    1.29 +	             (gbPrinterPacket[7+gbPrinterDataSize]<<8);
    1.30 +
    1.31 +	return msgCrc == crc;
    1.32 +}
    1.33 +
    1.34 +void gbPrinterReset()
    1.35 +{
    1.36 +	gbPrinterState     = 0;
    1.37 +	gbPrinterDataSize  = 0;
    1.38 +	gbPrinterDataCount = 0;
    1.39 +	gbPrinterCount     = 0;
    1.40 +	gbPrinterStatus    = 0;
    1.41 +	gbPrinterResult    = 0;
    1.42 +}
    1.43 +
    1.44 +void gbPrinterShowData()
    1.45 +{
    1.46 +	systemGbPrint(gbPrinterData,
    1.47 +	              gbPrinterPacket[6],
    1.48 +	              gbPrinterPacket[7],
    1.49 +	              gbPrinterPacket[8],
    1.50 +	              gbPrinterPacket[9]);
    1.51 +	/*
    1.52 +	   allegro_init();
    1.53 +	   install_keyboard();
    1.54 +	   set_gfx_mode(GFX_AUTODETECT, 160, 144, 0, 0);
    1.55 +	   PALETTE pal;
    1.56 +	   pal[0].r = 255;
    1.57 +	   pal[0].g = 255;
    1.58 +	   pal[0].b = 255;
    1.59 +	   pal[1].r = 168;
    1.60 +	   pal[1].g = 168;
    1.61 +	   pal[1].b = 168;
    1.62 +	   pal[2].r = 96;
    1.63 +	   pal[2].g = 96;
    1.64 +	   pal[2].b = 96;
    1.65 +	   pal[3].r = 0;
    1.66 +	   pal[3].g = 0;
    1.67 +	   pal[3].b = 0;
    1.68 +	   set_palette(pal);
    1.69 +	   acquire_screen();
    1.70 +	   u8 *data = gbPrinterData;
    1.71 +	   for(int y = 0; y < 0x12; y++) {
    1.72 +	   for(int x = 0; x < 0x14; x++) {
    1.73 +	    for(int k = 0; k < 8; k++) {
    1.74 +	      int a = *data++;
    1.75 +	      int b = *data++;
    1.76 +	      for(int j = 0; j < 8; j++) {
    1.77 +	        int mask = 1 << (7-j);
    1.78 +	        int c = 0;
    1.79 +	        if(a & mask)
    1.80 +	          c++;
    1.81 +	        if(b & mask)
    1.82 +	          c+=2;
    1.83 +	        putpixel(screen, x*8+j, y*8+k, c);
    1.84 +	      }
    1.85 +	    }
    1.86 +	   }
    1.87 +	   }
    1.88 +	   release_screen();
    1.89 +	   while(!keypressed()) {
    1.90 +	   }
    1.91 +	 */
    1.92 +}
    1.93 +
    1.94 +void gbPrinterReceiveData()
    1.95 +{
    1.96 +	if (gbPrinterPacket[3]) // compressed
    1.97 +	{
    1.98 +		u8 *data = &gbPrinterPacket[6];
    1.99 +		u8 *dest = &gbPrinterData[gbPrinterDataCount];
   1.100 +		int len  = 0;
   1.101 +		while (len < gbPrinterDataSize)
   1.102 +		{
   1.103 +			u8 control = *data++;
   1.104 +			if (control & 0x80) // repeated data
   1.105 +			{
   1.106 +				control &= 0x7f;
   1.107 +				control += 2;
   1.108 +				memset(dest, *data++, control);
   1.109 +				len  += control;
   1.110 +				dest += control;
   1.111 +			}
   1.112 +			else // raw data
   1.113 +			{
   1.114 +				control++;
   1.115 +				memcpy(dest, data, control);
   1.116 +				dest += control;
   1.117 +				data += control;
   1.118 +				len  += control;
   1.119 +			}
   1.120 +		}
   1.121 +	}
   1.122 +	else
   1.123 +	{
   1.124 +		memcpy(&gbPrinterData[gbPrinterDataCount],
   1.125 +		       &gbPrinterPacket[6],
   1.126 +		       gbPrinterDataSize);
   1.127 +		gbPrinterDataCount += gbPrinterDataSize;
   1.128 +	}
   1.129 +}
   1.130 +
   1.131 +void gbPrinterCommand()
   1.132 +{
   1.133 +	switch (gbPrinterPacket[2])
   1.134 +	{
   1.135 +	case 0x01:
   1.136 +		// reset/initialize packet
   1.137 +		gbPrinterDataCount = 0;
   1.138 +		gbPrinterStatus    = 0;
   1.139 +		break;
   1.140 +	case 0x02:
   1.141 +		// print packet
   1.142 +		gbPrinterShowData();
   1.143 +		break;
   1.144 +	case 0x04:
   1.145 +		// data packet
   1.146 +		gbPrinterReceiveData();
   1.147 +		break;
   1.148 +	case 0x0f:
   1.149 +		// NUL packet
   1.150 +		break;
   1.151 +	}
   1.152 +}
   1.153 +
   1.154 +u8 gbPrinterSend(u8 byte)
   1.155 +{
   1.156 +	switch (gbPrinterState)
   1.157 +	{
   1.158 +	case 0:
   1.159 +		gbPrinterCount = 0;
   1.160 +		// receiving preamble
   1.161 +		if (byte == 0x88)
   1.162 +		{
   1.163 +			gbPrinterPacket[gbPrinterCount++] = byte;
   1.164 +			gbPrinterState++;
   1.165 +		}
   1.166 +		else
   1.167 +		{
   1.168 +			// todo: handle failure
   1.169 +			gbPrinterReset();
   1.170 +		}
   1.171 +		break;
   1.172 +	case 1:
   1.173 +		// receiving preamble
   1.174 +		if (byte == 0x33)
   1.175 +		{
   1.176 +			gbPrinterPacket[gbPrinterCount++] = byte;
   1.177 +			gbPrinterState++;
   1.178 +		}
   1.179 +		else
   1.180 +		{
   1.181 +			// todo: handle failure
   1.182 +			gbPrinterReset();
   1.183 +		}
   1.184 +		break;
   1.185 +	case 2:
   1.186 +		// receiving header
   1.187 +		gbPrinterPacket[gbPrinterCount++] = byte;
   1.188 +		if (gbPrinterCount == 6)
   1.189 +		{
   1.190 +			gbPrinterState++;
   1.191 +			gbPrinterDataSize = gbPrinterPacket[4] + (gbPrinterPacket[5]<<8);
   1.192 +		}
   1.193 +		break;
   1.194 +	case 3:
   1.195 +		// receiving data
   1.196 +		if (gbPrinterDataSize)
   1.197 +		{
   1.198 +			gbPrinterPacket[gbPrinterCount++] = byte;
   1.199 +			if (gbPrinterCount == (6+gbPrinterDataSize))
   1.200 +			{
   1.201 +				gbPrinterState++;
   1.202 +			}
   1.203 +			break;
   1.204 +		}
   1.205 +		gbPrinterState++;
   1.206 +	// intentionally move to next if no data to receive
   1.207 +	case 4:
   1.208 +		// receiving CRC
   1.209 +		gbPrinterPacket[gbPrinterCount++] = byte;
   1.210 +		gbPrinterState++;
   1.211 +		break;
   1.212 +	case 5:
   1.213 +		// receiving CRC-2
   1.214 +		gbPrinterPacket[gbPrinterCount++] = byte;
   1.215 +		if (gbPrinterCheckCRC())
   1.216 +		{
   1.217 +			gbPrinterCommand();
   1.218 +		}
   1.219 +		gbPrinterState++;
   1.220 +		break;
   1.221 +	case 6:
   1.222 +		// receiving dummy 1
   1.223 +		gbPrinterPacket[gbPrinterCount++] = byte;
   1.224 +		gbPrinterResult = 0x81;
   1.225 +		gbPrinterState++;
   1.226 +		break;
   1.227 +	case 7:
   1.228 +		// receiving dummy 2
   1.229 +		gbPrinterPacket[gbPrinterCount++] = byte;
   1.230 +		gbPrinterResult = gbPrinterStatus;
   1.231 +		gbPrinterState  = 0;
   1.232 +		gbPrinterCount  = 0;
   1.233 +		break;
   1.234 +	}
   1.235 +	return gbPrinterResult;
   1.236 +}
   1.237 +