Revision 48
Added by markw over 11 years ago
| firmware/freeze.c | ||
|---|---|---|
| 
     #include "regs.h"
 
   | 
||
| 
     | 
||
| 
     unsigned char store_portb;
 
   | 
||
| 
     unsigned volatile int * store_mem;
 
   | 
||
| 
     unsigned volatile char * store_custom;
 
   | 
||
| 
     unsigned volatile char * store_mem;
 
   | 
||
| 
     unsigned volatile char * custom_mirror;
 
   | 
||
| 
     unsigned volatile char * atari_base;
 
   | 
||
| 
     | 
||
| 
     void freeze_init(void * memory)
 
   | 
||
| 
     {
 
   | 
||
| 
     	store_mem  = memory;
 
   | 
||
| 
     	store_custom = memory;
 
   | 
||
| 
     	store_mem = (unsigned volatile char *)memory;
 
   | 
||
| 
     | 
||
| 
     	custom_mirror = (unsigned volatile char *)atari_regmirror;
 
   | 
||
| 
     	atari_base = (unsigned volatile char *)atari_regbase;
 
   | 
||
| ... | ... | |
| 
     	store_portb = *atari_portb;
 
   | 
||
| 
     	{
 
   | 
||
| 
     		//gtia
 
   | 
||
| 
     		for (i=0xd000; i!=0xd01f; i++)
 
   | 
||
| 
     		for (i=0xd000; i!=0xd020; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			store_custom[i] = custom_mirror[i];
 
   | 
||
| 
     			store_mem[i] = custom_mirror[i];
 
   | 
||
| 
     			atari_base[i] = 0;
 
   | 
||
| 
     		}
 
   | 
||
| 
     		//pokey1/2
 
   | 
||
| 
     		for (i=0xd200; i!=0xd21f; i++)
 
   | 
||
| 
     		for (i=0xd200; i!=0xd220; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			store_custom[i] = custom_mirror[i];
 
   | 
||
| 
     			store_mem[i] = custom_mirror[i];
 
   | 
||
| 
     			atari_base[i] = 0;
 
   | 
||
| 
     		}
 
   | 
||
| 
     		//antic
 
   | 
||
| 
     		for (i=0xd400; i!=0xd40f; i++)
 
   | 
||
| 
     		for (i=0xd400; i!=0xd410; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			store_custom[i] = custom_mirror[i];
 
   | 
||
| 
     			store_mem[i] = custom_mirror[i];
 
   | 
||
| 
     			atari_base[i] = 0;
 
   | 
||
| 
     		}
 
   | 
||
| 
     	}
 
   | 
||
| ... | ... | |
| 
     | 
||
| 
     	// Copy 64k ram to sdram
 
   | 
||
| 
     	// Atari screen memory...
 
   | 
||
| 
     	for (i=0x0; i!=0x3400; ++i)
 
   | 
||
| 
     	for (i=0x0; i!=0xd000; ++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		store_mem[i] = atari_base[i];
 
   | 
||
| 
     	}
 
   | 
||
| 
     	for (i=0x3600; i!=0x4000; ++i)
 
   | 
||
| 
     	for (i=0xd800; i!=0x10000; ++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		store_mem[i] = atari_base[i];
 
   | 
||
| 
     	}
 
   | 
||
| 
     | 
||
| 
     	//Clear, except dl (first 0x40 bytes)
 
   | 
||
| 
     	for (i=0x40; i!=1024; i++)
 
   | 
||
| 
     	for (i=0x9c40; i!=(0x9c40+1024); i++)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		atari_base[i] = 0;
 
   | 
||
| 
     	}
 
   | 
||
| ... | ... | |
| 
     		0x70,
 
   | 
||
| 
     		0x41,0x00,0x9c
 
   | 
||
| 
     	};
 
   | 
||
| 
     	int end=0x9c00+sizeof(dl);
 
   | 
||
| 
     	for (i=0x9c00; i!=end; ++i)
 
   | 
||
| 
     	int j = 0;
 
   | 
||
| 
     	for (i=0x9c00; j!=sizeof(dl); ++i,++j)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		atari_base[i] = dl[i];
 
   | 
||
| 
     		atari_base[i] = dl[j];
 
   | 
||
| 
     	}
 
   | 
||
| 
     | 
||
| 
     	// point antic at my display list
 
   | 
||
| ... | ... | |
| 
     	int i;
 
   | 
||
| 
     | 
||
| 
     	// Restore memory
 
   | 
||
| 
     	for (i=0x0; i!=0x3400; ++i)
 
   | 
||
| 
     	for (i=0x0; i!=0xd000; ++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		atari_base[i] = store_mem[i];
 
   | 
||
| 
     	}
 
   | 
||
| 
     	for (i=0x3600; i!=0x4000; ++i)
 
   | 
||
| 
     	for (i=0xd800; i!=0x10000; ++i)
 
   | 
||
| 
     	{
 
   | 
||
| 
     		atari_base[i] = store_mem[i];
 
   | 
||
| 
     	}
 
   | 
||
| ... | ... | |
| 
     	// Restore custom chips
 
   | 
||
| 
     	{
 
   | 
||
| 
     		//gtia
 
   | 
||
| 
     		for (i=0xd000; i!=0xd01f; i++)
 
   | 
||
| 
     		for (i=0xd000; i!=0xd020; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			atari_base[i] = store_custom[i];
 
   | 
||
| 
     			atari_base[i] = store_mem[i];
 
   | 
||
| 
     		}
 
   | 
||
| 
     		//pokey1/2
 
   | 
||
| 
     		for (i=0xd200; i!=0xd21f; i++)
 
   | 
||
| 
     		for (i=0xd200; i!=0xd220; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			atari_base[i] = store_custom[i];
 
   | 
||
| 
     			atari_base[i] = store_mem[i];
 
   | 
||
| 
     		}
 
   | 
||
| 
     		//antic
 
   | 
||
| 
     		for (i=0xd400; i!=0xd40f; i++)
 
   | 
||
| 
     		for (i=0xd400; i!=0xd410; i++)
 
   | 
||
| 
     		{
 
   | 
||
| 
     			atari_base[i] = store_custom[i];
 
   | 
||
| 
     			atari_base[i] = store_mem[i];
 
   | 
||
| 
     		}
 
   | 
||
| 
     	}
 
   | 
||
| 
     | 
||
debugged...