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(); }
// 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++; } }