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