|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <byteswap.h>
|
|
|
|
typedef enum {MODE_NTSC_5994=0,MODE_NTSC_60=1,MODE_PAL_50=2,MODE_PAL_ORIG=3,MODE_NTSC_ORIG=4} video_pll_mode;
|
|
|
|
char const * mode_description[] =
|
|
{
|
|
"1440x576 50Hz interlace",
|
|
"720x576 50Hz",
|
|
"1280x720 50Hz",
|
|
"1920x1080 50Hz interlace",
|
|
"1440x480 59.94Hz interlace",
|
|
"720x480 59.94Hz",
|
|
"1280x720 60Hz",
|
|
"1920x1080 60Hz interlace"
|
|
};
|
|
|
|
typedef unsigned short uint16_t;
|
|
|
|
uint16_t crtc_registers[] =
|
|
{
|
|
/*pal576i*/
|
|
126, /*h_syncLen*/
|
|
138, /*h_preActiveLen*/
|
|
1440, /*h_activeLen*/
|
|
24, /*h_postActiveLen*/
|
|
3, /*v_syncLen*/
|
|
19, /*v_preActiveLen*/
|
|
288, /*v_activeLen*/
|
|
2, /*v_postActiveLen*/
|
|
1, /*v_interlace*/
|
|
864, /*v_interlaceDelayLen*/
|
|
21, /*mode */
|
|
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
/*pal576p*/
|
|
64, /*h_syncLen*/
|
|
68, /*h_preActiveLen*/
|
|
720, /*h_activeLen*/
|
|
12, /*h_postActiveLen*/
|
|
5, /*v_syncLen*/
|
|
39, /*v_preActiveLen*/
|
|
576, /*v_activeLen*/
|
|
5, /*v_postActiveLen*/
|
|
0, /*v_interlace*/
|
|
0, /*v_interlaceDelayLen*/
|
|
17, /*mode */
|
|
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
/*pal720p*/
|
|
40, /*h_syncLen*/
|
|
220, /*h_preActiveLen*/
|
|
1280, /*h_activeLen*/
|
|
440, /*h_postActiveLen*/
|
|
5, /*v_syncLen*/
|
|
20, /*v_preActiveLen*/
|
|
720, /*v_activeLen*/
|
|
5, /*v_postActiveLen*/
|
|
0, /*v_interlace*/
|
|
0, /*v_interlaceDelayLen*/
|
|
19, /*mode */
|
|
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
|
|
/* pal 1080i */
|
|
44, /*h_syncLen*/
|
|
148, /*h_preActiveLen*/
|
|
1920, /*h_activeLen*/
|
|
528, /*h_postActiveLen*/
|
|
5, /*v_syncLen*/
|
|
15, /*v_preActiveLen*/
|
|
540, /*v_activeLen*/
|
|
2, /*v_postActiveLen*/
|
|
1, /*v_interlace*/
|
|
1320, /*v_interlaceDelayLen*/
|
|
20, /*mode*/
|
|
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
/*ntsc480i*/
|
|
124, /*h_syncLen*/
|
|
114, /*h_preActiveLen*/
|
|
1440, /*h_activeLen*/
|
|
38, /*h_postActiveLen*/
|
|
3, /*v_syncLen*/
|
|
15, /*v_preActiveLen*/
|
|
240, /*v_activeLen*/
|
|
4, /*v_postActiveLen*/
|
|
1, /*v_interlace*/
|
|
858, /*v_interlaceDelayLen*/
|
|
6, /*mode */
|
|
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
|
|
/*ntsc480p*/
|
|
62, /*h_syncLen*/
|
|
60, /*h_preActiveLen*/
|
|
720, /*h_activeLen*/
|
|
16, /*h_postActiveLen*/
|
|
6, /*v_syncLen*/
|
|
30, /*v_preActiveLen*/
|
|
480, /*v_activeLen*/
|
|
9, /*v_postActiveLen*/
|
|
0, /*v_interlace*/
|
|
0, /*v_interlaceDelayLen*/
|
|
2, /*mode */
|
|
3, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
|
|
/* ntsc720p*/
|
|
40, /*h_syncLen*/
|
|
220, /*h_preActiveLen*/
|
|
1280, /*h_activeLen*/
|
|
110, /*h_postActiveLen*/
|
|
5, /*v_syncLen*/
|
|
20, /*v_preActiveLen*/
|
|
720, /*v_activeLen*/
|
|
5, /*v_postActiveLen*/
|
|
0, /*v_interlace*/
|
|
0, /*v_interlaceDelayLen*/
|
|
4, /*mode */
|
|
2, /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
|
|
/* ntsc 1080i */
|
|
44, /*h_syncLen*/
|
|
148, /*h_preActiveLen*/
|
|
1920, /*h_activeLen*/
|
|
88, /*h_postActiveLen*/
|
|
5, /*v_syncLen*/
|
|
15, /*v_preActiveLen*/
|
|
540, /*v_activeLen*/
|
|
2, /*v_postActiveLen*/
|
|
1, /*v_interlace*/
|
|
1100, /*v_interlaceDelayLen*/
|
|
5, /*mode */
|
|
2 /*clock select - 27MHz or 74.25MHz - TODO*/
|
|
|
|
};
|
|
|
|
uint16_t scaler_registers[] =
|
|
{
|
|
400,400,328,164,328,1, /*pal576i*/
|
|
1024,1024,1,
|
|
400,400,328,164,164,2, /*pal576p*/
|
|
1024,512,2,
|
|
400,225,700,291,291,2, /*pal720p*/
|
|
576,426,2,
|
|
400,300,786,218,436,1, /*pal1080i*/
|
|
768,568,1,
|
|
400,400,328,164,328,1, /*ntsc480i*/
|
|
1024,1024,1,
|
|
400,400,328,164,164,2, /*ntsc480p*/
|
|
1024,512,2,
|
|
400,225,834,291,291,2, /*ntsc720p*/
|
|
576,358,2,
|
|
400,300,936,218,436,1, /*ntsc1080i*/
|
|
768,478,1
|
|
};
|
|
|
|
video_pll_mode const mode_freqs[] =
|
|
{
|
|
MODE_PAL_50,
|
|
MODE_PAL_50,
|
|
MODE_PAL_50,
|
|
MODE_PAL_50,
|
|
MODE_NTSC_5994,
|
|
MODE_NTSC_5994,
|
|
MODE_NTSC_60,
|
|
MODE_NTSC_60
|
|
};
|
|
|
|
/* mode layout
|
|
* 0 :name
|
|
64 :crtc
|
|
128:scaler
|
|
192:freq
|
|
*/
|
|
int main(void)
|
|
{
|
|
int nummodes = 8;
|
|
char * buffer = malloc(nummodes*256);
|
|
memset(buffer,0,nummodes*256);
|
|
|
|
for (int i=0;i!=nummodes*12;++i)
|
|
crtc_registers[i] = __bswap_16 (crtc_registers[i]);
|
|
|
|
for (int i=0;i!=nummodes*9;++i)
|
|
scaler_registers[i] = __bswap_16 (scaler_registers[i]);
|
|
|
|
for (int i=0;i!=nummodes;++i)
|
|
{
|
|
char * base = buffer+i*256;
|
|
strcpy(base,mode_description[i]);
|
|
memcpy(base+64,crtc_registers+(12*i),12*2);
|
|
memcpy(base+128,scaler_registers+(9*i),9*2);
|
|
memcpy(base+192,&mode_freqs[i],1);
|
|
}
|
|
|
|
FILE * f = fopen("video_modes.rom","w");
|
|
fwrite(buffer,1,nummodes*256,f);
|
|
fclose(f);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|