trunk/src/mame/video/decodmd1.c
| r24041 | r24042 | |
| 28 | 28 | |
| 29 | 29 | WRITE8_MEMBER( decodmd_type1_device::ctrl_w ) |
| 30 | 30 | { |
| 31 | | if(!(m_ctrl & 0x01) && (data & 0x01)) |
| 31 | if((data | m_ctrl) & 0x01) |
| 32 | 32 | { |
| 33 | 33 | m_command = m_latch; |
| 34 | | m_busy = 1; |
| 35 | | m_cpu->set_input_line(INPUT_LINE_IRQ0,ASSERT_LINE); |
| 34 | set_busy(B_CLK,data & 0x01); |
| 36 | 35 | } |
| 37 | 36 | if((m_ctrl & 0x02) && !(data & 0x02)) |
| 38 | 37 | { |
| 39 | 38 | m_rombank1->set_entry(0); |
| 40 | 39 | m_bank = 0; |
| 41 | | m_busy = 0; |
| 40 | set_busy(B_SET,0); |
| 42 | 41 | m_rowselect = 0; |
| 43 | 42 | m_blank = 0; |
| 44 | 43 | m_frameswap = false; |
| 44 | m_status = 0; |
| 45 | 45 | m_cpu->set_input_line(INPUT_LINE_RESET,PULSE_LINE); |
| 46 | 46 | } |
| 47 | 47 | m_ctrl = data; |
| r24041 | r24042 | |
| 54 | 54 | |
| 55 | 55 | READ8_MEMBER( decodmd_type1_device::status_r ) |
| 56 | 56 | { |
| 57 | | return (m_busy & 0x01) | ((m_ctrl) << 1); |
| 57 | return (m_busy & 0x01) | (m_status << 1); |
| 58 | 58 | } |
| 59 | 59 | |
| 60 | 60 | WRITE8_MEMBER( decodmd_type1_device::status_w ) |
| r24041 | r24042 | |
| 69 | 69 | if((offset & 0x84) == 0x80) |
| 70 | 70 | { |
| 71 | 71 | // IDAT (read only) |
| 72 | | m_busy = 0; |
| 73 | | m_ctrl &= ~0x01; |
| 74 | | m_cpu->set_input_line(INPUT_LINE_IRQ0,CLEAR_LINE); |
| 75 | | return m_latch; |
| 72 | //m_ctrl &= ~0x01; |
| 73 | set_busy(B_CLR,0); |
| 74 | set_busy(B_CLR,1); |
| 75 | return m_command; |
| 76 | 76 | } |
| 77 | 77 | return 0xff; |
| 78 | 78 | } |
| r24041 | r24042 | |
| 129 | 129 | m_rowclock = bit; |
| 130 | 130 | break; |
| 131 | 131 | case 0xdc: // Test |
| 132 | | m_busy_set = bit; |
| 133 | | //check_busy(); |
| 132 | set_busy(B_SET,bit); |
| 134 | 133 | break; |
| 135 | 134 | } |
| 136 | 135 | break; |
| r24041 | r24042 | |
| 160 | 159 | } |
| 161 | 160 | } |
| 162 | 161 | |
| 163 | | void decodmd_type1_device::check_busy() |
| 162 | void decodmd_type1_device::set_busy(UINT8 input, UINT8 val) |
| 164 | 163 | { |
| 165 | | if(m_busy_clr) |
| 166 | | { |
| 164 | UINT8 newval = (m_busy_lines & ~input) | (val ? input : 0); |
| 165 | |
| 166 | if(~newval & m_busy_lines & B_CLR) |
| 167 | 167 | m_busy = 0; |
| 168 | | m_cpu->set_input_line(INPUT_LINE_IRQ0,CLEAR_LINE); |
| 169 | | } |
| 170 | | else if(!m_busy_set) |
| 171 | | { |
| 168 | else if (~newval & m_busy_lines & B_SET) |
| 172 | 169 | m_busy = 1; |
| 173 | | m_cpu->set_input_line(INPUT_LINE_IRQ0,ASSERT_LINE); |
| 174 | | } |
| 175 | | else |
| 170 | else if ((newval & (B_CLR|B_SET)) == (B_CLR|B_SET)) |
| 176 | 171 | { |
| 177 | | if(!m_busy_clk) |
| 178 | | { |
| 172 | if(newval & ~m_busy_lines & B_CLK) |
| 179 | 173 | m_busy = 1; |
| 180 | | m_cpu->set_input_line(INPUT_LINE_IRQ0,ASSERT_LINE); |
| 181 | | } |
| 182 | 174 | } |
| 183 | 175 | |
| 176 | m_busy_lines = newval; |
| 177 | |
| 178 | m_cpu->set_input_line(INPUT_LINE_IRQ0,m_busy ? ASSERT_LINE : CLEAR_LINE); |
| 184 | 179 | } |
| 185 | 180 | |
| 186 | 181 | TIMER_DEVICE_CALLBACK_MEMBER(decodmd_type1_device::dmd_nmi) |
| r24041 | r24042 | |
| 190 | 185 | |
| 191 | 186 | static ADDRESS_MAP_START( decodmd1_map, AS_PROGRAM, 8, decodmd_type1_device ) |
| 192 | 187 | AM_RANGE(0x0000, 0x3fff) AM_ROMBANK("dmdbank2") // last 16k of ROM |
| 193 | | AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("dmdbank1") //AM_WRITE(status_w) |
| 188 | AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("dmdbank1") |
| 194 | 189 | AM_RANGE(0x8000, 0x9fff) AM_RAMBANK("dmdram") |
| 195 | 190 | ADDRESS_MAP_END |
| 196 | 191 | |
| r24041 | r24042 | |
| 201 | 196 | |
| 202 | 197 | static MACHINE_CONFIG_FRAGMENT( decodmd1 ) |
| 203 | 198 | /* basic machine hardware */ |
| 204 | | MCFG_CPU_ADD("dmdcpu", Z80, XTAL_4MHz) |
| 199 | MCFG_CPU_ADD("dmdcpu", Z80, XTAL_8MHz / 2) |
| 205 | 200 | MCFG_CPU_PROGRAM_MAP(decodmd1_map) |
| 206 | 201 | MCFG_CPU_IO_MAP(decodmd1_io_map) |
| 207 | 202 | |
| 208 | | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 203 | MCFG_QUANTUM_TIME(attotime::from_hz(50)) |
| 209 | 204 | |
| 210 | 205 | MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi_timer",decodmd_type1_device,dmd_nmi,attotime::from_hz(2000)) // seems a lot |
| 211 | 206 | |
| r24041 | r24042 | |
| 215 | 210 | MCFG_SCREEN_SIZE(128, 16) |
| 216 | 211 | MCFG_SCREEN_VISIBLE_AREA(0, 128-1, 0, 16-1) |
| 217 | 212 | MCFG_SCREEN_UPDATE_DRIVER(decodmd_type1_device,screen_update) |
| 218 | | MCFG_SCREEN_REFRESH_RATE(60) |
| 213 | MCFG_SCREEN_REFRESH_RATE(50) |
| 219 | 214 | |
| 220 | 215 | MCFG_RAM_ADD(RAM_TAG) |
| 221 | 216 | MCFG_RAM_DEFAULT_SIZE("8K") |
| r24041 | r24042 | |
| 247 | 242 | m_rom = memregion(m_romregion); |
| 248 | 243 | |
| 249 | 244 | memset(RAM,0,0x2000); |
| 245 | memset(m_pixels,0,0x100); |
| 250 | 246 | |
| 251 | 247 | ROM = m_rom->base(); |
| 252 | 248 | m_rombank1->configure_entries(0, 8, &ROM[0x0000], 0x4000); |
| 253 | 249 | m_rombank2->configure_entry(0, &ROM[0x1c000]); |
| 254 | 250 | m_rombank1->set_entry(0); |
| 255 | 251 | m_rombank2->set_entry(0); |
| 252 | m_status = 0; |
| 256 | 253 | m_bank = 0; |
| 257 | 254 | m_busy = 0; |
| 255 | set_busy(B_CLR|B_SET,0); |
| 258 | 256 | m_rowselect = 0; |
| 259 | 257 | m_blank = 0; |
| 260 | 258 | m_frameswap = false; |