31
32
#include "resources.h"
32
33
#include "vicii-sprites.h"
33
34
#include "vicii-timing.h"
34
36
#include "viciitypes.h"
37
39
/* Screen constants. */
38
#define VICII_PAL_SCREEN_HEIGHT 312
39
#define VICII_NTSC_SCREEN_HEIGHT 263
40
#define VICII_NTSCOLD_SCREEN_HEIGHT 262
42
#define VICII_PAL_OFFSET 0
43
#define VICII_NTSC_OFFSET 0
44
#define VICII_NTSCOLD_OFFSET 0
46
#define VICII_SCREEN_PAL_BORDERWIDTH 32
47
#define VICII_SCREEN_PAL_BORDERHEIGHT 51
48
#define VICII_SCREEN_NTSC_BORDERWIDTH 32
49
#define VICII_SCREEN_NTSC_BORDERHEIGHT 27
50
#define VICII_SCREEN_NTSCOLD_BORDERWIDTH 32
51
#define VICII_SCREEN_NTSCOLD_BORDERHEIGHT 27
53
#define VICII_PAL_FIRST_DISPLAYED_LINE 0x10
54
#define VICII_PAL_LAST_DISPLAYED_LINE 0x11f
55
#define VICII_PAL_25ROW_START_LINE 0x33
56
#define VICII_PAL_25ROW_STOP_LINE 0xfb
57
#define VICII_PAL_24ROW_START_LINE 0x37
58
#define VICII_PAL_24ROW_STOP_LINE 0xf7
60
#define VICII_NTSC_FIRST_DISPLAYED_LINE (0x20 - VICII_NTSC_OFFSET)
61
#define VICII_NTSC_LAST_DISPLAYED_LINE 0x102
62
#define VICII_NTSC_25ROW_START_LINE (0x33 - VICII_NTSC_OFFSET)
63
#define VICII_NTSC_25ROW_STOP_LINE (0xfb - VICII_NTSC_OFFSET)
64
#define VICII_NTSC_24ROW_START_LINE (0x37 - VICII_NTSC_OFFSET)
65
#define VICII_NTSC_24ROW_STOP_LINE (0xf7 - VICII_NTSC_OFFSET)
67
#define VICII_NTSCOLD_FIRST_DISPLAYED_LINE (0x20 - VICII_NTSCOLD_OFFSET)
68
#define VICII_NTSCOLD_LAST_DISPLAYED_LINE 0x102
69
#define VICII_NTSCOLD_25ROW_START_LINE (0x33 - VICII_NTSCOLD_OFFSET)
70
#define VICII_NTSCOLD_25ROW_STOP_LINE (0xfb - VICII_NTSCOLD_OFFSET)
71
#define VICII_NTSCOLD_24ROW_START_LINE (0x37 - VICII_NTSCOLD_OFFSET)
72
#define VICII_NTSCOLD_24ROW_STOP_LINE (0xf7 - VICII_NTSCOLD_OFFSET)
40
#define VICII_PAL_SCREEN_HEIGHT 312
41
#define VICII_NTSC_SCREEN_HEIGHT 263
42
#define VICII_NTSCOLD_SCREEN_HEIGHT 262
44
/* Sideborder sizes */
45
#define VICII_SCREEN_PAL_NORMAL_LEFTBORDERWIDTH 0x20
46
#define VICII_SCREEN_PAL_NORMAL_RIGHTBORDERWIDTH 0x20
47
#define VICII_SCREEN_PAL_FULL_LEFTBORDERWIDTH 0x30 /* actually 0x2e, but must be divisible by 8 */
48
#define VICII_SCREEN_PAL_FULL_RIGHTBORDERWIDTH 0x24
49
#define VICII_SCREEN_PAL_DEBUG_LEFTBORDERWIDTH 0x88
50
#define VICII_SCREEN_PAL_DEBUG_RIGHTBORDERWIDTH 0x30
52
#define VICII_SCREEN_NTSC_NORMAL_LEFTBORDERWIDTH 0x20
53
#define VICII_SCREEN_NTSC_NORMAL_RIGHTBORDERWIDTH 0x20
54
#define VICII_SCREEN_NTSC_FULL_LEFTBORDERWIDTH 0x38
55
#define VICII_SCREEN_NTSC_FULL_RIGHTBORDERWIDTH 0x2c
56
#define VICII_SCREEN_NTSC_DEBUG_LEFTBORDERWIDTH 0x88
57
#define VICII_SCREEN_NTSC_DEBUG_RIGHTBORDERWIDTH 0x40
59
#define VICII_SCREEN_NTSCOLD_NORMAL_LEFTBORDERWIDTH 0x20
60
#define VICII_SCREEN_NTSCOLD_NORMAL_RIGHTBORDERWIDTH 0x20
61
#define VICII_SCREEN_NTSCOLD_FULL_LEFTBORDERWIDTH 0x38
62
#define VICII_SCREEN_NTSCOLD_FULL_RIGHTBORDERWIDTH 0x2c
63
#define VICII_SCREEN_NTSCOLD_DEBUG_LEFTBORDERWIDTH 0x88
64
#define VICII_SCREEN_NTSCOLD_DEBUG_RIGHTBORDERWIDTH 0x38
66
/* Y display ranges */
67
/* Note: If the last displayed line setting is larger than */
68
/* the screen height, lines 0+ are displayed in the lower */
69
/* border. This is used for NTSC display. */
70
#define VICII_PAL_NORMAL_FIRST_DISPLAYED_LINE 0x10
71
#define VICII_PAL_NORMAL_LAST_DISPLAYED_LINE 0x11f
72
#define VICII_PAL_FULL_FIRST_DISPLAYED_LINE 0x08
73
#define VICII_PAL_FULL_LAST_DISPLAYED_LINE 0x12c
74
#define VICII_PAL_DEBUG_FIRST_DISPLAYED_LINE 0x00
75
#define VICII_PAL_DEBUG_LAST_DISPLAYED_LINE 0x137
77
#define VICII_NTSC_NORMAL_FIRST_DISPLAYED_LINE 0x20
78
#define VICII_NTSC_NORMAL_LAST_DISPLAYED_LINE 0x102
79
#define VICII_NTSC_FULL_FIRST_DISPLAYED_LINE 0x1e /* enough space to show full sprites in the upper border */
80
#define VICII_NTSC_FULL_LAST_DISPLAYED_LINE 0x10f /* enough space to show full sprites in the lower border */
81
#define VICII_NTSC_DEBUG_FIRST_DISPLAYED_LINE 0x14
82
#define VICII_NTSC_DEBUG_LAST_DISPLAYED_LINE 0x11a
84
#define VICII_NTSCOLD_NORMAL_FIRST_DISPLAYED_LINE 0x20
85
#define VICII_NTSCOLD_NORMAL_LAST_DISPLAYED_LINE 0x102
86
#define VICII_NTSCOLD_FULL_FIRST_DISPLAYED_LINE 0x1e /* enough space to show full sprites in the upper border */
87
#define VICII_NTSCOLD_FULL_LAST_DISPLAYED_LINE 0x10f /* enough space to show full sprites in the lower border */
88
#define VICII_NTSCOLD_DEBUG_FIRST_DISPLAYED_LINE 0x14
89
#define VICII_NTSCOLD_DEBUG_LAST_DISPLAYED_LINE 0x119
74
91
/* Number of cycles per line. */
75
92
#define VICII_PAL_CYCLES_PER_LINE C64_PAL_CYCLES_PER_LINE
92
109
#define VICII_NTSC_DRAW_CYCLE VICII_NTSC_CYCLES_PER_LINE
93
110
#define VICII_NTSCOLD_DRAW_CYCLE VICII_NTSCOLD_CYCLES_PER_LINE
112
/* Common parameters for all video standards */
113
#define VICII_25ROW_START_LINE 0x33
114
#define VICII_25ROW_STOP_LINE 0xfb
115
#define VICII_24ROW_START_LINE 0x37
116
#define VICII_24ROW_STOP_LINE 0xf7
95
118
/* Bad line range. */
96
#define VICII_PAL_FIRST_DMA_LINE 0x30
97
#define VICII_PAL_LAST_DMA_LINE 0xf7
98
#define VICII_NTSC_FIRST_DMA_LINE (0x30 - VICII_NTSC_OFFSET)
99
#define VICII_NTSC_LAST_DMA_LINE 0xf7
100
#define VICII_NTSCOLD_FIRST_DMA_LINE (0x30 - VICII_NTSCOLD_OFFSET)
101
#define VICII_NTSCOLD_LAST_DMA_LINE 0xf7
104
void vicii_timing_set(machine_timing_t *machine_timing)
119
#define VICII_FIRST_DMA_LINE 0x30
120
#define VICII_LAST_DMA_LINE 0xf7
123
void vicii_timing_set(machine_timing_t *machine_timing, int border_mode)
106
resource_value_t mode;
108
resources_get_value("MachineVideoStandard", (void *)&mode);
127
resources_get_int("MachineVideoStandard", &mode);
111
130
case MACHINE_SYNC_NTSC:
112
131
vicii.screen_height = VICII_NTSC_SCREEN_HEIGHT;
113
vicii.first_displayed_line = VICII_NTSC_FIRST_DISPLAYED_LINE;
114
vicii.last_displayed_line = VICII_NTSC_LAST_DISPLAYED_LINE;
115
vicii.row_25_start_line = VICII_NTSC_25ROW_START_LINE;
116
vicii.row_25_stop_line = VICII_NTSC_25ROW_STOP_LINE;
117
vicii.row_24_start_line = VICII_NTSC_24ROW_START_LINE;
118
vicii.row_24_stop_line = VICII_NTSC_24ROW_STOP_LINE;
119
vicii.screen_borderwidth = VICII_SCREEN_NTSC_BORDERWIDTH;
120
vicii.screen_borderheight = VICII_SCREEN_NTSC_BORDERHEIGHT;
132
switch (border_mode) {
134
case VICII_NORMAL_BORDERS:
135
vicii.screen_leftborderwidth = VICII_SCREEN_NTSC_NORMAL_LEFTBORDERWIDTH;
136
vicii.screen_rightborderwidth = VICII_SCREEN_NTSC_NORMAL_RIGHTBORDERWIDTH;
137
vicii.first_displayed_line = VICII_NTSC_NORMAL_FIRST_DISPLAYED_LINE;
138
vicii.last_displayed_line = VICII_NTSC_NORMAL_LAST_DISPLAYED_LINE;
140
case VICII_FULL_BORDERS:
141
vicii.screen_leftborderwidth = VICII_SCREEN_NTSC_FULL_LEFTBORDERWIDTH;
142
vicii.screen_rightborderwidth = VICII_SCREEN_NTSC_FULL_RIGHTBORDERWIDTH;
143
vicii.first_displayed_line = VICII_NTSC_FULL_FIRST_DISPLAYED_LINE;
144
vicii.last_displayed_line = VICII_NTSC_FULL_LAST_DISPLAYED_LINE;
146
case VICII_DEBUG_BORDERS:
147
vicii.screen_leftborderwidth = VICII_SCREEN_NTSC_DEBUG_LEFTBORDERWIDTH;
148
vicii.screen_rightborderwidth = VICII_SCREEN_NTSC_DEBUG_RIGHTBORDERWIDTH;
149
vicii.first_displayed_line = VICII_NTSC_DEBUG_FIRST_DISPLAYED_LINE;
150
vicii.last_displayed_line = VICII_NTSC_DEBUG_LAST_DISPLAYED_LINE;
121
153
vicii.cycles_per_line = VICII_NTSC_CYCLES_PER_LINE;
122
154
vicii.draw_cycle = VICII_NTSC_DRAW_CYCLE;
123
155
vicii.sprite_fetch_cycle = VICII_NTSC_SPRITE_FETCH_CYCLE;
124
156
vicii.sprite_wrap_x = VICII_NTSC_SPRITE_WRAP_X;
125
vicii.first_dma_line = VICII_NTSC_FIRST_DMA_LINE;
126
vicii.last_dma_line = VICII_NTSC_LAST_DMA_LINE;
127
vicii.offset = VICII_NTSC_OFFSET;
129
158
case MACHINE_SYNC_NTSCOLD:
130
159
vicii.screen_height = VICII_NTSCOLD_SCREEN_HEIGHT;
131
vicii.first_displayed_line = VICII_NTSCOLD_FIRST_DISPLAYED_LINE;
132
vicii.last_displayed_line = VICII_NTSCOLD_LAST_DISPLAYED_LINE;
133
vicii.row_25_start_line = VICII_NTSCOLD_25ROW_START_LINE;
134
vicii.row_25_stop_line = VICII_NTSCOLD_25ROW_STOP_LINE;
135
vicii.row_24_start_line = VICII_NTSCOLD_24ROW_START_LINE;
136
vicii.row_24_stop_line = VICII_NTSCOLD_24ROW_STOP_LINE;
137
vicii.screen_borderwidth = VICII_SCREEN_NTSCOLD_BORDERWIDTH;
138
vicii.screen_borderheight = VICII_SCREEN_NTSCOLD_BORDERHEIGHT;
160
switch (border_mode) {
162
case VICII_NORMAL_BORDERS:
163
vicii.screen_leftborderwidth = VICII_SCREEN_NTSCOLD_NORMAL_LEFTBORDERWIDTH;
164
vicii.screen_rightborderwidth = VICII_SCREEN_NTSCOLD_NORMAL_RIGHTBORDERWIDTH;
165
vicii.first_displayed_line = VICII_NTSCOLD_NORMAL_FIRST_DISPLAYED_LINE;
166
vicii.last_displayed_line = VICII_NTSCOLD_NORMAL_LAST_DISPLAYED_LINE;
168
case VICII_FULL_BORDERS:
169
vicii.screen_leftborderwidth = VICII_SCREEN_NTSCOLD_FULL_LEFTBORDERWIDTH;
170
vicii.screen_rightborderwidth = VICII_SCREEN_NTSCOLD_FULL_RIGHTBORDERWIDTH;
171
vicii.first_displayed_line = VICII_NTSCOLD_FULL_FIRST_DISPLAYED_LINE;
172
vicii.last_displayed_line = VICII_NTSCOLD_FULL_LAST_DISPLAYED_LINE;
174
case VICII_DEBUG_BORDERS:
175
vicii.screen_leftborderwidth = VICII_SCREEN_NTSCOLD_DEBUG_LEFTBORDERWIDTH;
176
vicii.screen_rightborderwidth = VICII_SCREEN_NTSCOLD_DEBUG_RIGHTBORDERWIDTH;
177
vicii.first_displayed_line = VICII_NTSCOLD_DEBUG_FIRST_DISPLAYED_LINE;
178
vicii.last_displayed_line = VICII_NTSCOLD_DEBUG_LAST_DISPLAYED_LINE;
139
181
vicii.cycles_per_line = VICII_NTSCOLD_CYCLES_PER_LINE;
140
182
vicii.draw_cycle = VICII_NTSCOLD_DRAW_CYCLE;
141
183
vicii.sprite_fetch_cycle = VICII_NTSCOLD_SPRITE_FETCH_CYCLE;
142
184
vicii.sprite_wrap_x = VICII_NTSCOLD_SPRITE_WRAP_X;
143
vicii.first_dma_line = VICII_NTSCOLD_FIRST_DMA_LINE;
144
vicii.last_dma_line = VICII_NTSCOLD_LAST_DMA_LINE;
145
vicii.offset = VICII_NTSCOLD_OFFSET;
147
186
case MACHINE_SYNC_PAL:
149
188
vicii.screen_height = VICII_PAL_SCREEN_HEIGHT;
150
vicii.first_displayed_line = VICII_PAL_FIRST_DISPLAYED_LINE;
151
vicii.last_displayed_line = VICII_PAL_LAST_DISPLAYED_LINE;
152
vicii.row_25_start_line = VICII_PAL_25ROW_START_LINE;
153
vicii.row_25_stop_line = VICII_PAL_25ROW_STOP_LINE;
154
vicii.row_24_start_line = VICII_PAL_24ROW_START_LINE;
155
vicii.row_24_stop_line = VICII_PAL_24ROW_STOP_LINE;
156
vicii.screen_borderwidth = VICII_SCREEN_PAL_BORDERWIDTH;
157
vicii.screen_borderheight = VICII_SCREEN_PAL_BORDERHEIGHT;
189
switch (border_mode) {
191
case VICII_NORMAL_BORDERS:
192
vicii.screen_leftborderwidth = VICII_SCREEN_PAL_NORMAL_LEFTBORDERWIDTH;
193
vicii.screen_rightborderwidth = VICII_SCREEN_PAL_NORMAL_RIGHTBORDERWIDTH;
194
vicii.first_displayed_line = VICII_PAL_NORMAL_FIRST_DISPLAYED_LINE;
195
vicii.last_displayed_line = VICII_PAL_NORMAL_LAST_DISPLAYED_LINE;
197
case VICII_FULL_BORDERS:
198
vicii.screen_leftborderwidth = VICII_SCREEN_PAL_FULL_LEFTBORDERWIDTH;
199
vicii.screen_rightborderwidth = VICII_SCREEN_PAL_FULL_RIGHTBORDERWIDTH;
200
vicii.first_displayed_line = VICII_PAL_FULL_FIRST_DISPLAYED_LINE;
201
vicii.last_displayed_line = VICII_PAL_FULL_LAST_DISPLAYED_LINE;
203
case VICII_DEBUG_BORDERS:
204
vicii.screen_leftborderwidth = VICII_SCREEN_PAL_DEBUG_LEFTBORDERWIDTH;
205
vicii.screen_rightborderwidth = VICII_SCREEN_PAL_DEBUG_RIGHTBORDERWIDTH;
206
vicii.first_displayed_line = VICII_PAL_DEBUG_FIRST_DISPLAYED_LINE;
207
vicii.last_displayed_line = VICII_PAL_DEBUG_LAST_DISPLAYED_LINE;
158
210
vicii.cycles_per_line = VICII_PAL_CYCLES_PER_LINE;
159
211
vicii.draw_cycle = VICII_PAL_DRAW_CYCLE;
160
212
vicii.sprite_fetch_cycle = VICII_PAL_SPRITE_FETCH_CYCLE;
161
213
vicii.sprite_wrap_x = VICII_PAL_SPRITE_WRAP_X;
162
vicii.first_dma_line = VICII_PAL_FIRST_DMA_LINE;
163
vicii.last_dma_line = VICII_PAL_LAST_DMA_LINE;
164
vicii.offset = VICII_PAL_OFFSET;
217
vicii.first_dma_line = VICII_FIRST_DMA_LINE;
218
vicii.last_dma_line = VICII_LAST_DMA_LINE;
219
vicii.row_25_start_line = VICII_25ROW_START_LINE;
220
vicii.row_25_stop_line = VICII_25ROW_STOP_LINE;
221
vicii.row_24_start_line = VICII_24ROW_START_LINE;
222
vicii.row_24_stop_line = VICII_24ROW_STOP_LINE;
224
vicii.raster.display_xstart = VICII_40COL_START_PIXEL;
225
vicii.raster.display_xstop = VICII_40COL_STOP_PIXEL;
168
227
vicii_sprites_init_sprline();