Project

General

Profile

« Previous | Next » 

Revision 350

Added by markw over 10 years ago

Simple memory saving support - to help debugging

View differences:

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)

Also available in: Unified diff