#include "type.h" /* memory offsets */ typedef unsigned char vdp2_vram[0x080000]; typedef unsigned char vdp2_res0[0x080000]; typedef unsigned char vdp2_cram[0x001000]; typedef unsigned char vdp2_res1[0x07f000]; typedef struct vdp2_reg { reg16 TVMD; /* TV SCREEN MODE */ reg16 EXTEN; /* EXTERNAL SIGNAL ENABLE */ reg16 TVSTAT; /* SCREEN STATUS */ reg16 VRSIZE; /* VRAM SIZE */ reg16 HCNT; /* H-COUNTER */ reg16 VCNT; /* V-COUNTER */ reg16 _res0; reg16 RAMCTL; /* RAM CONTROL */ reg16 CYCA0L; /* VRAM CYCLE PATTERN (BANK A0) */ reg16 CYCA0U; /* VRAM CYCLE PATTERN (BANK A0) */ reg16 CYCA1L; /* VRAM CYCLE PATTERN (BANK A1) */ reg16 CYCA1U; /* VRAM CYCLE PATTERN (BANK A1) */ reg16 CYCB0L; /* VRAM CYCLE PATTERN (BANK A0) */ reg16 CYCB0U; /* VRAM CYCLE PATTERN (BANK A0) */ reg16 CYCB1L; /* VRAM CYCLE PATTERN (BANK B1) */ reg16 CYCB1U; /* VRAM CYCLE PATTERN (BANK B1) */ reg16 BGON; /* SCREEN DISPLAY ENABLE */ reg16 MZCTL; /* MOSAIC CONTROL */ reg16 SFSEL; /* SPECIAL FUNCTION CODE SELECT */ reg16 SFCODE; /* SPECIAL FUNCTION CODE */ reg16 CHCTLA; /* CHARACTER CONTROL (NBG0, NBG1) */ reg16 CHCTLB; /* CHARACTER CONTROL (NBG2, NBG3, RGB0) */ reg16 BMPNA; /* BITMAP PALETTE NUMBER (NBG0, NBG1) */ reg16 BMPNB; /* BITMAP PALETTE NUMBER (RGB0) */ reg16 NBG0; /* PATTERN NAME CONTROL (NBG0) */ reg16 NBG1; /* PATTERN NAME CONTROL (NBG1) */ reg16 NBG2; /* PATTERN NAME CONTROL (NBG2) */ reg16 NBG3; /* PATTERN NAME CONTROL (NBG2) */ reg16 RGB0; /* PATTERN NAME CONTROL (RGB0) */ reg16 PLSZ; /* PLANE SIZE */ reg16 MPOFN; /* MAP OFFSET (NBG0~NBG3) */ reg16 MPOFR; /* MAP OFFSET (ROTATION PARAMETER A,B) */ reg16 MPABN0; /* MAP (NBG0, PLANE A,B) */ reg16 MPCDN0; /* MAP (NBG0, PLANE C,D) */ reg16 MPABN1; /* MAP (NBG1, PLANE A,B) */ reg16 MPCDN1; /* MAP (NBG1, PLANE C,D) */ reg16 MPABN2; /* MAP (NBG2, PLANE A,B) */ reg16 MPCDN2; /* MAP (NBG2, PLANE C,D) */ reg16 MPABN3; /* MAP (NBG3, PLANE A,B) */ reg16 MPCDN3; /* MAP (NBG3, PLANE C,D) */ reg16 MPABRA; /* MAP (ROTATION PARAMETER A, PLANE A,B) */ reg16 MPCDRA; /* MAP (ROTATION PARAMETER A, PLANE C,D) */ reg16 MPEFRA; /* MAP (ROTATION PARAMETER A, PLANE E,F) */ reg16 MPGHRA; /* MAP (ROTATION PARAMETER A, PLANE G,H) */ reg16 MPIJRA; /* MAP (ROTATION PARAMETER A, PLANE I,J) */ reg16 MPKLRA; /* MAP (ROTATION PARAMETER A, PLANE K,L) */ reg16 MPMNRA; /* MAP (ROTATION PARAMETER A, PLANE M,N) */ reg16 MPOPRA; /* MAP (ROTATION PARAMETER A, PLANE O,P) */ reg16 MPABRB; /* MAP (ROTATION PARAMETER B, PLANE B,B) */ reg16 MPCDRB; /* MAP (ROTATION PARAMETER B, PLANE C,D) */ reg16 MPEFRB; /* MAP (ROTATION PARAMETER B, PLANE E,F) */ reg16 MPGHRB; /* MAP (ROTATION PARAMETER B, PLANE G,H) */ reg16 MPIJRB; /* MAP (ROTATION PARAMETER B, PLANE I,J) */ reg16 MPKLRB; /* MAP (ROTATION PARAMETER B, PLANE K,L) */ reg16 MPMNRB; /* MAP (ROTATION PARAMETER B, PLANE M,N) */ reg16 MPOPRB; /* MAP (ROTATION PARAMETER B, PLANE O,P) */ reg16 SCXIN0; /* SCREEN SCROLL VALUE (NBG0, HORIZONTAL INTEGER PART) */ reg16 SCXDN0; /* SCREEN SCROLL VALUE (NBG0, HORIZONTAL FRACTIONAL PART) */ reg16 SCYIN0; /* SCREEN SCROLL VALUE (NBG0, VERTICAL INTEGER PART) */ reg16 SCYDN0; /* SCREEN SCROLL VALUE (NBG0, VERTICAL FRACTIONAL PART) */ reg16 ZMXIN0; /* COORDINATE INCREMENT (NBG0, HORIZONTAL INTEGER PART) */ reg16 ZMXDN0; /* COORDINATE INCREMENT (NBG0, HORIZONTAL FRACTIONAL PART) */ reg16 ZMYIN0; /* COORDINATE INCREMENT (NBG0, VERTICAL INTEGER PART) */ reg16 ZMYDN0; /* COORDINATE INCREMENT (NBG0, VERTICAL FRACTIONAL PART) */ reg16 SCXIN1; /* SCREEN SCROLL VALUE (NBG1, HORIZONTAL INTEGER PART) */ reg16 SCXDN1; /* SCREEN SCROLL VALUE (NBG1, HORIZONTAL FRACTIONAL PART) */ reg16 SCYIN1; /* SCREEN SCROLL VALUE (NBG1, VERTICAL INTEGER PART) */ reg16 SCYDN1; /* SCREEN SCROLL VALUE (NBG1, VERTICAL FRACTIONAL PART) */ reg16 ZMXIN1; /* COORDINATE INCREMENT (NBG1, HORIZONTAL INTEGER PART) */ reg16 ZMXDN1; /* COORDINATE INCREMENT (NBG1, HORIZONTAL FRACTIONAL PART) */ reg16 ZMYIN1; /* COORDINATE INCREMENT (NBG1, VERTICAL INTEGER PART) */ reg16 ZMYDN1; /* COORDINATE INCREMENT (NBG1, VERTICAL FRACTIONAL PART) */ reg16 SCXN2; /* SCREEN SCROLL VALUE (NBG2, HORIZONTAL) */ reg16 SCYN2; /* SCREEN SCROLL VALUE (NBG2, VERTICAL) */ reg16 SCXN3; /* SCREEN SCROLL VALUE (NBG3, HORIZONTAL) */ reg16 SCYN3; /* SCREEN SCROLL VALUE (NBG3, VERTICAL) */ reg16 ZMCTL; /* REDUCTION ENABLE */ reg16 SCRCTL; /* LINE AND VERTICAL CELL SCROLL CONTROL (NBGO, NBG1) */ reg16 VCSTAU; /* VERTICAL CELL SCROLL TABLE ADDRESS (NBGO, NBG1) */ reg16 VCSTAL; /* VERTICAL CELL SCROLL TABLE ADDRESS (NBGO, NBG1) */ reg16 LSTA0U; /* LINE SCROLL TABLE ADDRESS (NBG0) */ reg16 LSTA0L; /* LINE SCROLL TABLE ADDRESS (NBG0) */ reg16 LSTA1U; /* LINE SCROLL TABLE ADDRESS (NBG1) */ reg16 LSTA1L; /* LINE SCROLL TABLE ADDRESS (NBG1) */ reg16 LCTAU; /* LINE COLOR SCREEN TABLE ADDRESS */ reg16 LCTAL; /* LINE COLOR SCREEN TABLE ADDRESS */ union { struct { reg16 BKTAU; /* BACK SCREEN TABLE ADDRESS */ reg16 BKTAL; /* BACK SCREEN TABLE ADDRESS */ }; reg32 BKTA; }; reg16 RPMD; /* ROTATION PARAMETER MODE */ reg16 RPRCTL; /* ROTATION PARAMETER READ CONTROL */ reg16 KTCTL; /* COEFFICIENT TABLE CONTROL */ reg16 KTAOF; /* COEFFICIENT TABLE ADDRESS OFFSET (ROTATION PARAMETER A, B) */ reg16 OVPNRA; /* SCREEN OVER PATTERN NAME (ROTATION PARAMETER A) */ reg16 OVPNRB; /* SCREEN OVER PATTERN NAME (ROTATION PARAMETER B) */ reg16 RPTAU; /* ROTATION PARAMETER TABLE ADDRESS (ROTATION PARAMETER A,B) */ reg16 RPTAL; /* ROTATION PARAMETER TABLE ADDRESS (ROTATION PARAMETER A,B) */ reg16 WPSX0; /* WINDOW POSITION (W0, HORIZONTAL START POINT) */ reg16 WPSY0; /* WINDOW POSITION (W0, VERTICAL START POINT) */ reg16 WPEX0; /* WINDOW POSITION (W0, HORIZONTAL END POINT) */ reg16 WPEY0; /* WINDOW POSITION (W0, VERTICAL END POINT) */ reg16 WPSX1; /* WINDOW POSITION (W1, HORIZONTAL START POINT) */ reg16 WPSY1; /* WINDOW POSITION (W1, VERTICAL START POINT) */ reg16 WPEX1; /* WINDOW POSITION (W1, HORIZONTAL END POINT) */ reg16 WPEY1; /* WINDOW POSITION (W1, VERTICAL END POINT) */ reg16 WCTLA; /* WINDOW CONTROL (NBG0, NBG1) */ reg16 WCTLB; /* WINDOW CONTROL (NBG2, NBG3) */ reg16 WCTLC; /* WINDOW CONTROL (RGB0, SPRITE) */ reg16 WCTLD; /* WINDOW CONTROL (PARAMETER WINDOW, COLOR CALC. WINDOW) */ reg16 LWTA0U; /* LINE WINDOW TABLE ADDRESS (W0) */ reg16 LWTA0L; /* LINE WINDOW TABLE ADDRESS (W0) */ reg16 LWTA1U; /* LINE WINDOW TABLE ADDRESS (W1) */ reg16 LWTA1L; /* LINE WINDOW TABLE ADDRESS (W1) */ reg16 SPCTL; /* SPRITE CONTROL */ reg16 SDCTL; /* SHADOW CONTROL */ reg16 CRAOFA; /* COLOR RAM ADDRESS OFFSET (NBG0~NBG3) */ reg16 CRAOFB; /* COLOR RAM ADDRESS OFFSET (RGB0, SPRITE) */ reg16 LNCLEN; /* LINE COLOR SCREEN ENABLE */ reg16 SFPRMD; /* SPECIAL PRIORITY MODE */ reg16 CCCTL; /* COLOR CALCULATION CONTROL */ reg16 SFCCMD; /* SPECIAL COLOR CALCULATION MODE */ reg16 PRISA; /* PRIORITY NUMBER (SPRITE 0,1) */ reg16 PRISB; /* PRIORITY NUMBER (SPRITE 2,3) */ reg16 PRISC; /* PRIORITY NUMBER (SPRITE 4,5) */ reg16 PRISD; /* PRIORITY NUMBER (SPRITE 6,7) */ reg16 PRINA; /* PRIORITY NUMBER (NBG0, NBG1) */ reg16 PRINB; /* PRIORITY NUMBER (NBG2, NBG3) */ reg16 PRIR; /* PRIORITY NUMBER (RGB0) */ reg16 _res1; reg16 CCRSA; /* COLOR CALCULATION RATIO (SPRITE 0,1) */ reg16 CCRSB; /* COLOR CALCULATION RATIO (SPRITE 2,3) */ reg16 CCRSC; /* COLOR CALCULATION RATIO (SPRITE 4,5) */ reg16 CCRSD; /* COLOR CALCULATION RATIO (SPRITE 6,7) */ reg16 CCRNA; /* COLOR CALCULATION RATIO (NBG0, NBG1) */ reg16 CCRNB; /* COLOR CALCULATION RATIO (NBG2, NBG3) */ reg16 CCRR; /* COLOR CALCULATION RATIO (RGB0) */ reg16 CCRLB; /* COLOR CALCULATION RATIO (LINE COLOR SCREEN, BACK SCREEN) */ reg16 CLOFEN; /* COLOR OFFSET ENABLE */ reg16 CLOFSL; /* COLOR OFFSET SELECT */ reg16 COAR; /* COLOR OFFSET A (RED) */ reg16 COAG; /* COLOR OFFSET A (GREEN) */ reg16 COAB; /* COLOR OFFSET A (BLUE) */ reg16 COBR; /* COLOR OFFSET B (RED) */ reg16 COBG; /* COLOR OFFSET B (GREEN) */ reg16 COBB; /* COLOR OFFSET B (BLUE) */ } vdp2_reg; static_assert((sizeof (struct vdp2_reg)) == 0x120); struct vdp2 { vdp2_vram vram; vdp2_res0 _res0; vdp2_cram cram; vdp2_res1 _res1; vdp2_reg reg; }; static_assert((sizeof (struct vdp2)) == 0x180120); static_assert((offsetof (struct vdp2, vram)) == 0x000000); static_assert((offsetof (struct vdp2, cram)) == 0x100000); static_assert((offsetof (struct vdp2, reg)) == 0x180000); extern struct vdp2 vdp2 __asm("vdp2"); /* register bits */ /* TVMD */ #define TVMD__DISP (1 << 15) #define TVMD__BDCLMD (1 << 8) // display back screen #define TVMD__LSMD__NON_INTERLACE (0b00 << 6) #define TVMD__LSMD__SINGLE_DENSITY (0b10 << 6) #define TVMD__LSMD__DOUBLE_DENSITY (0b11 << 6) #define TVMD__VRESO__224 (0b00 << 4) #define TVMD__VRESO__240 (0b01 << 4) #define TVMD__VRESO__256 (0b10 << 4) #define TVMD__HRESO__NORMAL_320 (0b000 << 0) #define TVMD__HRESO__NORMAL_352 (0b001 << 0) #define TVMD__HRESO__HIRES_640 (0b010 << 0) #define TVMD__HRESO__HIRES_704 (0b011 << 0) #define TVMD__HRESO__EXCLUSIVE_320 (0b100 << 0) #define TVMD__HRESO__EXCLUSIVE_352 (0b101 << 0) #define TVMD__HRESO__EXCLUSIVE_640 (0b110 << 0) #define TVMD__HRESO__EXCLUSIVE_704 (0b111 << 0) /* TVSTAT */ #define TVSTAT__VBLANK (1 << 3) /* BKTAU */ #define BKTAU__BKCLMD_SINGLE_COLOR (0 << 15) #define BKTAU__BKCLMD_PER_LINE (1 << 15)