aboutsummaryrefslogtreecommitdiff
path: root/c64/cia.h
blob: 8272c25e39eb8aef31d8e0816cd7e67206268fb8 (plain)
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
// cia.h
//
// 20060803 Markku Alén

#ifndef __CIA_H__
#define __CIA_H__ 1

typedef struct __cia_interrupt
{
	int mask;
	int request;
}cia_interrupt_t;

typedef struct __cia_port
{
	int pins;
	int input;
	int output;
	int direction;
}cia_port_t;

#define UPDATE_CIA_PORT_PINS(CIA_PORT)	((CIA_PORT)->pins = ((CIA_PORT)->output & (CIA_PORT)->direction) | ((CIA_PORT)->input & ~((CIA_PORT)->direction)))

typedef struct __cia_timer
{
	int latch;
	int counter;
	int running;
	int toggle_mode;
	int one_shot;
	cia_interrupt_t interrupt;
}cia_timer_t;

typedef struct __cia
{
	cia_port_t port_a, port_b;
	cia_timer_t timer_a, timer_b;
	int inmode_a, inmode_b;
	int irq_pin;
}cia_t;

void cia_init(cia_t *cia);

int cia_read(cia_t *cia, int address);
void cia_write(cia_t *cia, int address, int data);

int cia_a_port_output(cia_t *cia);
int cia_b_port_output(cia_t *cia);

void cia_port_a_input(cia_t *cia, int data);
void cia_port_b_input(cia_t *cia, int data);

void cia_exec(cia_t *cia, unsigned int cycles);

#endif