Exemple #1
0
static void blit(const char *fps, const char *notice)
{
	int emu_opt = currentConfig.EmuOpt;

	if (PicoOpt&0x10)
	{
		int lines_flags = 224;
		// 8bit fast renderer
		if (Pico.m.dirtyPal) {
			Pico.m.dirtyPal = 0;
			vidConvCpyRGB565(localPal, Pico.cram, 0x40);
		}
		if (!(Pico.video.reg[12]&1)) lines_flags|=0x10000;
		if (currentConfig.EmuOpt&0x4000)
			lines_flags|=0x40000; // (Pico.m.frame_count&1)?0x20000:0x40000;
		vidCpy8to16((unsigned short *)giz_screen+321*8, PicoDraw2FB+328*8, localPal, lines_flags);
	}
	else if (!(emu_opt&0x80))
	{
		int lines_flags;
		// 8bit accurate renderer
		if (Pico.m.dirtyPal) {
			Pico.m.dirtyPal = 0;
			vidConvCpyRGB565(localPal, Pico.cram, 0x40);
			if (Pico.video.reg[0xC]&8) { // shadow/hilight mode
				//vidConvCpyRGB32sh(localPal+0x40, Pico.cram, 0x40);
				//vidConvCpyRGB32hi(localPal+0x80, Pico.cram, 0x40); // TODO?
				blockcpy(localPal+0xc0, localPal+0x40, 0x40*2);
				localPal[0xc0] = 0x0600;
				localPal[0xd0] = 0xc000;
				localPal[0xe0] = 0x0000; // reserved pixels for OSD
				localPal[0xf0] = 0xffff;
			}
			/* no support
			else if (rendstatus & 0x20) { // mid-frame palette changes
				vidConvCpyRGB565(localPal+0x40, HighPal, 0x40);
				vidConvCpyRGB565(localPal+0x80, HighPal+0x40, 0x40);
			} */
		}
		lines_flags = (Pico.video.reg[1]&8) ? 240 : 224;
		if (!(Pico.video.reg[12]&1)) lines_flags|=0x10000;
		if (currentConfig.EmuOpt&0x4000)
			lines_flags|=0x40000; // (Pico.m.frame_count&1)?0x20000:0x40000;
		vidCpy8to16((unsigned short *)giz_screen+321*8, PicoDraw2FB+328*8, localPal, lines_flags);
	}

	if (notice || (emu_opt & 2)) {
		int h = 232;
		if (notice)      osd_text(4, h, notice);
		if (emu_opt & 2) osd_text(OSD_FPS_X, h, fps);
	}

	if ((emu_opt & 0x400) && (PicoMCD & 1))
		cd_leds();
}
Exemple #2
0
// NMEA parseri
// Sy�tteen� merkkijonon osoite ja pituus.
// esim. yhden merkin sy�tt�: vNMEAParser(&merkki, 1);
void vNMEAParser(const char* Chr, int Len) {
	static unsigned int Index=0;
	static unsigned char Checksum;
	static unsigned char RCDChecksum;
	static int ChecksumCount;
	static char NMEAMessage[100];
	static int Commas;

	while (Len--) {
		if (*Chr=='$') {				// Paketti alkaa '$' merkist�
			Index=1;
			Checksum=0;
			ChecksumCount = 0;
			Commas = 0;
		}
		else if (Index) {				// Paketin vastaanotto meneill��n
			if (ChecksumCount) {		// Tarkistussumman vastanotto meneill��n
				if (ChecksumCount==1) {
					RCDChecksum = (*Chr&0xc0?(*Chr&0x07)+9:*Chr-'0')<<4;
					ChecksumCount++;
				}
				else {					// Tarkistussumman toinen merkki, senj�lkeen voikin purkaa paketin
					RCDChecksum |= (*Chr&0xc0?(*Chr&0x7)+9:*Chr-'0')&0x0f;
					if (RCDChecksum==Checksum) {
						if (!strcmp ( NMEAMessage, "GPGGA")) {	 // GPGGA
							if (Commas==14) {
								char* ind = NMEAMessage;
								ind += strlen(ind)+1;
								// Muteksi p��lle?
								ind += blockcpy(GGAFixTaken, ind, sizeof(GGAFixTaken));
								ind += blockcpy(GGALatitude, ind,  sizeof(GGALatitude));
								ind += blockcpy(GGALatitudeNS, ind, sizeof(GGALatitudeNS));
								ind += blockcpy(GGALongitude, ind, sizeof(GGALongitude));
								ind += blockcpy(GGALongitudeEW, ind, sizeof(GGALongitudeEW));
								ind += blockcpy(GGAFixQuality, ind, sizeof(GGAFixQuality));
								ind += blockcpy(GGANumberOfSatellites, ind, sizeof(GGANumberOfSatellites));
								ind += blockcpy(GGAHorizontalDilutionOfPosition, ind, sizeof(GGAHorizontalDilutionOfPosition));
								ind += blockcpy(GGAAltitude, ind, sizeof(GGAAltitude));
								ind += blockcpy(GGAAltitudeUnit, ind, sizeof(GGAAltitudeUnit));
								ind += blockcpy(GGAHeightOfGeoid, ind, sizeof(GGAHeightOfGeoid));
								ind += blockcpy(GGAHeightOfGeoidUnit, ind, sizeof(GGAHeightOfGeoidUnit));
								ind += blockcpy(GGALastDGPSUpdate, ind, sizeof(GGALastDGPSUpdate));
								blockcpy(GGADGPSStationID, ind, sizeof(GGADGPSStationID));
								// Valmis! Mutexi pois ja ilmoitellaan semafoorilla jonnekin tms?
							}
						}
						else if (!strcmp ( NMEAMessage, "GPRMC")) {	// GPRMC
							if (Commas==11) {
								char* ind = NMEAMessage;
								ind += strlen(ind)+1;
								// Muteksi p��lle?
								ind += blockcpy(RMCFixTaken, ind, sizeof(RMCFixTaken));
								ind += blockcpy(RMCStatus, ind, sizeof(RMCStatus));
								ind += blockcpy(RMCLatitude, ind, sizeof(RMCLatitude));
								ind += blockcpy(RMCLatitudeNS, ind, sizeof(RMCLatitudeNS));
								ind += blockcpy(RMCLongitude, ind, sizeof(RMCLongitude));
								ind += blockcpy(RMCLongitudeEW, ind, sizeof(RMCLongitudeEW));
								ind += blockcpy(RMCSpeed, ind, sizeof(RMCSpeed));
								ind += blockcpy(RMCTrackangle, ind, sizeof(RMCTrackangle));
								ind += blockcpy(RMCDate, ind, sizeof(RMCDate));
								ind += blockcpy(RMCMagneticVariation, ind, sizeof(RMCMagneticVariation));
								blockcpy(RMCMagneticVariationEW, ind, sizeof(RMCMagneticVariationEW));
								// Valmis!
							}
						}
					}
					Index=0;
				}
			}
			else if (*Chr=='*') {	 	// Paketti loppuu, vastaanotetaan viel� tarkistussumma.
				NMEAMessage[Index-1]=0;
				ChecksumCount++;
			}
			else {
				if (Index<sizeof(NMEAMessage)) {
					if (*Chr==',') {
						NMEAMessage[Index++-1]=0;
						Commas++;
					}
					else NMEAMessage[Index++-1]=*Chr;
					Checksum ^= *Chr;
				}
				else Index=0;		// Liian pitk�, ei mahdu taulukkoon
			}
		}
		Chr++;
	}
}