#ifndef __YGV608_H__
#define __YGV608_H__
/*
* Yamaha YGV608 - PVDC2 Pattern mode Video Display Controller 2
* - Mark McDougall
*/
// Fundamental constants
#define YGV608_SPRITE_ATTR_TABLE_SIZE 256
enum {
p5_rwai = 0x80, // increment register select on reads
p5_rrai = 0x40, // increment register select on writes
p5_rn = 0x3f, // register select
// p6_res6 = 0xe0,
p6_fp = 0x10, // position detection flag
p6_fv = 0x08, // vertical border interval flag
p6_fc = 0x04,
p6_hb = 0x02, // horizontal blanking flag?
p6_vb = 0x01, // vertical blanking flag?
// p7_res7 = 0xc0,
p7_tr = 0x20,
p7_tc = 0x10,
p7_tl = 0x08,
p7_ts = 0x04,
p7_tn = 0x02,
p7_sr = 0x01,
r0_pnya = 0x80, // if set, increment name table address after reads
r0_b_a = 0x40, // if set, we're reading from the second plane of tile data
r0_pny = 0x3f, // y-coordinate of current name table address
r1_pnxa = 0x80, // if set, increment name table address after read
r1_res1 = 0x40,
r1_pnx = 0x3f, // x-coordinate of current name table address
r2_cpaw = 0x80, // if set, increment color palette address after writes
r2_cpar = 0x40, // if set, increment color palette address after reads
// r2_res2 = 0x20,
r2_b_a = 0x10,
r2_scaw = 0x08, // if set, increment scroll address after writes
r2_scar = 0x04, // if set, increment scroll address after reads
r2_saaw = 0x02, // if set, increment sprite address after writes
r2_saar = 0x01, // if set, increment sprite address after reads
r7_dckm = 0x80,
r7_flip = 0x40,
// r7_res7 = 0x30,
r7_zron = 0x08, // if set, roz plane is active
r7_md = 0x06, // determines 1 of 4 possible video modes
r7_dspe = 0x01, // if set, display is enabled
r8_hds = 0xc0,
r8_vds = 0x30,
r8_rlrt = 0x08,
r8_rlsc = 0x04,
// r8_res8 = 0x02,
r8_pgs = 0x01,
r9_pts = 0xc0,
r9_slh = 0x38,
r9_slv = 0x07,
r10_spa = 0xc0, // misc global sprite attributes (x/y flip or sprite size)
r10_spas = 0x20, // if set, spa controls sprite flip, if clear, controls sprite size
r10_sprd = 0x10, // if set, sprites are disabled
r10_mcb = 0x0c,
r10_mca = 0x03,
r11_scm = 0xc0,
r11_yse = 0x20,
r11_cbdr = 0x10,
r11_prm = 0x0c, // determines one of 4 priority settings
r11_ctpb = 0x02,
r11_ctpa = 0x01,
r12_spf = 0xc0,
r12_bpf = 0x38,
r12_apf = 0x07,
// r14_res14 = 0xfc,
r14_iep = 0x02, // if set, generate IRQ on position detection (?)
r14_iev = 0x01, // if set, generate IRQ on vertical border interval draw
// these 4 are currently unimplemented by us
r16_fpm = 0x80,
r16_il8 = 0x40,
r16_res16 = 0x20,
r16_ih = 0x1f,
r17_ba1 = 0x70,
r17_ba0 = 0x07,
r18_ba3 = 0x70,
r18_ba2 = 0x07,
r19_ba5 = 0x70,
r19_ba4 = 0x07,
r20_ba7 = 0x70,
r20_ba6 = 0x07,
r21_bb1 = 0x70,
r21_bb0 = 0x07,
r22_bb3 = 0x70,
r22_bb2 = 0x07,
r23_bb5 = 0x70,
r23_bb4 = 0x07,
r24_bb7 = 0x70,
r24_bb6 = 0x07,
r39_hsw = 0xe0,
r39_hbw = 0x1f,
r40_htl89 = 0xc0,
r40_hdw = 0x3f,
r43_vsw = 0xe0,
r43_vbw = 0x1f,
r44_vsls = 0x40,
r44_vdw = 0x1f,
r45_vtl8 = 0x80,
r45_tres = 0x40,
r45_vdp = 0x1f
};
typedef struct _ygv_ports {
UINT8 na; // P#0 - pattern name table data port (read/write)
UINT8 p1; // P#1 - sprite data port (read/write)
UINT8 p2; // P#2 - scroll data port (read/write)
UINT8 p3; // P#3 - colour palette data port (read/write)
UINT8 p4; // P#4 - register data port (read/write)
UINT8 p5; // P#5 - register select port (write only)
UINT8 p6; // P#6 - status port (read/write)
UINT8 p7; // P#7 - system control port (read/write)
} YGV_PORTS, *pYGV_PORTS;
typedef struct _ygv_regs {
UINT8 r0; // R#0 - pattern name table access ptr (r/w)
UINT8 r1; // R#1 - pattern name table access ptr (r/w)
UINT8 r2; // R#2 - built in ram access control
UINT8 saa; // R#3 - sprite attribute table access ptr (r/w)
UINT8 sca; // R#4 - scroll table access ptr (r/w)
UINT8 cc; // R#5 - color palette access ptr (r/w)
UINT8 sba; // R#6 - sprite generator base address (r/w)
// R#7 - R#11 - screen control (r/w)
UINT8 r7; // misc screen control (r/w)
UINT8 r8; // misc screen control (r/w)
UINT8 r9; // misc screen control (r/w)
UINT8 r10; // misc screen control (r/w)
UINT8 r11; // misc screen control (r/w)
UINT8 r12; // R#12 - color palette selection (r/w)
UINT8 bdc; // R#13 - border colour (wo)
// R#14 - R#16 - interrupt control
UINT8 r14;
UINT8 il;
UINT8 r16;
// R#17 - R#24 - base address (wo)
UINT8 r17;
UINT8 r18;
UINT8 r19;
UINT8 r20;
UINT8 r21;
UINT8 r22;
UINT8 r23;
UINT8 r24;
// R#25 - R#38 - enlargement, contraction and rotation parameters (wo)
UINT8 ax0;
UINT8 ax8;
UINT8 ax16;
UINT8 dx0;
UINT8 dx8;
UINT8 dxy0;
UINT8 dxy8;
UINT8 ay0;
UINT8 ay8;
UINT8 ay16;
UINT8 dy0;
UINT8 dy8;
UINT8 dyx0;
UINT8 dyx8;
// R#39 - R#46 - display scan control (wo)
UINT8 r39;
UINT8 r40;
UINT8 hdsp;
UINT8 htl;
UINT8 r43;
UINT8 r44;
UINT8 r45;
UINT8 vtl;
// R#47 - R#49 - rom transfer control (wo)
UINT8 tb5;
UINT8 tb13;
UINT8 tn4;
} YGV_REGS, *pYGV_REGS;
#define YGV608_MAX_SPRITES (YGV608_SPRITE_ATTR_TABLE_SIZE>>2)
// R#7(md)
#define MD_2PLANE_8BIT 0x00
#define MD_2PLANE_16BIT 0x02
#define MD_1PLANE_16COLOUR 0x04
#define MD_1PLANE_256COLOUR 0x06
#define MD_1PLANE (MD_1PLANE_16COLOUR & MD_1PLANE_256COLOUR)
#define MD_SHIFT 0
#define MD_MASK 0x06
// R#8
#define PGS_64X32 0x0
#define PGS_32X64 0x1
#define PGS_SHIFT 0
#define PGS_MASK 0x01
// R#9
#define SLV_SCREEN 0x00
#define SLV_8 0x04
#define SLV_16 0x05
#define SLV_32 0x06
#define SLV_64 0x07
#define SLH_SCREEN 0x00
#define SLH_8 0x04
#define SLH_16 0x05
#define SLH_32 0x06
#define SLH_64 0x07
#define PTS_8X8 0x00
#define PTS_16X16 0x40
#define PTS_32X32 0x80
#define PTS_64X64 0xc0
#define PTS_SHIFT 0
#define PTS_MASK 0xc0
// R#10
#define SPAS_SPRITESIZE 0
#define SPAS_SPRITEREVERSE 1
// R#10(spas)=1
#define SZ_8X8 0x00
#define SZ_16X16 0x01
#define SZ_32X32 0x02
#define SZ_64X64 0x03
// R#10(spas)=0
#define SZ_NOREVERSE 0x00
#define SZ_VERTREVERSE 0x01
#define SZ_HORIZREVERSE 0x02
#define SZ_BOTHREVERSE 0x03
// R#11(prm)
#define PRM_SABDEX 0x00
#define PRM_ASBDEX 0x04
#define PRM_SEABDX 0x08
#define PRM_ASEBDX 0x0c
// R#40
#define HDW_SHIFT 0
#define HDW_MASK 0x3f
// R#44
#define VDW_SHIFT 0
#define VDW_MASK 0x3f
typedef struct {
UINT8 sy; // y dot position 7:0
UINT8 sx; // x dot position 7:0
UINT8 attr; // 0xf0 = color, 0x0c = size, reverse, 0x02 = x hi bit, 0x01 = y hi bit
UINT8 sn; // pattern name (0-255)
} SPRITE_ATTR, *PSPRITE_ATTR;
typedef struct _ygv608 {
union {
UINT8 b[8];
YGV_PORTS s;
} ports;
union {
UINT8 b[50];
YGV_REGS s;
} regs;
/*
* Built in ram
*/
UINT8 pattern_name_table[4096];
union {
UINT8 b[YGV608_SPRITE_ATTR_TABLE_SIZE];
SPRITE_ATTR s[YGV608_MAX_SPRITES];
} sprite_attribute_table;
UINT8 scroll_data_table[2][256];
UINT8 colour_palette[256][3];
/*
* Shortcut variables
*/
UINT32 bits16; // bits per pattern (8/16)
UINT32 page_x, page_y; // pattern page size
UINT32 pny_shift; // y coord multiplier
UINT8 na8_mask; // mask on/off na11/9:8
int col_shift; // shift in scroll table column index
// rotation, zoom shortcuts
UINT32 ax, dx, dxy, ay, dy, dyx;
// base address shortcuts
UINT32 base_addr[2][8];
UINT32 base_y_shift; // for extracting pattern y coord 'base'
UINT8 screen_resize; // screen requires resize
UINT8 tilemap_resize; // tilemap requires resize
} YGV608, *pYGV608;
void ygv608_set_gfxbank(UINT8 gfxbank);
INTERRUPT_GEN( ygv608_timed_interrupt );
VIDEO_START( ygv608 );
SCREEN_UPDATE( ygv608 );
READ16_HANDLER( ygv608_r );
WRITE16_HANDLER( ygv608_w );
// to be removed
READ16_HANDLER( ygv608_debug_trigger );
#endif