8 static dcpu16_hw_signal_t clock_reset_
;
9 static dcpu16_hw_signal_t clock_cycle_
;
10 static dcpu16_hw_signal_t clock_hwi_
;
11 static struct dcpu16_hw hw_
= {
12 .name_
= "Generic Clock (compatible)",
19 .cycle
= clock_cycle_
,
20 .reset
= clock_reset_
,
21 .data
= (struct clock_
*)NULL
28 DCPU16_WORD interrupt_message
;
32 void clock_reset_(struct dcpu16
*vm
, void *data
) {
33 struct clock_
*clock
= (struct clock_
*)data
;
37 memset(clock
, 0, sizeof *clock
);
41 void clock_cycle_(struct dcpu16
*vm
, void *data
) {
42 struct clock_
*clock
= (struct clock_
*)data
;
44 /* cycle is only called 100000 times per second */
45 /* maximum rate is 60hz / word_max = 3932160 */
51 if (clock
->cycle_
>= clock
->rate
) {
52 /* THIS CHECK IS WRONG, JUST A PLACEHOLDER */
56 if (clock
->interrupt_message
) {
57 if (dcpu16_interrupt(vm
, clock
->interrupt_message
))
58 vm
->warn_cb_("%s: could not send interrupt", hw_
.name_
);
64 void clock_hwi_(struct dcpu16
*vm
, void *data
) {
65 struct clock_
*clock
= (struct clock_
*)data
;
66 DCPU16_WORD reg_a
= vm
->reg
[DCPU16_REG_A
];
67 DCPU16_WORD reg_b
= vm
->reg
[DCPU16_REG_B
];
70 case 0: /* set tick gather rate, 60hz/B */
74 case 1: /* fetch elapsed count since rate was set */
75 vm
->reg
[DCPU16_REG_C
] = clock
->tick
;
79 clock
->interrupt_message
= reg_b
;
84 /* instantitate a new clock */
85 struct dcpu16_hw
*clock_new(struct dcpu16
*vm
) {
88 hw
= calloc(1, sizeof *hw
);
90 vm
->warn_cb_("%s():%s", "calloc", strerror(errno
));
93 memcpy(hw
, &hw_
, sizeof *hw
);
94 hw
->data
= calloc(1, sizeof hw
->data
);
95 if (hw
->data
== NULL
) {
96 vm
->warn_cb_("%s():%s", "calloc", strerror(errno
));
104 void clock_del(struct dcpu16_hw
**hw
) {