Revision 350
Added by markw over 10 years ago
| firmware/a800/freeze.c | ||
|---|---|---|
|
#include "regs.h"
|
||
|
#include "memory.h"
|
||
|
|
||
|
unsigned char store_portb;
|
||
|
unsigned volatile char * store_mem;
|
||
|
unsigned volatile char * custom_mirror;
|
||
|
unsigned volatile char * atari_base;
|
||
| ... | ... | |
|
{
|
||
|
int i;
|
||
|
// store custom chips
|
||
|
store_portb = *atari_portb;
|
||
|
store_mem[0xd300] = *atari_portb;
|
||
|
{
|
||
|
//backup last value written to custom chip regs
|
||
|
//gtia
|
||
| ... | ... | |
|
memcp8(store_mem,atari_base,0xd400,0x10);
|
||
|
}
|
||
|
|
||
|
*atari_portb = store_portb;
|
||
|
*atari_portb = store_mem[0xd300];
|
||
|
}
|
||
|
|
||
|
void freeze_save(struct SimpleFile * file)
|
||
|
{
|
||
|
if (file_size(file)>=65536 && file_readonly(file)==0)
|
||
|
{
|
||
|
int byteswritten = 0;
|
||
|
file_write(file,(void *)store_mem,65536,&byteswritten);
|
||
|
file_write_flush();
|
||
|
}
|
||
|
}
|
||
|
void freeze_load(struct SimpleFile * file)
|
||
|
{
|
||
|
if (file_size(file)>=65536)
|
||
|
{
|
||
|
int bytesread = 0;
|
||
|
file_read(file,(void *)store_mem,65536,&bytesread);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
enum SimpleFileStatus file_read(struct SimpleFile * file, void * buffer, int bytes, int * bytesread);
|
||
|
|
||
|
enum SimpleFileStatus file_write(struct SimpleFile * file, void * buffer, int bytes, int * byteswritten);
|
||
|
enum SimpleFileStatus file_write_flush();
|
||
|
*/
|
||
|
|
||
| firmware/a800/mainmenu.c | ||
|---|---|---|
|
|
||
|
debug_pos = 520;
|
||
|
debug_adjust = row==9 ? 128 : 0;
|
||
|
printf("Load memory");
|
||
|
|
||
|
debug_pos = 560;
|
||
|
debug_adjust = row==10 ? 128 : 0;
|
||
|
printf("Save memory (for debugging)");
|
||
|
|
||
|
debug_pos = 640;
|
||
|
debug_adjust = row==11 ? 128 : 0;
|
||
|
printf("Exit");
|
||
|
|
||
|
// Slow it down a bit
|
||
| ... | ... | |
|
|
||
|
row+=joy.y_;
|
||
|
if (row<0) row = 0;
|
||
|
if (row>9) row = 8;
|
||
|
if (row>11) row = 11;
|
||
|
switch (row)
|
||
|
{
|
||
|
case 0:
|
||
| ... | ... | |
|
}
|
||
|
break;
|
||
|
case 9:
|
||
|
case 10:
|
||
|
{
|
||
|
if (joy.fire_)
|
||
|
{
|
||
|
fil_type = fil_type_mem;
|
||
|
filter = filter_specified;
|
||
|
file_selector(files[6]);
|
||
|
if (row == 9)
|
||
|
{
|
||
|
freeze_load(files[6]);
|
||
|
}
|
||
|
else if (row == 10)
|
||
|
{
|
||
|
freeze_save(files[6]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 11:
|
||
|
if (joy.fire_)
|
||
|
{
|
||
|
done = 1;
|
||
| firmware/fileselector.c | ||
|---|---|---|
|
char const * fil_type_rom;
|
||
|
char const * fil_type_bin;
|
||
|
char const * fil_type_car;
|
||
|
char const * fil_type_mem;
|
||
|
int filter_specified(struct SimpleDirEntry * entry)
|
||
|
{
|
||
|
if (dir_is_subdir(entry)) return 1;
|
||
| firmware/fileselector.h | ||
|---|---|---|
|
extern char const * fil_type_rom;
|
||
|
extern char const * fil_type_bin;
|
||
|
extern char const * fil_type_car;
|
||
|
extern char const * fil_type_mem;
|
||
|
int filter_specified(struct SimpleDirEntry * entry);
|
||
|
|
||
|
extern int (* filter)(struct SimpleDirEntry * entry);
|
||
| firmware/freeze.h | ||
|---|---|---|
|
#pragma once
|
||
|
|
||
|
#include "simplefile.h"
|
||
|
|
||
|
// Allow us to take over the system
|
||
|
// NB: CPU should be frozen before calling these!
|
||
|
|
||
| ... | ... | |
|
// Restore hardware registers
|
||
|
void restore();
|
||
|
|
||
|
// Store system ram to a file for debugging (base 64k only)
|
||
|
void freeze_save(struct SimpleFile * file);
|
||
|
void freeze_load(struct SimpleFile * file);
|
||
|
|
||
| firmware/main.h | ||
|---|---|---|
|
fil_type_rom = "ROM";
|
||
|
fil_type_bin = "BIN";
|
||
|
fil_type_car = "CAR";
|
||
|
fil_type_mem = "MEM";
|
||
|
|
||
|
int i;
|
||
|
for (i=0; i!=NUM_FILES; ++i)
|
||
Simple memory saving support - to help debugging