comparison sms.c @ 1162:c4ea535cf57e

Forgot that the expansion to 32-bit values for 16-bit addresses is not done when calling a C function to handle a memory operation. Mask on location in mapper_write was needed afterall
author Michael Pavone <pavone@retrodev.com>
date Sun, 08 Jan 2017 16:55:30 -0800
parents c83ec07ddbac
children b1147418254a
comparison
equal deleted inserted replaced
1161:c2210d586950 1162:c4ea535cf57e
111 static void *mapper_write(uint32_t location, void *vcontext, uint8_t value) 111 static void *mapper_write(uint32_t location, void *vcontext, uint8_t value)
112 { 112 {
113 z80_context *z80 = vcontext; 113 z80_context *z80 = vcontext;
114 sms_context *sms = z80->system; 114 sms_context *sms = z80->system;
115 void *old_value; 115 void *old_value;
116 sms->ram[location & (sizeof(sms->ram)-1)] = value;
117 location &= 3; 116 location &= 3;
117 sms->ram[0x1FFC + location] = value;
118 sms->bank_regs[location] = value; 118 sms->bank_regs[location] = value;
119 if (location) { 119 if (location) {
120 uint32_t idx = location - 1; 120 uint32_t idx = location - 1;
121 old_value = z80->mem_pointers[idx]; 121 old_value = z80->mem_pointers[idx];
122 z80->mem_pointers[idx] = sms->rom + (value << 14 & (sms->rom_size-1)); 122 z80->mem_pointers[idx] = sms->rom + (value << 14 & (sms->rom_size-1));
286 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; 286 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL};
287 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; 287 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL};
288 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; 288 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL};
289 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write}; 289 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, cart_ram_write};
290 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; 290 memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL};
291 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; 291 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write};
292 } else { 292 } else {
293 info_out->map_chunks = 2; 293 info_out->map_chunks = 2;
294 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; 294 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL};
295 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; 295 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL};
296 }; 296 };
306 sms->rom_size = rom_size; 306 sms->rom_size = rom_size;
307 if (info_out->map_chunks > 2) { 307 if (info_out->map_chunks > 2) {
308 sms->z80->mem_pointers[0] = sms->rom; 308 sms->z80->mem_pointers[0] = sms->rom;
309 sms->z80->mem_pointers[1] = sms->rom + 0x4000; 309 sms->z80->mem_pointers[1] = sms->rom + 0x4000;
310 sms->z80->mem_pointers[2] = sms->rom + 0x8000; 310 sms->z80->mem_pointers[2] = sms->rom + 0x8000;
311 sms->bank_regs[1] = 0;
312 sms->bank_regs[2] = 0x4000 >> 14;
313 sms->bank_regs[3] = 0x8000 >> 14;
311 } 314 }
312 315
313 char * lowpass_cutoff_str = tern_find_path(config, "audio\0lowpass_cutoff\0").ptrval; 316 char * lowpass_cutoff_str = tern_find_path(config, "audio\0lowpass_cutoff\0").ptrval;
314 uint32_t lowpass_cutoff = lowpass_cutoff_str ? atoi(lowpass_cutoff_str) : 3390; 317 uint32_t lowpass_cutoff = lowpass_cutoff_str ? atoi(lowpass_cutoff_str) : 3390;
315 318