Boot from a disk image when initially invoked with it

This commit is contained in:
David Schmidt 2012-02-28 06:16:59 +00:00
parent 943d22ffd5
commit 0143475b56
7 changed files with 414 additions and 330 deletions

View File

@ -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;
}
}

View File

@ -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
View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);