1 /*
2  * vicii.h - A cycle-exact event-driven MOS6569 (VIC-II) emulation.
3  *
4  * Written by
5  *  Ettore Perazzoli <ettore@comm2000.it>
6  *  Andreas Boose <viceteam@t-online.de>
7  *
8  * This file is part of VICE, the Versatile Commodore Emulator.
9  * See README for copyright notice.
10  *
11  *  This program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2 of the License, or
14  *  (at your option) any later version.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with this program; if not, write to the Free Software
23  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24  *  02111-1307  USA.
25  *
26  */
27 
28 #ifndef VICE_VICII_H
29 #define VICE_VICII_H
30 
31 #include "types.h"
32 
33 struct canvas_refresh_s;
34 struct machine_timing_s;
35 struct raster_s;
36 struct screenshot_s;
37 struct snapshot_s;
38 
39 #define VICII_STANDARD 0
40 #define VICII_EXTENDED 1
41 #define VICII_DTV 2
42 
43 /* VICII border mode defines */
44 #define VICII_NORMAL_BORDERS 0
45 #define VICII_FULL_BORDERS   1
46 #define VICII_DEBUG_BORDERS  2
47 #define VICII_NO_BORDERS     3
48 #define VICII_BORDER_MODE(v) (v << 12)
49 
50 /* VICII model defines (for vicii/) FIXME enum instead? */
51 #define VICII_MODEL_PALG        0
52 #define VICII_MODEL_PALG_OLD    1
53 #define VICII_MODEL_NTSCM       2
54 #define VICII_MODEL_NTSCM_OLD   3
55 #define VICII_MODEL_PALN        4
56 
57 /* VICII model defines (for viciisc/) FIXME enum instead? */
58 /* PAL, 63 cycle, 9 luma, "old" */
59 #define VICII_MODEL_6569    0
60 /* PAL, 63 cycle, 9 luma, "new" */
61 #define VICII_MODEL_8565    1
62 /* PAL, 63 cycle, 5 luma, "old" */
63 #define VICII_MODEL_6569R1  2
64 /* NTSC, 65 cycle, 9 luma, "old" */
65 #define VICII_MODEL_6567    3
66 /* NTSC, 65 cycle, 9 luma, "new" */
67 #define VICII_MODEL_8562    4
68 /* NTSC, 64 cycle, ? luma, "old" */
69 #define VICII_MODEL_6567R56A 5
70 /* PAL-N, 65 cycle, ? luma, "?" */
71 #define VICII_MODEL_6572    6
72 #define VICII_MODEL_NUM 7
73 
74 extern int vicii_resources_init(void);
75 extern int vicii_cmdline_options_init(void);
76 extern struct raster_s *vicii_init(unsigned int flag);
77 extern struct video_canvas_s *vicii_get_canvas(void);
78 
79 extern void vicii_reset(void);
80 extern void vicii_set_light_pen(CLOCK mclk, int state);
81 extern void vicii_trigger_light_pen(CLOCK mclk);
82 extern CLOCK vicii_lightpen_timing(int x, int y);
83 extern void vicii_set_vbank(int new_vbank);
84 extern void vicii_set_ram_base(uint8_t *base);
85 extern void vicii_powerup(void);
86 extern void vicii_set_canvas_refresh(int enable);
87 extern void vicii_reset_registers(void);
88 extern void vicii_update_memory_ptrs_external(void);
89 extern void vicii_handle_pending_alarms_external(int num_write_cycles);
90 extern void vicii_handle_pending_alarms_external_write(void);
91 
92 extern void vicii_screenshot(struct screenshot_s *screenshot);
93 extern void vicii_shutdown(void);
94 extern void vicii_change_timing(struct machine_timing_s *machine_timing, int border_mode);
95 
96 extern int vicii_dump(void);
97 
98 extern void vicii_snapshot_prepare(void);
99 extern int vicii_snapshot_write_module(struct snapshot_s *s);
100 extern int vicii_snapshot_read_module(struct snapshot_s *s);
101 
102 extern void vicii_async_refresh(struct canvas_refresh_s *r);
103 
104 extern void vicii_set_phi1_vbank(int num_vbank);
105 extern void vicii_set_phi2_vbank(int num_vbank);
106 extern void vicii_set_phi1_ram_base(uint8_t *base);
107 extern void vicii_set_phi2_ram_base(uint8_t *base);
108 extern void vicii_set_phi1_addr_options(uint16_t mask, uint16_t offset);
109 extern void vicii_set_phi2_addr_options(uint16_t mask, uint16_t offset);
110 extern void vicii_set_chargen_addr_options(uint16_t mask, uint16_t value);
111 extern void vicii_set_phi1_chargen_addr_options(uint16_t mask, uint16_t value);
112 extern void vicii_set_phi2_chargen_addr_options(uint16_t mask, uint16_t value);
113 
114 /* 8502 specific functions */
115 extern CLOCK vicii_clock_add(CLOCK clock, int amount);
116 extern void vicii_clock_read_stretch(void);
117 extern void vicii_clock_write_stretch(void);
118 extern int vicii_get_half_cycle(void);
119 extern void vicii_memory_refresh_alarm_handler(void);
120 extern int vicii_check_memory_refresh(CLOCK clock);
121 
122 #endif
123