diff -Naur --exclude=CVS atari800-trunk/DOC/ChangeLog atari800/DOC/ChangeLog --- atari800-trunk/DOC/ChangeLog 2012-07-13 21:16:25.000000000 +0000 +++ atari800/DOC/ChangeLog 2012-07-13 21:05:27.000000000 +0000 @@ -1,3 +1,10 @@ +2012-07-13 Jerzy Kut +* atari.c: -nomapram & -mapram cli switches +* cfg.c: ENABLE_MAPRAM bool config entry +* memory.*: Simius MapRAM extension implementation +* atari800.man: -nomapram & -mapram description +* ui.c: "XL/XE MapRAM" entry in "System settings" menu + 2012-06-02 Kostas Nakos * android/*: Small tweaks to the touchscreen mode * afile.c, cartridge.c: Temporary fix for non auto-detected cartridges, until diff -Naur --exclude=CVS atari800-trunk/DOC/NEWS atari800/DOC/NEWS --- atari800-trunk/DOC/NEWS 2011-04-28 12:02:19.000000000 +0000 +++ atari800/DOC/NEWS 2012-07-13 21:07:14.000000000 +0000 @@ -1,3 +1,8 @@ +Version 2.2.2 (?) + + * Simius MapRAM extension support + + Version 2.2.1 (2011/04/28) Quick update fixing some annoying bugs from the previous release diff -Naur --exclude=CVS atari800-trunk/DOC/README atari800/DOC/README --- atari800-trunk/DOC/README 2011-04-28 12:02:19.000000000 +0000 +++ atari800/DOC/README 2012-07-13 21:08:25.000000000 +0000 @@ -136,3 +136,6 @@ o MIO and Black Box emulation o 1400XL and 1450XLD emulation + +o Simius MapRAM extension support + diff -Naur --exclude=CVS atari800-trunk/DOC/USAGE atari800/DOC/USAGE --- atari800-trunk/DOC/USAGE 2012-07-13 21:16:25.000000000 +0000 +++ atari800/DOC/USAGE 2012-07-13 21:10:42.000000000 +0000 @@ -135,6 +135,9 @@ -pal Emulate PAL TV mode -ntsc Emulate NTSC TV mode +-nomapram Turn off Simius MapRAM extension +-mapram Turn on Simius MapRAM extension + -nobasic Turn off Atari BASIC ROM -basic Turn on Atari BASIC ROM diff -Naur --exclude=CVS atari800-trunk/src/atari.c atari800/src/atari.c --- atari800-trunk/src/atari.c 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/atari.c 2012-07-13 18:27:05.000000000 +0000 @@ -553,6 +553,10 @@ Atari800_builtin_game = FALSE; Atari800_keyboard_detached = FALSE; } + else if (strcmp(argv[i], "-nomapram") == 0) + MEMORY_mapram_ext = FALSE; + else if (strcmp(argv[i], "-mapram") == 0) + MEMORY_mapram_ext = TRUE; else if (strcmp(argv[i], "-nobasic") == 0) Atari800_disable_basic = TRUE; else if (strcmp(argv[i], "-basic") == 0) @@ -675,6 +679,8 @@ Log_print("\t-rambo Emulate Atari 320XE (Rambo XL)"); Log_print("\t-xegs Emulate Atari XEGS"); Log_print("\t-5200 Emulate Atari 5200 Games System"); + Log_print("\t-nomapram Turn off MapRAM extenssion"); + Log_print("\t-mapram Turn on MapRAM extenssion"); Log_print("\t-nobasic Turn off Atari BASIC ROM"); Log_print("\t-basic Turn on Atari BASIC ROM"); Log_print("\t-pal Enable PAL TV mode"); diff -Naur --exclude=CVS atari800-trunk/src/atari800.man atari800/src/atari800.man --- atari800-trunk/src/atari800.man 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/atari800.man 2012-07-13 20:56:14.000000000 +0000 @@ -237,6 +237,14 @@ Emulate NTSC TV mode .TP +.B \-nomapram +Used to disable Simius MapRAM extension when starting the emulator +in XL/XE mode. +.TP +.B \-mapram +Turn on Simius MapRAM extension + +.TP .B \-nobasic Used to disable Basic when starting the emulator in XL/XE mode. Simulates the Option key being held down during system boot. diff -Naur --exclude=CVS atari800-trunk/src/cfg.c atari800/src/cfg.c --- atari800-trunk/src/cfg.c 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/cfg.c 2012-07-13 18:27:46.000000000 +0000 @@ -256,6 +256,8 @@ else Log_print("Invalid Mosaic RAM number of banks: %s", ptr); } + else if (strcmp(string, "ENABLE_MAPRAM") == 0) + MEMORY_mapram_ext = Util_sscanbool(ptr); else if (strcmp(string, "BUILTIN_BASIC") == 0) Atari800_builtin_basic = Util_sscanbool(ptr); else if (strcmp(string, "KEYBOARD_LEDS") == 0) @@ -384,6 +386,8 @@ fprintf(fp, "MOSAIC_RAM_NUM_BANKS=%d\n", MEMORY_mosaic_num_banks); fprintf(fp, "AXLON_RAM_NUM_BANKS=%d\n", MEMORY_axlon_num_banks); + fprintf(fp, "ENABLE_MAPRAM=%d\n", MEMORY_mapram_ext); + fprintf(fp, "DISABLE_BASIC=%d\n", Atari800_disable_basic); fprintf(fp, "ENABLE_SIO_PATCH=%d\n", ESC_enable_sio_patch); fprintf(fp, "ENABLE_H_PATCH=%d\n", Devices_enable_h_patch); diff -Naur --exclude=CVS atari800-trunk/src/memory.c atari800/src/memory.c --- atari800-trunk/src/memory.c 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/memory.c 2012-07-13 20:08:13.000000000 +0000 @@ -81,6 +81,10 @@ int MEMORY_xe_bank = 0; int MEMORY_selftest_enabled = 0; +int MEMORY_mapram_ext = 0; +static UBYTE MEMORY_mapram[0x800]; +int MEMORY_mapram_enabled = 0; + static UBYTE under_atarixl_os[16384]; static UBYTE under_cart809F[8192]; static UBYTE under_cartA0BF[8192]; @@ -91,9 +95,9 @@ static UBYTE *atarixe_memory = NULL; static ULONG atarixe_memory_size = 0; -/* RAM shadowed by Self-Test in the XE bank seen by ANTIC, when ANTIC/CPU +/* RAM shadowed by Self-Test or MapRAM in the XE bank seen by ANTIC, when ANTIC/CPU separate XE access is active. */ -static UBYTE antic_bank_under_selftest[0x800]; +static UBYTE antic_bank_under_5057[0x800]; int MEMORY_have_basic = FALSE; /* Atari BASIC image has been successfully read (Atari 800 only) */ @@ -404,7 +408,14 @@ if (MEMORY_ram_size > 64) { StateSav_SaveUBYTE(&atarixe_memory[0], atarixe_memory_size); if (ANTIC_xe_ptr != NULL && MEMORY_selftest_enabled) - StateSav_SaveUBYTE(antic_bank_under_selftest, 0x800); + StateSav_SaveUBYTE(antic_bank_under_5057, 0x800); + } + + /* Simius XL/XE MapRAM extenssion */ + if (Atari800_machine_type == Atari800_MACHINE_XLXE && MEMORY_ram_size > 20) { + StateSav_SaveINT(&MEMORY_mapram_ext, 1); + if (MEMORY_mapram_ext) + StateSav_SaveUBYTE(MEMORY_mapram, 0x800); } } @@ -636,10 +647,19 @@ if (ANTIC_xe_ptr != NULL && MEMORY_selftest_enabled) /* Also read ANTIC-visible memory shadowed by Self Test. */ - StateSav_ReadUBYTE(antic_bank_under_selftest, 0x800); + StateSav_ReadUBYTE(antic_bank_under_5057, 0x800); } } + + /* Simius XL/XE MapRAM extenssion */ + if (Atari800_machine_type == Atari800_MACHINE_XLXE && MEMORY_ram_size > 20) { + StateSav_ReadINT(&MEMORY_mapram_ext, 1); + if (MEMORY_mapram_ext) + StateSav_ReadUBYTE(MEMORY_mapram, 0x800); + + MEMORY_mapram_enabled = MEMORY_mapram_ext && (portb & 0xb1) == 0x30; + } } #endif /* BASIC */ @@ -730,10 +750,23 @@ memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); if (ANTIC_xe_ptr != NULL) /* Also disable Self Test from XE bank accessed by ANTIC. */ - memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); MEMORY_SetRAM(0x5000, 0x57ff); MEMORY_selftest_enabled = FALSE; } + else if (MEMORY_mapram_ext && MEMORY_mapram_enabled + && (cpu_bank != new_cpu_bank + || antic_bank != new_antic_bank + || (MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP && (byte & 0x20) == 0))) { + /* Disable MapRAM */ + memcpy(MEMORY_mapram, MEMORY_mem + 0x5000, 0x800); + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable MapRAM from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + MEMORY_mapram_enabled = FALSE; + } if (cpu_bank != new_cpu_bank) { memcpy(atarixe_memory + (cpu_bank << 14), MEMORY_mem + 0x4000, 0x4000); memcpy(MEMORY_mem + 0x4000, atarixe_memory + (new_cpu_bank << 14), 0x4000); @@ -777,13 +810,27 @@ memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); if (ANTIC_xe_ptr != NULL) /* Also disable Self Test from XE bank accessed by ANTIC. */ - memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); MEMORY_SetRAM(0x5000, 0x57ff); } else MEMORY_dFillMem(0x5000, 0xff, 0x800); MEMORY_selftest_enabled = FALSE; } + /* or MapRAM - Mono */ + else if (MEMORY_mapram_ext && MEMORY_mapram_enabled && (byte & 0xb1) != 0x30) { + if (MEMORY_ram_size > 20) { + memcpy(MEMORY_mapram, MEMORY_mem + 0x5000, 0x800); + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable MapRAM from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + } + else + MEMORY_dFillMem(0x5000, 0xff, 0x800); + MEMORY_mapram_enabled = FALSE; + } } } @@ -817,13 +864,27 @@ memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); if (ANTIC_xe_ptr != NULL) /* Also disable Self Test from XE bank accessed by ANTIC. */ - memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); MEMORY_SetRAM(0x5000, 0x57ff); } else MEMORY_dFillMem(0x5000, 0xff, 0x800); MEMORY_selftest_enabled = FALSE; } + else if (MEMORY_mapram_ext && MEMORY_mapram_enabled) { + /* Disable MapRAM */ + if (MEMORY_ram_size > 20) { + memcpy(MEMORY_mapram, MEMORY_mem + 0x5000, 0x800); + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable MapRAM from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_5057, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + } + else + MEMORY_dFillMem(0x5000, 0xff, 0x800); + MEMORY_mapram_enabled = FALSE; + } } else { /* We can enable Self Test only if the OS ROM is enabled */ @@ -837,7 +898,7 @@ memcpy(under_atarixl_os + 0x1000, MEMORY_mem + 0x5000, 0x800); if (ANTIC_xe_ptr != NULL) /* Also backup RAM under Self Test from XE bank accessed by ANTIC. */ - memcpy(antic_bank_under_selftest, atarixe_memory + (antic_bank << 14) + 0x1000, 0x800); + memcpy(antic_bank_under_5057, atarixe_memory + (antic_bank << 14) + 0x1000, 0x800); MEMORY_SetROM(0x5000, 0x57ff); } memcpy(MEMORY_mem + 0x5000, MEMORY_os + 0x1000, 0x800); @@ -846,6 +907,19 @@ memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, MEMORY_os + 0x1000, 0x800); MEMORY_selftest_enabled = TRUE; } + /* Enable MapRAM if OS ROM is disabled and both CPU & ANTIC have access to base RAM */ + else if (MEMORY_mapram_ext && !MEMORY_mapram_enabled && (byte & 0xb1) == 0x30) { + /* Enable MapRAM */ + if (MEMORY_ram_size > 20) { + memcpy(under_atarixl_os + 0x1000, MEMORY_mem + 0x5000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also backup RAM under MapRAM from XE bank accessed by ANTIC. */ + memcpy(antic_bank_under_5057, atarixe_memory + (antic_bank << 14) + 0x1000, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + } + memcpy(MEMORY_mem + 0x5000, MEMORY_mapram, 0x800); + MEMORY_mapram_enabled = TRUE; + } } } diff -Naur --exclude=CVS atari800-trunk/src/memory.h atari800/src/memory.h --- atari800-trunk/src/memory.h 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/memory.h 2012-07-13 18:26:31.000000000 +0000 @@ -132,4 +132,7 @@ void MEMORY_HwPutByte(UWORD addr, UBYTE byte); #endif /* PAGED_MEM */ +/* MapRAM extenssion */ +extern int MEMORY_mapram_ext; + #endif /* MEMORY_H_ */ diff -Naur --exclude=CVS atari800-trunk/src/ui.c atari800/src/ui.c --- atari800-trunk/src/ui.c 2012-07-13 21:16:26.000000000 +0000 +++ atari800/src/ui.c 2012-07-13 18:25:59.000000000 +0000 @@ -345,6 +345,7 @@ UI_MENU_ACTION(11, "1200XL F1-F4 keys:"), UI_MENU_ACTION(12, "1200XL option jumper J1:"), UI_MENU_ACTION(13, "Keyboard:"), + UI_MENU_ACTION(14, "XL/XE MapRAM:"), UI_MENU_END }; @@ -372,7 +373,8 @@ && Atari800_f_keys == machine[sys_id].f_keys && (machine[sys_id].jumper || !Atari800_jumper) && Atari800_builtin_game == machine[sys_id].game - && (machine[sys_id].keyboard || !Atari800_keyboard_detached)) { + && (machine[sys_id].keyboard || !Atari800_keyboard_detached) + && !MEMORY_mapram_ext) { menu_array[0].suffix = machine_menu_array[sys_id].item; break; } @@ -500,6 +502,11 @@ menu_array[13].suffix = Atari800_machine_type != Atari800_MACHINE_XLXE ? "N/A" : Atari800_keyboard_detached ? "detached (XEGS)" : "integrated/attached"; + /* Set label for the "XL/XE MapRAM" action. */ + menu_array[14].suffix = (Atari800_machine_type != Atari800_MACHINE_XLXE || MEMORY_ram_size < 20) + ? "N/A" + : MEMORY_mapram_ext ? "Yes" : "No"; + option = UI_driver->fSelect("System Settings", 0, option, menu_array, NULL); switch (option) { case 0: @@ -515,6 +522,7 @@ Atari800_builtin_game = machine[option2].game; if (!machine[option2].keyboard) Atari800_keyboard_detached = FALSE; + MEMORY_mapram_ext = FALSE; need_initialise = TRUE; } break; @@ -617,6 +625,9 @@ if (option2 >= 0) { MEMORY_ram_size = option2; need_initialise = TRUE; + if (MEMORY_ram_size < 20) { + MEMORY_mapram_ext = FALSE; + } } } leave: @@ -688,6 +699,10 @@ Atari800_UpdateKeyboardDetached(); } break; + case 14: + if (Atari800_machine_type == Atari800_MACHINE_XLXE && MEMORY_ram_size > 20) + MEMORY_mapram_ext = !MEMORY_mapram_ext; + break; default: if (new_tv_mode != Atari800_tv_mode) { Atari800_SetTVMode(new_tv_mode);