From: <pa...@us...> - 2011-12-18 21:54:34
|
Revision: 4600 http://fuse-emulator.svn.sourceforge.net/fuse-emulator/?rev=4600&view=rev Author: pak21 Date: 2011-12-18 21:54:28 +0000 (Sun, 18 Dec 2011) Log Message: ----------- Fix paging for 4K page size (thanks, unittests). Modified Paths: -------------- branches/2011-02-16-spectranet/fuse/hacking/ChangeLog branches/2011-02-16-spectranet/fuse/peripherals/ide/divide.c Modified: branches/2011-02-16-spectranet/fuse/hacking/ChangeLog =================================================================== --- branches/2011-02-16-spectranet/fuse/hacking/ChangeLog 2011-12-18 21:27:08 UTC (rev 4599) +++ branches/2011-02-16-spectranet/fuse/hacking/ChangeLog 2011-12-18 21:54:28 UTC (rev 4600) @@ -3910,3 +3910,5 @@ Opus paging arguably even less wrong. It's still not right, though. 20111218 menu_data.dat,menu.h,ui/{options.dat,widget/{menu.c,widget.[ch]}}: peripherals menu had become insanely big; split it in two. +20111218 peripherals/ide/divide.c: fix paging for 4K page size (thanks, + unittests). Modified: branches/2011-02-16-spectranet/fuse/peripherals/ide/divide.c =================================================================== --- branches/2011-02-16-spectranet/fuse/peripherals/ide/divide.c 2011-12-18 21:27:08 UTC (rev 4599) +++ branches/2011-02-16-spectranet/fuse/peripherals/ide/divide.c 2011-12-18 21:54:28 UTC (rev 4600) @@ -86,8 +86,8 @@ #define DIVIDE_PAGE_LENGTH 0x2000 static libspectrum_byte *divide_ram[ DIVIDE_PAGES ]; static libspectrum_byte *divide_eprom; -static memory_page divide_memory_map_eprom; -static memory_page divide_memory_map_ram[DIVIDE_PAGES]; +static memory_page divide_memory_map_eprom[ MEMORY_PAGES_IN_8K ]; +static memory_page divide_memory_map_ram[ DIVIDE_PAGES ][ MEMORY_PAGES_IN_8K ]; static int memory_allocated = 0; static int divide_memory_source_eprom; static int divide_memory_source_ram; @@ -117,7 +117,7 @@ int divide_init( void ) { - int error, i; + int error, i, j; divide_idechn0 = libspectrum_ide_alloc( LIBSPECTRUM_IDE_DATA16 ); divide_idechn1 = libspectrum_ide_alloc( LIBSPECTRUM_IDE_DATA16 ); @@ -144,12 +144,18 @@ divide_memory_source_eprom = memory_source_register( "DivIDE EPROM" ); divide_memory_source_ram = memory_source_register( "DivIDE RAM" ); - divide_memory_map_eprom.source = divide_memory_source_eprom; - divide_memory_map_eprom.page_num = 0; + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) { + memory_page *page = ÷_memory_map_eprom[i]; + page->source = divide_memory_source_eprom; + page->page_num = 0; + } for( i = 0; i < DIVIDE_PAGES; i++ ) { - divide_memory_map_ram[i].source = divide_memory_source_ram; - divide_memory_map_ram[i].page_num = i; + for( j = 0; j < MEMORY_PAGES_IN_8K; j++ ) { + memory_page *page = ÷_memory_map_ram[i][j]; + page->source = divide_memory_source_ram; + page->page_num = i; + } } periph_register( PERIPH_TYPE_DIVIDE, ÷_periph ); @@ -364,6 +370,7 @@ { int i; int upper_ram_page; + int lower_page_writable, upper_page_writable; memory_page *lower_page, *upper_page; if( !divide_active ) return; @@ -373,24 +380,29 @@ upper_ram_page = divide_control & (DIVIDE_PAGES - 1); if( divide_control & DIVIDE_CONTROL_CONMEM ) { - lower_page = ÷_memory_map_eprom; - lower_page->writable = !settings_current.divide_wp; - upper_page = ÷_memory_map_ram[ upper_ram_page ]; - upper_page->writable = 1; + lower_page = divide_memory_map_eprom; + lower_page_writable = !settings_current.divide_wp; + upper_page = divide_memory_map_ram[ upper_ram_page ]; + upper_page_writable = 1; } else { if( divide_control & DIVIDE_CONTROL_MAPRAM ) { - lower_page = ÷_memory_map_ram[3]; - lower_page->writable = 0; - upper_page = ÷_memory_map_ram[ upper_ram_page ]; - upper_page->writable = ( upper_ram_page != 3 ); + lower_page = divide_memory_map_ram[3]; + lower_page_writable = 0; + upper_page = divide_memory_map_ram[ upper_ram_page ]; + upper_page_writable = ( upper_ram_page != 3 ); } else { - lower_page = ÷_memory_map_eprom; - lower_page->writable = 0; - upper_page = ÷_memory_map_ram[ upper_ram_page ]; - upper_page->writable = 1; + lower_page = divide_memory_map_eprom; + lower_page_writable = 0; + upper_page = divide_memory_map_ram[ upper_ram_page ]; + upper_page_writable = 1; } } + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) { + lower_page[i].writable = lower_page_writable; + upper_page[i].writable = upper_page_writable; + } + memory_map_romcs_8k( 0x0000, lower_page ); memory_map_romcs_8k( 0x2000, upper_page ); } @@ -472,17 +484,25 @@ divide_activate( void ) { if( !memory_allocated ) { - int i; + int i, j; libspectrum_byte *memory = memory_pool_allocate_persistent( DIVIDE_PAGES * DIVIDE_PAGE_LENGTH, 1 ); for( i = 0; i < DIVIDE_PAGES; i++ ) { divide_ram[i] = memory + i * DIVIDE_PAGE_LENGTH; - divide_memory_map_ram[i].page = divide_ram[i]; + for( j = 0; j < MEMORY_PAGES_IN_8K; j++ ) { + memory_page *page = ÷_memory_map_ram[i][j]; + page->page = divide_ram[i] + j * MEMORY_PAGE_SIZE; + page->offset = j * MEMORY_PAGE_SIZE; + } } divide_eprom = memory_pool_allocate_persistent( DIVIDE_PAGE_LENGTH, 1 ); - divide_memory_map_eprom.page = divide_eprom; + for( i = 0; i < MEMORY_PAGES_IN_8K; i++ ) { + memory_page *page = ÷_memory_map_eprom; + page->page = divide_eprom + i * MEMORY_PAGE_SIZE; + page->offset = i * MEMORY_PAGE_SIZE; + } memory_allocated = 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |