1 /*
2 * drive-overflow.c
3 *
4 * Written by
5 * Andreas Boose <viceteam@t-online.de>
6 *
7 * This file is part of VICE, the Versatile Commodore Emulator.
8 * See README for copyright notice.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23 * 02111-1307 USA.
24 *
25 */
26
27 #include "vice.h"
28
29 #include "alarm.h"
30 #include "clkguard.h"
31 #include "drive-overflow.h"
32 #include "drive.h"
33 #include "drivetypes.h"
34 #include "interrupt.h"
35 #include "log.h"
36 #include "rotation.h"
37
38
drive_clk_overflow_callback(CLOCK sub,void * data)39 static void drive_clk_overflow_callback(CLOCK sub, void *data)
40 {
41 unsigned int dnr;
42 drive_t *drive;
43
44 dnr = vice_ptr_to_uint(data);
45 drive = drive_context[dnr]->drive;
46
47 drive_context[dnr]->cpu->stop_clk -= sub;
48
49 rotation_overflow_callback(sub, dnr);
50
51 rotation_rotate_disk(drive);
52
53 if (drive->attach_clk > (CLOCK)0) {
54 drive->attach_clk -= sub;
55 }
56 if (drive->detach_clk > (CLOCK)0) {
57 drive->detach_clk -= sub;
58 }
59 if (drive->attach_detach_clk > (CLOCK)0) {
60 drive->attach_detach_clk -= sub;
61 }
62 if (drive->led_last_change_clk > (CLOCK)0) {
63 drive->led_last_change_clk -= sub;
64 }
65 if (drive->led_last_uiupdate_clk > (CLOCK)0) {
66 drive->led_last_uiupdate_clk -= sub;
67 }
68
69 alarm_context_time_warp(drive_context[dnr]->cpu->alarm_context, sub, -1);
70 interrupt_cpu_status_time_warp(drive_context[dnr]->cpu->int_status, sub,
71 -1);
72 }
73
drive_overflow_init(void)74 void drive_overflow_init(void)
75 {
76 unsigned int dnr;
77
78 for (dnr = 0; dnr < DRIVE_NUM; dnr++) {
79 clk_guard_add_callback(drive_context[dnr]->cpu->clk_guard,
80 drive_clk_overflow_callback, uint_to_void_ptr(dnr));
81 }
82 }
83