1 // Devices.h - description. -*- C++ -*-
3 // Copyright (C) 1999, 2000 Red Hat.
4 // This file is part of SID and is licensed under the GPL.
5 // See the file COPYING.SID for conditions for redistribution.
8 #define DEVICES_DEF_H 1
12 #include <sidpinutil.h>
13 #include <sidbusutil.h>
14 #include <sidattrutil.h>
15 #include <sidcomputil.h>
19 using namespace sidutil;
21 class DeviceDriver : public virtual component,
22 public fixed_attribute_map_component,
23 public fixed_bus_map_component,
24 public fixed_accessor_map_component,
25 public no_relation_component,
26 public fixed_pin_map_component
32 int wc; // for writing strings
35 int rc; // for reading strings
39 output_pin scheduler_advance_pin;
41 class intr_pin : public binary_input_pin {
45 intr_pin() { driver = 0; }
47 void init( DeviceDriver *me ) { driver = me; set_active_high(); }
49 void driven( host_int_4 val ) throw ( ) {
52 driver->intrHandler( val );
62 friend class intr_pin;
65 void intrHandler( int val );
67 class WriteTrigger : public input_pin {
71 WriteTrigger() { driver = 0; }
73 void init(DeviceDriver *owner) { driver = owner; }
75 void driven( host_int_4 val ) throw ( ) {
80 driver->write( (char *) str_addr );
88 friend class WriteTrigger;
89 WriteTrigger wtrigger;
94 add_pin( "sched-advance", &scheduler_advance_pin );
96 add_pin( "INTR", &intr );
99 add_pin( "write-trigger", &wtrigger );
100 wtrigger.init( this );
102 add_accessor( "Bus", &bus );
105 add_attribute( "interrupt-count", &irq_cnt );
112 void write( char *s );
113 int read( char *buf );
118 class SerialSink : public virtual component,
119 public fixed_attribute_map_component,
120 public no_bus_component,
121 public no_accessor_component,
122 public no_relation_component,
123 public fixed_pin_map_component
127 callback_pin<SerialSink> sin;
128 friend class callback_pin<SerialSink>;
130 unsigned ldisc; // Line Control Reg
134 EVEN_PARITY = 0x10 // Matches bit in LCR
137 int checkParity( unsigned val, int nbits, enum parity p ) const;
139 void echo( host_int_4 val );
143 SerialSink() : sin( this, &SerialSink::echo ) {
144 add_pin( "Sin", &sin );
147 add_attribute( "line-discipline", &ldisc );
153 class Main : public virtual component,
154 public no_attribute_component,
155 public fixed_bus_map_component,
156 public fixed_accessor_map_component,
157 public no_relation_component,
158 public fixed_pin_map_component
167 class activity_pin_t: public input_pin {
171 activity_pin_t(Main* h): host(h) {}
173 void driven() throw ( ){
177 host->shutdown.drive( 1 );
185 friend class activity_pin_t;
186 activity_pin_t activity_pin;
192 Main() : activity_pin(this) {
193 add_pin( "perform-activity", &activity_pin );
194 add_pin( "shutdown-status", &shutdown );
195 add_pin( "source", &source );
196 add_pin( "driver-trigger", &wtrigger );
198 add_accessor( "Bus", &bus );
204 #endif // DEVICES_DEF_H