1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#ifndef JAG_VIDEO_H_
#define JAG_VIDEO_H_
enum {
VID_HCOUNT,
VID_VCOUNT,
VID_HLPEN,
VID_VLPEN,
VID_REG_C,
VID_REG_E,
VID_OBJ0,
VID_OBJ1,
VID_OBJ2,
VID_OBJ3,
VID_REG_18,
VID_REG_1A,
VID_REG_1C,
VID_REG_1E,
VID_OBJLIST1,
VID_OBJLIST2,
VID_REG_24,
VID_OBJFLAG,
VID_VMODE,
VID_BORDER_RG,
VID_BORDER_B,
VID_HPERIOD,
VID_HBLANK_BEGIN,
VID_HBLANK_END,
VID_HSYNC,
VID_HVSYNC,
VID_HDISP_BEGIN1,
VID_HDISP_BEGIN2,
VID_HDISP_END,
VID_VPERIOD,
VID_VBLANK_BEGIN,
VID_VBLANK_END,
VID_VSYNC,
VID_VDISP_BEGIN,
VID_VDISP_END,
VID_VEQUAL_BEGIN,
VID_VEQUAL_END,
VID_VINT,
VID_PIT0,
VID_PIT1,
VID_HEQUAL_END,
VID_REG_56,
VID_BGCOLOR,
JAG_VIDEO_REGS
};
#define LINEBUFFER_WORDS 720
typedef struct {
uint32_t *output;
uint32_t output_pitch;
uint16_t regs[JAG_VIDEO_REGS];
uint16_t clut[256];
uint16_t line_buffer_a[LINEBUFFER_WORDS];
uint16_t line_buffer_b[LINEBUFFER_WORDS];
uint16_t *write_line_buffer;
uint32_t cycles;
uint8_t pclock_div;
uint8_t pclock_counter;
uint8_t mode;
} jag_video;
jag_video *jag_video_init(void);
void jag_video_run(jag_video *context, uint32_t target_cycle);
void jag_video_reg_write(jag_video *context, uint32_t address, uint16_t value);
#endif //JAG_VIDEO_H_
|