/* * Sega Saturn cartridge flash tool * by Anders Montonen, 2012 * * Original software by ExCyber * Graphics routines by Charles MacDonald * * Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) */ #ifndef VDP2_H_ #define VDP2_H_ #define VDP2_BASE 0x25e00000 #define VDP2_VRAM VDP2_BASE #define VDP2_CRAM (VDP2_BASE+0x100000) #define VDP2_REGISTER_BASE (VDP2_BASE+0x180000) #define TVMD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x00)) #define DISP (1<<15) #define BDCLMD (1<<8) #define LSMD1 (1<<7) #define LSMD0 (1<<6) #define VRESO1 (1<<5) #define VRESO0 (1<<4) #define HRESO2 (1<<2) #define HRESO1 (1<<1) #define HRESO0 (1<<0) /* Display modes. Only TV modes. */ #define NOINTERLACE (0) #define SINGLEINTERLACE (LSMD1) #define DOUBLEINTERLACE (LSMD1|LSMD0) #define VRES224 (0) #define VRES240 (VRESO0) /* 256 lines in PAL, 240 lines in NTSC */ #define VRES256 (VRESO1|VRESO0) #define HRES320 (0) #define HRES352 (HRESO0) #define HRES640 (HRESO1) #define HRES704 (HRESO1|HRESO0) #define EXTEN (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x02)) #define EXLTEN (1<<9) #define EXSYEN (1<<8) #define DASEL (1<<1) #define EXBGEN (1<<0) #define TVSTAT (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x04)) #define EXLTFG (1<<9) #define EXSYFG (1<<8) #define VBLANK (1<<3) #define HBLANK (1<<2) #define ODD (1<<1) #define PAL (1<<0) /* Sync macros */ #define WaitForVBLANKIn() while(!(TVSTAT&VBLANK)); #define WaitForVBLANKOut() while(TVSTAT&VBLANK); #define WaitForHBLANKIn() while(!(TVSTAT&HBLANK)); #define WaitForHBLANKOut() while(TVSTAT&HBLANK); #define VRSIZE (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x06)) #define VRAMSZ (1<<15) #define HCNT (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x08)) #define VCNT (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x0a)) #define RAMCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x0e)) #define CYCA0L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x10)) #define CYCA0U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x12)) #define CYCA1L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x14)) #define CYCA1U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x16)) #define CYCB0L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x18)) #define CYCB0U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x1a)) #define CYCB1L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x1c)) #define CYCB1U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x1e)) #define BGON (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x20)) #define R0TPON (1<<12) #define N3TPON (1<<11) #define N2TPON (1<<10) #define N1TPON (1<<9) #define N0TPON (1<<8) #define R1ON (1<<5) #define R0ON (1<<4) #define N3ON (1<<3) #define N2ON (1<<2) #define N1ON (1<<1) #define N0ON (1<<0) #define MZCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x22)) #define SFSEL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x24)) #define SFCODE (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x26)) #define CHCTLA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x28)) #define CHCTLB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x2a)) #define BMPNA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x2c)) #define BMPNB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x2e)) #define PNCN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x30)) #define PNCN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x32)) #define PNCN2 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x34)) #define PNCN3 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x36)) #define PNCR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x38)) #define PLSZ (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x3a)) #define MPOFN (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x3c)) #define MPOFR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x3e)) #define MPABN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x40)) #define MPCDN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x42)) #define MPABN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x44)) #define MPCDN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x46)) #define MPABN2 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x48)) #define MPCDN2 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x4a)) #define MPABN3 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x4c)) #define MPCDN3 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x4e)) #define MPABRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x50)) #define MPCDRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x52)) #define MPEFRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x54)) #define MPGHRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x56)) #define MPIJRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x58)) #define MPKLRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x5a)) #define MPMNRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x5c)) #define MPOPRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x5e)) #define MPABRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x60)) #define MPCDRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x62)) #define MPEFRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x64)) #define MPGHRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x66)) #define MPIJRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x68)) #define MPLKRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x6a)) #define MPMNRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x6c)) #define MPOPRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x6e)) #define SCXIN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x70)) #define SCXDN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x72)) #define SCYIN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x74)) #define SCYDN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x76)) #define ZMXIN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x78)) #define ZMXDN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x7a)) #define ZMYIN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x7c)) #define ZMYDN0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x7e)) #define SCXIN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x80)) #define SCXDN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x82)) #define SCYIN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x84)) #define SCYDN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x86)) #define ZMXIN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x88)) #define ZMXDN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x8a)) #define ZMYIN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x8c)) #define ZMYDN1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x8e)) #define SCXN2 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x90)) #define SCYN2 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x92)) #define SCXN3 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x94)) #define SCYN3 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x96)) #define ZMCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x98)) #define SCRCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x9a)) #define VCSTAU (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x9c)) #define VCSTAL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x9e)) #define LSTA0U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xa0)) #define LSTA0L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xa2)) #define LSTA1U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xa4)) #define LSTA1L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xa6)) #define LCTAU (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xa8)) #define LCTAL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xaa)) #define BKTA (*(volatile unsigned int *)(VDP2_REGISTER_BASE+0xac)) #define BKTAU (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xac)) #define BKTAL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xae)) #define RPMD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xb0)) #define RPRCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xb2)) #define KTCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xb4)) #define KTAOF (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xb6)) #define OVPNRA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xb8)) #define OVPNRB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xba)) #define RPTAU (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xbc)) #define RPTAL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xbe)) #define WPSX0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xc0)) #define WPSY0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xc2)) #define WPEX0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xc4)) #define WPEY0 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xc6)) #define WPSX1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xc8)) #define WPSY1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xca)) #define WPEX1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xcc)) #define WPEY1 (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xce)) #define WCTLA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xd0)) #define WCTLB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xd2)) #define WCTLC (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xd4)) #define WCTLD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xd6)) #define LWTA0U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xd8)) #define LWTA0L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xda)) #define LWTA1U (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xdc)) #define LWTA1L (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xde)) #define SPCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xe0)) #define SPCCCS1 (1<<13) #define SPCCCS0 (1<<12) #define SPCCN2 (1<<10) #define SPCCN1 (1<<9) #define SPCCN0 (1<<8) #define SPCLMD (1<<5) #define SPWINEN (1<<4) #define SPTYPE3 (1<<3) #define SPTYPE2 (1<<2) #define SPTYPE1 (1<<1) #define SPTYPE0 (1<<0) #define SPRITETYPE0 (0) #define SPRITETYPE1 (SPTYPE0) #define SPRITETYPE2 (SPTYPE1) #define SPRITETYPE3 (SPTYPE1|SPTYPE0) #define SPRITETYPE4 (SPTYPE2) #define SPRITETYPE5 (SPTYPE2|SPTYPE0) #define SPRITETYPE6 (SPTYPE2|SPTYPE1) #define SPRITETYPE7 (SPTYPE2|SPTYPE1|SPTYPE0) #define SPRITETYPE8 (SPTYPE3) #define SPRITETYPE9 (SPTYPE3|SPTYPE0) #define SPRITETYPEA (SPTYPE3|SPTYPE1) #define SPRITETYPEB (SPTYPE3|SPTYPE1|SPTYPE0) #define SPRITETYPEC (SPTYPE3|SPTYPE2) #define SPRITETYPED (SPTYPE3|SPTYPE2|SPTYPE0) #define SPRITETYPEE (SPTYPE3|SPTYPE2|SPTYPE1) #define SPRITETYPEF (SPTYPE3|SPTYPE2|SPTYPE1|SPTYPE0) #define SDCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xe2)) #define CRAOFA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xe4)) #define CRAOFB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xe6)) #define LNCLEN (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xe8)) #define SFPRMD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xea)) #define CCCTL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xec)) #define SFCCMD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xee)) #define PRISA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xf0)) #define PRISB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xf2)) #define PRISC (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xf4)) #define PRISD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xf6)) #define PRINA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xf8)) #define PRINB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xfa)) #define PRIR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0xfc)) #define CCRSA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x100)) #define CCRSB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x102)) #define CCRSC (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x104)) #define CCRSD (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x106)) #define CCRNA (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x108)) #define CCRNB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x10a)) #define CCRR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x10c)) #define CCRLB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x10e)) #define CLOFEN (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x110)) #define CLOFSL (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x112)) #define COAR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x114)) #define COAG (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x116)) #define COAB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x118)) #define COBR (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x11a)) #define COBG (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x11c)) #define COBB (*(volatile unsigned short *)(VDP2_REGISTER_BASE+0x11e)) #endif/* VDP2_H_ */