/* Move the XL/XE OS to RAM. Based on the RAMROM code by Joe Miller, from the Mapping the Atari XL appendix (see the PORTB entry). Uses $6000 to $97FF as a buffer, so it won't step on the default GR.0 screen if BASIC is enabled. */ #include #include #include #include <6502.h> #define LO_ROM_SIZE 0x1000 #define HI_ROM_SIZE 0x2800 static char *lo_buf = (char *)0x6000; static char *hi_buf = (char *)0x7000; static char *lo_rom = (char *)0xc000; static char *hi_rom = (char *)0xd800; static char old_nmi; static void enable_interrupts(void) { ANTIC.nmien = old_nmi; CLI(); } static void disable_os_rom(void) { SEI(); old_nmi = ANTIC.nmien; ANTIC.nmien = 0; PIA.portb &= 0xfe; } void os_to_ram(void) { memcpy(lo_buf, lo_rom, LO_ROM_SIZE); memcpy(hi_buf, hi_rom, HI_ROM_SIZE); disable_os_rom(); memcpy(lo_rom, lo_buf, LO_ROM_SIZE); memcpy(hi_rom, hi_buf, HI_ROM_SIZE); enable_interrupts(); } #if 0 void main(void) { if(is_xl()) { puts("XL/XE, copying OS to RAM."); os_to_ram(); *((char *)0xe003) = 0x7e; } else { puts("400/800, can't do."); } hang: goto hang; } #endif