summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2018-02-05 17:00:50 +0100
committer angelosa <salese_corp_ltd@email.it>2018-02-05 17:01:38 +0100
commitd2fa8a502a98ec686e4a145f5cab476efd255a2f (patch)
treecc63b7c2ee2f414be4235694413074712fcaf576
parent9f6f2af975f8c775f3af8c4dd88c29e097a09b85 (diff)
Some improvements towards pc6001sr (nw)
-rw-r--r--src/mame/drivers/pc6001.cpp84
-rw-r--r--src/mame/includes/pc6001.h34
-rw-r--r--src/mame/video/pc6001.cpp75
3 files changed, 122 insertions, 71 deletions
diff --git a/src/mame/drivers/pc6001.cpp b/src/mame/drivers/pc6001.cpp
index a4d124b1db6..0be32cf3906 100644
--- a/src/mame/drivers/pc6001.cpp
+++ b/src/mame/drivers/pc6001.cpp
@@ -794,8 +794,8 @@ WRITE8_MEMBER(pc6001sr_state::sr_bank_rn_w)
case 0xf0: bank[offset]->set_base(&ROM[SR_SYSROM_1(bank_num)]); break;
case 0xe0: bank[offset]->set_base(&ROM[SR_SYSROM_2(bank_num)]); break;
case 0xd0: bank[offset]->set_base(&ROM[SR_CGROM1(bank_num)]); break;
- case 0xc0: bank[offset]->set_base(&ROM[SR_EXROM0(bank_num)]); break;
- case 0xb0: bank[offset]->set_base(&ROM[SR_EXROM1(bank_num)]); break;
+ case 0xc0: bank[offset]->set_base(&ROM[SR_EXROM1(bank_num)]); break;
+ case 0xb0: bank[offset]->set_base(&ROM[SR_EXROM0(bank_num)]); break;
case 0x20: bank[offset]->set_base(&ROM[SR_EXRAM0(bank_num)]); break;
case 0x00: bank[offset]->set_base(&ROM[SR_WRAM0(bank_num)]); break;
default: bank[offset]->set_base(&ROM[SR_NULL(bank_num)]); break;
@@ -812,17 +812,41 @@ WRITE8_MEMBER(pc6001sr_state::sr_bank_wn_w)
m_sr_bank_w[offset] = data;
}
+WRITE8_MEMBER(pc6001sr_state::sr_bitmap_yoffs_w)
+{
+ m_bitmap_yoffs = data;
+}
+
+WRITE8_MEMBER(pc6001sr_state::sr_bitmap_xoffs_w)
+{
+ m_bitmap_xoffs = data;
+}
+
#define SR_WRAM_BANK_W(_v_) \
{ \
uint8_t *ROM = m_region_maincpu->base(); \
uint8_t bank_num; \
- bank_num = m_sr_bank_w[_v_] & 0x0f; \
- if((m_sr_bank_w[_v_] & 0xf0) != 0x20) \
+ bank_num = m_sr_bank_w[_v_] & 0x0e; \
+ if((m_sr_bank_w[_v_] & 0xf0) == 0x00) \
ROM[offset+(SR_WRAM0(bank_num))] = data; \
- else \
+ else if((m_sr_bank_w[_v_] & 0xf0) == 0x20) \
ROM[offset+(SR_EXRAM0(bank_num))] = data; \
}
-WRITE8_MEMBER(pc6001sr_state::sr_work_ram0_w){ SR_WRAM_BANK_W(0); }
+
+WRITE8_MEMBER(pc6001sr_state::sr_work_ram0_w)
+{
+ // TODO: not entirely correct
+ if(m_sr_text_mode == false && m_sr_bank_w[0] == 0)
+ {
+ uint32_t real_offs = (m_bitmap_xoffs*16+m_bitmap_yoffs)*256;
+ real_offs += offset;
+
+ m_gvram[real_offs] = data;
+ return;
+ }
+
+ SR_WRAM_BANK_W(0);
+}
WRITE8_MEMBER(pc6001sr_state::sr_work_ram1_w){ SR_WRAM_BANK_W(1); }
WRITE8_MEMBER(pc6001sr_state::sr_work_ram2_w){ SR_WRAM_BANK_W(2); }
WRITE8_MEMBER(pc6001sr_state::sr_work_ram3_w){ SR_WRAM_BANK_W(3); }
@@ -833,8 +857,11 @@ WRITE8_MEMBER(pc6001sr_state::sr_work_ram7_w){ SR_WRAM_BANK_W(7); }
WRITE8_MEMBER(pc6001sr_state::sr_mode_w)
{
- m_sr_video_mode = data;
-
+ // if 1 text mode else bitmap mode
+ m_sr_text_mode = bool(BIT(data,3));
+ m_sr_text_rows = data & 4 ? 20 : 25;
+ // bit 1: bus request
+
if(data & 1)
assert("PC-6001SR in Mk-2 compatibility mode not yet supported!\n");
}
@@ -875,6 +902,11 @@ WRITE8_MEMBER(pc6001sr_state::necsr_ppi8255_w)
m_ppi->write(space,offset,data);
}
+READ8_MEMBER(pc6001sr_state::hw_rev_r)
+{
+ // bit 1 is active for pc6601sr, causes a direct jump to "video telopper" for pc6001mk2sr
+ return 0;
+}
static ADDRESS_MAP_START(pc6001sr_map, AS_PROGRAM, 8, pc6001sr_state )
ADDRESS_MAP_UNMAP_HIGH
@@ -891,6 +923,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pc6001sr_io , AS_IO, 8, pc6001sr_state )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
+// 0x40-0x43 palette indexes
AM_RANGE(0x60, 0x67) AM_READWRITE(sr_bank_rn_r, sr_bank_rn_w)
AM_RANGE(0x68, 0x6f) AM_READWRITE(sr_bank_wn_r, sr_bank_wn_w)
AM_RANGE(0x80, 0x80) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w)
@@ -906,16 +939,19 @@ static ADDRESS_MAP_START( pc6001sr_io , AS_IO, 8, pc6001sr_state )
AM_RANGE(0xb0, 0xb0) AM_WRITE(sr_system_latch_w)
/* these are disk related */
// AM_RANGE(0xb1
-// AM_RANGE(0xb2
+ AM_RANGE(0xb2, 0xb2) AM_READ(hw_rev_r)
// AM_RANGE(0xb3
+ AM_RANGE(0xb8, 0xbf) AM_RAM AM_SHARE("irq_vectors")
// AM_RANGE(0xc0, 0xc0) AM_WRITE(mk2_col_bank_w)
// AM_RANGE(0xc1, 0xc1) AM_WRITE(mk2_vram_bank_w)
// AM_RANGE(0xc2, 0xc2) AM_WRITE(opt_bank_w)
AM_RANGE(0xc8, 0xc8) AM_WRITE(sr_mode_w)
AM_RANGE(0xc9, 0xc9) AM_WRITE(sr_vram_bank_w)
-
+ AM_RANGE(0xce, 0xce) AM_WRITE(sr_bitmap_yoffs_w)
+ AM_RANGE(0xcf, 0xcf) AM_WRITE(sr_bitmap_xoffs_w)
+
AM_RANGE(0xd0, 0xdf) AM_READWRITE(fdc_r,fdc_w) // disk device
AM_RANGE(0xe0, 0xe3) AM_MIRROR(0x0c) AM_DEVREADWRITE("upd7752", upd7752_device, read, write)
@@ -1088,17 +1124,25 @@ TIMER_CALLBACK_MEMBER(pc6001_state::audio_callback)
INTERRUPT_GEN_MEMBER(pc6001_state::vrtc_irq)
{
m_cur_keycode = check_joy_press();
- if(IRQ_LOG) printf("VRTC IRQ called 0x16\n"); // was "stick" IRQ?
+ if(IRQ_LOG) printf("Joystick IRQ called 0x16\n");
set_maincpu_irq_line(0x16);
}
INTERRUPT_GEN_MEMBER(pc6001sr_state::sr_vrtc_irq)
{
m_kludge ^= 1;
-
- m_cur_keycode = check_joy_press();
- if(IRQ_LOG) printf("VRTC IRQ called 0x16\n");
- set_maincpu_irq_line((m_kludge) ? 0x22 : 0x16);
+
+ // TODO: it is unclear who is responsible of the "Joystick IRQ" vs VRTC
+ if(m_kludge)
+ {
+ m_cur_keycode = check_joy_press();
+ if(IRQ_LOG) printf("Joystick IRQ called 0x16\n");
+ set_maincpu_irq_line(0x16);
+ }
+ else
+ {
+ set_maincpu_irq_line(m_sr_irq_vectors[VRTC_IRQ]);
+ }
}
IRQ_CALLBACK_MEMBER(pc6001_state::irq_callback)
@@ -1356,6 +1400,10 @@ void pc6001sr_state::machine_reset()
pc6001_state::machine_reset();
set_videoram_bank(0x70000);
+ // default to bitmap mode
+ m_sr_text_mode = false;
+ m_sr_text_rows = 20;
+
std::string region_tag;
m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
// should this be mirrored into the EXROM regions? hard to tell without an actual cart dump...
@@ -1365,8 +1413,8 @@ void pc6001sr_state::machine_reset()
uint8_t *ROM = m_region_maincpu->base();
m_sr_bank_r[0] = 0xf8; m_bank1->set_base(&ROM[SR_SYSROM_1(0x08)]);
m_sr_bank_r[1] = 0xfa; m_bank2->set_base(&ROM[SR_SYSROM_1(0x0a)]);
- m_sr_bank_r[2] = 0xb0; m_bank3->set_base(&ROM[SR_EXROM1(0x00)]);
- m_sr_bank_r[3] = 0xc0; m_bank4->set_base(&ROM[SR_EXROM0(0x00)]);
+ m_sr_bank_r[2] = 0xc0; m_bank3->set_base(&ROM[SR_EXROM1(0x00)]);
+ m_sr_bank_r[3] = 0xb0; m_bank4->set_base(&ROM[SR_EXROM0(0x00)]);
m_sr_bank_r[4] = 0x08; m_bank5->set_base(&ROM[SR_WRAM0(0x08)]);
m_sr_bank_r[5] = 0x0a; m_bank6->set_base(&ROM[SR_WRAM0(0x0a)]);
m_sr_bank_r[6] = 0x0c; m_bank7->set_base(&ROM[SR_WRAM0(0x0c)]);
@@ -1627,4 +1675,4 @@ COMP( 1981, pc6001, 0, 0, pc6001, pc6001, pc6001_state, 0,
COMP( 1981, pc6001a, pc6001, 0, pc6001, pc6001, pc6001_state, 0, "NEC", "PC-6001A (US)", MACHINE_NOT_WORKING ) // This version is also known as the NEC Trek
COMP( 1983, pc6001mk2,pc6001, 0, pc6001mk2, pc6001, pc6001mk2_state, 0, "NEC", "PC-6001mkII (Japan)", MACHINE_NOT_WORKING )
COMP( 1983, pc6601, pc6001, 0, pc6601, pc6001, pc6601_state, 0, "NEC", "PC-6601 (Japan)", MACHINE_NOT_WORKING )
-COMP( 1984, pc6001sr, pc6001, 0, pc6001sr, pc6001, pc6001sr_state, 0, "NEC", "PC-6001mkIISR (Japan)", MACHINE_NOT_WORKING )
+COMP( 1984, pc6001sr, pc6001, 0, pc6001sr, pc6001, pc6001sr_state, 0, "NEC", "PC-6001mkIISR (Japan)", MACHINE_NOT_WORKING )
diff --git a/src/mame/includes/pc6001.h b/src/mame/includes/pc6001.h
index 4095ee35f47..72c8540074c 100644
--- a/src/mame/includes/pc6001.h
+++ b/src/mame/includes/pc6001.h
@@ -13,6 +13,7 @@
#include "machine/timer.h"
#include "sound/ay8910.h"
#include "sound/upd7752.h"
+//#include "sound/2203intf.h"
#include "sound/wave.h"
#include "video/mc6847.h"
@@ -187,6 +188,7 @@ protected:
required_memory_bank m_bank8;
inline void refresh_crtc_params();
+ virtual void video_start() override;
virtual void machine_reset() override;
private:
@@ -219,9 +221,11 @@ class pc6001sr_state : public pc6601_state
{
public:
pc6001sr_state(const machine_config &mconfig, device_type type, const char *tag)
- : pc6601_state(mconfig, type, tag)
+ : pc6601_state(mconfig, type, tag),
+ m_sr_irq_vectors(*this, "irq_vectors")
{};
+ DECLARE_READ8_MEMBER(hw_rev_r);
DECLARE_READ8_MEMBER(sr_bank_rn_r);
DECLARE_WRITE8_MEMBER(sr_bank_rn_w);
DECLARE_READ8_MEMBER(sr_bank_wn_r);
@@ -238,24 +242,40 @@ public:
DECLARE_WRITE8_MEMBER(sr_vram_bank_w);
DECLARE_WRITE8_MEMBER(sr_system_latch_w);
DECLARE_WRITE8_MEMBER(necsr_ppi8255_w);
-
+ DECLARE_WRITE8_MEMBER(sr_bitmap_yoffs_w);
+ DECLARE_WRITE8_MEMBER(sr_bitmap_xoffs_w);
+
INTERRUPT_GEN_MEMBER(sr_vrtc_irq);
- DECLARE_MACHINE_RESET(pc6001sr);
-
uint32_t screen_update_pc6001sr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void pc6001sr(machine_config &config);
-protected:
+protected:
+ virtual void video_start() override;
virtual void machine_reset() override;
private:
uint8_t m_sr_bank_r[8];
uint8_t m_sr_bank_w[8];
uint8_t m_kludge;
- uint8_t m_sr_video_mode;
-
+ bool m_sr_text_mode;
+ uint8_t m_sr_text_rows;
+ uint8_t *m_gvram;
+ uint8_t m_bitmap_yoffs,m_bitmap_xoffs;
+
+ enum{
+ SUB_CPU_IRQ = 0,
+ JOYSTICK_IRQ,
+ TIMER_IRQ,
+ VOICE_IRQ,
+ VRTC_IRQ,
+ RS232_IRQ,
+ PRINTER_IRQ,
+ EXT_IRQ
+ };
+
+ required_shared_ptr<uint8_t> m_sr_irq_vectors;
};
#endif
diff --git a/src/mame/video/pc6001.cpp b/src/mame/video/pc6001.cpp
index edeec582daf..04881cf9fad 100644
--- a/src/mame/video/pc6001.cpp
+++ b/src/mame/video/pc6001.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/*******************************************************************
*
- * PC6xxx video related functions
+ * PC-6xxx video related functions
*
*
*
@@ -121,7 +121,19 @@ void pc6001_state::video_start()
cfg.get_char_rom = pc6001_get_char_rom;
m6847_init(machine(), &cfg);
#endif
- m_video_ram = auto_alloc_array(machine(), uint8_t, 0x4000);
+ m_video_ram = auto_alloc_array_clear(machine(), uint8_t, 0x4000);
+}
+
+void pc6001mk2_state::video_start()
+{
+ // ...
+}
+
+void pc6001sr_state::video_start()
+{
+// m_video_ram = auto_alloc_array_clear(machine(), uint8_t, 0x4000);
+ m_gvram = auto_alloc_array_clear(machine(), uint8_t, 320*256*8); // TODO: size
+ save_pointer(NAME(m_gvram), 320*256*8);
}
/* this is known as gfx mode 4 */
@@ -525,10 +537,11 @@ uint32_t pc6001sr_state::screen_update_pc6001sr(screen_device &screen, bitmap_in
int xi,yi,pen,fgcol,bgcol,color;
uint8_t *gfx_data = m_region_gfx1->base();
+ bitmap.fill(0,cliprect);
- if(m_sr_video_mode & 8) // text mode
+ if(m_sr_text_mode == true) // text mode
{
- for(y=0;y<20;y++)
+ for(y=0;y<m_sr_text_rows;y++)
{
for(x=0;x<40;x++)
{
@@ -556,56 +569,26 @@ uint32_t pc6001sr_state::screen_update_pc6001sr(screen_device &screen, bitmap_in
}
else //4bpp bitmap mode (TODO)
{
- int count;
-
- count = 0;
-
- for(y=0;y<200;y+=2)
+ for(y=0;y<200;y++)
{
- for(x=0;x<320;x+=4)
+ for(x=0;x<320;x+=2)
{
- color = m_video_ram[count] & 0x0f;
+ uint32_t vram_addr;
+
+ if(x >= 256)
+ vram_addr = 0x1a00 + (x-256)+y*64;
+ else
+ vram_addr = x+y*256;
+
+ color = (m_gvram[vram_addr] & 0xf0) >> 4;
- if (cliprect.contains(x+0, y+0))
+ if (cliprect.contains(x, y+0))
bitmap.pix16((y+0), (x+0)) = m_palette->pen(color+0x10);
- color = (m_video_ram[count] & 0xf0) >> 4;
+ color = (m_gvram[vram_addr] & 0x0f);
if (cliprect.contains(x+1, y+0))
bitmap.pix16((y+0), (x+1)) = m_palette->pen(color+0x10);
-
- color = m_video_ram[count+1] & 0x0f;
-
- if (cliprect.contains(x+2, y+0))
- bitmap.pix16((y+0), (x+2)) = m_palette->pen(color+0x10);
-
- color = (m_video_ram[count+1] & 0xf0) >> 4;
-
- if (cliprect.contains(x+3, y+0))
- bitmap.pix16((y+0), (x+3)) = m_palette->pen(color+0x10);
-
- color = m_video_ram[count+2] & 0x0f;
-
- if (cliprect.contains(x+0, y+1))
- bitmap.pix16((y+1), (x+0)) = m_palette->pen(color+0x10);
-
- color = (m_video_ram[count+2] & 0xf0) >> 4;
-
- if (cliprect.contains(x+1, y+1))
- bitmap.pix16((y+1), (x+1)) = m_palette->pen(color+0x10);
-
- color = m_video_ram[count+3] & 0x0f;
-
- if (cliprect.contains(x+2, y+1))
- bitmap.pix16((y+1), (x+2)) = m_palette->pen(color+0x10);
-
- color = (m_video_ram[count+3] & 0xf0) >> 4;
-
- if (cliprect.contains(x+3, y+1))
- bitmap.pix16((y+1), (x+3)) = m_palette->pen(color+0x10);
-
-
- count+=4;
}
}
}