#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; INTERRUPT_GEN( ygv608_timed_interrupt ); VIDEO_START( ygv608 ); VIDEO_UPDATE( ygv608 ); READ16_HANDLER( ygv608_r ); WRITE16_HANDLER( ygv608_w ); // to be removed extern READ16_HANDLER( ygv608_debug_trigger ); #endif