~ubuntu-branches/ubuntu/hardy/vice/hardy

« back to all changes in this revision

Viewing changes to src/vicii/vicii-timing.c

  • Committer: Bazaar Package Importer
  • Author(s): Laszlo Boszormenyi (GCS)
  • Date: 2007-10-07 07:05:46 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20071007070546-81yy0twlka7p2t0e
Tags: 1.22-1
* New upstream version (closes: #428280).
* Correct link to HTML documentation in manpage (closes: #409567).
* Fix most packaging mistakes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 *
4
4
 * Written by
5
5
 *  Andreas Boose <viceteam@t-online.de>
 
6
 *  Gunnar Ruthenberg <Krill.Plush@gmail.com>
6
7
 *
7
8
 * This file is part of VICE, the Versatile Commodore Emulator.
8
9
 * See README for copyright notice.
31
32
#include "resources.h"
32
33
#include "vicii-sprites.h"
33
34
#include "vicii-timing.h"
 
35
#include "vicii.h"
34
36
#include "viciitypes.h"
35
37
 
36
38
 
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
41
 
 
42
 
#define VICII_PAL_OFFSET                   0
43
 
#define VICII_NTSC_OFFSET                  0
44
 
#define VICII_NTSCOLD_OFFSET               0
45
 
 
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
52
 
 
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
59
 
 
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)
66
 
 
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
 
43
 
 
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
 
51
 
 
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
 
58
 
 
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
 
65
 
 
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
 
76
 
 
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
 
83
 
 
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
73
90
 
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
94
111
 
 
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
 
117
 
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
102
 
 
103
 
 
104
 
void vicii_timing_set(machine_timing_t *machine_timing)
 
119
#define VICII_FIRST_DMA_LINE      0x30
 
120
#define VICII_LAST_DMA_LINE       0xf7
 
121
 
 
122
 
 
123
void vicii_timing_set(machine_timing_t *machine_timing, int border_mode)
105
124
{
106
 
    resource_value_t mode;
107
 
 
108
 
    resources_get_value("MachineVideoStandard", (void *)&mode);
109
 
 
110
 
    switch ((int)mode) {
 
125
    int mode;
 
126
 
 
127
    resources_get_int("MachineVideoStandard", &mode);
 
128
 
 
129
    switch (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) {
 
133
          default:
 
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;
 
139
            break;       
 
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;
 
145
            break;
 
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;
 
151
            break;
 
152
        }
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;
128
157
        break;
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) {
 
161
          default:
 
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;
 
167
            break;
 
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;
 
173
            break;
 
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;
 
179
            break;
 
180
        }
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;
146
185
        break;
147
186
      case MACHINE_SYNC_PAL:
148
187
      default:
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) {
 
190
          default:
 
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;
 
196
            break;
 
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;
 
202
            break;
 
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;
 
208
            break;
 
209
        }
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;
165
214
        break;
166
215
    }
167
216
 
 
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;
 
223
 
 
224
   vicii.raster.display_xstart = VICII_40COL_START_PIXEL;
 
225
    vicii.raster.display_xstop = VICII_40COL_STOP_PIXEL;
 
226
 
168
227
    vicii_sprites_init_sprline();
169
228
}
170