mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-08 20:05:13 +01:00
sound rendering test, updated DOS/Win32 ports
This commit is contained in:
parent
831c9642d3
commit
fefc260ec4
@ -196,6 +196,8 @@ int main (int argc, char *argv[])
|
||||
/* Emulation Loop */
|
||||
while (1)
|
||||
{
|
||||
ogc_audio__start();
|
||||
|
||||
/* Frame synchronization */
|
||||
if (gc_pal != vdp_pal)
|
||||
{
|
||||
@ -242,8 +244,8 @@ int main (int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* update video & audio */
|
||||
ogc_video__update();
|
||||
ogc_audio__update();
|
||||
ogc_video__update();
|
||||
|
||||
/* Check rendered frames (FPS) */
|
||||
FrameCount++;
|
||||
|
@ -51,11 +51,14 @@ void ogc_audio__init(void)
|
||||
{
|
||||
AUDIO_Init (NULL);
|
||||
AUDIO_SetDSPSampleRate (AI_SAMPLERATE_48KHZ);
|
||||
AUDIO_RegisterDMACallback (AudioSwitchBuffers);
|
||||
// AUDIO_RegisterDMACallback (AudioSwitchBuffers);
|
||||
}
|
||||
|
||||
void ogc_audio__reset(void)
|
||||
{
|
||||
IsPlaying = 0;
|
||||
mixbuffer = 0;
|
||||
playbuffer = 0;
|
||||
memset(soundbuffer, 0, 16 * 3840);
|
||||
}
|
||||
|
||||
@ -63,12 +66,27 @@ void ogc_audio__update(void)
|
||||
{
|
||||
/* flush data from CPU cache */
|
||||
DCFlushRange(soundbuffer[mixbuffer], dma_len);
|
||||
AUDIO_InitDMA((u32) soundbuffer[mixbuffer], dma_len);
|
||||
}
|
||||
|
||||
void ogc_audio__stop(void)
|
||||
{
|
||||
/* stop audio DMA */
|
||||
AUDIO_StopDMA ();
|
||||
AUDIO_InitDMA((u32) soundbuffer[0], dma_len);
|
||||
IsPlaying = 0;
|
||||
mixbuffer = 0;
|
||||
playbuffer = 0;
|
||||
}
|
||||
|
||||
void ogc_audio__start(void)
|
||||
{
|
||||
if (!IsPlaying)
|
||||
{
|
||||
dma_len = (vdp_pal) ? 3840 : 3200;
|
||||
/* buffer size */
|
||||
dma_len = vdp_pal ? 3840 : 3200;
|
||||
|
||||
/* set audio DMA parameters */
|
||||
/* set default DMA parameters */
|
||||
AUDIO_InitDMA((u32) soundbuffer[0], dma_len);
|
||||
|
||||
/* start audio DMA */
|
||||
@ -77,13 +95,3 @@ void ogc_audio__update(void)
|
||||
IsPlaying = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void ogc_audio__stop(void)
|
||||
{
|
||||
/* stop audio DMA */
|
||||
AUDIO_StopDMA ();
|
||||
IsPlaying = 0;
|
||||
mixbuffer = 0;
|
||||
playbuffer = 0;
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,7 @@ extern int mixbuffer;
|
||||
extern void ogc_audio__init(void);
|
||||
extern void ogc_audio__reset(void);
|
||||
extern void ogc_audio__stop(void);
|
||||
extern void ogc_audio__start(void);
|
||||
extern void ogc_audio__update(void);
|
||||
|
||||
#endif
|
||||
|
@ -396,9 +396,4 @@ static inline void audio_update (void)
|
||||
*sb++ = l;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef DOS
|
||||
mixbuffer++;
|
||||
mixbuffer &= 0xf;
|
||||
#endif
|
||||
}
|
||||
|
@ -1,9 +1,28 @@
|
||||
Genesis Plus History
|
||||
--------------------
|
||||
|
||||
Note: All recent changes directly come from the Gamecube/Wii port, coded by Eke-Eke.
|
||||
Note: All recent changes directly come from the GX (Gamecube/Wii) port, code by Eke-Eke.
|
||||
|
||||
|
||||
[14/12/08] (Eke-Eke) version 1.3.0
|
||||
-------------------
|
||||
- YM2612 bugfixes (MAME core):
|
||||
.fixed EG Decay->Substain transition when SL & DR are minimals: fix tracks #3 and #9 in "Mega Turrican"
|
||||
.fixed a bug in SSG-EG emulation code: fix Level 1 music in "Alisia Dragoon"
|
||||
.modified SSG-EG Decay End Level: fix some sound effects (ChainSaw, Zap...) in "Beavis & Butthead"
|
||||
.improved Detune overflow accuracy: fix very high frequency sounds in many games
|
||||
.fixed registers 0x20-0x26 Reset state: fix intro music in "B.O.B"
|
||||
.reverted incorrect fix with KEY ON: fix "Flamethrower" sound effect in "Alien 3" and many others
|
||||
- adjusted HCounter values: fixes line flickering in "Sonic 3D" bonus stage
|
||||
- adjusted VINT timing: fixes hang-up in "V.R Troopers"
|
||||
- improved HBLANK flag accuracy: fixes line flickering in "Gouketsuji Ichizoku"
|
||||
- fixed broken Z80 access to WRAM: fixes hang-up in "Mamono Hunter Youko"
|
||||
- modified JCART emulation: fixes corrupted tracks logo in "Micro Machines 2"
|
||||
- added Blargg's NTSC Filters support (NTSC video artifacts emulation)
|
||||
- optimized VDP rendering core, rewrote 68k interface (memory handlers, cycle execution, interrupts): greatly improved emulation speed
|
||||
|
||||
[08/26/08] (Eke-Eke)
|
||||
-------------------
|
||||
- YM2612(MAME): fixed LFO phase update for CH3 special mode: fix sound effects in Warlock & Aladdin (thanks to AamirM)
|
||||
- YM2612(MAME): fixed EG attenuation level on "KEY ON": fix Ecco 2's splash sound
|
||||
- YM2612(MAME): fixed SSG-EG emulation: fix Bubba'n Stix (Track 5) and many others
|
||||
@ -19,6 +38,7 @@ Note: All recent changes directly come from the Gamecube/Wii port, coded by Eke-
|
||||
- added Sega Mouse emulation (Populous 2, Body Count, Shangai 2, Fun'n Games, ...)
|
||||
|
||||
[07/16/08] (Eke-Eke)
|
||||
-------------------
|
||||
- adjusted (again) HINT timings: fix Double Dragon 2 (game freezed), hopefully does not break anything else
|
||||
- fixed broken EEPROM support for Codemaster games
|
||||
- modified input update timings: fix Dungeons & Dragons - Warriors of the Eternal Sun (thanks to Notaz)
|
||||
@ -33,22 +53,26 @@ Note: All recent changes directly come from the Gamecube/Wii port, coded by Eke-
|
||||
.implemented sample interpolation in MAME core to emulate the chip at original frequency (HQ YM2612 mode, from gens)
|
||||
|
||||
[06/01/08] (Eke-Eke)
|
||||
-------------------
|
||||
- improved HCounter accuracy: fix graphic glitches in "Striker (Europe)"
|
||||
- improved HINT timing accuracy: fix flickering in "Zero The Kamikaze Squirrel (USA)"
|
||||
- improved rendering accuracy when backdrop color is modified during HBLANK (Road Rash I/II/III)
|
||||
- fixed broken Game Genie support
|
||||
|
||||
[04/19/08] (Eke-Eke)
|
||||
-------------------
|
||||
- modified VINT timings a little bit: fix lockup during Desert Strike's intro
|
||||
- corrected 68k interrupts handling: fix graphic glitches in Darius II/Sagaia
|
||||
|
||||
[04/06/08] (Eke-Eke)
|
||||
-------------------
|
||||
- updated SVP core: fix some perspective issues in Virtua Racing (thanks to Notaz)
|
||||
- added internal SAT update during VRAM Fill: fix unmasked sprites during Battletech's intro
|
||||
- fixed m68k core issues with gcc 4.2.3: fix Xperts, Lemmings 2, M1 Abrams Battle Tank
|
||||
- forced YM2612 Enveloppe update: fix intro music in Batman&Robin (thanks to Aamir)
|
||||
|
||||
[03/01/08] (Eke-Eke)
|
||||
-------------------
|
||||
- added SVP emulation: Virtua Racing is now emulated (big thanks to Notaz and TascoDeluxe)
|
||||
- fixed VDP registers behaviour when VDP Mode 4 is enabled: fix Bass Masters Classic Pro, Captain Planet & The Planeeters
|
||||
- corrected a bug in DMA Fill operation: fix James Pond 3, Rockman World/Megaman Willy Wars (corrupted VRAM)
|
||||
@ -59,6 +83,7 @@ Note: All recent changes directly come from the Gamecube/Wii port, coded by Eke-
|
||||
- reduced Savestate size
|
||||
|
||||
[01/07/08] (Eke-Eke)
|
||||
-------------------
|
||||
- fixed interleaved rom detection: roms with .smd extension should now work fine
|
||||
- fixed a recently introduced bug in VDP registers writes: fixes bad colors in Toy Story (intro)
|
||||
- updated list of games using EEPROM: added Sports Talk Baseball (internal memory check fixed) and Brian Lara Cricket
|
||||
@ -69,6 +94,7 @@ Note: All recent changes directly come from the Gamecube/Wii port, coded by Eke-
|
||||
- added support for custom ROM/RAM mapping used by Game no Kanzume Otokuyou
|
||||
|
||||
[12/28/07] (Eke-Eke)
|
||||
-------------------
|
||||
- many sourcecode cleanup and optimization
|
||||
- completely rewrote EEPROM emulation: now support all known EEPROM types (24C01-24C65) and mappers (Sega, Acclaim, EA, Codemasters)
|
||||
used in a few games (now use internal game database) as external RAM. This should at least fix save support in the following games:
|
||||
@ -99,6 +125,7 @@ used in a few games (now use internal game database) as external RAM. This shoul
|
||||
- added full overscan emulation (vertical & horizontal borders) for "pixel perfect" aspect ratio (tested against a real genesis)
|
||||
|
||||
[07/20/07] (Eke-Eke)
|
||||
-------------------
|
||||
- corrected TeamPlayer support: fix multiplayer in Gauntlet 4 (Sept. version), Pengo and a lot of others
|
||||
- added J-Cart support: enable multiplayer in Codemasters games (Pete Sampras, Micromachines games, Super Skidmarks)
|
||||
- added serial EEPROM autodetection: fix games with bad SRAM informations in header (NBA Jam TE)
|
||||
@ -109,10 +136,12 @@ used in a few games (now use internal game database) as external RAM. This shoul
|
||||
in some games to enable special features or even complete the game (ex: X-Men).
|
||||
|
||||
[06/21/07] (Eke-Eke)
|
||||
-------------------
|
||||
- added Multitap support (EA 4-Way Play and Sega Teamplayer): allowed up to four players in games supporting those peripherals
|
||||
- added partial Sega Menacer lightgun support (use Analog Stick): automatically set when detecting the 6-in-1 Menacer game
|
||||
|
||||
[05/18/07] (Eke-Eke)
|
||||
-------------------
|
||||
- you can now switch between FM cores without reseting the game. FM registers value are automatically restored when switching.
|
||||
- removed the previous VINT timings modification because it brokes some games (Rocket Knight, Thunderforce III,...)
|
||||
- added automatic Timing configuration (VDP latency, VINT timing & alternate Line Timing) at game loading, based upon specific romname detection.
|
||||
@ -124,6 +153,7 @@ For information, games that are actually detected and need special timings to ru
|
||||
.Chaos Engine/Soldiers of Fortune (graphic glitches on scrolling)
|
||||
|
||||
[05/08/07] (Eke-Eke)
|
||||
-------------------
|
||||
- VINT timings are now a little more accurate: fixes Sesame's Street Counting Cafe
|
||||
- SN76496 MAX_OUTPUT back to normal
|
||||
- modified FB_WNOISE value in SN76496 core according to John Kortink's last informations
|
||||
@ -135,13 +165,16 @@ For information, games that are actually detected and need special timings to ru
|
||||
- added some other configurable sound options (boost overall volume, FM improvment for Gens YM2612)
|
||||
|
||||
[04/11/07] (Eke-Eke)
|
||||
-------------------
|
||||
- corrected MAX_OUTPUT value in SN76496 core: fix PSG sound (SFX) volume
|
||||
|
||||
[03/17/07] (Eke-Eke)
|
||||
-------------------
|
||||
- added an option to enable alternate line rendering timing (fix single line error in Road Rash series and Legend of Galahad's Intro)
|
||||
- Color RAM update now always reset color 0 to border color (fix color glitches in Mortal Kombat,...) (thanks to Noop's for the idea)
|
||||
|
||||
[03/09/07] (Eke-Eke)
|
||||
-------------------
|
||||
- modified HV counter tables (fix graphic glitches in Skitchin's sky, Lotus 2 Recs, Panorama Cotton, Dashin Desperados & maybe more)
|
||||
- completely rewrote DMA timings emulation so that it works for all games (no more cpu freezing)
|
||||
- added all DMA tranfer rates handling for each three DMA modes and added dma busy flag emulation
|
||||
@ -154,6 +187,7 @@ For information, games that are actually detected and need special timings to ru
|
||||
- modified sound mixing a bit according to Generator sourcecode (FM and PSG ratios seems more correct)
|
||||
|
||||
[02/07/07] (Eke-Eke)
|
||||
-------------------
|
||||
- fixed fm timers (fix missing music in Castle of Illusion, Quackshot, Undead Line, Wonderboy in Monster Lair, Cal 50, Turbo Outrun, Thundeforce 4 and maybe more)
|
||||
- added complete EEPROM emulation (save support now works fine in Wonderboy5, Megaman Willy Wars, NBA Jam...) (credits to Notaz, adapted from Picodrive code)
|
||||
- added preliminar dma timing emulation (fix bottom screen in Legend of Galahad) (credits to Notaz, adapted from Picodrive code)
|
||||
@ -165,12 +199,15 @@ For information, games that are actually detected and need special timings to ru
|
||||
- modified dma fill operation for big endian platform (fix Contra Hardcorps gfx garbage)
|
||||
|
||||
[05/25/03]
|
||||
-------------------
|
||||
- Fixed a typo that made Z80 banked access to the VDP registers always fail.
|
||||
|
||||
[05/17/03]
|
||||
-------------------
|
||||
- Modified the rendering code to handle unaligned longword access to memory.
|
||||
|
||||
[04/20/03]
|
||||
-------------------
|
||||
- Modified 68000 emulator to prevent 'tas.b $mem' from writing data back
|
||||
after a read (fixes Gargoyles).
|
||||
- Fixed bug in 68000 emulator to swap order of words written for address
|
||||
@ -181,6 +218,7 @@ For information, games that are actually detected and need special timings to ru
|
||||
- Optimized sprite rendering inner loop.
|
||||
|
||||
[04/13/03]
|
||||
-------------------
|
||||
- Finished up memory map for VDP DMA V-bus reads.
|
||||
- Fixed handling of 68000 writes to I/O chip at even addresses.
|
||||
- Fixed bit 7 handling of control register in I/O chip.
|
||||
@ -189,5 +227,6 @@ For information, games that are actually detected and need special timings to ru
|
||||
- Removed some faulty code from the 68000 memory map handlers.
|
||||
|
||||
[03/22/03]
|
||||
-------------------
|
||||
- Completed implementation of Z80 banked memory handlers.
|
||||
|
||||
|
@ -13,19 +13,19 @@ CC = gcc
|
||||
AS = nasm -f coff
|
||||
LDFLAGS =
|
||||
FLAGS = -I. -I.. -I../z80 -I../m68k -I../dos -I../sound -I../sound/SRC -I../cart_hw -I../cart_hw/svp \
|
||||
-Wall -g \
|
||||
-O6 -march=i686 -fomit-frame-pointer \
|
||||
-DLSB_FIRST -DX86_ASM -DDOS
|
||||
-Wall -g \
|
||||
-O6 -march=i686 -fomit-frame-pointer \
|
||||
-DLSB_FIRST -DX86_ASM -DDOS
|
||||
|
||||
LIBS = -lalleg -laudio -lz -lm
|
||||
|
||||
OBJ = obj/z80.o
|
||||
OBJ = obj/z80.o
|
||||
|
||||
OBJ += obj/m68kcpu.o \
|
||||
OBJ += obj/m68kcpu.o \
|
||||
obj/m68kops.o
|
||||
|
||||
|
||||
OBJ += obj/genesis.o \
|
||||
OBJ += obj/genesis.o \
|
||||
obj/vdp.o \
|
||||
obj/render.o \
|
||||
obj/system.o \
|
||||
@ -34,10 +34,9 @@ OBJ += obj/genesis.o \
|
||||
obj/mem68k.o \
|
||||
obj/memz80.o \
|
||||
obj/membnk.o \
|
||||
obj/memvdp.o \
|
||||
obj/state.o
|
||||
|
||||
OBJ += obj/sound.o \
|
||||
OBJ += obj/sound.o \
|
||||
obj/fm.o \
|
||||
obj/sn76489.o \
|
||||
obj/ym2612.o
|
||||
@ -48,7 +47,7 @@ OBJ += obj/samplerate.o \
|
||||
obj/src_sinc.o \
|
||||
obj/src_zoh.o \
|
||||
|
||||
OBJ += obj/sram.o \
|
||||
OBJ += obj/sram.o \
|
||||
obj/eeprom.o \
|
||||
obj/svp.o \
|
||||
obj/ssp16.o \
|
||||
|
@ -16,273 +16,273 @@ static int master_volume = 256;
|
||||
|
||||
void osd_update_audio(void)
|
||||
{
|
||||
if (seal_sample_rate == 0) return;
|
||||
AUpdateAudio();
|
||||
if (seal_sample_rate == 0) return;
|
||||
AUpdateAudio();
|
||||
}
|
||||
|
||||
|
||||
/* attenuation in dB */
|
||||
void osd_set_mastervolume(int _attenuation)
|
||||
{
|
||||
float volume;
|
||||
float volume;
|
||||
|
||||
attenuation = _attenuation;
|
||||
attenuation = _attenuation;
|
||||
|
||||
volume = 256.0; /* range is 0-256 */
|
||||
while (_attenuation++ < 0)
|
||||
volume /= 1.122018454; /* = (10 ^ (1/20)) = 1dB */
|
||||
volume = 256.0; /* range is 0-256 */
|
||||
while (_attenuation++ < 0)
|
||||
volume /= 1.122018454; /* = (10 ^ (1/20)) = 1dB */
|
||||
|
||||
master_volume = volume;
|
||||
master_volume = volume;
|
||||
|
||||
ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME,master_volume);
|
||||
ASetAudioMixerValue(AUDIO_MIXER_MASTER_VOLUME,master_volume);
|
||||
}
|
||||
|
||||
|
||||
int msdos_init_sound(int *rate, int card)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
seal_sample_rate = *rate;
|
||||
seal_sound_card = card;
|
||||
seal_sample_rate = *rate;
|
||||
seal_sound_card = card;
|
||||
|
||||
if (AInitialize() != AUDIO_ERROR_NONE)
|
||||
return 1;
|
||||
if (AInitialize() != AUDIO_ERROR_NONE)
|
||||
return 1;
|
||||
|
||||
/* Ask the user if no sound card was chosen */
|
||||
if (seal_sound_card == -1)
|
||||
/* Ask the user if no sound card was chosen */
|
||||
if (seal_sound_card == -1)
|
||||
{
|
||||
unsigned int k;
|
||||
|
||||
printf("\n SELECT YOUR AUDIO DEVICE :\n\n"
|
||||
" AWE32/64 playback requires onboard DRAM,\n"
|
||||
" Sound Blaster playback is the most compatible & better for emulation\n\n");
|
||||
|
||||
for (k = 0;k < AGetAudioNumDevs();k++)
|
||||
{
|
||||
unsigned int k;
|
||||
|
||||
printf("\n SELECT YOUR AUDIO DEVICE :\n\n"
|
||||
" AWE32/64 playback requires onboard DRAM,\n"
|
||||
" Sound Blaster playback is the most compatible & better for emulation\n\n");
|
||||
|
||||
for (k = 0;k < AGetAudioNumDevs();k++)
|
||||
{
|
||||
if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE)
|
||||
printf(" %2d. %s\n",k,caps.szProductName);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
if (k < 10)
|
||||
{
|
||||
i = getch();
|
||||
seal_sound_card = i - '0';
|
||||
}
|
||||
else
|
||||
scanf("%d",&seal_sound_card);
|
||||
if (AGetAudioDevCaps(k,&caps) == AUDIO_ERROR_NONE)
|
||||
printf(" %2d. %s\n",k,caps.szProductName);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
/* initialize SEAL audio library */
|
||||
if (seal_sound_card == 0) /* silence */
|
||||
if (k < 10)
|
||||
{
|
||||
/* update the Machine structure to show that sound is disabled */
|
||||
seal_sample_rate = 0;
|
||||
exit(0);
|
||||
return 0;
|
||||
i = getch();
|
||||
seal_sound_card = i - '0';
|
||||
}
|
||||
else
|
||||
scanf("%d",&seal_sound_card);
|
||||
}
|
||||
|
||||
/* open audio device */
|
||||
/* info.nDeviceId = AUDIO_DEVICE_MAPPER;*/
|
||||
info.nDeviceId = seal_sound_card;
|
||||
/* always use 16 bit mixing if possible - better quality and same speed of 8 bit */
|
||||
info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE;
|
||||
|
||||
info.nSampleRate = seal_sample_rate;
|
||||
if (AOpenAudio(&info) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
AGetAudioDevCaps(info.nDeviceId,&caps);
|
||||
printf("Using `%s' at %d-bit %s %u Hz\n",
|
||||
caps.szProductName,
|
||||
info.wFormat & AUDIO_FORMAT_16BITS ? 16 : 8,
|
||||
info.wFormat & AUDIO_FORMAT_STEREO ? "stereo" : "mono",
|
||||
info.nSampleRate);
|
||||
|
||||
/* open and allocate voices, allocate waveforms */
|
||||
if (AOpenVoices(NUMVOICES) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
printf("voices initialization failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUMVOICES; i++)
|
||||
{
|
||||
if (ACreateAudioVoice(&hVoice[i]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
printf("voice #%d creation failed\n",i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ASetVoicePanning(hVoice[i],128);
|
||||
|
||||
lpWave[i] = 0;
|
||||
}
|
||||
|
||||
/* update the Machine structure to reflect the actual sample rate */
|
||||
*rate = seal_sample_rate = info.nSampleRate;
|
||||
|
||||
{
|
||||
uclock_t a,b;
|
||||
LONG start,end;
|
||||
|
||||
|
||||
if ((lpWave[0] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
|
||||
return 1;
|
||||
|
||||
lpWave[0]->wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO;
|
||||
lpWave[0]->nSampleRate = seal_sample_rate;
|
||||
lpWave[0]->dwLength = 3*seal_sample_rate;
|
||||
lpWave[0]->dwLoopStart = 0;
|
||||
lpWave[0]->dwLoopEnd = 3*seal_sample_rate;
|
||||
if (ACreateAudioData(lpWave[0]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
free(lpWave[0]);
|
||||
lpWave[0] = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(lpWave[0]->lpData,0,3*seal_sample_rate);
|
||||
/* upload the data to the audio DRAM local memory */
|
||||
AWriteAudioData(lpWave[0],0,3*seal_sample_rate);
|
||||
APrimeVoice(hVoice[0],lpWave[0]);
|
||||
ASetVoiceFrequency(hVoice[0],seal_sample_rate);
|
||||
ASetVoiceVolume(hVoice[0],0);
|
||||
AStartVoice(hVoice[0]);
|
||||
|
||||
a = uclock();
|
||||
/* wait some time to let everything stabilize */
|
||||
do
|
||||
{
|
||||
osd_update_audio();
|
||||
b = uclock();
|
||||
} while (b-a < UCLOCKS_PER_SEC/10);
|
||||
|
||||
a = uclock();
|
||||
AGetVoicePosition(hVoice[0],&start);
|
||||
do
|
||||
{
|
||||
osd_update_audio();
|
||||
b = uclock();
|
||||
} while (b-a < UCLOCKS_PER_SEC);
|
||||
AGetVoicePosition(hVoice[0],&end);
|
||||
|
||||
nominal_sample_rate = seal_sample_rate;
|
||||
seal_sample_rate = end - start;
|
||||
|
||||
AStopVoice(hVoice[0]);
|
||||
ADestroyAudioData(lpWave[0]);
|
||||
free(lpWave[0]);
|
||||
lpWave[0] = 0;
|
||||
}
|
||||
|
||||
osd_set_mastervolume(0); /* start at maximum volume */
|
||||
|
||||
/* initialize SEAL audio library */
|
||||
if (seal_sound_card == 0) /* silence */
|
||||
{
|
||||
/* update the Machine structure to show that sound is disabled */
|
||||
seal_sample_rate = 0;
|
||||
exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* open audio device */
|
||||
/* info.nDeviceId = AUDIO_DEVICE_MAPPER;*/
|
||||
info.nDeviceId = seal_sound_card;
|
||||
/* always use 16 bit mixing if possible - better quality and same speed of 8 bit */
|
||||
info.wFormat = AUDIO_FORMAT_16BITS | AUDIO_FORMAT_STEREO | AUDIO_FORMAT_RAW_SAMPLE;
|
||||
|
||||
info.nSampleRate = seal_sample_rate;
|
||||
if (AOpenAudio(&info) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
AGetAudioDevCaps(info.nDeviceId,&caps);
|
||||
printf("Using `%s' at %d-bit %s %u Hz\n",
|
||||
caps.szProductName,
|
||||
info.wFormat & AUDIO_FORMAT_16BITS ? 16 : 8,
|
||||
info.wFormat & AUDIO_FORMAT_STEREO ? "stereo" : "mono",
|
||||
info.nSampleRate);
|
||||
|
||||
/* open and allocate voices, allocate waveforms */
|
||||
if (AOpenVoices(NUMVOICES) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
printf("voices initialization failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUMVOICES; i++)
|
||||
{
|
||||
if (ACreateAudioVoice(&hVoice[i]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
printf("voice #%d creation failed\n",i);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ASetVoicePanning(hVoice[i],128);
|
||||
|
||||
lpWave[i] = 0;
|
||||
}
|
||||
|
||||
/* update the Machine structure to reflect the actual sample rate */
|
||||
*rate = seal_sample_rate = info.nSampleRate;
|
||||
|
||||
{
|
||||
uclock_t a,b;
|
||||
LONG start,end;
|
||||
|
||||
|
||||
if ((lpWave[0] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
|
||||
return 1;
|
||||
|
||||
lpWave[0]->wFormat = AUDIO_FORMAT_8BITS | AUDIO_FORMAT_MONO;
|
||||
lpWave[0]->nSampleRate = seal_sample_rate;
|
||||
lpWave[0]->dwLength = 3*seal_sample_rate;
|
||||
lpWave[0]->dwLoopStart = 0;
|
||||
lpWave[0]->dwLoopEnd = 3*seal_sample_rate;
|
||||
if (ACreateAudioData(lpWave[0]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
free(lpWave[0]);
|
||||
lpWave[0] = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(lpWave[0]->lpData,0,3*seal_sample_rate);
|
||||
/* upload the data to the audio DRAM local memory */
|
||||
AWriteAudioData(lpWave[0],0,3*seal_sample_rate);
|
||||
APrimeVoice(hVoice[0],lpWave[0]);
|
||||
ASetVoiceFrequency(hVoice[0],seal_sample_rate);
|
||||
ASetVoiceVolume(hVoice[0],0);
|
||||
AStartVoice(hVoice[0]);
|
||||
|
||||
a = uclock();
|
||||
/* wait some time to let everything stabilize */
|
||||
do
|
||||
{
|
||||
osd_update_audio();
|
||||
b = uclock();
|
||||
} while (b-a < UCLOCKS_PER_SEC/10);
|
||||
|
||||
a = uclock();
|
||||
AGetVoicePosition(hVoice[0],&start);
|
||||
do
|
||||
{
|
||||
osd_update_audio();
|
||||
b = uclock();
|
||||
} while (b-a < UCLOCKS_PER_SEC);
|
||||
AGetVoicePosition(hVoice[0],&end);
|
||||
|
||||
nominal_sample_rate = seal_sample_rate;
|
||||
seal_sample_rate = end - start;
|
||||
|
||||
AStopVoice(hVoice[0]);
|
||||
ADestroyAudioData(lpWave[0]);
|
||||
free(lpWave[0]);
|
||||
lpWave[0] = 0;
|
||||
}
|
||||
|
||||
osd_set_mastervolume(0); /* start at maximum volume */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void msdos_shutdown_sound(void)
|
||||
{
|
||||
if (seal_sample_rate != 0)
|
||||
{
|
||||
int n;
|
||||
if (seal_sample_rate != 0)
|
||||
{
|
||||
int n;
|
||||
|
||||
/* stop and release voices */
|
||||
for (n = 0; n < NUMVOICES; n++)
|
||||
{
|
||||
AStopVoice(hVoice[n]);
|
||||
ADestroyAudioVoice(hVoice[n]);
|
||||
if (lpWave[n])
|
||||
{
|
||||
ADestroyAudioData(lpWave[n]);
|
||||
free(lpWave[n]);
|
||||
lpWave[n] = 0;
|
||||
}
|
||||
}
|
||||
ACloseVoices();
|
||||
ACloseAudio();
|
||||
/* stop and release voices */
|
||||
for (n = 0; n < NUMVOICES; n++)
|
||||
{
|
||||
AStopVoice(hVoice[n]);
|
||||
ADestroyAudioVoice(hVoice[n]);
|
||||
if (lpWave[n])
|
||||
{
|
||||
ADestroyAudioData(lpWave[n]);
|
||||
free(lpWave[n]);
|
||||
lpWave[n] = 0;
|
||||
}
|
||||
}
|
||||
ACloseVoices();
|
||||
ACloseAudio();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void playstreamedsample(int channel,signed char *data,int len,int freq,int volume,int pan,int bits)
|
||||
{
|
||||
static int playing[NUMVOICES];
|
||||
static int c[NUMVOICES];
|
||||
static int playing[NUMVOICES];
|
||||
static int c[NUMVOICES];
|
||||
|
||||
/* backwards compatibility with old 0-255 volume range */
|
||||
if (volume > 100) volume = volume * 25 / 255;
|
||||
/* backwards compatibility with old 0-255 volume range */
|
||||
if (volume > 100) volume = volume * 25 / 255;
|
||||
|
||||
if (seal_sample_rate == 0 || channel >= NUMVOICES) return;
|
||||
if (seal_sample_rate == 0 || channel >= NUMVOICES) return;
|
||||
|
||||
if (!playing[channel])
|
||||
if (!playing[channel])
|
||||
{
|
||||
if (lpWave[channel])
|
||||
{
|
||||
if (lpWave[channel])
|
||||
{
|
||||
AStopVoice(hVoice[channel]);
|
||||
ADestroyAudioData(lpWave[channel]);
|
||||
free(lpWave[channel]);
|
||||
lpWave[channel] = 0;
|
||||
}
|
||||
AStopVoice(hVoice[channel]);
|
||||
ADestroyAudioData(lpWave[channel]);
|
||||
free(lpWave[channel]);
|
||||
lpWave[channel] = 0;
|
||||
}
|
||||
|
||||
if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
|
||||
return;
|
||||
if ((lpWave[channel] = (LPAUDIOWAVE)malloc(sizeof(AUDIOWAVE))) == 0)
|
||||
return;
|
||||
|
||||
lpWave[channel]->wFormat = (bits == 8 ? AUDIO_FORMAT_8BITS : AUDIO_FORMAT_16BITS)
|
||||
| AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP;
|
||||
lpWave[channel]->nSampleRate = nominal_sample_rate;
|
||||
lpWave[channel]->dwLength = 3*len;
|
||||
lpWave[channel]->dwLoopStart = 0;
|
||||
lpWave[channel]->dwLoopEnd = 3*len;
|
||||
if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
free(lpWave[channel]);
|
||||
lpWave[channel] = 0;
|
||||
lpWave[channel]->wFormat = (bits == 8 ? AUDIO_FORMAT_8BITS : AUDIO_FORMAT_16BITS)
|
||||
| AUDIO_FORMAT_MONO | AUDIO_FORMAT_LOOP;
|
||||
lpWave[channel]->nSampleRate = nominal_sample_rate;
|
||||
lpWave[channel]->dwLength = 3*len;
|
||||
lpWave[channel]->dwLoopStart = 0;
|
||||
lpWave[channel]->dwLoopEnd = 3*len;
|
||||
if (ACreateAudioData(lpWave[channel]) != AUDIO_ERROR_NONE)
|
||||
{
|
||||
free(lpWave[channel]);
|
||||
lpWave[channel] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
memset(lpWave[channel]->lpData,0,3*len);
|
||||
memcpy(lpWave[channel]->lpData,data,len);
|
||||
|
||||
/* upload the data to the audio DRAM local memory */
|
||||
AWriteAudioData(lpWave[channel],0,3*len);
|
||||
APrimeVoice(hVoice[channel],lpWave[channel]);
|
||||
|
||||
memset(lpWave[channel]->lpData,0,3*len);
|
||||
memcpy(lpWave[channel]->lpData,data,len);
|
||||
/* upload the data to the audio DRAM local memory */
|
||||
AWriteAudioData(lpWave[channel],0,3*len);
|
||||
APrimeVoice(hVoice[channel],lpWave[channel]);
|
||||
/* need to cast to double because freq*nominal_sample_rate can exceed the size of an int */
|
||||
ASetVoiceFrequency(hVoice[channel],(double)freq*nominal_sample_rate/seal_sample_rate);
|
||||
AStartVoice(hVoice[channel]);
|
||||
playing[channel] = 1;
|
||||
c[channel] = 1;
|
||||
}
|
||||
else
|
||||
ASetVoiceFrequency(hVoice[channel],(double)freq*nominal_sample_rate/seal_sample_rate);
|
||||
AStartVoice(hVoice[channel]);
|
||||
playing[channel] = 1;
|
||||
c[channel] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
LONG pos;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
LONG pos;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
AGetVoicePosition(hVoice[channel],&pos);
|
||||
if (c[channel] == 0 && pos >= len) break;
|
||||
if (c[channel] == 1 && (pos < len || pos >= 2*len)) break;
|
||||
if (c[channel] == 2 && pos < 2*len) break;
|
||||
osd_update_audio();
|
||||
}
|
||||
|
||||
memcpy(&lpWave[channel]->lpData[len * c[channel]],data,len);
|
||||
AWriteAudioData(lpWave[channel],len*c[channel],len);
|
||||
c[channel]++;
|
||||
if (c[channel] == 3) c[channel] = 0;
|
||||
AGetVoicePosition(hVoice[channel],&pos);
|
||||
if (c[channel] == 0 && pos >= len) break;
|
||||
if (c[channel] == 1 && (pos < len || pos >= 2*len)) break;
|
||||
if (c[channel] == 2 && pos < 2*len) break;
|
||||
osd_update_audio();
|
||||
}
|
||||
|
||||
memcpy(&lpWave[channel]->lpData[len * c[channel]],data,len);
|
||||
AWriteAudioData(lpWave[channel],len*c[channel],len);
|
||||
c[channel]++;
|
||||
if (c[channel] == 3) c[channel] = 0;
|
||||
}
|
||||
|
||||
ASetVoiceVolume(hVoice[channel],volume * 64 / 100);
|
||||
ASetVoicePanning(hVoice[channel],(pan + 100) * 255 / 200);
|
||||
ASetVoiceVolume(hVoice[channel],volume * 64 / 100);
|
||||
ASetVoicePanning(hVoice[channel],(pan + 100) * 255 / 200);
|
||||
}
|
||||
|
||||
void osd_play_streamed_sample_16(int channel,signed short *data,int len,int freq,int volume,int pan)
|
||||
{
|
||||
playstreamedsample(channel,(signed char *)data,len,freq,volume,pan,16);
|
||||
playstreamedsample(channel,(signed char *)data,len,freq,volume,pan,16);
|
||||
}
|
||||
|
||||
|
@ -67,34 +67,34 @@ int main (int argc, char *argv[])
|
||||
error_init();
|
||||
|
||||
cart_rom = malloc(0xA00000);
|
||||
memset(cart_rom, 0, 0xA00000);
|
||||
memset(cart_rom, 0, 0xA00000);
|
||||
|
||||
if(!load_rom(argv[1]))
|
||||
if(!load_rom(argv[1]))
|
||||
{
|
||||
printf("File `%s' not found.\n", argv[1]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/* load BIOS */
|
||||
/* load BIOS */
|
||||
memset(bios_rom, 0, sizeof(bios_rom));
|
||||
FILE *f = fopen("./BIOS.bin", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&bios_rom, 0x800,1,f);
|
||||
fclose(f);
|
||||
int i;
|
||||
for(i = 0; i < 0x800; i += 2)
|
||||
{
|
||||
uint8 temp = bios_rom[i];
|
||||
bios_rom[i] = bios_rom[i+1];
|
||||
bios_rom[i+1] = temp;
|
||||
}
|
||||
config.bios_enabled |= 2;
|
||||
FILE *f = fopen("./BIOS.bin", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&bios_rom, 0x800,1,f);
|
||||
fclose(f);
|
||||
int i;
|
||||
for(i = 0; i < 0x800; i += 2)
|
||||
{
|
||||
uint8 temp = bios_rom[i];
|
||||
bios_rom[i] = bios_rom[i+1];
|
||||
bios_rom[i+1] = temp;
|
||||
}
|
||||
config.bios_enabled |= 2;
|
||||
}
|
||||
else config.bios_enabled = 0;
|
||||
else config.bios_enabled = 0;
|
||||
|
||||
/* initialize genesis VM */
|
||||
/* initialize genesis VM */
|
||||
init_machine();
|
||||
|
||||
/* default config */
|
||||
@ -103,44 +103,45 @@ int main (int argc, char *argv[])
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_GAMEPAD;
|
||||
|
||||
/* initialize emulation */
|
||||
/* initialize emulation */
|
||||
system_init();
|
||||
audio_init(option.sndrate);
|
||||
|
||||
f = fopen("./game.srm", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
f = fopen("./game.srm", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/* reset emulation */
|
||||
system_reset();
|
||||
|
||||
/* emulation loop */
|
||||
for(;;)
|
||||
{
|
||||
dos_update_input();
|
||||
frame_count += 1;
|
||||
if(quit) break;
|
||||
if(frame_count % frame_skip == 0)
|
||||
{
|
||||
system_frame(0);
|
||||
frames_rendered++;
|
||||
dos_update_video();
|
||||
dos_update_video();
|
||||
}
|
||||
else
|
||||
{
|
||||
system_frame(1);
|
||||
system_frame(1,reset_line);
|
||||
}
|
||||
if(option.sound) dos_update_audio();
|
||||
}
|
||||
}
|
||||
|
||||
f = fopen("./game.srm", "wb");
|
||||
f = fopen("./game.srm", "wb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fwrite(&sram.sram, 0x10000,1,f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
trash_machine();
|
||||
system_shutdown();
|
||||
@ -153,131 +154,130 @@ int main (int argc, char *argv[])
|
||||
/* Timer handler */
|
||||
void tick_handler(void)
|
||||
{
|
||||
tick_count += 1;
|
||||
if(tick_count % FRAMES_PER_SECOND == 0)
|
||||
{
|
||||
frame_rate = frames_rendered;
|
||||
frames_rendered = 0;
|
||||
}
|
||||
tick_count += 1;
|
||||
if(tick_count % FRAMES_PER_SECOND == 0)
|
||||
{
|
||||
frame_rate = frames_rendered;
|
||||
frames_rendered = 0;
|
||||
}
|
||||
}
|
||||
END_OF_FUNCTION(tick_handler);
|
||||
|
||||
|
||||
int load_file(char *filename, char *buf, int size)
|
||||
{
|
||||
FILE *fd = fopen(filename, "rb");
|
||||
if(!fd) return (0);
|
||||
fread(buf, size, 1, fd);
|
||||
fclose(fd);
|
||||
return (1);
|
||||
FILE *fd = fopen(filename, "rb");
|
||||
if(!fd) return (0);
|
||||
fread(buf, size, 1, fd);
|
||||
fclose(fd);
|
||||
return (1);
|
||||
}
|
||||
|
||||
int save_file(char *filename, char *buf, int size)
|
||||
{
|
||||
FILE *fd = NULL;
|
||||
if(!(fd = fopen(filename, "wb"))) return (0);
|
||||
fwrite(buf, size, 1, fd);
|
||||
fclose(fd);
|
||||
return (1);
|
||||
FILE *fd = NULL;
|
||||
if(!(fd = fopen(filename, "wb"))) return (0);
|
||||
fwrite(buf, size, 1, fd);
|
||||
fclose(fd);
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int joynum = 0;
|
||||
|
||||
void dos_update_input(void)
|
||||
{
|
||||
FILE *f;
|
||||
FILE *f;
|
||||
|
||||
if(key[KEY_ESC] || key[KEY_END])
|
||||
{
|
||||
quit = 1;
|
||||
}
|
||||
if(key[KEY_ESC] || key[KEY_END])
|
||||
{
|
||||
quit = 1;
|
||||
}
|
||||
|
||||
while (input.dev[joynum] == NO_DEVICE)
|
||||
{
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
}
|
||||
|
||||
{
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
}
|
||||
|
||||
if(check_key(KEY_F11))
|
||||
{
|
||||
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
{
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
|
||||
while (input.dev[joynum] == NO_DEVICE)
|
||||
{
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
input.pad[joynum] = 0;
|
||||
|
||||
/* Is the joystick being used ? */
|
||||
if(option.joy_driver != JOY_TYPE_NONE)
|
||||
while (input.dev[joynum] == NO_DEVICE)
|
||||
{
|
||||
poll_joystick();
|
||||
|
||||
/* Check player 1 joystick */
|
||||
if(joy[0].stick[0].axis[1].d1) input.pad[0] |= INPUT_UP;
|
||||
else
|
||||
if(joy[0].stick[0].axis[1].d2) input.pad[0] |= INPUT_DOWN;
|
||||
|
||||
if(joy[0].stick[0].axis[0].d1) input.pad[0] |= INPUT_LEFT;
|
||||
else
|
||||
if(joy[0].stick[0].axis[0].d2) input.pad[0] |= INPUT_RIGHT;
|
||||
|
||||
if(joy[0].button[0].b) input.pad[0] |= INPUT_A;
|
||||
if(joy[0].button[1].b) input.pad[0] |= INPUT_B;
|
||||
if(joy[0].button[2].b) input.pad[0] |= INPUT_C;
|
||||
if(joy[0].button[3].b) input.pad[0] |= INPUT_START;
|
||||
if(joy[0].button[4].b) input.pad[0] |= INPUT_X;
|
||||
if(joy[0].button[5].b) input.pad[0] |= INPUT_Y;
|
||||
if(joy[0].button[6].b) input.pad[0] |= INPUT_Z;
|
||||
if(joy[0].button[7].b) input.pad[0] |= INPUT_MODE;
|
||||
|
||||
/* More than one joystick supported ? */
|
||||
if(num_joysticks > 2)
|
||||
{
|
||||
/* Check player 2 joystick */
|
||||
if(joy[1].stick[0].axis[1].d1) input.pad[1] |= INPUT_UP;
|
||||
else
|
||||
if(joy[1].stick[0].axis[1].d2) input.pad[1] |= INPUT_DOWN;
|
||||
|
||||
if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_LEFT;
|
||||
else
|
||||
if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_RIGHT;
|
||||
|
||||
if(joy[1].button[0].b) input.pad[1] |= INPUT_A;
|
||||
if(joy[1].button[1].b) input.pad[1] |= INPUT_B;
|
||||
if(joy[1].button[2].b) input.pad[1] |= INPUT_C;
|
||||
if(joy[1].button[3].b) input.pad[1] |= INPUT_START;
|
||||
if(joy[1].button[4].b) input.pad[1] |= INPUT_X;
|
||||
if(joy[1].button[5].b) input.pad[1] |= INPUT_Y;
|
||||
if(joy[1].button[6].b) input.pad[1] |= INPUT_Z;
|
||||
if(joy[1].button[7].b) input.pad[1] |= INPUT_MODE;
|
||||
}
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* keyboard */
|
||||
if(key[KEY_UP]) input.pad[joynum] |= INPUT_UP;
|
||||
else
|
||||
if(key[KEY_DOWN]) input.pad[joynum] |= INPUT_DOWN;
|
||||
input.pad[joynum] = 0;
|
||||
|
||||
if(key[KEY_LEFT]) input.pad[joynum] |= INPUT_LEFT;
|
||||
else
|
||||
if(key[KEY_RIGHT]) input.pad[joynum] |= INPUT_RIGHT;
|
||||
/* Is the joystick being used ? */
|
||||
if(option.joy_driver != JOY_TYPE_NONE)
|
||||
{
|
||||
poll_joystick();
|
||||
|
||||
if(key[KEY_A]) input.pad[joynum] |= INPUT_A;
|
||||
if(key[KEY_S]) input.pad[joynum] |= INPUT_B;
|
||||
if(key[KEY_D]) input.pad[joynum] |= INPUT_C;
|
||||
/* Check player 1 joystick */
|
||||
if(joy[0].stick[0].axis[1].d1) input.pad[0] |= INPUT_UP;
|
||||
else
|
||||
if(joy[0].stick[0].axis[1].d2) input.pad[0] |= INPUT_DOWN;
|
||||
|
||||
if(joy[0].stick[0].axis[0].d1) input.pad[0] |= INPUT_LEFT;
|
||||
else
|
||||
if(joy[0].stick[0].axis[0].d2) input.pad[0] |= INPUT_RIGHT;
|
||||
|
||||
if(joy[0].button[0].b) input.pad[0] |= INPUT_A;
|
||||
if(joy[0].button[1].b) input.pad[0] |= INPUT_B;
|
||||
if(joy[0].button[2].b) input.pad[0] |= INPUT_C;
|
||||
if(joy[0].button[3].b) input.pad[0] |= INPUT_START;
|
||||
if(joy[0].button[4].b) input.pad[0] |= INPUT_X;
|
||||
if(joy[0].button[5].b) input.pad[0] |= INPUT_Y;
|
||||
if(joy[0].button[6].b) input.pad[0] |= INPUT_Z;
|
||||
if(joy[0].button[7].b) input.pad[0] |= INPUT_MODE;
|
||||
|
||||
/* More than one joystick supported ? */
|
||||
if(num_joysticks > 2)
|
||||
{
|
||||
/* Check player 2 joystick */
|
||||
if(joy[1].stick[0].axis[1].d1) input.pad[1] |= INPUT_UP;
|
||||
else
|
||||
if(joy[1].stick[0].axis[1].d2) input.pad[1] |= INPUT_DOWN;
|
||||
|
||||
if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_LEFT;
|
||||
else
|
||||
if(joy[1].stick[0].axis[0].d1) input.pad[1] |= INPUT_RIGHT;
|
||||
|
||||
if(joy[1].button[0].b) input.pad[1] |= INPUT_A;
|
||||
if(joy[1].button[1].b) input.pad[1] |= INPUT_B;
|
||||
if(joy[1].button[2].b) input.pad[1] |= INPUT_C;
|
||||
if(joy[1].button[3].b) input.pad[1] |= INPUT_START;
|
||||
if(joy[1].button[4].b) input.pad[1] |= INPUT_X;
|
||||
if(joy[1].button[5].b) input.pad[1] |= INPUT_Y;
|
||||
if(joy[1].button[6].b) input.pad[1] |= INPUT_Z;
|
||||
if(joy[1].button[7].b) input.pad[1] |= INPUT_MODE;
|
||||
}
|
||||
}
|
||||
|
||||
/* keyboard */
|
||||
if(key[KEY_UP]) input.pad[joynum] |= INPUT_UP;
|
||||
else
|
||||
if(key[KEY_DOWN]) input.pad[joynum] |= INPUT_DOWN;
|
||||
|
||||
if(key[KEY_LEFT]) input.pad[joynum] |= INPUT_LEFT;
|
||||
else
|
||||
if(key[KEY_RIGHT]) input.pad[joynum] |= INPUT_RIGHT;
|
||||
|
||||
if(key[KEY_A]) input.pad[joynum] |= INPUT_A;
|
||||
if(key[KEY_S]) input.pad[joynum] |= INPUT_B;
|
||||
if(key[KEY_D]) input.pad[joynum] |= INPUT_C;
|
||||
if(key[KEY_Z]) input.pad[joynum] |= INPUT_X;
|
||||
if(key[KEY_X]) input.pad[joynum] |= INPUT_Y;
|
||||
if(key[KEY_C]) input.pad[joynum] |= INPUT_Z;
|
||||
if(key[KEY_V]) input.pad[joynum] |= INPUT_MODE;
|
||||
if(key[KEY_X]) input.pad[joynum] |= INPUT_Y;
|
||||
if(key[KEY_C]) input.pad[joynum] |= INPUT_Z;
|
||||
if(key[KEY_V]) input.pad[joynum] |= INPUT_MODE;
|
||||
|
||||
if(key[KEY_F]) input.pad[joynum] |= INPUT_START;
|
||||
|
||||
if(key[KEY_F]) input.pad[joynum] |= INPUT_START;
|
||||
|
||||
extern uint8 pico_current;
|
||||
if (input.dev[joynum] == DEVICE_LIGHTGUN)
|
||||
{
|
||||
@ -297,81 +297,80 @@ void dos_update_input(void)
|
||||
else if (input.dev[joynum] == DEVICE_MOUSE)
|
||||
{
|
||||
/* Poll mouse if necessary */
|
||||
if(mouse_needs_poll() == TRUE)
|
||||
poll_mouse();
|
||||
if(mouse_needs_poll() == TRUE)
|
||||
poll_mouse();
|
||||
|
||||
/* Get X & Y quantity of movement */
|
||||
get_mouse_mickeys(&input.analog[2][0], &input.analog[2][1]);
|
||||
get_mouse_mickeys(&input.analog[2][0], &input.analog[2][1]);
|
||||
|
||||
/* Sega Mouse range is -256;+256 */
|
||||
input.analog[2][0] = (input.analog[2][0] * 256) / SCREEN_W;
|
||||
input.analog[2][1] = (input.analog[2][1] * 256) / SCREEN_H;
|
||||
input.analog[2][0] = (input.analog[2][0] * 256) / SCREEN_W;
|
||||
input.analog[2][1] = (input.analog[2][1] * 256) / SCREEN_H;
|
||||
|
||||
/* Vertical movement is upsidedown */
|
||||
if (!config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
|
||||
|
||||
/* Map mouse buttons to player #1 inputs */
|
||||
if(mouse_b & 4) input.pad[joynum] |= INPUT_C;
|
||||
if(mouse_b & 1) input.pad[joynum] |= INPUT_B;
|
||||
if(mouse_b & 2) input.pad[joynum] |= INPUT_A;
|
||||
}
|
||||
|
||||
/* Map mouse buttons to player #1 inputs */
|
||||
if(mouse_b & 4) input.pad[joynum] |= INPUT_C;
|
||||
if(mouse_b & 1) input.pad[joynum] |= INPUT_B;
|
||||
if(mouse_b & 2) input.pad[joynum] |= INPUT_A;
|
||||
}
|
||||
else if (system_hw == SYSTEM_PICO)
|
||||
{
|
||||
/* Poll mouse if necessary */
|
||||
if(mouse_needs_poll() == TRUE)
|
||||
poll_mouse();
|
||||
/* Poll mouse if necessary */
|
||||
if(mouse_needs_poll() == TRUE)
|
||||
poll_mouse();
|
||||
|
||||
/* Calculate X Y axis values */
|
||||
input.analog[0][0] = 0x3c + (mouse_x * (0x17c-0x03c+1)) / SCREEN_W;
|
||||
input.analog[0][1] = 0x1fc + (mouse_y * (0x2f7-0x1fc+1)) / SCREEN_H;
|
||||
|
||||
/* Map mouse buttons to player #1 inputs */
|
||||
if(mouse_b & 2) input.pad[0] |= INPUT_B;
|
||||
if(mouse_b & 1) input.pad[0] |= INPUT_A;
|
||||
if(mouse_b & 4) pico_current++;
|
||||
if (pico_current > 6) pico_current = 0;
|
||||
/* Map mouse buttons to player #1 inputs */
|
||||
if(mouse_b & 2) input.pad[0] |= INPUT_B;
|
||||
if(mouse_b & 1) input.pad[0] |= INPUT_A;
|
||||
if(mouse_b & 4) pico_current++;
|
||||
if (pico_current > 6) pico_current = 0;
|
||||
}
|
||||
|
||||
|
||||
if(check_key(KEY_F1)) frame_skip = 1;
|
||||
if(check_key(KEY_F2)) frame_skip = 2;
|
||||
if(check_key(KEY_F3)) frame_skip = 3;
|
||||
if(check_key(KEY_F4)) frame_skip = 4;
|
||||
if(check_key(KEY_F1)) frame_skip = 1;
|
||||
if(check_key(KEY_F2)) frame_skip = 2;
|
||||
if(check_key(KEY_F3)) frame_skip = 3;
|
||||
if(check_key(KEY_F4)) frame_skip = 4;
|
||||
|
||||
if(check_key(KEY_F5)) log_error ^= 1;
|
||||
if(check_key(KEY_F6)) debug_on ^= 1;
|
||||
|
||||
if(check_key(KEY_F7))
|
||||
{
|
||||
f = fopen("game.gpz","r+b");
|
||||
if (f)
|
||||
{
|
||||
fread(&buf, 0x23000, 1, f);
|
||||
state_load(buf);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
if(check_key(KEY_F5)) log_error ^= 1;
|
||||
if(check_key(KEY_F6)) debug_on ^= 1;
|
||||
|
||||
if(check_key(KEY_F8))
|
||||
{
|
||||
f = fopen("game.gpz","w+b");
|
||||
if (f)
|
||||
{
|
||||
state_save(buf);
|
||||
fwrite(&buf, 0x23000, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
if(check_key(KEY_F7))
|
||||
{
|
||||
f = fopen("game.gpz","r+b");
|
||||
if (f)
|
||||
{
|
||||
fread(&buf, 0x23000, 1, f);
|
||||
state_load(buf);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(check_key(KEY_F9))
|
||||
if(check_key(KEY_F8))
|
||||
{
|
||||
f = fopen("game.gpz","w+b");
|
||||
if (f)
|
||||
{
|
||||
state_save(buf);
|
||||
fwrite(&buf, 0x23000, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
if(check_key(KEY_F9))
|
||||
{
|
||||
vdp_pal ^= 1;
|
||||
|
||||
/* reinitialize timings */
|
||||
system_init ();
|
||||
audio_init(option.sndrate);
|
||||
audio_init(option.sndrate);
|
||||
fm_restore();
|
||||
|
||||
|
||||
/* reinitialize HVC tables */
|
||||
vctab = (vdp_pal) ? ((reg[1] & 8) ? vc_pal_240 : vc_pal_224) : vc_ntsc_224;
|
||||
hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32;
|
||||
@ -382,268 +381,267 @@ void dos_update_input(void)
|
||||
bitmap.viewport.changed = 1;
|
||||
}
|
||||
|
||||
if(check_key(KEY_F10)) set_softreset();
|
||||
if(check_key(KEY_TAB)) system_reset();
|
||||
if(check_key(KEY_F10)) set_softreset();
|
||||
if(check_key(KEY_TAB)) system_reset();
|
||||
}
|
||||
|
||||
void dos_update_audio(void)
|
||||
{
|
||||
osd_play_streamed_sample_16(option.swap ^ 0, snd.buffer[0], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, -100);
|
||||
osd_play_streamed_sample_16(option.swap ^ 1, snd.buffer[1], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, 100);
|
||||
osd_play_streamed_sample_16(option.swap ^ 0, snd.buffer[0], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, -100);
|
||||
osd_play_streamed_sample_16(option.swap ^ 1, snd.buffer[1], snd.buffer_size * 2, option.sndrate, FRAMES_PER_SECOND, 100);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void dos_update_palette(void)
|
||||
{
|
||||
if(is_border_dirty)
|
||||
if(is_border_dirty)
|
||||
{
|
||||
uint16 data = *(uint16 *)&cram[(border << 1)];
|
||||
RGB *color;
|
||||
|
||||
is_border_dirty = 0;
|
||||
|
||||
if(reg[12] & 8)
|
||||
{
|
||||
uint16 data = *(uint16 *)&cram[(border << 1)];
|
||||
int j;
|
||||
for(j = 0; j < 3; j += 1)
|
||||
{
|
||||
color = &vdp_palette[j][data];
|
||||
set_color((j << 6), color);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
color = &vdp_palette[1][data];
|
||||
set_color(0x00, color);
|
||||
set_color(0x40, color);
|
||||
set_color(0x80, color);
|
||||
}
|
||||
}
|
||||
|
||||
if(is_color_dirty)
|
||||
{
|
||||
int i;
|
||||
uint16 *p = (uint16 *)&cram[0];
|
||||
is_color_dirty = 0;
|
||||
|
||||
for(i = 0; i < 64; i += 1)
|
||||
{
|
||||
if((color_dirty[i]) && ((i & 0x0F) != 0x00))
|
||||
{
|
||||
RGB *color;
|
||||
|
||||
is_border_dirty = 0;
|
||||
|
||||
color_dirty[i] = 0;
|
||||
if(reg[12] & 8)
|
||||
{
|
||||
int j;
|
||||
for(j = 0; j < 3; j += 1)
|
||||
{
|
||||
color = &vdp_palette[j][data];
|
||||
set_color((j << 6), color);
|
||||
}
|
||||
int j;
|
||||
for(j = 0; j < 3; j += 1)
|
||||
{
|
||||
color = &vdp_palette[j][p[i]];
|
||||
set_color((j << 6) | i, color);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
color = &vdp_palette[1][data];
|
||||
set_color(0x00, color);
|
||||
set_color(0x40, color);
|
||||
set_color(0x80, color);
|
||||
}
|
||||
}
|
||||
|
||||
if(is_color_dirty)
|
||||
{
|
||||
int i;
|
||||
uint16 *p = (uint16 *)&cram[0];
|
||||
is_color_dirty = 0;
|
||||
|
||||
for(i = 0; i < 64; i += 1)
|
||||
{
|
||||
if((color_dirty[i]) && ((i & 0x0F) != 0x00))
|
||||
{
|
||||
RGB *color;
|
||||
color_dirty[i] = 0;
|
||||
if(reg[12] & 8)
|
||||
{
|
||||
int j;
|
||||
for(j = 0; j < 3; j += 1)
|
||||
{
|
||||
color = &vdp_palette[j][p[i]];
|
||||
set_color((j << 6) | i, color);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
color = &vdp_palette[1][p[i]];
|
||||
set_color(0x00 | i, color);
|
||||
set_color(0x40 | i, color);
|
||||
set_color(0x80 | i, color);
|
||||
}
|
||||
}
|
||||
color = &vdp_palette[1][p[i]];
|
||||
set_color(0x00 | i, color);
|
||||
set_color(0x40 | i, color);
|
||||
set_color(0x80 | i, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void dos_update_video(void)
|
||||
{
|
||||
int width = (bitmap.viewport.w + 2 * bitmap.viewport.x);
|
||||
int height = (bitmap.viewport.h + 2 * bitmap.viewport.y) << (interlaced ? 1:0);
|
||||
int center_x = (SCREEN_W - width) / 2;
|
||||
int center_y = (SCREEN_H / (option.scanlines ? 4 : 2)) - (height / 2);
|
||||
int width = (bitmap.viewport.w + 2 * bitmap.viewport.x);
|
||||
int height = (bitmap.viewport.h + 2 * bitmap.viewport.y) << (interlaced ? 1:0);
|
||||
int center_x = (SCREEN_W - width) / 2;
|
||||
int center_y = (SCREEN_H / (option.scanlines ? 4 : 2)) - (height / 2);
|
||||
|
||||
/* Wait for VSync */
|
||||
if(option.vsync) vsync();
|
||||
/* Wait for VSync */
|
||||
if(option.vsync) vsync();
|
||||
|
||||
if(bitmap.viewport.changed)
|
||||
if(bitmap.viewport.changed)
|
||||
{
|
||||
bitmap.viewport.changed = 0;
|
||||
if(bitmap.remap)
|
||||
{
|
||||
bitmap.viewport.changed = 0;
|
||||
if(bitmap.remap)
|
||||
{
|
||||
clear(screen);
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_to_color(screen, 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
if(bitmap.remap == 0)
|
||||
{
|
||||
dos_update_palette();
|
||||
}
|
||||
#endif
|
||||
|
||||
msg_print(2, 2, "offset = 0x%x", hc_latch/*frame_rate*/);
|
||||
|
||||
if(option.scanlines)
|
||||
{
|
||||
int y;
|
||||
for(y = 0; y < height; y += 1)
|
||||
{
|
||||
blit(gen_bmp, screen, 0x0, y, center_x, (center_y + y) << 1, width, 1);
|
||||
}
|
||||
clear(screen);
|
||||
}
|
||||
else
|
||||
{
|
||||
stretch_blit(gen_bmp, screen, 0, 0, width, height, (SCREEN_W-352)/2, (SCREEN_H-240)/2, 352,240 << (interlaced ? 1:0));
|
||||
|
||||
clear_to_color(screen, 0xFF);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
if(bitmap.remap == 0)
|
||||
{
|
||||
dos_update_palette();
|
||||
}
|
||||
#endif
|
||||
|
||||
msg_print(2, 2, "%d", frame_rate);
|
||||
|
||||
if(option.scanlines)
|
||||
{
|
||||
int y;
|
||||
for(y = 0; y < height; y += 1)
|
||||
{
|
||||
blit(gen_bmp, screen, 0x0, y, center_x, (center_y + y) << 1, width, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stretch_blit(gen_bmp, screen, 0, 0, width, height, (SCREEN_W-352)/2, (SCREEN_H-240)/2, 352,240 << (interlaced ? 1:0));
|
||||
}
|
||||
}
|
||||
|
||||
void init_machine(void)
|
||||
{
|
||||
do_config("gen.cfg");
|
||||
do_config("gen.cfg");
|
||||
|
||||
if(option.sound)
|
||||
{
|
||||
msdos_init_sound(&option.sndrate, option.sndcard);
|
||||
}
|
||||
if(option.sound)
|
||||
{
|
||||
msdos_init_sound(&option.sndrate, option.sndcard);
|
||||
}
|
||||
|
||||
allegro_init();
|
||||
install_mouse();
|
||||
install_keyboard();
|
||||
install_joystick(option.joy_driver);
|
||||
allegro_init();
|
||||
install_mouse();
|
||||
install_keyboard();
|
||||
install_joystick(option.joy_driver);
|
||||
|
||||
install_timer();
|
||||
LOCK_FUNCTION(tick_handler);
|
||||
LOCK_VARIABLE(tick_count);
|
||||
LOCK_VARIABLE(frame_rate);
|
||||
install_int_ex(tick_handler, BPS_TO_TIMER(FRAMES_PER_SECOND));
|
||||
install_timer();
|
||||
LOCK_FUNCTION(tick_handler);
|
||||
LOCK_VARIABLE(tick_count);
|
||||
LOCK_VARIABLE(frame_rate);
|
||||
install_int_ex(tick_handler, BPS_TO_TIMER(FRAMES_PER_SECOND));
|
||||
|
||||
set_color_depth(option.video_depth);
|
||||
gen_bmp = create_bitmap(360, 576);
|
||||
clear(gen_bmp);
|
||||
set_color_depth(option.video_depth);
|
||||
gen_bmp = create_bitmap(720, 576);
|
||||
clear(gen_bmp);
|
||||
|
||||
memset(&bitmap, 0, sizeof(bitmap));
|
||||
bitmap.data = (uint8 *)&gen_bmp->line[0][0];
|
||||
bitmap.width = gen_bmp->w;
|
||||
bitmap.height = gen_bmp->h;
|
||||
bitmap.depth = option.video_depth;
|
||||
switch(option.video_depth)
|
||||
{
|
||||
case 8:
|
||||
bitmap.granularity = 1;
|
||||
break;
|
||||
case 15:
|
||||
bitmap.granularity = 2;
|
||||
break;
|
||||
case 16:
|
||||
bitmap.granularity = 2;
|
||||
break;
|
||||
case 32:
|
||||
bitmap.granularity = 4;
|
||||
break;
|
||||
}
|
||||
bitmap.pitch = (bitmap.width * bitmap.granularity);
|
||||
bitmap.viewport.w = 256;
|
||||
bitmap.viewport.h = 224;
|
||||
bitmap.viewport.x = 0x00;
|
||||
bitmap.viewport.y = 0x00;
|
||||
bitmap.remap = 0;
|
||||
if(option.remap) bitmap.remap = 1;
|
||||
else
|
||||
if(bitmap.depth > 8) bitmap.remap = 1;
|
||||
memset(&bitmap, 0, sizeof(bitmap));
|
||||
bitmap.data = (uint8 *)&gen_bmp->line[0][0];
|
||||
bitmap.width = gen_bmp->w;
|
||||
bitmap.height = gen_bmp->h;
|
||||
bitmap.depth = option.video_depth;
|
||||
switch(option.video_depth)
|
||||
{
|
||||
case 8:
|
||||
bitmap.granularity = 1;
|
||||
break;
|
||||
case 15:
|
||||
bitmap.granularity = 2;
|
||||
break;
|
||||
case 16:
|
||||
bitmap.granularity = 2;
|
||||
break;
|
||||
case 32:
|
||||
bitmap.granularity = 4;
|
||||
break;
|
||||
}
|
||||
bitmap.pitch = (bitmap.width * bitmap.granularity);
|
||||
bitmap.viewport.w = 256;
|
||||
bitmap.viewport.h = 224;
|
||||
bitmap.viewport.x = 0x00;
|
||||
bitmap.viewport.y = 0x00;
|
||||
bitmap.remap = 0;
|
||||
if(option.remap) bitmap.remap = 1;
|
||||
else
|
||||
if(bitmap.depth > 8) bitmap.remap = 1;
|
||||
|
||||
make_vdp_palette();
|
||||
make_vdp_palette();
|
||||
|
||||
memcpy(gen_pal, black_palette, sizeof(PALETTE));
|
||||
gen_pal[0xFE].r = \
|
||||
gen_pal[0xFE].g = \
|
||||
gen_pal[0xFE].b = 0x3F;
|
||||
memcpy(gen_pal, black_palette, sizeof(PALETTE));
|
||||
gen_pal[0xFE].r = \
|
||||
gen_pal[0xFE].g = \
|
||||
gen_pal[0xFE].b = 0x3F;
|
||||
|
||||
dos_change_mode();
|
||||
dos_change_mode();
|
||||
}
|
||||
|
||||
void trash_machine(void)
|
||||
{
|
||||
if(option.sound)
|
||||
{
|
||||
msdos_shutdown_sound();
|
||||
}
|
||||
clear(screen);
|
||||
destroy_bitmap(gen_bmp);
|
||||
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
|
||||
if(option.sound)
|
||||
{
|
||||
msdos_shutdown_sound();
|
||||
}
|
||||
clear(screen);
|
||||
destroy_bitmap(gen_bmp);
|
||||
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void make_vdp_palette(void)
|
||||
{
|
||||
uint8 lut[3][8] =
|
||||
{
|
||||
{0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C},
|
||||
{0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38},
|
||||
{0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C},
|
||||
};
|
||||
uint8 lut[3][8] =
|
||||
{
|
||||
{0x00, 0x04, 0x08, 0x0C, 0x10, 0x14, 0x18, 0x1C},
|
||||
{0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38},
|
||||
{0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x38, 0x3C},
|
||||
};
|
||||
|
||||
int j;
|
||||
for(j = 0; j < 0x600; j += 1)
|
||||
{
|
||||
int j;
|
||||
for(j = 0; j < 0x600; j += 1)
|
||||
{
|
||||
|
||||
int r = (j >> 6) & 7;
|
||||
int g = (j >> 3) & 7;
|
||||
int b = (j >> 0) & 7;
|
||||
int i = (j >> 9) & 3;
|
||||
int r = (j >> 6) & 7;
|
||||
int g = (j >> 3) & 7;
|
||||
int b = (j >> 0) & 7;
|
||||
int i = (j >> 9) & 3;
|
||||
|
||||
vdp_palette[i][j & 0x1FF].r = lut[i][r];
|
||||
vdp_palette[i][j & 0x1FF].g = lut[i][g];
|
||||
vdp_palette[i][j & 0x1FF].b = lut[i][b];
|
||||
}
|
||||
vdp_palette[i][j & 0x1FF].r = lut[i][r];
|
||||
vdp_palette[i][j & 0x1FF].g = lut[i][g];
|
||||
vdp_palette[i][j & 0x1FF].b = lut[i][b];
|
||||
}
|
||||
}
|
||||
|
||||
void dos_change_mode(void)
|
||||
{
|
||||
int ret;
|
||||
int width = option.video_width;
|
||||
int height = option.video_height;
|
||||
int ret;
|
||||
int width = option.video_width;
|
||||
int height = option.video_height;
|
||||
|
||||
if(option.scanlines) height *= 2;
|
||||
ret = set_gfx_mode(option.video_driver, width, height, 0, 0);
|
||||
if(ret != 0)
|
||||
{
|
||||
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
|
||||
printf("Error setting graphics mode (%dx%d %dbpp).\nAllegro says: `%s'\n", width, height, option.video_depth, allegro_error);
|
||||
exit(1);
|
||||
}
|
||||
if(option.scanlines) height *= 2;
|
||||
ret = set_gfx_mode(option.video_driver, width, height, 0, 0);
|
||||
if(ret != 0)
|
||||
{
|
||||
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
|
||||
printf("Error setting graphics mode (%dx%d %dbpp).\nAllegro says: `%s'\n", width, height, option.video_depth, allegro_error);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(bitmap.depth == 8)
|
||||
if(bitmap.depth == 8)
|
||||
{
|
||||
if(bitmap.remap)
|
||||
{
|
||||
if(bitmap.remap)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 0x100; i += 1)
|
||||
{
|
||||
gen_pal[i].r = ((i >> 5) & 7) << 3;
|
||||
gen_pal[i].g = ((i >> 2) & 7) << 3;
|
||||
gen_pal[i].b = ((i >> 0) & 3) << 4;
|
||||
}
|
||||
set_palette(gen_pal);
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_to_color(screen, 0xFF);
|
||||
gen_pal[0xfe].r = 0xff;
|
||||
gen_pal[0xfe].g = 0xff;
|
||||
gen_pal[0xfe].b = 0xff;
|
||||
set_palette(gen_pal);
|
||||
inp(0x3DA);
|
||||
outp(0x3C0, 0x31);
|
||||
outp(0x3C0, 0xFF);
|
||||
}
|
||||
int i;
|
||||
for(i = 0; i < 0x100; i += 1)
|
||||
{
|
||||
gen_pal[i].r = ((i >> 5) & 7) << 3;
|
||||
gen_pal[i].g = ((i >> 2) & 7) << 3;
|
||||
gen_pal[i].b = ((i >> 0) & 3) << 4;
|
||||
}
|
||||
set_palette(gen_pal);
|
||||
}
|
||||
else
|
||||
{
|
||||
clear(screen);
|
||||
clear_to_color(screen, 0xFF);
|
||||
gen_pal[0xfe].r = 0xff;
|
||||
gen_pal[0xfe].g = 0xff;
|
||||
gen_pal[0xfe].b = 0xff;
|
||||
set_palette(gen_pal);
|
||||
inp(0x3DA);
|
||||
outp(0x3C0, 0x31);
|
||||
outp(0x3C0, 0xFF);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
clear(screen);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -651,17 +649,17 @@ void dos_change_mode(void)
|
||||
/* Check if a key is pressed */
|
||||
int check_key(int code)
|
||||
{
|
||||
static char lastbuf[0x100] = {0};
|
||||
static char lastbuf[0x100] = {0};
|
||||
|
||||
if((!key[code]) && (lastbuf[code] == 1))
|
||||
lastbuf[code] = 0;
|
||||
if((!key[code]) && (lastbuf[code] == 1))
|
||||
lastbuf[code] = 0;
|
||||
|
||||
if((key[code]) && (lastbuf[code] == 0))
|
||||
{
|
||||
lastbuf[code] = 1;
|
||||
return (1);
|
||||
}
|
||||
if((key[code]) && (lastbuf[code] == 0))
|
||||
{
|
||||
lastbuf[code] = 1;
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,6 @@ void make_vdp_palette(void);
|
||||
void dos_change_mode(void);
|
||||
int check_key(int code);
|
||||
|
||||
#define update_input() dos_update_input()
|
||||
#define MAX_INPUTS 8
|
||||
|
||||
extern uint8 debug_on;
|
||||
|
@ -4,9 +4,9 @@
|
||||
FILE *error_log;
|
||||
|
||||
struct {
|
||||
int enabled;
|
||||
int verbose;
|
||||
FILE *log;
|
||||
int enabled;
|
||||
int verbose;
|
||||
FILE *log;
|
||||
} t_error;
|
||||
|
||||
void error_init(void)
|
||||
@ -23,8 +23,8 @@ void error_shutdown(void)
|
||||
|
||||
void error(char *format, ...)
|
||||
{
|
||||
if (!log_error) return;
|
||||
va_list ap;
|
||||
if (!log_error) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
if(error_log) vfprintf(error_log, format, ap);
|
||||
va_end(ap);
|
||||
|
1294
source/unused/dos/unzip.c
Normal file
1294
source/unused/dos/unzip.c
Normal file
File diff suppressed because it is too large
Load Diff
273
source/unused/dos/unzip.h
Normal file
273
source/unused/dos/unzip.h
Normal file
@ -0,0 +1,273 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 0.15 beta, Mar 19th, 1998,
|
||||
|
||||
Copyright (C) 1998 Gilles Vollant
|
||||
|
||||
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
|
||||
WinZip, InfoZip tools and compatible.
|
||||
Encryption and multi volume ZipFile (span) are not supported.
|
||||
Old compressions used by old PKZip 1.x are not supported
|
||||
|
||||
THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
|
||||
CAN CHANGE IN FUTURE VERSION !!
|
||||
I WAIT FEEDBACK at mail info@winimage.com
|
||||
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/* for more info about .ZIP format, see
|
||||
ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
|
||||
PkWare has also a specification at :
|
||||
ftp://ftp.pkware.com/probdesc.zip */
|
||||
|
||||
#ifndef _unz_H
|
||||
#define _unz_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
#define UNZ_EOF (0)
|
||||
#define UNZ_PARAMERROR (-102)
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
} unz_file_info;
|
||||
|
||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
||||
const char* fileName2,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Compare two filename (fileName1,fileName2).
|
||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
||||
or strcasecmp)
|
||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
||||
(like 1 on Unix, 2 on Windows)
|
||||
*/
|
||||
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
/*
|
||||
Open a Zip file. path contain the full pathname (by example,
|
||||
on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
|
||||
"zlib/zlib111.zip".
|
||||
If the zipfile cannot be opened (file don't exist or in not valid), the
|
||||
return value is NULL.
|
||||
Else, the return value is a unzFile Handle, usable with other function
|
||||
of this unzip package.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/*
|
||||
Close a ZipFile opened with unzipOpen.
|
||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||
unz_global_info *pglobal_info));
|
||||
/*
|
||||
Write info about the ZipFile in the *pglobal_info structure.
|
||||
No preparation of the structure is needed
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||
char *szComment,
|
||||
uLong uSizeBuf));
|
||||
/*
|
||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* Unzip package allow you browse the directory of the zipfile */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the first file.
|
||||
return UNZ_OK if there is no problem
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the next file.
|
||||
return UNZ_OK if there is no problem
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
||||
const char *szFileName,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Try locate the file szFileName in the zipfile.
|
||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||
|
||||
return value :
|
||||
UNZ_OK if the file is found. It becomes the current file.
|
||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||
unz_file_info *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
/*
|
||||
Get Info about the current file
|
||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
||||
the current file
|
||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||
(fileNameBufferSize is the size of the buffer)
|
||||
if extraField!=NULL, the extra field information will be copied in extraField
|
||||
(extraFieldBufferSize is the size of the buffer).
|
||||
This is the Central-header version of the extra field
|
||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||
(commentBufferSize is the size of the buffer)
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
/* for reading the content of the current zipfile, you can open it, read data
|
||||
from it, and close it (you can close it before reading all the file)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Close the file in zip opened with unzOpenCurrentFile
|
||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error
|
||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||
*/
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
/*
|
||||
Give the current position in uncompressed data
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
/*
|
||||
return 1 if the end of file was reached, 0 elsewhere
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf==NULL, it return the size of the local extra field
|
||||
|
||||
if buf!=NULL, len is the size of the buffer, the extra header is copied in
|
||||
buf.
|
||||
the return value is the number of bytes copied in buf, or (if <0)
|
||||
the error code
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz_H */
|
@ -31,7 +31,6 @@ OBJECTS += obj/genesis.o \
|
||||
obj/mem68k.o \
|
||||
obj/memz80.o \
|
||||
obj/membnk.o \
|
||||
obj/memvdp.o \
|
||||
obj/state.o
|
||||
|
||||
OBJECTS += obj/sound.o \
|
||||
|
@ -11,8 +11,8 @@ void set_config_defaults(void)
|
||||
config.fm_preamp = 1.0;
|
||||
config.boost = 1;
|
||||
config.filter = 1;
|
||||
config.hq_fm = 2;
|
||||
config.fm_core = 0;
|
||||
config.hq_fm = 1;
|
||||
config.fm_core = 1;
|
||||
|
||||
/* system options */
|
||||
config.region_detect = 0;
|
||||
|
@ -8,14 +8,14 @@
|
||||
FILE *error_log;
|
||||
|
||||
struct {
|
||||
int enabled;
|
||||
int verbose;
|
||||
FILE *log;
|
||||
int enabled;
|
||||
int verbose;
|
||||
FILE *log;
|
||||
} t_error;
|
||||
|
||||
void error_init(void)
|
||||
{
|
||||
#ifdef LOG_ERROR
|
||||
#ifdef LOGERROR
|
||||
error_log = fopen("error.log","w");
|
||||
#endif
|
||||
}
|
||||
@ -27,8 +27,8 @@ void error_shutdown(void)
|
||||
|
||||
void error(char *format, ...)
|
||||
{
|
||||
if (!log_error) return;
|
||||
va_list ap;
|
||||
if (!log_error) return;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
if(error_log) vfprintf(error_log, format, ap);
|
||||
va_end(ap);
|
||||
|
@ -24,9 +24,9 @@ int playbuffer = 0;
|
||||
|
||||
uint8 log_error = 0;
|
||||
uint8 debug_on = 0;
|
||||
uint8 turbo_mode = 0;
|
||||
uint8 use_sound = 1;
|
||||
uint8 fullscreen = 0;
|
||||
uint8 turbo_mode = 1;
|
||||
uint8 use_sound = 0;
|
||||
uint8 fullscreen = 0;
|
||||
|
||||
int audio_len;
|
||||
|
||||
@ -53,8 +53,8 @@ static int sdl_sound_init()
|
||||
if(SDL_Init(SDL_INIT_AUDIO) < 0)
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "SDL audio can't initialize");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
sprintf(caption, "SDL audio can't initialize");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -67,12 +67,12 @@ static int sdl_sound_init()
|
||||
if(SDL_OpenAudio(&audio, NULL) == -1)
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "SDL can't open audio");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
sprintf(caption, "SDL can't open audio");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(soundbuffer, 0, 16 * 3840);
|
||||
memset(soundbuffer, 0, 16 * 3840);
|
||||
mixbuffer = 0;
|
||||
playbuffer = 0;
|
||||
return 1;
|
||||
@ -86,32 +86,32 @@ static long output_pitch;
|
||||
|
||||
Uint32 fps_callback(Uint32 interval)
|
||||
{
|
||||
if(paused) return 1000/vdp_rate;
|
||||
timer_count++;
|
||||
if(paused) return 1000/vdp_rate;
|
||||
timer_count++;
|
||||
frameticker ++;
|
||||
if(timer_count % vdp_rate == 0)
|
||||
{
|
||||
int fps = frame_count + 1;
|
||||
char caption[100];
|
||||
if(timer_count % vdp_rate == 0)
|
||||
{
|
||||
int fps = frame_count + 1;
|
||||
char caption[100];
|
||||
char region[10];
|
||||
if (region_code == REGION_USA) sprintf(region,"USA");
|
||||
else if (region_code == REGION_EUROPE) sprintf(region,"EUR");
|
||||
else sprintf(region,"JAP");
|
||||
sprintf(caption, "Genesis Plus/SDL - %s (%s) - %d fps", rominfo.international, region, fps);
|
||||
SDL_WM_SetCaption(caption, NULL);
|
||||
frame_count = 0;
|
||||
SDL_WM_SetCaption(caption, NULL);
|
||||
frame_count = 0;
|
||||
|
||||
}
|
||||
return 1000/vdp_rate;
|
||||
}
|
||||
return 1000/vdp_rate;
|
||||
}
|
||||
|
||||
void lock_pixels( void )
|
||||
{
|
||||
if ( SDL_LockSurface( surface ) < 0 )
|
||||
MessageBox(NULL, "Couldn't lock surface", "Error", 0);
|
||||
SDL_FillRect( surface, 0, 0 );
|
||||
output_pitch = surface->pitch;
|
||||
output_pixels = (unsigned char*) surface->pixels;
|
||||
if ( SDL_LockSurface( surface ) < 0 )
|
||||
MessageBox(NULL, "Couldn't lock surface", "Error", 0);
|
||||
SDL_FillRect( surface, 0, 0 );
|
||||
output_pitch = surface->pitch;
|
||||
output_pixels = (unsigned char*) surface->pixels;
|
||||
}
|
||||
|
||||
void display_output( void )
|
||||
@ -121,9 +121,9 @@ void display_output( void )
|
||||
dest.h=rect.h;
|
||||
dest.x=(640-rect.w)/2;
|
||||
dest.y=(480-rect.h)/2;
|
||||
//SDL_UnlockSurface( surface );
|
||||
if ( SDL_BlitSurface( surface, &rect, screen, &dest ) < 0 || SDL_Flip( screen ) < 0 )
|
||||
MessageBox(NULL, "SDL blit failed", "Error", 0);
|
||||
//SDL_UnlockSurface( surface );
|
||||
if ( SDL_BlitSurface( surface, &rect, screen, &dest ) < 0 || SDL_Flip( screen ) < 0 )
|
||||
MessageBox(NULL, "SDL blit failed", "Error", 0);
|
||||
}
|
||||
|
||||
md_ntsc_t md_ntsc;
|
||||
@ -131,7 +131,7 @@ sms_ntsc_t sms_ntsc;
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
int running = 1;
|
||||
int running = 1;
|
||||
int sym;
|
||||
md_ntsc_setup_t md_setup;
|
||||
sms_ntsc_setup_t sms_setup;
|
||||
@ -141,42 +141,42 @@ int main (int argc, char **argv)
|
||||
error_init();
|
||||
|
||||
/* Print help if no game specified */
|
||||
if(argc < 2)
|
||||
{
|
||||
char caption[256];
|
||||
if(argc < 2)
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "Genesis Plus\\SDL by Charles MacDonald\nWWW: http://cgfm2.emuviews.com\nusage: %s gamename\n", argv[0]);
|
||||
MessageBox(NULL, caption, "Information", 0);
|
||||
exit(1);
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Load game */
|
||||
/* Load game */
|
||||
cart_rom = malloc(0xA00000);
|
||||
memset(cart_rom, 0, 0xA00000);
|
||||
memset(cart_rom, 0, 0xA00000);
|
||||
if(!load_rom(argv[1]))
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "Error loading file `%s'.", argv[1]);
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
exit(1);
|
||||
}
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "Error loading file `%s'.", argv[1]);
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* initialize SDL */
|
||||
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
|
||||
{
|
||||
char caption[256];
|
||||
sprintf(caption, "SDL initialization failed");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
char caption[256];
|
||||
sprintf(caption, "SDL initialization failed");
|
||||
MessageBox(NULL, caption, "Error", 0);
|
||||
exit(1);
|
||||
}
|
||||
SDL_WM_SetCaption("Genesis Plus/SDL", NULL);
|
||||
SDL_ShowCursor(0);
|
||||
|
||||
screen = SDL_SetVideoMode(640, 480, 16, fullscreen ? (SDL_SWSURFACE|SDL_FULLSCREEN): (SDL_SWSURFACE));
|
||||
surface = SDL_CreateRGBSurface(SDL_SWSURFACE, 720, 576, 16, 0, 0, 0, 0);
|
||||
screen = SDL_SetVideoMode(640, 480, 16, fullscreen ? (SDL_HWSURFACE|SDL_FULLSCREEN): (SDL_HWSURFACE));
|
||||
surface = SDL_CreateRGBSurface(SDL_HWSURFACE, 720, 576, 16, 0, 0, 0, 0);
|
||||
if (!screen || !surface)
|
||||
{
|
||||
MessageBox(NULL, "Video initialization failed", "Error", 0);
|
||||
exit(1);
|
||||
MessageBox(NULL, "Video initialization failed", "Error", 0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* initialize Genesis display */
|
||||
@ -197,24 +197,24 @@ int main (int argc, char **argv)
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_GAMEPAD;
|
||||
|
||||
/* load BIOS */
|
||||
/* load BIOS */
|
||||
memset(bios_rom, 0, sizeof(bios_rom));
|
||||
FILE *f = fopen("./BIOS.bin", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&bios_rom, 0x800,1,f);
|
||||
fclose(f);
|
||||
int i;
|
||||
for(i = 0; i < 0x800; i += 2)
|
||||
{
|
||||
uint8 temp = bios_rom[i];
|
||||
bios_rom[i] = bios_rom[i+1];
|
||||
bios_rom[i+1] = temp;
|
||||
}
|
||||
config.bios_enabled |= 2;
|
||||
FILE *f = fopen("./BIOS.bin", "rb");
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(&bios_rom, 0x800,1,f);
|
||||
fclose(f);
|
||||
int i;
|
||||
for(i = 0; i < 0x800; i += 2)
|
||||
{
|
||||
uint8 temp = bios_rom[i];
|
||||
bios_rom[i] = bios_rom[i+1];
|
||||
bios_rom[i+1] = temp;
|
||||
}
|
||||
config.bios_enabled |= 2;
|
||||
}
|
||||
|
||||
/* initialize emulation */
|
||||
/* initialize emulation */
|
||||
system_init();
|
||||
audio_init(SOUND_FREQUENCY);
|
||||
|
||||
@ -226,7 +226,7 @@ int main (int argc, char **argv)
|
||||
if (f!=NULL)
|
||||
{
|
||||
fread(sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/* reset emulation */
|
||||
@ -236,23 +236,23 @@ int main (int argc, char **argv)
|
||||
SDL_SetTimer(1000/vdp_rate, fps_callback);
|
||||
if (use_sound) SDL_PauseAudio(0);
|
||||
|
||||
while(running)
|
||||
{
|
||||
while (SDL_PollEvent(&event))
|
||||
{
|
||||
switch(event.type)
|
||||
{
|
||||
case SDL_QUIT: /* Windows was closed */
|
||||
running = 0;
|
||||
break;
|
||||
while(running)
|
||||
{
|
||||
while (SDL_PollEvent(&event))
|
||||
{
|
||||
switch(event.type)
|
||||
{
|
||||
case SDL_QUIT: /* Windows was closed */
|
||||
running = 0;
|
||||
break;
|
||||
|
||||
case SDL_ACTIVEEVENT: /* Window focus changed or was minimized */
|
||||
if(event.active.state & (SDL_APPINPUTFOCUS | SDL_APPACTIVE))
|
||||
{
|
||||
paused = !event.active.gain;
|
||||
case SDL_ACTIVEEVENT: /* Window focus changed or was minimized */
|
||||
if(event.active.state & (SDL_APPINPUTFOCUS | SDL_APPACTIVE))
|
||||
{
|
||||
paused = !event.active.gain;
|
||||
if (use_sound) SDL_PauseAudio(paused);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SDL_KEYDOWN: /* user options */
|
||||
sym = event.key.keysym.sym;
|
||||
@ -261,7 +261,7 @@ int main (int argc, char **argv)
|
||||
else if (sym == SDLK_RETURN)
|
||||
{
|
||||
fullscreen ^=1;
|
||||
screen = SDL_SetVideoMode(640, 480, 16, fullscreen ? (SDL_SWSURFACE|SDL_FULLSCREEN): (SDL_SWSURFACE));
|
||||
screen = SDL_SetVideoMode(640, 480, 16, fullscreen ? (SDL_HWSURFACE|SDL_FULLSCREEN): (SDL_HWSURFACE));
|
||||
|
||||
}
|
||||
else if(sym == SDLK_F3) config.render ^=1;
|
||||
@ -337,10 +337,11 @@ int main (int argc, char **argv)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!paused)
|
||||
{
|
||||
@ -359,14 +360,15 @@ int main (int argc, char **argv)
|
||||
system_frame (0);
|
||||
frame_count++;
|
||||
}
|
||||
update_input();
|
||||
|
||||
frameticker--;
|
||||
|
||||
if(bitmap.viewport.changed)
|
||||
{
|
||||
bitmap.viewport.changed = 0;
|
||||
bitmap.viewport.changed = 0;
|
||||
rect.w = bitmap.viewport.w+2*bitmap.viewport.x;
|
||||
rect.h = bitmap.viewport.h+2*bitmap.viewport.y;
|
||||
rect.h = bitmap.viewport.h+2*bitmap.viewport.y;
|
||||
if (config.render && (interlaced || config.ntsc)) rect.h *= 2;
|
||||
if (config.ntsc) rect.w = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(rect.w) : SMS_NTSC_OUT_WIDTH(rect.w);
|
||||
|
||||
@ -403,7 +405,7 @@ int main (int argc, char **argv)
|
||||
if (f!=NULL)
|
||||
{
|
||||
fwrite(&sram.sram,0x10000,1, f);
|
||||
fclose(f);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
SDL_PauseAudio(1);
|
||||
@ -424,8 +426,8 @@ int update_input(void)
|
||||
|
||||
while (input.dev[joynum] == NO_DEVICE)
|
||||
{
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
joynum ++;
|
||||
if (joynum > MAX_DEVICES - 1) joynum = 0;
|
||||
}
|
||||
|
||||
/* reset input */
|
||||
@ -448,7 +450,6 @@ int update_input(void)
|
||||
if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_Z;
|
||||
if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_MODE;
|
||||
|
||||
extern uint8 pico_current;
|
||||
if (input.dev[joynum] == DEVICE_LIGHTGUN)
|
||||
{
|
||||
/* get mouse (absolute values) */
|
||||
|
1294
source/unused/win/unzip.c
Normal file
1294
source/unused/win/unzip.c
Normal file
File diff suppressed because it is too large
Load Diff
273
source/unused/win/unzip.h
Normal file
273
source/unused/win/unzip.h
Normal file
@ -0,0 +1,273 @@
|
||||
/* unzip.h -- IO for uncompress .zip files using zlib
|
||||
Version 0.15 beta, Mar 19th, 1998,
|
||||
|
||||
Copyright (C) 1998 Gilles Vollant
|
||||
|
||||
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
|
||||
WinZip, InfoZip tools and compatible.
|
||||
Encryption and multi volume ZipFile (span) are not supported.
|
||||
Old compressions used by old PKZip 1.x are not supported
|
||||
|
||||
THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
|
||||
CAN CHANGE IN FUTURE VERSION !!
|
||||
I WAIT FEEDBACK at mail info@winimage.com
|
||||
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
|
||||
|
||||
Condition of use and distribution are the same than zlib :
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
/* for more info about .ZIP format, see
|
||||
ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip
|
||||
PkWare has also a specification at :
|
||||
ftp://ftp.pkware.com/probdesc.zip */
|
||||
|
||||
#ifndef _unz_H
|
||||
#define _unz_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef _ZLIB_H
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
|
||||
/* like the STRICT of WIN32, we define a pointer that cannot be converted
|
||||
from (void*) without cast */
|
||||
typedef struct TagunzFile__ { int unused; } unzFile__;
|
||||
typedef unzFile__ *unzFile;
|
||||
#else
|
||||
typedef voidp unzFile;
|
||||
#endif
|
||||
|
||||
|
||||
#define UNZ_OK (0)
|
||||
#define UNZ_END_OF_LIST_OF_FILE (-100)
|
||||
#define UNZ_ERRNO (Z_ERRNO)
|
||||
#define UNZ_EOF (0)
|
||||
#define UNZ_PARAMERROR (-102)
|
||||
#define UNZ_BADZIPFILE (-103)
|
||||
#define UNZ_INTERNALERROR (-104)
|
||||
#define UNZ_CRCERROR (-105)
|
||||
|
||||
/* tm_unz contain date/time info */
|
||||
typedef struct tm_unz_s
|
||||
{
|
||||
uInt tm_sec; /* seconds after the minute - [0,59] */
|
||||
uInt tm_min; /* minutes after the hour - [0,59] */
|
||||
uInt tm_hour; /* hours since midnight - [0,23] */
|
||||
uInt tm_mday; /* day of the month - [1,31] */
|
||||
uInt tm_mon; /* months since January - [0,11] */
|
||||
uInt tm_year; /* years - [1980..2044] */
|
||||
} tm_unz;
|
||||
|
||||
/* unz_global_info structure contain global data about the ZIPfile
|
||||
These data comes from the end of central dir */
|
||||
typedef struct unz_global_info_s
|
||||
{
|
||||
uLong number_entry; /* total number of entries in
|
||||
the central dir on this disk */
|
||||
uLong size_comment; /* size of the global comment of the zipfile */
|
||||
} unz_global_info;
|
||||
|
||||
|
||||
/* unz_file_info contain information about a file in the zipfile */
|
||||
typedef struct unz_file_info_s
|
||||
{
|
||||
uLong version; /* version made by 2 bytes */
|
||||
uLong version_needed; /* version needed to extract 2 bytes */
|
||||
uLong flag; /* general purpose bit flag 2 bytes */
|
||||
uLong compression_method; /* compression method 2 bytes */
|
||||
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
|
||||
uLong crc; /* crc-32 4 bytes */
|
||||
uLong compressed_size; /* compressed size 4 bytes */
|
||||
uLong uncompressed_size; /* uncompressed size 4 bytes */
|
||||
uLong size_filename; /* filename length 2 bytes */
|
||||
uLong size_file_extra; /* extra field length 2 bytes */
|
||||
uLong size_file_comment; /* file comment length 2 bytes */
|
||||
|
||||
uLong disk_num_start; /* disk number start 2 bytes */
|
||||
uLong internal_fa; /* internal file attributes 2 bytes */
|
||||
uLong external_fa; /* external file attributes 4 bytes */
|
||||
|
||||
tm_unz tmu_date;
|
||||
} unz_file_info;
|
||||
|
||||
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
|
||||
const char* fileName2,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Compare two filename (fileName1,fileName2).
|
||||
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
|
||||
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
|
||||
or strcasecmp)
|
||||
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
|
||||
(like 1 on Unix, 2 on Windows)
|
||||
*/
|
||||
|
||||
|
||||
extern unzFile ZEXPORT unzOpen OF((const char *path));
|
||||
/*
|
||||
Open a Zip file. path contain the full pathname (by example,
|
||||
on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer
|
||||
"zlib/zlib111.zip".
|
||||
If the zipfile cannot be opened (file don't exist or in not valid), the
|
||||
return value is NULL.
|
||||
Else, the return value is a unzFile Handle, usable with other function
|
||||
of this unzip package.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzClose OF((unzFile file));
|
||||
/*
|
||||
Close a ZipFile opened with unzipOpen.
|
||||
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
|
||||
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
|
||||
unz_global_info *pglobal_info));
|
||||
/*
|
||||
Write info about the ZipFile in the *pglobal_info structure.
|
||||
No preparation of the structure is needed
|
||||
return UNZ_OK if there is no problem. */
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
|
||||
char *szComment,
|
||||
uLong uSizeBuf));
|
||||
/*
|
||||
Get the global comment string of the ZipFile, in the szComment buffer.
|
||||
uSizeBuf is the size of the szComment buffer.
|
||||
return the number of byte copied or an error code <0
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* Unzip package allow you browse the directory of the zipfile */
|
||||
|
||||
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the first file.
|
||||
return UNZ_OK if there is no problem
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
|
||||
/*
|
||||
Set the current file of the zipfile to the next file.
|
||||
return UNZ_OK if there is no problem
|
||||
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzLocateFile OF((unzFile file,
|
||||
const char *szFileName,
|
||||
int iCaseSensitivity));
|
||||
/*
|
||||
Try locate the file szFileName in the zipfile.
|
||||
For the iCaseSensitivity signification, see unzStringFileNameCompare
|
||||
|
||||
return value :
|
||||
UNZ_OK if the file is found. It becomes the current file.
|
||||
UNZ_END_OF_LIST_OF_FILE if the file is not found
|
||||
*/
|
||||
|
||||
|
||||
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
|
||||
unz_file_info *pfile_info,
|
||||
char *szFileName,
|
||||
uLong fileNameBufferSize,
|
||||
void *extraField,
|
||||
uLong extraFieldBufferSize,
|
||||
char *szComment,
|
||||
uLong commentBufferSize));
|
||||
/*
|
||||
Get Info about the current file
|
||||
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
|
||||
the current file
|
||||
if szFileName!=NULL, the filemane string will be copied in szFileName
|
||||
(fileNameBufferSize is the size of the buffer)
|
||||
if extraField!=NULL, the extra field information will be copied in extraField
|
||||
(extraFieldBufferSize is the size of the buffer).
|
||||
This is the Central-header version of the extra field
|
||||
if szComment!=NULL, the comment string of the file will be copied in szComment
|
||||
(commentBufferSize is the size of the buffer)
|
||||
*/
|
||||
|
||||
/***************************************************************************/
|
||||
/* for reading the content of the current zipfile, you can open it, read data
|
||||
from it, and close it (you can close it before reading all the file)
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Open for reading data the current file in the zipfile.
|
||||
If there is no error, the return value is UNZ_OK.
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
|
||||
/*
|
||||
Close the file in zip opened with unzOpenCurrentFile
|
||||
Return UNZ_CRCERROR if all the file was read but the CRC is not good
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read bytes from the current file (opened by unzOpenCurrentFile)
|
||||
buf contain buffer where data must be copied
|
||||
len the size of buf.
|
||||
|
||||
return the number of byte copied if somes bytes are copied
|
||||
return 0 if the end of file was reached
|
||||
return <0 with error code if there is an error
|
||||
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
|
||||
*/
|
||||
|
||||
extern z_off_t ZEXPORT unztell OF((unzFile file));
|
||||
/*
|
||||
Give the current position in uncompressed data
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzeof OF((unzFile file));
|
||||
/*
|
||||
return 1 if the end of file was reached, 0 elsewhere
|
||||
*/
|
||||
|
||||
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
|
||||
voidp buf,
|
||||
unsigned len));
|
||||
/*
|
||||
Read extra field from the current file (opened by unzOpenCurrentFile)
|
||||
This is the local-header version of the extra field (sometimes, there is
|
||||
more info in the local-header version than in the central-header)
|
||||
|
||||
if buf==NULL, it return the size of the local extra field
|
||||
|
||||
if buf!=NULL, len is the size of the buffer, the extra header is copied in
|
||||
buf.
|
||||
the return value is the number of bytes copied in buf, or (if <0)
|
||||
the error code
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _unz_H */
|
Loading…
Reference in New Issue
Block a user