aboutsummaryrefslogtreecommitdiff
path: root/config/os2ram.c
diff options
context:
space:
mode:
Diffstat (limited to 'config/os2ram.c')
-rw-r--r--config/os2ram.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/config/os2ram.c b/config/os2ram.c
new file mode 100644
index 0000000..587c396
--- /dev/null
+++ b/config/os2ram.c
@@ -0,0 +1,55 @@
+/* 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 <stdio.h>
+#include <string.h>
+#include <atari.h>
+#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