1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
/*
* Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
*
* (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and
* Jerremy Koot (jkoot@snes9x.com)
*
* Super FX C emulator code
* (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and
* Gary Henderson.
* Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_.
*
* DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson.
* C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_.
* C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com).
*
* DOS port code contains the works of other authors. See headers in
* individual files.
*
* Snes9x homepage: http://www.snes9x.com
*
* Permission to use, copy, modify and distribute Snes9x in both binary and
* source form, for non-commercial purposes, is hereby granted without fee,
* providing that this license information and copyright notice appear with
* all copies and any derived work.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event shall the authors be held liable for any damages
* arising from the use of this software.
*
* Snes9x is freeware for PERSONAL USE only. Commercial users should
* seek permission of the copyright holders first. Commercial use includes
* charging money for Snes9x or software derived from Snes9x.
*
* The copyright holders request that bug fixes and improvements to the code
* should be forwarded to them so everyone can benefit from the modifications
* in future versions.
*
* Super NES and Super Nintendo Entertainment System are trademarks of
* Nintendo Co., Limited and its subsidiary companies.
*/
#include <allegro.h>
#undef TRUE
#undef FALSE
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <dpmi.h>
#include <go32.h>
#include "snes9x.h"
#include "memmap.h"
#include "debug.h"
#include "ppu.h"
#include "snapshot.h"
#include "gfx.h"
#include "display.h"
#include "apu.h"
#include "soundux.h"
extern BITMAP *off_screen;
extern uint32 last_rendered_width;
extern uint32 last_rendered_height;
void SaveScreenshot ()
{
char FilePCX [512];
char FileNAME [255], FileDIR [255], FileDRIVE [_MAX_DRIVE], FileEXT [255];
int i, numpos;
char HexDig [17] = "0123456789ABCDEF";
BITMAP *bmp;
_splitpath (Memory.ROMFilename, FileDRIVE, FileDIR, FileNAME, FileEXT);
if (strlen (FileNAME) <= 8)
{
for (i = strlen (FileNAME); i < 8 ; i++)
FileNAME [i] = '_';
FileNAME [8] = 0; // We extended the filename... Truncate it at 8.
numpos = 6;
}
else
{
numpos = strlen (FileNAME);
// Make sure our extending terminates properly.
FileNAME [numpos + 1] = FileNAME [numpos + 2]=0;
}
i = 0;
while (i <= 0xff) // Find an open slot. 0-FF.
{
FileNAME [numpos] = HexDig [i >> 4];
FileNAME [numpos + 1] = HexDig [i & 0xf];
_makepath (FilePCX, FileDRIVE, FileDIR, FileNAME, "pcx");
if (!exists (FilePCX))
break;
else
i++;
}
// There. We have a decent filename, now save the damned thing!
uint16 Brightness = IPPU.MaxBrightness * 138;
PALLETE p;
for (int i = 0; i < 256; i++)
{
p[i].r = (((PPU.CGDATA [i] >> 0) & 0x1F) * Brightness) >> 10;
p[i].g = (((PPU.CGDATA [i] >> 5) & 0x1F) * Brightness) >> 10;
p[i].b = (((PPU.CGDATA [i] >> 10) & 0x1F) * Brightness) >> 10;
}
bmp = create_sub_bitmap (off_screen, 0, 0, last_rendered_width,
last_rendered_height);
save_bitmap (FilePCX, bmp, p);
destroy_bitmap (bmp);
}
|