Mercurial > repos > blastem
annotate jag_video.c @ 1088:c0a026e974f4
Basic handling of video/object processor register writes
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 08 Oct 2016 23:49:20 -0700 |
parents | 6433d4d05934 |
children | 87597a048d38 |
rev | line source |
---|---|
1087
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 #include <stdint.h> |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 #include <stdlib.h> |
1088
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
3 #include <stdio.h> |
1087
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 #include "jag_video.h" |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 |
1088
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
6 enum { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
7 VMODE_CRY, |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
8 VMODE_RGB24, |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
9 VMODE_DIRECT16, |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
10 VMODE_RGB16, |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
11 VMODE_VARIABLE |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
12 }; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
13 |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
14 char *vmode_names[] = { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
15 "CRY", |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
16 "RGB16", |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
17 "DIRECT16", |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
18 "VARIABLE" |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
19 }; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
20 |
1087
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 jag_video *jag_video_init(void) |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 { |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 return calloc(1, sizeof(jag_video)); |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 } |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 void jag_video_run(jag_video *context, uint32_t target_cycle) |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 { |
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 context->cycles = target_cycle; |
1088
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
29 |
1087
6433d4d05934
Added placeholder code for video output hardware/object processor
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 } |
1088
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
31 |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
32 static uint8_t is_reg_writeable(uint32_t address) |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
33 { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
34 return address < VID_HLPEN || address >= VID_OBJLIST1; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
35 } |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
36 |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
37 void jag_video_reg_write(jag_video *context, uint32_t address, uint16_t value) |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
38 { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
39 uint32_t reg = (address >> 1 & 0x7F) - 2; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
40 if (reg < JAG_VIDEO_REGS && is_reg_writeable(reg)) { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
41 context->regs[reg] = value; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
42 if (reg == VID_VMODE) { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
43 context->pclock_div = (value >> 9 & 7) + 1; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
44 context->pclock_counter = 0; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
45 if (value & 0x10) { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
46 context->mode = VMODE_VARIABLE; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
47 } else { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
48 context->mode = value >> 1 & 3; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
49 } |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
50 printf("Mode %s, pixel clock divider: %d, time base generation: %s\n", vmode_names[context->mode], context->pclock_div, value & 1 ? "enabled" : "disabled"); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
51 } |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
52 switch (reg) |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
53 { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
54 case VID_OBJLIST1: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
55 printf("Object List Pointer 1: %X\n", value); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
56 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
57 case VID_OBJLIST2: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
58 printf("Object List Pointer 2: %X\n", value); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
59 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
60 case VID_HPERIOD: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
61 printf("Horizontal period: %d\n", value & 0x3FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
62 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
63 case VID_HBLANK_BEGIN: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
64 printf("horizontal blanking begin: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
65 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
66 case VID_HBLANK_END: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
67 printf("horizontal blanking end: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
68 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
69 case VID_HSYNC: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
70 printf("horizontal sync start: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
71 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
72 case VID_HDISP_BEGIN1: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
73 printf("horizontal display begin 1: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
74 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
75 case VID_HDISP_BEGIN2: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
76 printf("horizontal display begin 2: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
77 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
78 case VID_HDISP_END: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
79 printf("horizontal display end: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
80 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
81 case VID_VPERIOD: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
82 printf("Vertical period: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
83 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
84 case VID_VBLANK_BEGIN: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
85 printf("vertical blanking begin: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
86 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
87 case VID_VBLANK_END: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
88 printf("vertical blanking end: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
89 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
90 case VID_VSYNC: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
91 printf("vertical sync start: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
92 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
93 case VID_VDISP_BEGIN: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
94 printf("vertical display begin: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
95 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
96 case VID_VDISP_END: |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
97 printf("vertical display end: %d\n", value & 0x7FF); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
98 break; |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
99 } |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
100 } else { |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
101 fprintf(stderr, "Write to invalid video/object processor register %X:%X\n", address, value); |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
102 } |
c0a026e974f4
Basic handling of video/object processor register writes
Michael Pavone <pavone@retrodev.com>
parents:
1087
diff
changeset
|
103 } |