mirror of
https://github.com/david-schmidt/gsport.git
synced 2024-06-09 18:29:29 +00:00
Boot from a disk image when initially invoked with it
This commit is contained in:
parent
943d22ffd5
commit
0143475b56
98
src/clock.c
98
src/clock.c
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
GSport - an Apple //gs Emulator
|
||||
Copyright (C) 2010 by GSport contributors
|
||||
Copyright (C) 2010 - 2012 by GSport contributors
|
||||
|
||||
Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
|||
#endif
|
||||
|
||||
extern int Verbose;
|
||||
extern word32 g_vbl_count; // OG change int to word32
|
||||
extern word32 g_vbl_count; // OG change int to word32
|
||||
extern int g_rom_version;
|
||||
extern int g_config_gsport_update_needed;
|
||||
|
||||
|
@ -48,6 +48,8 @@ extern int g_c034_val;
|
|||
|
||||
byte g_bram[2][256];
|
||||
byte *g_bram_ptr = &(g_bram[0][0]);
|
||||
byte g_temp_boot_slot = 254;
|
||||
byte g_orig_boot_slot = 0;
|
||||
|
||||
word32 g_clk_cur_time = 0xa0000000;
|
||||
int g_clk_next_vbl_update = 0;
|
||||
|
@ -106,7 +108,7 @@ micro_sleep(double dtime)
|
|||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
Sleep((DWORD)(dtime * 1000));
|
||||
Sleep((DWORD)(dtime * 1000));
|
||||
#else
|
||||
Timer.tv_sec = 0;
|
||||
Timer.tv_usec = (dtime * 1000000.0);
|
||||
|
@ -139,13 +141,13 @@ clk_bram_set(int bram_num, int offset, int val)
|
|||
g_bram[bram_num][offset] = val;
|
||||
}
|
||||
|
||||
|
||||
extern void x_clk_setup_bram_version();
|
||||
|
||||
|
||||
extern void x_clk_setup_bram_version();
|
||||
|
||||
void
|
||||
clk_setup_bram_version()
|
||||
{
|
||||
x_clk_setup_bram_version();
|
||||
x_clk_setup_bram_version();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -165,6 +167,36 @@ clk_write_bram(FILE *fconf)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
clk_calculate_bram_checksum(void) {
|
||||
int checksum = 0;
|
||||
int i;
|
||||
if (g_bram_ptr[251] == 0xff) {
|
||||
// Only make the checksum valid if we have non-zeron data!
|
||||
// Otherwise you have very valid zeroes, which confuses the GS firmware mightily.
|
||||
for (i = 250; i >= 0; i--) {
|
||||
checksum = (checksum & 0xFFFF) << 1;
|
||||
checksum = (checksum & 0xFFFF)
|
||||
+ g_bram_ptr[i]
|
||||
+ ((int)g_bram_ptr[i + 1] << 8)
|
||||
+ (checksum >> 16);
|
||||
}
|
||||
checksum &= 0xFFFF;
|
||||
checksum += ((checksum ^ 0xAAAA) << 16);
|
||||
#ifdef GSPORT_LITTLE_ENDIAN
|
||||
g_bram_ptr[252] = (checksum & 0xFF);
|
||||
g_bram_ptr[253] = (checksum >> 8);
|
||||
g_bram_ptr[254] = (checksum >> 16);
|
||||
g_bram_ptr[255] = (checksum >> 24);
|
||||
#else
|
||||
g_bram_ptr[255] = (checksum & 0xFF);
|
||||
g_bram_ptr[254] = (checksum >> 8);
|
||||
g_bram_ptr[253] = (checksum >> 16);
|
||||
g_bram_ptr[252] = (checksum >> 24);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
update_cur_time()
|
||||
{
|
||||
|
@ -172,29 +204,29 @@ update_cur_time()
|
|||
time_t cur_time;
|
||||
unsigned int secs, secs2;
|
||||
|
||||
|
||||
#ifdef UNDER_CE // OG Not supported on WIndows CE
|
||||
/*
|
||||
SYSTEMTIME stime;
|
||||
FILETIME ftime;
|
||||
GetLocalTime(&stime);
|
||||
SystemTimeToFileTime(&stime,&ftime);
|
||||
cur_time = ftime.dwLowDateTime;
|
||||
*/
|
||||
cur_time = time(0);
|
||||
|
||||
secs=0;
|
||||
secs2=0;
|
||||
|
||||
#else
|
||||
|
||||
#ifdef UNDER_CE // OG Not supported on WIndows CE
|
||||
/*
|
||||
SYSTEMTIME stime;
|
||||
FILETIME ftime;
|
||||
GetLocalTime(&stime);
|
||||
SystemTimeToFileTime(&stime,&ftime);
|
||||
cur_time = ftime.dwLowDateTime;
|
||||
*/
|
||||
cur_time = time(0);
|
||||
|
||||
secs=0;
|
||||
secs2=0;
|
||||
|
||||
#else
|
||||
cur_time = time(0);
|
||||
|
||||
/* Figure out the timezone (effectively) by diffing two times. */
|
||||
/* this is probably not right for a few hours around daylight savings*/
|
||||
/* time transition */
|
||||
secs2 = (unsigned int)mktime(gmtime(&cur_time));
|
||||
secs2 = (unsigned int)mktime(gmtime(&cur_time));
|
||||
tm_ptr = localtime(&cur_time);
|
||||
secs = (unsigned int)mktime(tm_ptr);
|
||||
secs = (unsigned int)mktime(tm_ptr);
|
||||
|
||||
#ifdef MAC
|
||||
/* Mac OS X's mktime function modifies the tm_ptr passed in for */
|
||||
|
@ -209,7 +241,7 @@ update_cur_time()
|
|||
secs += 3600;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
/* add in secs to make date based on Apple Jan 1, 1904 instead of */
|
||||
/* Unix's Jan 1, 1970 */
|
||||
/* So add in 66 years and 17 leap year days (1904 is a leap year) */
|
||||
|
@ -325,7 +357,13 @@ do_clock_data()
|
|||
if(read) {
|
||||
if(g_clk_read) {
|
||||
/* Yup, read */
|
||||
g_c033_data = g_bram_ptr[g_clk_reg1];
|
||||
if ((g_clk_reg1 == 0x28) && (g_temp_boot_slot != 254)){
|
||||
// Modify boot slot
|
||||
g_c033_data = g_temp_boot_slot;
|
||||
clk_calculate_bram_checksum();
|
||||
} else {
|
||||
g_c033_data = g_bram_ptr[g_clk_reg1];
|
||||
}
|
||||
clk_printf("Reading BRAM loc %02x: %02x\n",
|
||||
g_clk_reg1, g_c033_data);
|
||||
} else {
|
||||
|
@ -336,9 +374,15 @@ do_clock_data()
|
|||
halt_printf("CLK_BRAM1: said rd, now write\n");
|
||||
} else {
|
||||
/* Yup, write */
|
||||
if ((g_clk_reg1 == 0x28) && (g_temp_boot_slot != 254)) {
|
||||
// Modify boot slot
|
||||
g_bram_ptr[g_clk_reg1] = g_temp_boot_slot;
|
||||
clk_calculate_bram_checksum();
|
||||
} else {
|
||||
g_bram_ptr[g_clk_reg1] = g_c033_data;
|
||||
}
|
||||
clk_printf("Writing BRAM loc %02x with %02x\n",
|
||||
g_clk_reg1, g_c033_data);
|
||||
g_bram_ptr[g_clk_reg1] = g_c033_data;
|
||||
g_config_gsport_update_needed = 1;
|
||||
}
|
||||
}
|
||||
|
|
67
src/config.c
67
src/config.c
|
@ -96,6 +96,10 @@ extern word32 g_full_refresh_needed;
|
|||
extern word32 g_a2_screen_buffer_changed;
|
||||
extern int g_a2_new_all_stat[];
|
||||
extern int g_new_a2_stat_cur_line;
|
||||
extern byte g_bram[2][256];
|
||||
extern byte* g_bram_ptr;
|
||||
extern byte g_temp_boot_slot;
|
||||
extern byte g_orig_boot_slot;
|
||||
|
||||
extern int g_key_down;
|
||||
extern const char g_gsport_version_str[];
|
||||
|
@ -170,14 +174,14 @@ Cfg_menu g_cfg_disk_menu[] = {
|
|||
{ 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
// OG Use define instead of const for joystick_types
|
||||
#define STRINGIFY(x) #x
|
||||
#define TOSTRING(x) STRINGIFY(x)
|
||||
|
||||
// OG Use define instead of const for joystick_types
|
||||
#define STRINGIFY(x) #x
|
||||
#define TOSTRING(x) STRINGIFY(x)
|
||||
|
||||
Cfg_menu g_cfg_joystick_menu[] = {
|
||||
{ "Joystick Configuration", g_cfg_joystick_menu, 0, 0, CFGTYPE_MENU },
|
||||
{ "Joystick Emulation,"TOSTRING(JOYSTICK_TYPE_KEYPAD)",Keypad Joystick,"TOSTRING(JOYSTICK_TYPE_MOUSE)",Mouse Joystick,"TOSTRING(JOYSTICK_TYPE_NATIVE_1)",Native Joystick 1,"
|
||||
TOSTRING(JOYSTICK_TYPE_NATIVE_2)",Native Joystick 2,"TOSTRING(JOYSTICK_TYPE_NONE)",No Joystick", KNMP(g_joystick_type), CFGTYPE_INT },
|
||||
{ "Joystick Emulation,"TOSTRING(JOYSTICK_TYPE_KEYPAD)",Keypad Joystick,"TOSTRING(JOYSTICK_TYPE_MOUSE)",Mouse Joystick,"TOSTRING(JOYSTICK_TYPE_NATIVE_1)",Native Joystick 1,"
|
||||
TOSTRING(JOYSTICK_TYPE_NATIVE_2)",Native Joystick 2,"TOSTRING(JOYSTICK_TYPE_NONE)",No Joystick", KNMP(g_joystick_type), CFGTYPE_INT },
|
||||
{ "Joystick Scale X,0x100,Standard,0x119,+10%,0x133,+20%,"
|
||||
"0x150,+30%,0xb0,-30%,0xcd,-20%,0xe7,-10%",
|
||||
KNMP(g_joystick_scale_factor_x), CFGTYPE_INT },
|
||||
|
@ -2155,9 +2159,9 @@ cfg_parse_menu(Cfg_menu *menuptr, int menu_pos, int highlight_pos, int change)
|
|||
defval = -1;
|
||||
curstr = 0;
|
||||
if(type == CFGTYPE_INT) {
|
||||
iptr = (int*)menuptr->ptr; // OG Added cast
|
||||
iptr = (int*)menuptr->ptr; // OG Added cast
|
||||
curval = *iptr;
|
||||
iptr = (int*)menuptr->defptr; // OG Added cast
|
||||
iptr = (int*)menuptr->defptr; // OG Added cast
|
||||
defval = *iptr;
|
||||
if(curval == defval) {
|
||||
g_cfg_opt_buf[3] = 'D'; /* checkmark */
|
||||
|
@ -2469,10 +2473,10 @@ cfg_file_add_dirent(Cfg_listhdr *listhdrptr, const char *nameptr, int is_dir,
|
|||
inc_amt = MAX(64, listhdrptr->max);
|
||||
inc_amt = MIN(inc_amt, 1024);
|
||||
listhdrptr->max += inc_amt;
|
||||
listhdrptr->direntptr = (Cfg_dirent*)realloc(listhdrptr->direntptr,
|
||||
listhdrptr->direntptr = (Cfg_dirent*)realloc(listhdrptr->direntptr,
|
||||
listhdrptr->max * sizeof(Cfg_dirent));
|
||||
}
|
||||
ptr = (char*)malloc(namelen+1+is_dir); // OG Added cast
|
||||
ptr = (char*)malloc(namelen+1+is_dir); // OG Added cast
|
||||
strncpy(ptr, nameptr, namelen+1);
|
||||
if(is_dir) {
|
||||
strcat(ptr, "/");
|
||||
|
@ -2498,10 +2502,10 @@ cfg_dirent_sortfn(const void *obj1, const void *obj2)
|
|||
/* Called by qsort to sort directory listings */
|
||||
direntptr1 = (const Cfg_dirent *)obj1;
|
||||
direntptr2 = (const Cfg_dirent *)obj2;
|
||||
#if defined(MAC) || defined(_WIN32)
|
||||
// OG
|
||||
ret = 0;
|
||||
// ret = strcasecmp(direntptr1->name, direntptr2->name);
|
||||
#if defined(MAC) || defined(_WIN32)
|
||||
// OG
|
||||
ret = 0;
|
||||
// ret = strcasecmp(direntptr1->name, direntptr2->name);
|
||||
#else
|
||||
ret = strcmp(direntptr1->name, direntptr2->name);
|
||||
#endif
|
||||
|
@ -2669,18 +2673,19 @@ cfg_file_readdir(const char *pathptr)
|
|||
}
|
||||
|
||||
void
|
||||
cfg_inspect_maybe_insert_file(char *filename)
|
||||
cfg_inspect_maybe_insert_file(char *filename, int should_boot)
|
||||
{
|
||||
/*
|
||||
Take a look at a file. Based on its size, guess a slot/drive to insert it into.
|
||||
Used for blind operations like dragging/dropping files.
|
||||
Used for blind operations like dragging/dropping files.
|
||||
Optionally boot from that slot.
|
||||
*/
|
||||
int rc = 0;
|
||||
int slot = 0;
|
||||
rc = cfg_guess_image_size(filename);
|
||||
switch (rc)
|
||||
{
|
||||
case 0: slot = 5; break;
|
||||
case 0: slot = 7; break;
|
||||
case 1: slot = 6; break;
|
||||
case 2: slot = 5; break;
|
||||
case 3: slot = 7; break;
|
||||
|
@ -2689,7 +2694,11 @@ Used for blind operations like dragging/dropping files.
|
|||
if (slot > 0)
|
||||
{
|
||||
insert_disk(slot,0,filename,0,0,0,-1);
|
||||
printf("Inserted disk in slot %d, drive 1. Filename: %s\n",slot,filename);
|
||||
printf("Inserted disk in slot %d, drive 1. Filename: %s\n", slot, filename);
|
||||
if (should_boot) {
|
||||
g_temp_boot_slot = slot;
|
||||
printf("That slot has been set to boot.\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
printf("Unable to determine appropriate place to insert file %s.\n",filename);
|
||||
|
@ -2936,7 +2945,7 @@ cfg_file_update_ptr(char *str)
|
|||
char *newstr;
|
||||
int len;
|
||||
len = strlen(str) + 1;
|
||||
newstr = (char*)malloc(len);
|
||||
newstr = (char*)malloc(len);
|
||||
memcpy(newstr, str, len);
|
||||
if(g_cfg_file_strptr) {
|
||||
if(*g_cfg_file_strptr) {
|
||||
|
@ -3295,14 +3304,12 @@ config_control_panel()
|
|||
g_full_refresh_needed = -1;
|
||||
g_a2_screen_buffer_changed = -1;
|
||||
}
|
||||
|
||||
extern byte g_bram[2][256];
|
||||
extern byte* g_bram_ptr;
|
||||
void x_clk_setup_bram_version()
|
||||
{
|
||||
if(g_rom_version < 3) {
|
||||
g_bram_ptr = (&g_bram[0][0]); // ROM 01
|
||||
} else {
|
||||
g_bram_ptr = (&g_bram[1][0]); // ROM 03
|
||||
}
|
||||
}
|
||||
|
||||
void x_clk_setup_bram_version()
|
||||
{
|
||||
if(g_rom_version < 3) {
|
||||
g_bram_ptr = (&g_bram[0][0]); // ROM 01
|
||||
} else {
|
||||
g_bram_ptr = (&g_bram[1][0]); // ROM 03
|
||||
}
|
||||
}
|
||||
|
|
134
src/iwm.c
134
src/iwm.c
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
GSport - an Apple //gs Emulator
|
||||
Copyright (C) 2010 by GSport contributors
|
||||
Copyright (C) 2010 - 2012 by GSport contributors
|
||||
|
||||
Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
|||
#include "defc.h"
|
||||
|
||||
extern int Verbose;
|
||||
extern word32 g_vbl_count; // OG change int to word32
|
||||
extern word32 g_vbl_count; // OG change int to word32
|
||||
extern int g_c036_val_speed;
|
||||
|
||||
const byte phys_to_dos_sec[] = {
|
||||
|
@ -175,24 +175,24 @@ iwm_init()
|
|||
iwm_reset();
|
||||
}
|
||||
|
||||
// OG Added shut function to IWM
|
||||
// Free the memory, and more important free the open handle onto the disk
|
||||
void
|
||||
iwm_shut()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 2; i++) {
|
||||
eject_disk(&iwm.drive525[i]);
|
||||
eject_disk(&iwm.drive35[i]);
|
||||
}
|
||||
|
||||
for(i = 0; i < MAX_C7_DISKS; i++) {
|
||||
eject_disk(&iwm.smartport[i]);
|
||||
}
|
||||
|
||||
from_disk_byte_valid = 0;
|
||||
}
|
||||
|
||||
// OG Added shut function to IWM
|
||||
// Free the memory, and more important free the open handle onto the disk
|
||||
void
|
||||
iwm_shut()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 2; i++) {
|
||||
eject_disk(&iwm.drive525[i]);
|
||||
eject_disk(&iwm.drive35[i]);
|
||||
}
|
||||
|
||||
for(i = 0; i < MAX_C7_DISKS; i++) {
|
||||
eject_disk(&iwm.smartport[i]);
|
||||
}
|
||||
|
||||
from_disk_byte_valid = 0;
|
||||
}
|
||||
|
||||
void
|
||||
iwm_reset()
|
||||
{
|
||||
|
@ -235,19 +235,19 @@ draw_iwm_status(int line, char *buf)
|
|||
flag[apple35_sel][iwm.drive_select] = "*";
|
||||
}
|
||||
|
||||
#ifdef ACTIVEGS // OG Pass monitoring info
|
||||
{
|
||||
extern void ki_loading(int _motorOn,int _slot,int _drive, int _curtrack);
|
||||
int curtrack=0;
|
||||
if (apple35_sel)
|
||||
curtrack = iwm.drive35[iwm.drive_select].cur_qtr_track ;
|
||||
else
|
||||
curtrack = iwm.drive525[iwm.drive_select].cur_qtr_track >> 2 ;
|
||||
|
||||
ki_loading(g_iwm_motor_on,apple35_sel?5:6,iwm.drive_select+1,curtrack);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ACTIVEGS // OG Pass monitoring info
|
||||
{
|
||||
extern void ki_loading(int _motorOn,int _slot,int _drive, int _curtrack);
|
||||
int curtrack=0;
|
||||
if (apple35_sel)
|
||||
curtrack = iwm.drive35[iwm.drive_select].cur_qtr_track ;
|
||||
else
|
||||
curtrack = iwm.drive525[iwm.drive_select].cur_qtr_track >> 2 ;
|
||||
|
||||
ki_loading(g_iwm_motor_on,apple35_sel?5:6,iwm.drive_select+1,curtrack);
|
||||
}
|
||||
#endif
|
||||
|
||||
sprintf(buf, "s6d1:%2d%s s6d2:%2d%s s5d1:%2d/%d%s "
|
||||
"s5d2:%2d/%d%s fast_disk_emul:%d,%d c036:%02x",
|
||||
iwm.drive525[0].cur_qtr_track >> 2, flag[0][0],
|
||||
|
@ -334,6 +334,11 @@ iwm_flush_disk_to_unix(Disk *dsk)
|
|||
|
||||
/* Check for dirty disk 3 times a second */
|
||||
|
||||
extern byte g_bram[2][256];
|
||||
extern byte* g_bram_ptr;
|
||||
extern byte g_temp_boot_slot;
|
||||
extern byte g_orig_boot_slot;
|
||||
extern int g_config_gsport_update_needed;
|
||||
void
|
||||
iwm_vbl_update(int doit_3_persec)
|
||||
{
|
||||
|
@ -342,11 +347,18 @@ iwm_vbl_update(int doit_3_persec)
|
|||
int i;
|
||||
|
||||
if(iwm.motor_on && iwm.motor_off) {
|
||||
if((word32)iwm.motor_off_vbl_count <= g_vbl_count) {
|
||||
if((word32)iwm.motor_off_vbl_count <= g_vbl_count) {
|
||||
printf("Disk timer expired, drive off: %08x\n",
|
||||
g_vbl_count);
|
||||
iwm.motor_on = 0;
|
||||
iwm.motor_off = 0;
|
||||
if (g_temp_boot_slot != 254) {
|
||||
// Drive is off, now's a good time to turn off the temp boot slot if it was on.
|
||||
g_temp_boot_slot = 254;
|
||||
g_bram_ptr[40] = g_orig_boot_slot;
|
||||
clk_calculate_bram_checksum();
|
||||
g_config_gsport_update_needed = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,6 +369,14 @@ iwm_vbl_update(int doit_3_persec)
|
|||
motor_on = iwm.motor_on;
|
||||
if(g_c031_disk35 & 0x40) {
|
||||
motor_on = iwm.motor_on35;
|
||||
if (g_temp_boot_slot != 254) {
|
||||
// Now's a good time to turn off the temp boot slot if it was on.
|
||||
g_temp_boot_slot = 254;
|
||||
g_bram_ptr[40] = g_orig_boot_slot;
|
||||
clk_calculate_bram_checksum();
|
||||
g_config_gsport_update_needed = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(motor_on == 0 || iwm.motor_off) {
|
||||
|
@ -755,12 +775,12 @@ iwm_do_action35(double dcycs)
|
|||
break;
|
||||
case 0x0d: /* eject disk */
|
||||
eject_disk(dsk);
|
||||
#ifdef ACTIVEGS // OG : pass eject info to the Control (ActiveX specific)
|
||||
{
|
||||
extern void ejectDisk(int slot,int disk);
|
||||
ejectDisk(dsk->disk_525?6:5,dsk->drive+1);
|
||||
}
|
||||
#endif
|
||||
#ifdef ACTIVEGS // OG : pass eject info to the Control (ActiveX specific)
|
||||
{
|
||||
extern void ejectDisk(int slot,int disk);
|
||||
ejectDisk(dsk->disk_525?6:5,dsk->drive+1);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case 0x02:
|
||||
case 0x07:
|
||||
|
@ -1670,24 +1690,24 @@ disk_track_to_unix(Disk *dsk, int qtr_track, byte *outbuf)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if(disk_525)
|
||||
{
|
||||
// OG
|
||||
// Add support for .nib file
|
||||
if (dsk->image_type!=DSK_TYPE_NIB)
|
||||
if(disk_525)
|
||||
{
|
||||
// OG
|
||||
// Add support for .nib file
|
||||
if (dsk->image_type!=DSK_TYPE_NIB)
|
||||
return iwm_denib_track525(dsk, trk, qtr_track, outbuf);
|
||||
else
|
||||
{
|
||||
int len = trk->track_len;
|
||||
byte* trk_ptr = trk->nib_area+1;
|
||||
byte* nib_ptr = outbuf;
|
||||
for(i = 0; i < len; i += 2)
|
||||
{
|
||||
*nib_ptr++ = *trk_ptr;
|
||||
trk_ptr+=2;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = trk->track_len;
|
||||
byte* trk_ptr = trk->nib_area+1;
|
||||
byte* nib_ptr = outbuf;
|
||||
for(i = 0; i < len; i += 2)
|
||||
{
|
||||
*nib_ptr++ = *trk_ptr;
|
||||
trk_ptr+=2;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
return iwm_denib_track35(dsk, trk, qtr_track, outbuf);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
GSport - an Apple //gs Emulator
|
||||
Copyright (C) 2010 by GSport contributors
|
||||
Copyright (C) 2010 - 2012 by GSport contributors
|
||||
|
||||
Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey
|
||||
|
||||
|
@ -139,6 +139,7 @@ double get_dtime(void);
|
|||
int micro_sleep(double dtime);
|
||||
void clk_bram_zero(void);
|
||||
void clk_bram_set(int bram_num, int offset, int val);
|
||||
void clk_calculate_bram_checksum(void);
|
||||
void clk_setup_bram_version(void);
|
||||
void clk_write_bram(FILE *fconf);
|
||||
void update_cur_time(void);
|
||||
|
@ -158,7 +159,7 @@ void cfg_exit(void);
|
|||
void cfg_toggle_config_panel(void);
|
||||
void cfg_text_screen_dump(void);
|
||||
void cfg_get_tfe_name(void);
|
||||
void cfg_inspect_maybe_insert_file(char *filename);
|
||||
void cfg_inspect_maybe_insert_file(char *filename, int should_boot);
|
||||
int cfg_guess_image_size(char *filename);
|
||||
void config_vbl_update(int doit_3_persec);
|
||||
void config_parse_option(char *buf, int pos, int len, int line);
|
||||
|
|
389
src/sim65816.c
389
src/sim65816.c
|
@ -34,9 +34,9 @@
|
|||
|
||||
#define PC_LOG_LEN (8*1024)
|
||||
|
||||
int g_speed_fast ; // OG Expose fast parameter
|
||||
int g_initialized = 0; // OG To know if the emulator has finalized its initialization
|
||||
int g_accept_events = 0; // OG To know if the emulator is ready to accept external events
|
||||
int g_speed_fast ; // OG Expose fast parameter
|
||||
int g_initialized = 0; // OG To know if the emulator has finalized its initialization
|
||||
int g_accept_events = 0; // OG To know if the emulator is ready to accept external events
|
||||
|
||||
char g_argv0_path[256] = "./";
|
||||
|
||||
|
@ -195,13 +195,13 @@ byte *g_dummy_memory1_ptr = 0;
|
|||
byte *g_rom_fc_ff_ptr = 0;
|
||||
byte *g_rom_cards_ptr = 0;
|
||||
|
||||
// OG Added allocated pointers
|
||||
byte *g_slow_memory_ptr_allocated = 0;
|
||||
byte *g_memory_ptr_allocated = 0;
|
||||
byte *g_dummy_memory1_ptr_allocated = 0;
|
||||
byte *g_rom_fc_ff_ptr_allocated = 0;
|
||||
byte *g_rom_cards_ptr_allocated = 0;
|
||||
|
||||
// OG Added allocated pointers
|
||||
byte *g_slow_memory_ptr_allocated = 0;
|
||||
byte *g_memory_ptr_allocated = 0;
|
||||
byte *g_dummy_memory1_ptr_allocated = 0;
|
||||
byte *g_rom_fc_ff_ptr_allocated = 0;
|
||||
byte *g_rom_cards_ptr_allocated = 0;
|
||||
|
||||
void *g_memory_alloc_ptr = 0; /* for freeing memory area */
|
||||
|
||||
Page_info page_info_rd_wr[2*65536 + PAGE_INFO_PAD_SIZE];
|
||||
|
@ -217,70 +217,70 @@ Data_log *g_log_data_ptr = &(g_data_log_array[0]);
|
|||
Data_log *g_log_data_start_ptr = &(g_data_log_array[0]);
|
||||
Data_log *g_log_data_end_ptr = &(g_data_log_array[PC_LOG_LEN]);
|
||||
|
||||
// OG Added sim65816_initglobals()
|
||||
void sim65816_initglobals()
|
||||
{
|
||||
// OG Added sim65816_initglobals()
|
||||
void sim65816_initglobals()
|
||||
{
|
||||
|
||||
g_fcycles_stop = 0.0;
|
||||
halt_sim = 0;
|
||||
enter_debug = 0;
|
||||
g_rom_version = -1;
|
||||
g_user_halt_bad = 0;
|
||||
g_halt_on_bad_read = 0;
|
||||
g_ignore_bad_acc = 1;
|
||||
g_ignore_halts = 1;
|
||||
g_code_red = 0;
|
||||
g_code_yellow = 0;
|
||||
g_use_alib = 0;
|
||||
g_raw_serial = 1;
|
||||
g_iw2_emul = 0;
|
||||
g_serial_out_masking = 0;
|
||||
//g_serial_modem[2] = { 0, 1 };
|
||||
|
||||
g_config_iwm_vbl_count = 0;
|
||||
|
||||
g_pause=0;
|
||||
|
||||
g_last_vbl_dcycs = START_DCYCS;
|
||||
g_cur_dcycs = START_DCYCS;
|
||||
|
||||
g_last_vbl_dadjcycs = 0.0;
|
||||
g_dadjcycs = 0.0;
|
||||
|
||||
|
||||
g_wait_pending = 0;
|
||||
g_stp_pending = 0;
|
||||
|
||||
g_num_irq = 0;
|
||||
g_num_brk = 0;
|
||||
g_num_cop = 0;
|
||||
g_num_enter_engine = 0;
|
||||
g_io_amt = 0;
|
||||
g_engine_action = 0;
|
||||
g_engine_halt_event = 0;
|
||||
g_engine_scan_int = 0;
|
||||
g_engine_doc_int = 0;
|
||||
|
||||
g_testing = 0;
|
||||
g_testing_enabled = 0;
|
||||
|
||||
g_debug_file_fd = -1;
|
||||
g_fatal_log = -1;
|
||||
|
||||
g_25sec_cntr = 0;
|
||||
g_1sec_cntr = 0;
|
||||
|
||||
g_dnatcycs_1sec = 0.0;
|
||||
g_natcycs_lastvbl = 0;
|
||||
|
||||
Verbose = 0;
|
||||
Halt_on = 0;
|
||||
|
||||
g_mem_size_base = 256*1024; /* size of motherboard memory */
|
||||
g_mem_size_exp = 8*1024*1024; /* size of expansion RAM card */
|
||||
g_mem_size_total = 256*1024; /* Total contiguous RAM from 0 */
|
||||
}
|
||||
|
||||
g_fcycles_stop = 0.0;
|
||||
halt_sim = 0;
|
||||
enter_debug = 0;
|
||||
g_rom_version = -1;
|
||||
g_user_halt_bad = 0;
|
||||
g_halt_on_bad_read = 0;
|
||||
g_ignore_bad_acc = 1;
|
||||
g_ignore_halts = 1;
|
||||
g_code_red = 0;
|
||||
g_code_yellow = 0;
|
||||
g_use_alib = 0;
|
||||
g_raw_serial = 1;
|
||||
g_iw2_emul = 0;
|
||||
g_serial_out_masking = 0;
|
||||
//g_serial_modem[2] = { 0, 1 };
|
||||
|
||||
g_config_iwm_vbl_count = 0;
|
||||
|
||||
g_pause=0;
|
||||
|
||||
g_last_vbl_dcycs = START_DCYCS;
|
||||
g_cur_dcycs = START_DCYCS;
|
||||
|
||||
g_last_vbl_dadjcycs = 0.0;
|
||||
g_dadjcycs = 0.0;
|
||||
|
||||
|
||||
g_wait_pending = 0;
|
||||
g_stp_pending = 0;
|
||||
|
||||
g_num_irq = 0;
|
||||
g_num_brk = 0;
|
||||
g_num_cop = 0;
|
||||
g_num_enter_engine = 0;
|
||||
g_io_amt = 0;
|
||||
g_engine_action = 0;
|
||||
g_engine_halt_event = 0;
|
||||
g_engine_scan_int = 0;
|
||||
g_engine_doc_int = 0;
|
||||
|
||||
g_testing = 0;
|
||||
g_testing_enabled = 0;
|
||||
|
||||
g_debug_file_fd = -1;
|
||||
g_fatal_log = -1;
|
||||
|
||||
g_25sec_cntr = 0;
|
||||
g_1sec_cntr = 0;
|
||||
|
||||
g_dnatcycs_1sec = 0.0;
|
||||
g_natcycs_lastvbl = 0;
|
||||
|
||||
Verbose = 0;
|
||||
Halt_on = 0;
|
||||
|
||||
g_mem_size_base = 256*1024; /* size of motherboard memory */
|
||||
g_mem_size_exp = 8*1024*1024; /* size of expansion RAM card */
|
||||
g_mem_size_total = 256*1024; /* Total contiguous RAM from 0 */
|
||||
}
|
||||
|
||||
void
|
||||
show_pc_log()
|
||||
{
|
||||
|
@ -409,7 +409,7 @@ toolbox_debug_c(word32 xreg, word32 stack, double *cyc_ptr)
|
|||
pos = g_toolbox_log_pos;
|
||||
|
||||
stack += 9;
|
||||
g_toolbox_log_array[pos][0] = (word32)(g_last_vbl_dcycs + *cyc_ptr);
|
||||
g_toolbox_log_array[pos][0] = (word32)(g_last_vbl_dcycs + *cyc_ptr);
|
||||
g_toolbox_log_array[pos][1] = stack+1;
|
||||
g_toolbox_log_array[pos][2] = xreg;
|
||||
g_toolbox_log_array[pos][3] = toolbox_debug_4byte(stack+1);
|
||||
|
@ -700,29 +700,29 @@ show_regs()
|
|||
show_regs_act(&engine);
|
||||
}
|
||||
|
||||
//OG for regular exit, use quitEmulator()
|
||||
|
||||
void quitEmulator()
|
||||
//OG for regular exit, use quitEmulator()
|
||||
|
||||
void quitEmulator()
|
||||
{
|
||||
printf("set_halt(HALT_WANTTOQUIT)\n");
|
||||
set_halt(HALT_WANTTOQUIT);
|
||||
}
|
||||
|
||||
//OG change exit to fatal_exit()
|
||||
|
||||
#ifndef ACTIVEGS
|
||||
// use standard exit function
|
||||
#define fatalExit exit
|
||||
#else
|
||||
extern void fatalExit(int);
|
||||
printf("set_halt(HALT_WANTTOQUIT)\n");
|
||||
set_halt(HALT_WANTTOQUIT);
|
||||
}
|
||||
|
||||
//OG change exit to fatal_exit()
|
||||
|
||||
#ifndef ACTIVEGS
|
||||
// use standard exit function
|
||||
#define fatalExit exit
|
||||
#else
|
||||
extern void fatalExit(int);
|
||||
#endif
|
||||
|
||||
void my_exit(int ret)
|
||||
{
|
||||
end_screen();
|
||||
|
||||
void my_exit(int ret)
|
||||
{
|
||||
end_screen();
|
||||
printer_close();
|
||||
printf("exiting (ret=%d)\n",ret);
|
||||
fatalExit(ret);
|
||||
printf("exiting (ret=%d)\n",ret);
|
||||
fatalExit(ret);
|
||||
}
|
||||
|
||||
|
||||
|
@ -767,9 +767,9 @@ do_reset()
|
|||
|
||||
g_stepping = 0;
|
||||
|
||||
if (g_irq_pending)
|
||||
halt_printf("*** irq remainings...\n");
|
||||
|
||||
if (g_irq_pending)
|
||||
halt_printf("*** irq remainings...\n");
|
||||
|
||||
}
|
||||
|
||||
#define CHECK(start, var, value, var1, var2) \
|
||||
|
@ -832,7 +832,7 @@ memalloc_align(int size, int skip_amt, void **alloc_ptr)
|
|||
word32 offset;
|
||||
|
||||
skip_amt = MAX(256, skip_amt);
|
||||
bptr = (byte*)calloc(size + skip_amt + 256, 1); // OG Added cast
|
||||
bptr = (byte*)calloc(size + skip_amt + 256, 1); // OG Added cast
|
||||
if(alloc_ptr) {
|
||||
/* Save allocation address */
|
||||
*alloc_ptr = bptr;
|
||||
|
@ -857,34 +857,34 @@ memory_ptr_init()
|
|||
/* changes this will be called */
|
||||
mem_size = MIN(0xdf0000, g_mem_size_base + g_mem_size_exp);
|
||||
g_mem_size_total = mem_size;
|
||||
|
||||
// OG using memory_ptr_shut() instead
|
||||
memory_ptr_shut();
|
||||
/*
|
||||
|
||||
// OG using memory_ptr_shut() instead
|
||||
memory_ptr_shut();
|
||||
/*
|
||||
if(g_memory_alloc_ptr) {
|
||||
free(g_memory_alloc_ptr);
|
||||
g_memory_alloc_ptr = 0;
|
||||
}
|
||||
*/
|
||||
*/
|
||||
g_memory_ptr = memalloc_align(mem_size, 256, &g_memory_alloc_ptr);
|
||||
|
||||
printf("RAM size is 0 - %06x (%.2fMB)\n", mem_size,
|
||||
(double)mem_size/(1024.0*1024.0));
|
||||
}
|
||||
|
||||
// OG Added memory_ptr_shut
|
||||
void
|
||||
memory_ptr_shut()
|
||||
{
|
||||
if(g_memory_alloc_ptr)
|
||||
{
|
||||
free(g_memory_alloc_ptr);
|
||||
g_memory_alloc_ptr = 0;
|
||||
}
|
||||
g_memory_ptr = 0;
|
||||
}
|
||||
|
||||
|
||||
// OG Added memory_ptr_shut
|
||||
void
|
||||
memory_ptr_shut()
|
||||
{
|
||||
if(g_memory_alloc_ptr)
|
||||
{
|
||||
free(g_memory_alloc_ptr);
|
||||
g_memory_alloc_ptr = 0;
|
||||
}
|
||||
g_memory_ptr = 0;
|
||||
}
|
||||
|
||||
|
||||
extern int g_screen_redraw_skip_amt;
|
||||
extern int g_use_shmem;
|
||||
extern int g_use_dhr140;
|
||||
|
@ -904,16 +904,16 @@ gsportmain(int argc, char **argv)
|
|||
int i;
|
||||
char *final_arg = 0;
|
||||
char *filename_ptr;
|
||||
|
||||
// OG Restoring globals
|
||||
sim65816_initglobals();
|
||||
moremem_init();
|
||||
|
||||
//OG Disabling argument parsing
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
|
||||
// OG Restoring globals
|
||||
sim65816_initglobals();
|
||||
moremem_init();
|
||||
|
||||
//OG Disabling argument parsing
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
/* parse args */
|
||||
for(i = 1; i < argc; i++) {
|
||||
for(i = 1; i < argc; i++) {
|
||||
if(!strcmp("-badrd", argv[i])) {
|
||||
printf("Halting on bad reads\n");
|
||||
g_halt_on_bad_read = 2;
|
||||
|
@ -1025,7 +1025,7 @@ gsportmain(int argc, char **argv)
|
|||
exit(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
check_engine_asm_defines();
|
||||
fixed_memory_ptrs_init();
|
||||
|
@ -1060,7 +1060,8 @@ gsportmain(int argc, char **argv)
|
|||
config_init();
|
||||
// If the final argument was not a switch, then treat it like a disk image filename to insert
|
||||
if (final_arg) {
|
||||
cfg_inspect_maybe_insert_file(final_arg);
|
||||
// ...and flag it to boot
|
||||
cfg_inspect_maybe_insert_file(final_arg, 1);
|
||||
}
|
||||
printer_init(g_printer_dpi,85,110,g_printer_output,g_printer_multipage);
|
||||
//If ethernet is enabled in config.gsport, let's initialize it
|
||||
|
@ -1114,33 +1115,33 @@ gsportmain(int argc, char **argv)
|
|||
|
||||
do_reset();
|
||||
g_stepping = 0;
|
||||
|
||||
// OG Notify emulator has been initialized and ready to accept external events
|
||||
g_initialized = 1;
|
||||
g_accept_events = 1;
|
||||
|
||||
|
||||
// OG Notify emulator has been initialized and ready to accept external events
|
||||
g_initialized = 1;
|
||||
g_accept_events = 1;
|
||||
|
||||
do_go();
|
||||
|
||||
/* If we get here, we hit a breakpoint, call debug intfc */
|
||||
do_debug_intfc();
|
||||
|
||||
// OG Notify emulator is being closed, and cannot accept events anymore
|
||||
g_accept_events = 0;
|
||||
|
||||
sound_shutdown();
|
||||
|
||||
|
||||
// OG Cleaning up
|
||||
adb_shut();
|
||||
iwm_shut();
|
||||
fixed_memory_ptrs_shut();
|
||||
load_roms_shut_memory();
|
||||
clear_fatal_logs();
|
||||
|
||||
// OG Not needed anymore : the emulator will quit gently
|
||||
//my_exit(0);
|
||||
end_screen();
|
||||
|
||||
// OG Notify emulator is being closed, and cannot accept events anymore
|
||||
g_accept_events = 0;
|
||||
|
||||
sound_shutdown();
|
||||
|
||||
|
||||
// OG Cleaning up
|
||||
adb_shut();
|
||||
iwm_shut();
|
||||
fixed_memory_ptrs_shut();
|
||||
load_roms_shut_memory();
|
||||
clear_fatal_logs();
|
||||
|
||||
// OG Not needed anymore : the emulator will quit gently
|
||||
//my_exit(0);
|
||||
end_screen();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1165,14 +1166,14 @@ load_roms_init_memory()
|
|||
set_memory16_c(0xe115fe, 0, 0);
|
||||
}
|
||||
|
||||
// OG Added load_roms_shut_memory
|
||||
void load_roms_shut_memory()
|
||||
{
|
||||
memory_ptr_shut();
|
||||
}
|
||||
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
// OG Added load_roms_shut_memory
|
||||
void load_roms_shut_memory()
|
||||
{
|
||||
memory_ptr_shut();
|
||||
}
|
||||
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
void
|
||||
gsport_expand_path(char *out_ptr, const char *in_ptr, int maxlen)
|
||||
{
|
||||
|
@ -1322,8 +1323,8 @@ setup_gsport_file(char *outname, int maxlen, int ok_if_missing,
|
|||
my_exit(2);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Event g_event_list[MAX_EVENTS];
|
||||
Event g_event_free;
|
||||
Event g_event_start;
|
||||
|
@ -1656,13 +1657,13 @@ run_prog()
|
|||
|
||||
while(1) {
|
||||
fflush(stdout);
|
||||
|
||||
// OG Disabling control panel
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
// OG Disabling control panel
|
||||
#ifndef ACTIVEGS
|
||||
if(g_config_control_panel) {
|
||||
config_control_panel();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if(g_irq_pending && !(engine.psr & 0x4)) {
|
||||
irq_printf("taking an irq!\n");
|
||||
take_irq(0);
|
||||
|
@ -1676,8 +1677,8 @@ run_prog()
|
|||
zip_follow_cps = ((g_zipgs_reg_c059 & 0x8) != 0);
|
||||
zip_speed_0tof_new = g_zipgs_reg_c05a & 0xf0;
|
||||
fast = (g_c036_val_speed & 0x80) || (zip_en && !zip_follow_cps);
|
||||
// OG Make fast parameter public
|
||||
g_speed_fast = fast;
|
||||
// OG Make fast parameter public
|
||||
g_speed_fast = fast;
|
||||
if(zip_speed_0tof_new != zip_speed_0tof) {
|
||||
zip_speed_0tof = zip_speed_0tof_new;
|
||||
setup_zip_speeds();
|
||||
|
@ -1692,11 +1693,11 @@ run_prog()
|
|||
zip_speed = faster_than_28 &&
|
||||
((zip_speed_0tof != 0) || (limit_speed == 3) ||
|
||||
(g_zipgs_unlock >= 4) );
|
||||
|
||||
// OG unlimited speed should not be affected by zip.
|
||||
// unl_speed = faster_than_28 && !zip_speed;
|
||||
unl_speed = (limit_speed == 0) && faster_than_28;
|
||||
|
||||
|
||||
// OG unlimited speed should not be affected by zip.
|
||||
// unl_speed = faster_than_28 && !zip_speed;
|
||||
unl_speed = (limit_speed == 0) && faster_than_28;
|
||||
|
||||
if(unl_speed) {
|
||||
/* use unlimited speed */
|
||||
fspeed_mult = g_projected_pmhz;
|
||||
|
@ -2106,13 +2107,13 @@ update_60hz(double dcycs, double dtime_now)
|
|||
default: sp_str = "Unlimited"; break;
|
||||
}
|
||||
|
||||
// OG Pass speed info to the control (ActiveX specific)
|
||||
#ifdef ACTIVEGS
|
||||
{
|
||||
extern void updateInfo(const char* target,const char *speed);
|
||||
updateInfo(sp_str,total_mhz_ptr);
|
||||
}
|
||||
#endif
|
||||
// OG Pass speed info to the control (ActiveX specific)
|
||||
#ifdef ACTIVEGS
|
||||
{
|
||||
extern void updateInfo(const char* target,const char *speed);
|
||||
updateInfo(sp_str,total_mhz_ptr);
|
||||
}
|
||||
#endif
|
||||
sprintf(status_buf, "dcycs:%9.1f sim MHz:%s "
|
||||
"Eff MHz:%s, sec:%1.3f vol:%02x pal:%x, Limit:%s",
|
||||
dcycs/(1000.0*1000.0), sim_mhz_ptr, total_mhz_ptr,
|
||||
|
@ -2341,17 +2342,17 @@ update_60hz(double dcycs, double dtime_now)
|
|||
}
|
||||
|
||||
iwm_vbl_update(doit_3_persec);
|
||||
|
||||
// OG Disabling config update
|
||||
#ifndef ACTIVEGS
|
||||
|
||||
// OG Disabling config update
|
||||
#ifndef ACTIVEGS
|
||||
config_vbl_update(doit_3_persec);
|
||||
#else
|
||||
// OG Added disk update
|
||||
{
|
||||
extern void checkImages();
|
||||
checkImages();
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
// OG Added disk update
|
||||
{
|
||||
extern void checkImages();
|
||||
checkImages();
|
||||
}
|
||||
#endif
|
||||
|
||||
video_update();
|
||||
sound_update(dcycs);
|
||||
|
@ -2442,7 +2443,7 @@ check_scan_line_int(double dcycs, int cur_video_line)
|
|||
}
|
||||
if(g_slow_memory_ptr[0x19d00+i] & 0x40) {
|
||||
irq_printf("Adding scan_int for line %d\n", i);
|
||||
delay = (int)( (DCYCS_IN_16MS/262.0) * ((double)line) );
|
||||
delay = (int)( (DCYCS_IN_16MS/262.0) * ((double)line) );
|
||||
add_event_entry(g_last_vbl_dcycs + delay, EV_SCAN_INT +
|
||||
(line << 8));
|
||||
g_scan_int_events = 1;
|
||||
|
@ -2658,15 +2659,15 @@ gsport_vprintf(const char *fmt, va_list ap)
|
|||
int len;
|
||||
int ret;
|
||||
|
||||
bufptr = (char*)malloc(4096); // OG Added Cast
|
||||
bufptr = (char*)malloc(4096); // OG Added Cast
|
||||
ret = vsnprintf(bufptr, 4090, fmt, ap);
|
||||
|
||||
// OG Display warning
|
||||
printf("Warning:%s",bufptr);
|
||||
|
||||
// OG Display warning
|
||||
printf("Warning:%s",bufptr);
|
||||
|
||||
len = strlen(bufptr);
|
||||
if(g_fatal_log >= 0 && g_fatal_log < MAX_FATAL_LOGS) {
|
||||
buf2ptr = (char*)malloc(len+1); // OG Added Cast
|
||||
buf2ptr = (char*)malloc(len+1); // OG Added Cast
|
||||
memcpy(buf2ptr, bufptr, len+1);
|
||||
g_fatal_log_strs[g_fatal_log++] = buf2ptr;
|
||||
}
|
||||
|
@ -2717,7 +2718,7 @@ gsport_malloc_str(char *in_str)
|
|||
int len;
|
||||
|
||||
len = strlen(in_str) + 1;
|
||||
str = (char*)malloc(len); // OG Added cast
|
||||
str = (char*)malloc(len); // OG Added cast
|
||||
memcpy(str, in_str, len);
|
||||
|
||||
return str;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
GSport - an Apple //gs Emulator
|
||||
Copyright (C) 2010 by GSport contributors
|
||||
Copyright (C) 2010 - 2012 by GSport contributors
|
||||
|
||||
Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey
|
||||
|
||||
|
@ -757,11 +757,22 @@ do_format_c7(int unit_num)
|
|||
}
|
||||
|
||||
|
||||
extern byte g_bram[2][256];
|
||||
extern byte* g_bram_ptr;
|
||||
extern byte g_temp_boot_slot;
|
||||
extern byte g_orig_boot_slot;
|
||||
extern int g_config_gsport_update_needed;
|
||||
void
|
||||
do_c700(word32 ret)
|
||||
{
|
||||
disk_printf("do_c700 called, ret: %08x\n", ret);
|
||||
|
||||
if (g_temp_boot_slot != 254) {
|
||||
// Booting from slot 7 - now is a good time to turn off the temp boot slot, if it was on.
|
||||
g_temp_boot_slot = 254;
|
||||
g_bram_ptr[40] = g_orig_boot_slot;
|
||||
clk_calculate_bram_checksum();
|
||||
g_config_gsport_update_needed = 1;
|
||||
}
|
||||
ret = do_read_c7(0, 0x800, 0);
|
||||
|
||||
set_memory_c(0x7f8, 7, 0);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
GSport - an Apple //gs Emulator
|
||||
Copyright (C) 2010 by GSport contributors
|
||||
Copyright (C) 2010 - 2012 by GSport contributors
|
||||
|
||||
Based on the KEGS emulator written by and Copyright (C) 2003 Kent Dickey
|
||||
|
||||
|
@ -26,11 +26,11 @@
|
|||
#include <windowsx.h>
|
||||
#include <mmsystem.h>
|
||||
#include <winsock.h>
|
||||
#include <commctrl.h>
|
||||
#include <shellapi.h>
|
||||
#include <commctrl.h>
|
||||
#include <shellapi.h>
|
||||
|
||||
#include "defc.h"
|
||||
#include "protos.h"
|
||||
#include "protos.h"
|
||||
#include "protos_windriver.h"
|
||||
|
||||
extern int Verbose;
|
||||
|
@ -448,10 +448,10 @@ win_event_redraw()
|
|||
LRESULT CALLBACK
|
||||
win_event_handler(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int i, j;
|
||||
int numDraggedFiles;
|
||||
int szFilename;
|
||||
LPTSTR lpszFile;
|
||||
int i, j;
|
||||
int numDraggedFiles;
|
||||
int szFilename;
|
||||
LPTSTR lpszFile;
|
||||
|
||||
switch(umsg) {
|
||||
case WM_MOUSEMOVE:
|
||||
|
@ -467,17 +467,17 @@ LPTSTR lpszFile;
|
|||
case WM_PAINT:
|
||||
win_event_redraw();
|
||||
break;
|
||||
case WM_DROPFILES:
|
||||
numDraggedFiles = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
|
||||
for (i = 0; i < numDraggedFiles; i++) {
|
||||
szFilename = DragQueryFile((HDROP)wParam, i, NULL, 0);
|
||||
lpszFile = (LPTSTR)malloc(szFilename + 1);
|
||||
case WM_DROPFILES:
|
||||
numDraggedFiles = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
|
||||
for (i = 0; i < numDraggedFiles; i++) {
|
||||
szFilename = DragQueryFile((HDROP)wParam, i, NULL, 0);
|
||||
lpszFile = (LPTSTR)malloc(szFilename + 1);
|
||||
szFilename = DragQueryFile((HDROP)wParam, i, lpszFile, szFilename + 1);
|
||||
cfg_inspect_maybe_insert_file(lpszFile);
|
||||
free(lpszFile);
|
||||
}
|
||||
DragFinish((HDROP)wParam);
|
||||
break;
|
||||
cfg_inspect_maybe_insert_file(lpszFile, 0);
|
||||
free(lpszFile);
|
||||
}
|
||||
DragFinish((HDROP)wParam);
|
||||
break;
|
||||
}
|
||||
switch(umsg) {
|
||||
HANDLE_MSG(hwnd, WM_KEYUP, WIN_EVENT_KEY);
|
||||
|
|
Loading…
Reference in New Issue
Block a user