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