mirror of
https://github.com/transistorfet/moa.git
synced 2024-05-28 13:41:30 +00:00
Fixed controllers in Earthworm Jim (but not Mortal Kombat 1)
This commit is contained in:
parent
d21e2c4d6a
commit
a60e72fc04
|
@ -50,13 +50,13 @@ impl GenesisControllerPort {
|
||||||
|
|
||||||
match (th_state, self.th_count) {
|
match (th_state, self.th_count) {
|
||||||
(true, 0) => self.outputs | ((inputs & 0x003F) as u8),
|
(true, 0) => self.outputs | ((inputs & 0x003F) as u8),
|
||||||
(false, 0) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | ((inputs & 0x0003) as u8),
|
(false, 1) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | ((inputs & 0x0003) as u8),
|
||||||
(true, 1) => self.outputs | ((inputs & 0x003F) as u8),
|
(true, 1) => self.outputs | ((inputs & 0x003F) as u8),
|
||||||
(false, 1) => self.outputs | (((inputs & 0x00C0) >> 2) as u8),
|
(false, 2) => self.outputs | (((inputs & 0x00C0) >> 2) as u8),
|
||||||
(true, 2) => self.outputs | ((inputs & 0x0030) as u8) | (((inputs & 0x0F00) >> 8) as u8),
|
(true, 2) => self.outputs | ((inputs & 0x0030) as u8) | (((inputs & 0x0F00) >> 8) as u8),
|
||||||
(false, 2) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | 0x0F,
|
(false, 3) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | 0x0F,
|
||||||
(true, 3) => self.outputs | ((inputs & 0x003F) as u8),
|
(true, 3) => self.outputs | ((inputs & 0x003F) as u8),
|
||||||
(false, 3) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | ((inputs & 0x0003) as u8),
|
(false, 1) => self.outputs | (((inputs & 0x00C0) >> 2) as u8) | ((inputs & 0x0003) as u8),
|
||||||
_ => 0,
|
_ => 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,14 +173,14 @@ impl Addressable for GenesisControllers {
|
||||||
REG_S_CTRL3 => { data[i] = self.expansion.s_ctrl | 0x02; },
|
REG_S_CTRL3 => { data[i] = self.expansion.s_ctrl | 0x02; },
|
||||||
_ => { warning!("{}: !!! unhandled reading from {:0x}", DEV_NAME, addr); },
|
_ => { warning!("{}: !!! unhandled reading from {:0x}", DEV_NAME, addr); },
|
||||||
}
|
}
|
||||||
debug!("{}: read from register {:x} the value {:x}", DEV_NAME, addr, data[0]);
|
info!("{}: read from register {:x} the value {:x}", DEV_NAME, addr, data[0]);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&mut self, addr: Address, data: &[u8]) -> Result<(), Error> {
|
fn write(&mut self, addr: Address, data: &[u8]) -> Result<(), Error> {
|
||||||
self.reset_timer = 0;
|
self.reset_timer = 0;
|
||||||
|
|
||||||
debug!("{}: write to register {:x} with {:x}", DEV_NAME, addr, data[0]);
|
info!("{}: write to register {:x} with {:x}", DEV_NAME, addr, data[0]);
|
||||||
match addr {
|
match addr {
|
||||||
REG_DATA1 => { self.port_1.set_data(data[0]); }
|
REG_DATA1 => { self.port_1.set_data(data[0]); }
|
||||||
REG_DATA2 => { self.port_2.set_data(data[0]); },
|
REG_DATA2 => { self.port_2.set_data(data[0]); },
|
||||||
|
|
|
@ -159,7 +159,7 @@ impl Ym7101Memory {
|
||||||
4 => Memory::Vsram,
|
4 => Memory::Vsram,
|
||||||
_ => Memory::Cram,
|
_ => Memory::Cram,
|
||||||
};
|
};
|
||||||
info!("{}: transfer requested of type {:x} ({:?}) to address {:x}", DEV_NAME, self.transfer_type, self.transfer_target, self.transfer_dest_addr);
|
debug!("{}: transfer requested of type {:x} ({:?}) to address {:x}", DEV_NAME, self.transfer_type, self.transfer_target, self.transfer_dest_addr);
|
||||||
if (self.transfer_type & 0x20) != 0 {
|
if (self.transfer_type & 0x20) != 0 {
|
||||||
if (self.transfer_type & 0x10) != 0 {
|
if (self.transfer_type & 0x10) != 0 {
|
||||||
self.set_dma_mode(DmaType::Copy);
|
self.set_dma_mode(DmaType::Copy);
|
||||||
|
@ -227,7 +227,7 @@ impl Ym7101Memory {
|
||||||
|
|
||||||
match self.transfer_run {
|
match self.transfer_run {
|
||||||
DmaType::Memory => {
|
DmaType::Memory => {
|
||||||
info!("{}: starting dma transfer {:x} from Mem:{:x} to {:?}:{:x} ({} bytes)", DEV_NAME, self.transfer_type, self.transfer_src_addr, self.transfer_target, self.transfer_dest_addr, self.transfer_remain);
|
debug!("{}: starting dma transfer {:x} from Mem:{:x} to {:?}:{:x} ({} bytes)", DEV_NAME, self.transfer_type, self.transfer_src_addr, self.transfer_target, self.transfer_dest_addr, self.transfer_remain);
|
||||||
let mut bus = system.get_bus();
|
let mut bus = system.get_bus();
|
||||||
|
|
||||||
while self.transfer_remain > 0 {
|
while self.transfer_remain > 0 {
|
||||||
|
@ -245,7 +245,7 @@ impl Ym7101Memory {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
DmaType::Copy => {
|
DmaType::Copy => {
|
||||||
info!("{}: starting dma copy from VRAM:{:x} to VRAM:{:x} ({} bytes)", DEV_NAME, self.transfer_src_addr, self.transfer_dest_addr, self.transfer_remain);
|
debug!("{}: starting dma copy from VRAM:{:x} to VRAM:{:x} ({} bytes)", DEV_NAME, self.transfer_src_addr, self.transfer_dest_addr, self.transfer_remain);
|
||||||
while self.transfer_remain > 0 {
|
while self.transfer_remain > 0 {
|
||||||
self.vram[self.transfer_dest_addr as usize] = self.vram[self.transfer_src_addr as usize];
|
self.vram[self.transfer_dest_addr as usize] = self.vram[self.transfer_src_addr as usize];
|
||||||
self.transfer_dest_addr += self.transfer_auto_inc;
|
self.transfer_dest_addr += self.transfer_auto_inc;
|
||||||
|
@ -254,7 +254,7 @@ impl Ym7101Memory {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
DmaType::Fill => {
|
DmaType::Fill => {
|
||||||
info!("{}: starting dma fill to VRAM:{:x} ({} bytes) with {:x}", DEV_NAME, self.transfer_dest_addr, self.transfer_remain, self.transfer_fill_word);
|
debug!("{}: starting dma fill to VRAM:{:x} ({} bytes) with {:x}", DEV_NAME, self.transfer_dest_addr, self.transfer_remain, self.transfer_fill_word);
|
||||||
while self.transfer_remain > 0 {
|
while self.transfer_remain > 0 {
|
||||||
self.vram[self.transfer_dest_addr as usize] = self.transfer_fill_word as u8;
|
self.vram[self.transfer_dest_addr as usize] = self.transfer_fill_word as u8;
|
||||||
self.transfer_dest_addr += self.transfer_auto_inc;
|
self.transfer_dest_addr += self.transfer_auto_inc;
|
||||||
|
@ -697,7 +697,7 @@ impl Ym7101 {
|
||||||
fn set_register(&mut self, word: u16) {
|
fn set_register(&mut self, word: u16) {
|
||||||
let reg = ((word & 0x1F00) >> 8) as usize;
|
let reg = ((word & 0x1F00) >> 8) as usize;
|
||||||
let data = (word & 0x00FF) as u8;
|
let data = (word & 0x00FF) as u8;
|
||||||
info!("{}: register {:x} set to {:x}", DEV_NAME, reg, data);
|
debug!("{}: register {:x} set to {:x}", DEV_NAME, reg, data);
|
||||||
self.update_register_value(reg, data);
|
self.update_register_value(reg, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
todo.txt
14
todo.txt
|
@ -57,20 +57,18 @@ Debugger:
|
||||||
|
|
||||||
Genesis/Mega Drive:
|
Genesis/Mega Drive:
|
||||||
|
|
||||||
* there's a bug when Sonic 2 goes to the demo screen, it's all corrupted (could it be a dma copy error)
|
* implement sn76489 and ym2612 for audio
|
||||||
* fix sprite/cell priorities so that they're drawn correctly
|
|
||||||
* implement highlight and shadow mode, which is also related to the priority
|
|
||||||
* in some games the controller doesn't seem to work at all (Earthworm Jim, and Mortal Kombat)
|
* in some games the controller doesn't seem to work at all (Earthworm Jim, and Mortal Kombat)
|
||||||
* refactor ym7101 into multiple files perhaps. You can separate the DMA stuff, the address/interfacing parts, and the graphics state
|
* refactor to print line by line, so that colour palette changes have an effect
|
||||||
|
* there's a bug when Sonic 2 goes to the demo screen, it's all corrupted (could it be a dma copy error)
|
||||||
* colours are still broken in Sonic1
|
* colours are still broken in Sonic1
|
||||||
* sonic3 needs some kind of nvram to run
|
* sonic3 needs some kind of nvram to run
|
||||||
|
|
||||||
* implement sn76489 and ym2612 for audio
|
* the 68000/Z80 bank switching is probably buggy
|
||||||
* the 68000/Z80 bank switching is probably buggy, and there's that other banking stuff in the 0xC00000 range, which isn't implemented at all
|
* the H/V counters are not accurate because it seems to count at different speeds in the blanking period (time vs return value numbers don't divide properly)
|
||||||
* add support for the H/V counters at 0xC00008
|
|
||||||
* fix ym7101 to better handle V/H interrupts (right now it sets and then the next step will clear, but it'd be nice if it could 'edge trigger')
|
|
||||||
* make the ym7101 set/reset the v_int occurred flag based on the interrupt controller
|
* make the ym7101 set/reset the v_int occurred flag based on the interrupt controller
|
||||||
* add support for the sprite overflow flag (low priority)
|
* add support for the sprite overflow flag (low priority)
|
||||||
|
* still possibly a bug with the shadow/highlight colours
|
||||||
|
|
||||||
|
|
||||||
Macintosh:
|
Macintosh:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user