Mercurial > repos > blastem
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 |