1 /*
2  *  KCemu -- The emulator for the KC85 homecomputer series and much more.
3  *  Copyright (C) 1997-2010 Torsten Paul
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License along
16  *  with this program; if not, write to the Free Software Foundation, Inc.,
17  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #include <ctype.h>
21 
22 #include "kc/system.h"
23 
24 #include "kc/z80.h"
25 #include "kc/fdc9.h"
26 
27 #include "libdbg/dbg.h"
28 
FDC9(void)29 FDC9::FDC9(void)
30 {
31 }
32 
~FDC9(void)33 FDC9::~FDC9(void)
34 {
35 }
36 
37 long long
get_counter()38 FDC9::get_counter()
39 {
40   return z80->getCounter();
41 }
42 
43 void
add_callback(unsigned long long offset,Callback * cb,void * data)44 FDC9::add_callback(unsigned long long offset, Callback *cb, void *data)
45 {
46   z80->addCallback(offset, cb, data);
47 }
48 
49 byte_t
in(word_t addr)50 FDC9::in(word_t addr)
51 {
52   byte_t val = 0;
53 
54   switch (addr & 0xff)
55     {
56     case 0x40:
57       val = get_msr();
58       DBG(2, form("KCemu/FDC/in_F0",
59                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
60                   addr, val, isprint(val) ? val : '.'));
61       break;
62     case 0x41:
63       val = in_data(addr);
64       DBG(2, form("KCemu/FDC/in_F1",
65                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
66                   addr, val, isprint(val) ? val : '.'));
67       break;
68     case 0x42:
69       val = read_byte();
70       DBG(2, form("KCemu/FDC/in_F2",
71                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
72                   addr, val, isprint(val) ? val : '.'));
73       break;
74     case 0x44:
75       val = get_input_gate();
76       DBG(2, form("KCemu/FDC/in_F4",
77                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
78                   addr, val, isprint(val) ? val : '.'));
79       break;
80     case 0x46:
81       val = 0x00;
82       DBG(2, form("KCemu/FDC/in_F6",
83                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
84                   addr, val, isprint(val) ? val : '.'));
85       break;
86     case 0x48:
87       val = 0x00;
88       DBG(2, form("KCemu/FDC/in_F8",
89                   "FDC::in(): addr = %04x, val = %02x [%c]\n",
90                   addr, val, isprint(val) ? val : '.'));
91       break;
92     }
93 
94   DBG(2, form("KCemu/FDC/in",
95               "FDC::in(): addr = %04x, val = %02x\n",
96               addr, val));
97 
98   return val;
99 }
100 
101 void
out(word_t addr,byte_t val)102 FDC9::out(word_t addr, byte_t val)
103 {
104   switch (addr & 0xff)
105     {
106     case 0x41:
107       DBG(2, form("KCemu/FDC/out_F1",
108                   "FDC::out(): addr = %04x, val = %02x [%c]\n",
109                   addr, val, isprint(val) ? val : '.'));
110       out_data(addr, val);
111       break;
112     case 0x42:
113       DBG(2, form("KCemu/FDC/out_F2",
114                   "FDC::out(): addr = %04x, val = %02x [%c]\n",
115                   addr, val, isprint(val) ? val : '.'));
116       write_byte(val);
117       break;
118     case 0x46:
119       DBG(2, form("KCemu/FDC/out_F6",
120                   "FDC::out(): addr = %04x, val = %02x [%c]\n",
121                   addr, val, isprint(val) ? val : '.'));
122       break;
123     case 0x48:
124       DBG(2, form("KCemu/FDC/out_F8",
125                   "FDC::out(): TC %02x\n",
126                   val));
127       if (val == 0x00)
128 	set_state(FDC_STATE_IDLE);
129       if (val == 0x11)
130 	set_state(FDC_STATE_RESULT);
131 
132       set_input_gate(0x40, 0x00);
133       break;
134     default:
135       DBG(2, form("KCemu/FDC/out_unhandled",
136                   "FDC::out(): addr = %04x, val = %02x [%c]\n",
137                   addr, val, isprint(val) ? val : '.'));
138       break;
139     }
140 }
141