I know this is a rather marginal mapper used by just a few of lame-ish multicarts, but I found it a nice expansion to GNROM plus it allowed for mirroring selection by software:
http://wiki.nesdev.com/w/index.php/INES_Mapper_113
Doragasu has implemented a mapper which behaves exactly as described in the above link and we are using that for a couple of games and a multicart. That's sorted out and going nicely, but I need to be able to run the ROMs in emulators to develop.
Problem is, mirroring selection bit doesn't seem to affect actual mirroring when running the ROM in Fceux. I don't know whether I'm doing something wrong or if I'm missing something, but the mirroring is always what I specify in the iNES header. If I raise bit 0 of byte 6 it's horizontal, otherwise vertical.
Mapper 113 "listens" to writes to address $4100 (among others) and expects
Where "M" is the mirroring bit. But it seems to ignore it.
Here's my paging code. Nothing very fancy, as there's no bus conflicts
Whenever I want to change PRG or CHR, or mirroring, I write the correct value to a buffer in $0300 then call _change_rom. Writing a value of 10110110 ($B6) should select PRG 6, CHR 6, and Vertical mirroring, but it just selects PRG 6 and CHR 6. Mirroring doesn't change.
Any pointers? I've dived in the Fceux sources but can't find the implementation for 113.
http://wiki.nesdev.com/w/index.php/INES_Mapper_113
Doragasu has implemented a mapper which behaves exactly as described in the above link and we are using that for a couple of games and a multicart. That's sorted out and going nicely, but I need to be able to run the ROMs in emulators to develop.
Problem is, mirroring selection bit doesn't seem to affect actual mirroring when running the ROM in Fceux. I don't know whether I'm doing something wrong or if I'm missing something, but the mirroring is always what I specify in the iNES header. If I raise bit 0 of byte 6 it's horizontal, otherwise vertical.
Mapper 113 "listens" to writes to address $4100 (among others) and expects
Code:
MCPPPCCC
Where "M" is the mirroring bit. But it seems to ignore it.
Here's my paging code. Nothing very fancy, as there's no bus conflicts
Code:
_change_rom:
lda #0
sta PPU_MASK
sta PPU_CTRL
lda $0300
sta $4100
jmp start
lda #0
sta PPU_MASK
sta PPU_CTRL
lda $0300
sta $4100
jmp start
Whenever I want to change PRG or CHR, or mirroring, I write the correct value to a buffer in $0300 then call _change_rom. Writing a value of 10110110 ($B6) should select PRG 6, CHR 6, and Vertical mirroring, but it just selects PRG 6 and CHR 6. Mirroring doesn't change.
Any pointers? I've dived in the Fceux sources but can't find the implementation for 113.