repo2/firmware/freeze.c @ 173
46 | markw | #include "freeze.h"
|
|
47 | markw | #include "regs.h"
|
|
unsigned char store_portb;
|
|||
48 | markw | unsigned volatile char * store_mem;
|
|
47 | markw | unsigned volatile char * custom_mirror;
|
|
unsigned volatile char * atari_base;
|
|||
void freeze_init(void * memory)
|
|||
46 | markw | {
|
|
48 | markw | store_mem = (unsigned volatile char *)memory;
|
|
46 | markw | ||
47 | markw | custom_mirror = (unsigned volatile char *)atari_regmirror;
|
|
atari_base = (unsigned volatile char *)atari_regbase;
|
|||
}
|
|||
46 | markw | ||
47 | markw | void freeze()
|
|
{
|
|||
int i;
|
|||
46 | markw | // store custom chips
|
|
store_portb = *atari_portb;
|
|||
{
|
|||
//gtia
|
|||
48 | markw | for (i=0xd000; i!=0xd020; i++)
|
|
46 | markw | {
|
|
48 | markw | store_mem[i] = custom_mirror[i];
|
|
47 | markw | atari_base[i] = 0;
|
|
46 | markw | }
|
|
//pokey1/2
|
|||
48 | markw | for (i=0xd200; i!=0xd220; i++)
|
|
46 | markw | {
|
|
48 | markw | store_mem[i] = custom_mirror[i];
|
|
47 | markw | atari_base[i] = 0;
|
|
46 | markw | }
|
|
//antic
|
|||
48 | markw | for (i=0xd400; i!=0xd410; i++)
|
|
46 | markw | {
|
|
48 | markw | store_mem[i] = custom_mirror[i];
|
|
47 | markw | atari_base[i] = 0;
|
|
46 | markw | }
|
|
}
|
|||
47 | markw | *atari_portb = 0xff;
|
|
// Copy 64k ram to sdram
|
|||
// Atari screen memory...
|
|||
48 | markw | for (i=0x0; i!=0xd000; ++i)
|
|
47 | markw | {
|
|
store_mem[i] = atari_base[i];
|
|||
}
|
|||
48 | markw | for (i=0xd800; i!=0x10000; ++i)
|
|
47 | markw | {
|
|
store_mem[i] = atari_base[i];
|
|||
}
|
|||
//Clear, except dl (first 0x40 bytes)
|
|||
55 | markw | clearscreen();
|
|
47 | markw | ||
46 | markw | // Put custom chips in a safe state
|
|
55 | markw | // write a display list at 0600
|
|
unsigned char dl[] = {
|
|||
0x70,
|
|||
0x70,
|
|||
0x47,0x40,0x9c,
|
|||
0x70,
|
|||
0x42,0x68,0x9c,
|
|||
46 | markw | 0x2,0x2,0x2,0x2,0x2,
|
|
0x2,0x2,0x2,0x2,0x2,
|
|||
0x2,0x2,0x2,0x2,0x2,
|
|||
0x2,0x2,0x2,0x2,0x2,
|
|||
55 | markw | 0x2,0x2,
|
|
0x41,0x00,0x06
|
|||
46 | markw | };
|
|
48 | markw | int j = 0;
|
|
55 | markw | for (i=0x0600; j!=sizeof(dl); ++i,++j)
|
|
46 | markw | {
|
|
48 | markw | atari_base[i] = dl[j];
|
|
46 | markw | }
|
|
// point antic at my display list
|
|||
55 | markw | *atari_dlisth = 0x06;
|
|
46 | markw | *atari_dlistl = 0x00;
|
|
55 | markw | ||
46 | markw | *atari_colbk = 0x00;
|
|
55 | markw | *atari_colpf0 = 0x2f;
|
|
*atari_colpf1 = 0x3f;
|
|||
46 | markw | *atari_colpf2 = 0x00;
|
|
55 | markw | *atari_colpf3 = 0x1f;
|
|
46 | markw | *atari_prior = 0x00;
|
|
*atari_chbase = 0xe0;
|
|||
*atari_dmactl = 0x22;
|
|||
*atari_skctl = 0x3;
|
|||
*atari_chactl = 0x2;
|
|||
}
|
|||
void restore()
|
|||
{
|
|||
47 | markw | int i;
|
|
46 | markw | // Restore memory
|
|
48 | markw | for (i=0x0; i!=0xd000; ++i)
|
|
46 | markw | {
|
|
47 | markw | atari_base[i] = store_mem[i];
|
|
46 | markw | }
|
|
48 | markw | for (i=0xd800; i!=0x10000; ++i)
|
|
47 | markw | {
|
|
atari_base[i] = store_mem[i];
|
|||
}
|
|||
46 | markw | ||
// Restore custom chips
|
|||
{
|
|||
//gtia
|
|||
48 | markw | for (i=0xd000; i!=0xd020; i++)
|
|
46 | markw | {
|
|
48 | markw | atari_base[i] = store_mem[i];
|
|
46 | markw | }
|
|
//pokey1/2
|
|||
48 | markw | for (i=0xd200; i!=0xd220; i++)
|
|
46 | markw | {
|
|
48 | markw | atari_base[i] = store_mem[i];
|
|
46 | markw | }
|
|
//antic
|
|||
48 | markw | for (i=0xd400; i!=0xd410; i++)
|
|
46 | markw | {
|
|
48 | markw | atari_base[i] = store_mem[i];
|
|
46 | markw | }
|
|
}
|
|||
*atari_portb = store_portb;
|
|||
}
|