|
|
1.1 root 1: /*
1.1.1.4 root 2: Hatari - video.h
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
1.1 root 6: */
7:
1.1.1.4 root 8: #ifndef HATARI_VIDEO_H
9: #define HATARI_VIDEO_H
10:
1.1.1.7 root 11: /*
12: All the following processor timings are based on a bog standard 8MHz 68000 as
13: found in all standard STs:
14:
15: Clock cycles per line (50Hz) : 512
16: NOPs per scan line (50Hz) : 128
17: Scan lines per VBL (50Hz) : 313 (64 at top,200 screen,49 bottom)
18:
19: Clock cycles per line (60Hz) : 508
20: NOPs per scan line (60Hz) : 127
21: Scan lines per VBL (60Hz) : 263
22:
23: Clock cycles per VBL (50Hz) : 160256
24: NOPs per VBL (50Hz) : 40064
25:
26: Pixels per clock cycle (low res) : 1
27: Pixels per clock cycle (med res) : 2
28: Pixels per clock cycle (high res) : 4
29: Pixels per NOP (low res) : 4
30: Pixels per NOP (med res) : 8
31: Pixels per NOP (high res) : 16
32: */
33:
34: /* Scan lines per frame */
35: #define SCANLINES_PER_FRAME_50HZ 313 /* Number of scan lines per frame in 50 Hz */
36: #define SCANLINES_PER_FRAME_60HZ 263 /* Number of scan lines per frame in 60 Hz */
1.1.1.8 root 37: #define SCANLINES_PER_FRAME_71HZ 501 /* could also be 500 ? */
1.1.1.7 root 38: #define MAX_SCANLINES_PER_FRAME 313 /* Max. number of scan lines per frame */
39:
40: /* Cycles per line */
41: #define CYCLES_PER_LINE_50HZ 512
42: #define CYCLES_PER_LINE_60HZ 508
1.1.1.8 root 43: #define CYCLES_PER_LINE_71HZ 224
1.1.1.7 root 44:
45: /* Vertical border/display enable/disable:
46: * Normal screen starts 63 lines in, top border is 29 lines */
47: #define SCREEN_START_HBL_50HZ 63 /* Usually the first line of the displayed screen in 50 Hz */
48: #define SCREEN_START_HBL_60HZ 34 /* The first line of the displayed screen in 60 Hz */
1.1.1.8 root 49: #define SCREEN_START_HBL_71HZ 34 /* FIXME: 34 is not verified */
1.1.1.7 root 50: #define FIRST_VISIBLE_HBL_50HZ 34 /* At this line we start rendering our screen in 50 Hz */
51: #define FIRST_VISIBLE_HBL_60HZ (34-29) /* At this line we start rendering our screen in 60 Hz (29 = 63-34) */
1.1.1.8 root 52: #define FIRST_VISIBLE_HBL_71HZ 34 /* FIXME: 34 is not verified */
1.1.1.7 root 53:
1.1.1.8 root 54: #define SCREEN_HEIGHT_HBL_COLOR 200 /* This is usually the height of the screen */
55: #define SCREEN_HEIGHT_HBL_MONO 400
56:
57: #define SCREEN_END_HBL_50HZ ( SCREEN_START_HBL_50HZ + SCREEN_HEIGHT_HBL_COLOR ) /* 263 */
58: #define SCREEN_END_HBL_60HZ ( SCREEN_START_HBL_60HZ + SCREEN_HEIGHT_HBL_COLOR ) /* 234 */
1.1.1.7 root 59:
60: /* FIXME: SCREEN_START_CYCLE should rather be 52 or so, but this breaks a lot of other things at the moment... */
1.1.1.8 root 61: #define SCREEN_START_CYCLE 56 /* Cycle first normal pixel appears on */
62:
1.1.1.9 ! root 63: #define LINE_REMOVE_TOP_CYCLE_STF 504 /* switch to 60 Hz on line 33 should not occur after cycle 504 to remove top border */
! 64: /* switch to 50 Hz should occur after cycle 504 on line 33 */
! 65: #define LINE_REMOVE_BOTTOM_CYCLE_STF 504 /* same value than top border, but on line 262 (50 Hz) or 233 (60 Hz) */
! 66:
! 67: #define LINE_REMOVE_TOP_CYCLE_STE 500 /* on STE, switch can occur 4 cycles earlier */
! 68: #define LINE_REMOVE_BOTTOM_CYCLE_STE 500
1.1.1.8 root 69:
70:
71: #define LINE_START_CYCLE_50 56
72: #define LINE_START_CYCLE_60 52
73: #define LINE_START_CYCLE_70 0
74: #define LINE_END_CYCLE_50 376
75: #define LINE_END_CYCLE_60 372
76: #define LINE_END_CYCLE_70 160
77: #define LINE_END_CYCLE_NO_RIGHT 460
78: #define LINE_END_CYCLE_50_2 (LINE_END_CYCLE_50+44*2) /* used in enchanted lands */
79: #define LINE_END_CYCLE_FULL 512 /* used in enchanted lands */
80: #define LINE_SCROLL_13_CYCLE_50 20 /* 13 pixels right "hardware" scrolling */
81: #define LINE_SCROLL_9_CYCLE_50 24 /* 9 pixels right "hardware" scrolling */
82: #define LINE_SCROLL_5_CYCLE_50 28 /* 5 pixels right "hardware" scrolling */
83: #define LINE_SCROLL_1_CYCLE_50 32 /* 1 pixels right "hardware" scrolling */
84: #define LINE_LEFT_MID_CYCLE_1 20 /* mid res overscan, shifts display by 0 byte */
85: #define LINE_LEFT_MID_CYCLE_2 28 /* mid res overscan, shifts display by 2 bytes */
86: #define LINE_EMPTY_CYCLE_70 28 /* switch to hi/lo will create an empty line */
1.1.1.7 root 87:
88: /* Bytes for opened left and right border: */
1.1.1.8 root 89: #define BORDERBYTES_NORMAL 160 /* size of a "normal" line */
90: #define BORDERBYTES_LEFT 26
91: #define BORDERBYTES_RIGHT 44
92: #define BORDERBYTES_RIGHT_FULL 22
1.1.1.7 root 93:
94: /* Legacy defines: */
95: #define CYCLES_PER_FRAME (nScanlinesPerFrame*nCyclesPerLine) /* Cycles per VBL @ 50fps = 160256 */
96:
97:
1.1.1.8 root 98: #define VBL_VIDEO_CYCLE_OFFSET (60+4)
99: #define HBL_VIDEO_CYCLE_OFFSET (12-12) /* cycles after end of current line */
100: #define TIMERB_VIDEO_CYCLE_OFFSET (96+12) /* cycles before end of current line (28 cycles after display off) */
101: #define RESTART_VIDEO_COUNTER_CYCLE ( (MAX_SCANLINES_PER_FRAME-3) * CYCLES_PER_LINE_50HZ + 48 )
102:
103:
104: extern int STRes;
105: extern int TTRes;
106: extern BOOL bUseSTShifter;
1.1 root 107: extern BOOL bUseHighRes;
1.1.1.8 root 108: extern int nVBLs;
109: extern int nHBL;
110: extern int nStartHBL;
1.1 root 111: extern int OverscanMode;
1.1.1.7 root 112: extern Uint16 HBLPalettes[];
1.1.1.5 root 113: extern Uint16 *pHBLPalettes;
1.1.1.7 root 114: extern Uint32 HBLPaletteMasks[];
1.1.1.6 root 115: extern Uint32 *pHBLPaletteMasks;
1.1.1.5 root 116: extern Uint32 VideoBase;
1.1.1.3 root 117: extern int nScreenRefreshRate;
1.1 root 118:
1.1.1.7 root 119: extern int nScanlinesPerFrame;
120: extern int nCyclesPerLine;
121:
122:
1.1.1.9 ! root 123: extern void Video_SetSystemTimings(void);
1.1 root 124: extern void Video_Reset(void);
125: extern void Video_MemorySnapShot_Capture(BOOL bSave);
1.1.1.8 root 126: extern void Video_GetTTRes(int *width, int *height, int *bpp);
127: extern void Video_StartInterrupts(void);
1.1 root 128: extern void Video_InterruptHandler_VBL(void);
129: extern void Video_InterruptHandler_EndLine(void);
130: extern void Video_InterruptHandler_HBL(void);
131: extern void Video_SetScreenRasters(void);
1.1.1.4 root 132:
1.1.1.8 root 133: extern void Video_ScreenCounter_ReadByte(void);
1.1.1.5 root 134: extern void Video_Sync_ReadByte(void);
135: extern void Video_BaseLow_ReadByte(void);
136: extern void Video_LineWidth_ReadByte(void);
137: extern void Video_ShifterMode_ReadByte(void);
1.1.1.7 root 138: extern void Video_HorScroll_Read(void);
1.1.1.5 root 139:
1.1.1.6 root 140: extern void Video_ScreenBaseSTE_WriteByte(void);
141: extern void Video_ScreenCounter_WriteByte(void);
1.1.1.5 root 142: extern void Video_Sync_WriteByte(void);
1.1.1.7 root 143: extern void Video_LineWidth_WriteByte(void);
1.1.1.5 root 144: extern void Video_Color0_WriteWord(void);
145: extern void Video_Color1_WriteWord(void);
146: extern void Video_Color2_WriteWord(void);
147: extern void Video_Color3_WriteWord(void);
148: extern void Video_Color4_WriteWord(void);
149: extern void Video_Color5_WriteWord(void);
150: extern void Video_Color6_WriteWord(void);
151: extern void Video_Color7_WriteWord(void);
152: extern void Video_Color8_WriteWord(void);
153: extern void Video_Color9_WriteWord(void);
154: extern void Video_Color10_WriteWord(void);
155: extern void Video_Color11_WriteWord(void);
156: extern void Video_Color12_WriteWord(void);
157: extern void Video_Color13_WriteWord(void);
158: extern void Video_Color14_WriteWord(void);
159: extern void Video_Color15_WriteWord(void);
160: extern void Video_ShifterMode_WriteByte(void);
1.1.1.7 root 161: extern void Video_HorScroll_Write(void);
1.1.1.8 root 162: extern void Video_TTShiftMode_WriteWord(void);
163: extern void Video_TTColorRegs_WriteWord(void);
164: extern void Video_TTColorSTRegs_WriteWord(void);
1.1.1.5 root 165:
1.1.1.4 root 166: #endif /* HATARI_VIDEO_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.