/* * File: mz800_ntsc.h * * Generator video signalu Sharp MZ-800 RGBI NTSC (NTPL=1, japonska verze): * * Vsechny hodnoty zmereny z C modelu GDG WHID 65040-032 * (1:1 prepis VHDL netlisu, soubor: c-whid-0/diag_ntsc_video.c * a c-whid-0/diag_ntsc_vborder.c). * * CLK0 krystal: 17.734475 MHz (evropsky PAL krystal). * POZOR: Japonska verze MZ-800 pravdepodobne pouzivala jiny krystal * (~14.318 MHz = 4x NTSC colorburst), coz by dalo standardni NTSC * snimkovou frekvenci ~59.9 Hz. S PAL krystalem NTSC timing dava * 74.27 Hz — korektni pro GDG logiku, ale nestandardni pro NTSC. * Vsechny hodnoty v CLK0 taktech/radcich jsou nezavisle na frekvenci * krystalu — plati pro jakykoliv CLK0. * * * * Radkove casovani: * ================= * * Hsync: 64 T * Back Porch: 72 T * Video Enable: 752 T * Front Porch: 24 T * ----------------------- * Cely radek: 912 T * * * Snimkove casovani: * ================== * * Vsync: 3 radky (nVSYN=0, IGRB=0000) * Pre-sync black: 3 radky (nVSYN=1, IGRB=0000) * Post-sync black: 14 radku (nVSYN=1, IGRB=0000) * Border (viditelny): 42 radku (IGRB=border barva) * Canvas: 200 radku (nVBLN=1) * --------------------------------------------------- * Cely snimek: 262 radku * * * V-blank rozdeleni (nVBLN=0, celkem 62 radku): * * Bottom border: 18 radku (IGRB=border barva) * Pre-sync black: 3 radky (IGRB=0000, nVSYN=1) * Vsync: 3 radky (IGRB=0000, nVSYN=0) * Post-sync black: 14 radku (IGRB=0000, nVSYN=1) * Top border: 24 radku (IGRB=border barva) * * * H-border: * * Levy border: 60 T * Screen: 640 T * Pravy border: 52 T * * * * Porovnani s PAL: * ================ * * Parametr PAL (NTPL=0) NTSC (NTPL=1) * --------------------------------------------------------- * Cely radek 1136 T 912 T * Hsync sirka 80 T 64 T * Back porch 104 T 72 T * Video Enable 928 T 752 T * Front porch 24 T 24 T * Canvas sirka 640 T 640 T * Levy border 156 T 60 T * Pravy border 132 T 52 T * Celkem radku 312 262 * Canvas radku 200 200 * V-blank radku 112 62 * Top border (IGRB!=0) 45 radku 24 radku * Bottom border 42 radku 18 radku * Viditelnych radku 287 242 * Vsync (nVSYN=0) 3 radky 3 radky * CPU delicka CLK0/5 CLK0/4 * CPU frekvence (*) 3.547 MHz 4.434 MHz * CKMS delicka CLK0/16 CLK0/16 * Snimkova frekv. (*) 50.04 Hz 74.27 Hz * * (*) Pri CLK0 = 17.734475 MHz (PAL krystal). * Japonska verze s CLK0 ~ 14.318 MHz: * CPU = 14.318/4 = 3.580 MHz * Snimkova = 14318000/(912*262) = 59.92 Hz * * * * +----------------------------- Screen ------------------------------+ * | | * | | * | 0,0 -> +------------- Display (visible area) ----------+ | * | |Top border | | * | | | | * | | Left +----------- Canvas ------------+ Right | | * | | border| | border| | * | | | | | | * | | | | | | * | | | | | | * | | +---------- 640 x 200 ----------+ | | * | |Botom border | | * | | | | * | +------------------ 752 x 242 ------------------+ | * | | * | | * +--------------------------- 912 x 262 ----------------------------+ * * * */ #ifndef MZ800_NTSC_VIDEO_H #define MZ800_NTSC_VIDEO_H #ifdef __cplusplus extern "C" { #endif /* * * Definice rozmeru * */ #define VIDEO_NTSC_BORDER_LEFT_WIDTH 60 #define VIDEO_NTSC_BORDER_RIGHT_WIDTH 52 #define VIDEO_NTSC_BORDER_TOP_HEIGHT 24 #define VIDEO_NTSC_BORDER_BOTOM_HEIGHT 18 /* celkove rozmery uzivatelsky pouzitelne (kreslitelne) oblasti */ #define VIDEO_NTSC_CANVAS_WIDTH 640 #define VIDEO_NTSC_CANVAS_HEIGHT 200 /* celkove rozmery viditelneho displeje */ #define VIDEO_NTSC_DISPLAY_WIDTH ( VIDEO_NTSC_BORDER_LEFT_WIDTH + VIDEO_NTSC_CANVAS_WIDTH + VIDEO_NTSC_BORDER_RIGHT_WIDTH ) #define VIDEO_NTSC_DISPLAY_HEIGHT ( VIDEO_NTSC_BORDER_TOP_HEIGHT + VIDEO_NTSC_CANVAS_HEIGHT + VIDEO_NTSC_BORDER_BOTOM_HEIGHT ) #define VIDEO_NTSC_BORDER_TOP_WIDTH VIDEO_NTSC_DISPLAY_WIDTH #define VIDEO_NTSC_BORDER_LEFT_HEIGHT VIDEO_NTSC_CANVAS_HEIGHT #define VIDEO_NTSC_BORDER_RIGHT_HEIGHT VIDEO_NTSC_CANVAS_HEIGHT #define VIDEO_NTSC_BORDER_BOTOM_WIDTH VIDEO_NTSC_DISPLAY_WIDTH /* Definice obrazoveho radku */ #define VIDEO_NTSC_H_SYNC_TICKS 64 #define VIDEO_NTSC_H_BACK_PORCH_TICKS 72 #define VIDEO_NTSC_H_ENABLED_TICKS VIDEO_NTSC_DISPLAY_WIDTH #define VIDEO_NTSC_H_FRONT_PORCH_TICKS 24 /* Celkove rozmery screen */ #define VIDEO_NTSC_SCREEN_WIDTH ( VIDEO_NTSC_H_SYNC_TICKS + VIDEO_NTSC_H_BACK_PORCH_TICKS + VIDEO_NTSC_H_ENABLED_TICKS + VIDEO_NTSC_H_FRONT_PORCH_TICKS ) #define VIDEO_NTSC_SCREEN_HEIGHT 262 #define VIDEO_NTSC_SCREEN_TICKS ( VIDEO_NTSC_SCREEN_HEIGHT * VIDEO_NTSC_SCREEN_WIDTH ) /* * * Definice umisteni na ceste paprsku * */ #define VIDEO_NTSC_BEAM_BORDER_TOP_FIRST_COLUMN 0 #define VIDEO_NTSC_BEAM_BORDER_TOP_FIRST_ROW 0 #define VIDEO_NTSC_BEAM_BORDER_TOP_LAST_COLUMN ( VIDEO_NTSC_DISPLAY_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_BORDER_TOP_LAST_ROW ( VIDEO_NTSC_BORDER_TOP_HEIGHT - 1 ) #define VIDEO_NTSC_BEAM_CANVAS_FIRST_COLUMN ( VIDEO_NTSC_BORDER_LEFT_WIDTH ) #define VIDEO_NTSC_BEAM_CANVAS_FIRST_ROW ( VIDEO_NTSC_BEAM_BORDER_TOP_LAST_ROW + 1 ) #define VIDEO_NTSC_BEAM_CANVAS_LAST_COLUMN ( VIDEO_NTSC_BEAM_CANVAS_FIRST_COLUMN + VIDEO_NTSC_CANVAS_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_CANVAS_LAST_ROW ( VIDEO_NTSC_BEAM_CANVAS_FIRST_ROW + VIDEO_NTSC_CANVAS_HEIGHT - 1 ) #define VIDEO_NTSC_BEAM_BORDER_LEFT_FIRST_COLUMN 0 #define VIDEO_NTSC_BEAM_BORDER_LEFT_FIRST_ROW ( VIDEO_NTSC_BEAM_CANVAS_FIRST_ROW ) #define VIDEO_NTSC_BEAM_BORDER_LEFT_LAST_COLUMN ( VIDEO_NTSC_BORDER_LEFT_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_BORDER_LEFT_LAST_ROW ( VIDEO_NTSC_BEAM_CANVAS_LAST_ROW ) #define VIDEO_NTSC_BEAM_BORDER_RIGHT_FIRST_COLUMN ( VIDEO_NTSC_BEAM_CANVAS_LAST_COLUMN + 1 ) #define VIDEO_NTSC_BEAM_BORDER_RIGHT_FIRST_ROW ( VIDEO_NTSC_BEAM_CANVAS_FIRST_ROW ) #define VIDEO_NTSC_BEAM_BORDER_RIGHT_LAST_COLUMN ( VIDEO_NTSC_BEAM_BORDER_RIGHT_FIRST_COLUMN + VIDEO_NTSC_BORDER_RIGHT_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_BORDER_RIGHT_LAST_ROW ( VIDEO_NTSC_BEAM_CANVAS_LAST_ROW ) #define VIDEO_NTSC_BEAM_BORDER_BOTOM_FIRST_COLUMN 0 #define VIDEO_NTSC_BEAM_BORDER_BOTOM_FIRST_ROW ( VIDEO_NTSC_BEAM_CANVAS_LAST_ROW + 1 ) #define VIDEO_NTSC_BEAM_BORDER_BOTOM_LAST_COLUMN ( VIDEO_NTSC_DISPLAY_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_BORDER_BOTOM_LAST_ROW ( VIDEO_NTSC_BEAM_BORDER_BOTOM_FIRST_ROW + VIDEO_NTSC_BORDER_BOTOM_HEIGHT - 1 ) #define VIDEO_NTSC_BEAM_DISPLAY_FIRST_COLUMN 0 #define VIDEO_NTSC_BEAM_DISPLAY_FIRST_ROW 0 #define VIDEO_NTSC_BEAM_DISPLAY_LAST_COLUMN ( VIDEO_NTSC_DISPLAY_WIDTH - 1 ) #define VIDEO_NTSC_BEAM_DISPLAY_LAST_ROW ( VIDEO_NTSC_DISPLAY_HEIGHT - 1 ) #define VIDEO_NTSC_SCREENS_PER_SEC 60 /* nominalne; 74 Hz s PAL krystalem */ #define VIDEO_NTSC_GET_SCREEN_ROW( screen_ticks ) ( screen_ticks / VIDEO_NTSC_SCREEN_WIDTH ) #define VIDEO_NTSC_GET_SCREEN_COL( screen_ticks ) ( screen_ticks % VIDEO_NTSC_SCREEN_WIDTH ) #define VIDEO_NTSC_GET_DISPLAY_ADDR( display_row, display_col ) ( ( display_row * VIDEO_NTSC_DISPLAY_WIDTH ) + display_col ) #ifdef __cplusplus } #endif #endif /* MZ800_NTSC_VIDEO_H */