Previous 15994 Revisions Next

r15737 Friday 3rd August, 2012 at 21:51:07 UTC by Curt Coder
[ABC800] Cassette WIP. (nw)
[src/mess/drivers]abc80x.c
[src/mess/includes]abc80x.h

src/mess/includes/abc80x.h
r15736r15737
5151#define ABC800_CHAR_WIDTH   6
5252#define ABC800_CCLK         ABC800_X01/ABC800_CHAR_WIDTH
5353
54#define SCREEN_TAG      "screen"
55#define Z80_TAG         "z80"
56#define E0516_TAG      "j13"
57#define MC6845_TAG      "b12"
58#define SAA5052_TAG      "5c"
59#define Z80CTC_TAG      "z80ctc"
60#define Z80SIO_TAG      "z80sio"
61#define Z80DART_TAG      "z80dart"
62#define ABCBUS_TAG      "abcbus"
54#define SCREEN_TAG         "screen"
55#define Z80_TAG            "z80"
56#define E0516_TAG         "j13"
57#define MC6845_TAG         "b12"
58#define SAA5052_TAG         "5c"
59#define Z80CTC_TAG         "z80ctc"
60#define Z80SIO_TAG         "z80sio"
61#define Z80DART_TAG         "z80dart"
62#define ABCBUS_TAG         "abcbus"
63#define TIMER_CASSETTE_TAG   "cass"
6364
6465
65
6666//**************************************************************************
6767//  TYPE DEFINITIONS
6868//**************************************************************************
r15736r15737
7979        m_dart(*this, Z80DART_TAG),
8080        m_sio(*this, Z80SIO_TAG),
8181        m_discrete(*this, "discrete"),
82        m_cassette(*this, CASSETTE_TAG),
8283        m_ram(*this, RAM_TAG),
84        m_cassette_timer(*this, TIMER_CASSETTE_TAG),
8385        m_video_ram(*this, "video_ram"),
84        m_char_ram(*this, "char_ram")
86        m_char_ram(*this, "char_ram"),
87        m_ctc_z0(0),
88        m_sio_rxdb(1),
89        m_sio_txcb(0),
90        m_sio_txdb(1),
91        m_sio_rtsb(1),
92        m_dfd_out(0),
93        m_tape_ctr(4)
8594   { }
8695
8796   required_device<cpu_device> m_maincpu;
r15736r15737
8998   required_device<z80dart_device> m_dart;
9099   required_device<z80dart_device> m_sio;
91100   optional_device<device_t> m_discrete;
101   required_device<cassette_image_device> m_cassette;
92102   required_device<ram_device> m_ram;
103   required_device<timer_device> m_cassette_timer;
93104
94105   virtual void machine_start();
95106   virtual void machine_reset();
r15736r15737
97108   virtual void video_start();
98109
99110   void bankswitch();
111   void clock_cassette(int state);
100112
101113   DECLARE_READ8_MEMBER( pling_r );
102114   DECLARE_READ_LINE_MEMBER( keyboard_txd_r );
r15736r15737
109121   DECLARE_WRITE_LINE_MEMBER( ctc_z0_w );
110122   DECLARE_WRITE_LINE_MEMBER( ctc_z1_w );
111123   DECLARE_WRITE_LINE_MEMBER( ctc_z2_w );
124   DECLARE_READ_LINE_MEMBER( sio_rxdb_r );
125   DECLARE_WRITE_LINE_MEMBER( sio_txdb_w );
126   DECLARE_WRITE_LINE_MEMBER( sio_dtrb_w );
127   DECLARE_WRITE_LINE_MEMBER( sio_rtsb_w );
112128
113129   // cpu state
114130   int m_fetch_charram;         // opcode fetched from character RAM region (0x7800-0x7fff)
r15736r15737
126142
127143   // serial state
128144   UINT8 m_sb;
145   int m_ctc_z0;
146   int m_sio_rxdb;
129147   int m_sio_rxcb;
130148   int m_sio_txcb;
149   int m_sio_txdb;
150   int m_sio_rtsb;
151   int m_dfd_out;
152   int m_dfd_in;
153   int m_tape_ctr;
131154};
132155
133156class abc800m_state : public abc800_state
src/mess/drivers/abc80x.c
r15736r15737
646646{
647647   if (BIT(m_sb, 2))
648648   {
649      // connected to SIO/2 TxCA, CTC CLK/TRG3
650649      z80dart_txca_w(m_sio, state);
651650      z80ctc_trg3_w(m_ctc, state);
652651   }
653652
654   // connected to SIO/2 RxCB through a thingy
655   //m_sio_rxcb = ?
656   z80dart_rxcb_w(m_sio, m_sio_rxcb);
657
658   // connected to SIO/2 TxCB through a JK divide by 2
659   m_sio_txcb = !m_sio_txcb;
660   z80dart_txcb_w(m_sio, m_sio_txcb);
653   clock_cassette(state);
661654}
662655
663656WRITE_LINE_MEMBER( abc800_state::ctc_z1_w )
664657{
665658   if (BIT(m_sb, 3))
666659   {
667      // connected to SIO/2 RxCA
668660      z80dart_rxca_w(m_sio, state);
669661   }
670662
671663   if (BIT(m_sb, 4))
672664   {
673      // connected to SIO/2 TxCA, CTC CLK/TRG3
674665      z80dart_txca_w(m_sio, state);
675666      z80ctc_trg3_w(m_ctc, state);
676667   }
r15736r15737
678669
679670WRITE_LINE_MEMBER( abc800_state::ctc_z2_w )
680671{
681   // connected to DART channel A clock inputs
682672   z80dart_rxca_w(m_dart, state);
683673   z80dart_txca_w(m_dart, state);
684674}
685675
686676static Z80CTC_INTERFACE( ctc_intf )
687677{
688   0,                                      // timer disables
689   DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),   // interrupt handler
678   0,                                         // timer disables
679   DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),      // interrupt handler
690680   DEVCB_DRIVER_LINE_MEMBER(abc800_state, ctc_z0_w),   // ZC/TO0 callback
691681   DEVCB_DRIVER_LINE_MEMBER(abc800_state, ctc_z1_w),   // ZC/TO1 callback
692682   DEVCB_DRIVER_LINE_MEMBER(abc800_state, ctc_z2_w),   // ZC/TO2 callback
r15736r15737
697687//  Z80DART_INTERFACE( sio_intf )
698688//-------------------------------------------------
699689
700static READ_LINE_DEVICE_HANDLER( dfd_in_r )
690void abc800_state::clock_cassette(int state)
701691{
702   return dynamic_cast<cassette_image_device *>(device)->input() > 0.0;
692   if (m_ctc_z0 && !state)
693   {
694      m_sio_txcb = !m_sio_txcb;
695      z80dart_txcb_w(m_sio, !m_sio_txcb);
696
697      if (m_sio_txdb || m_sio_txcb)
698      {
699         m_dfd_out = !m_dfd_out;
700         m_cassette->output((m_dfd_out & m_sio_rtsb) ? +1.0 : -1.0);
701      }
702
703      if (m_tape_ctr < 15)
704      {
705         m_tape_ctr++;
706      }
707
708      z80dart_rxcb_w(m_sio, m_tape_ctr == 15);
709   }
710
711   m_ctc_z0 = state;
703712}
704713
705static WRITE_LINE_DEVICE_HANDLER( dfd_out_w )
714static TIMER_DEVICE_CALLBACK( cassette_tick )
706715{
707   dynamic_cast<cassette_image_device *>(device)->output(state ? +1.0 : -1.0);
716   abc800_state *state = timer.machine().driver_data<abc800_state>();
717
718   int dfd_in = state->m_cassette->input() > 0;
719
720   if (state->m_dfd_in && !dfd_in)
721   {
722      state->m_sio_rxdb = !(state->m_tape_ctr == 15);
723   }
724   
725   if (!dfd_in && (state->m_tape_ctr == 15))
726   {
727      state->m_tape_ctr = 4;
728   }
729
730   state->m_dfd_in = dfd_in;
708731}
709732
710static WRITE_LINE_DEVICE_HANDLER( motor_control_w )
733READ_LINE_MEMBER( abc800_state::sio_rxdb_r )
711734{
712   dynamic_cast<cassette_image_device *>(device)->change_state(state ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,CASSETTE_MASK_MOTOR);
735   return m_sio_rxdb;
713736}
714737
738WRITE_LINE_MEMBER( abc800_state::sio_txdb_w )
739{
740   m_sio_txdb = state;
741}
742
743WRITE_LINE_MEMBER( abc800_state::sio_dtrb_w )
744{
745   if (state)
746   {
747      m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
748      m_cassette_timer->enable(true);
749   }
750   else
751   {
752      m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
753      m_cassette_timer->enable(false);
754   }
755}
756
757WRITE_LINE_MEMBER( abc800_state::sio_rtsb_w )
758{
759   m_sio_rtsb = state;
760
761   if (!m_sio_rtsb)
762   {
763      m_cassette->output(-1.0);
764   }
765}
766
715767static Z80DART_INTERFACE( sio_intf )
716768{
717769   0, 0, 0, 0,
r15736r15737
723775   DEVCB_NULL,
724776   DEVCB_NULL,
725777
726   DEVCB_DEVICE_LINE(CASSETTE_TAG, dfd_in_r),
727   DEVCB_DEVICE_LINE(CASSETTE_TAG, dfd_out_w),
728   DEVCB_DEVICE_LINE(CASSETTE_TAG, motor_control_w),
778   DEVCB_DRIVER_LINE_MEMBER(abc800_state, sio_rxdb_r),
779   DEVCB_DRIVER_LINE_MEMBER(abc800_state, sio_txdb_w),
780   DEVCB_DRIVER_LINE_MEMBER(abc800_state, sio_dtrb_w),
781   DEVCB_DRIVER_LINE_MEMBER(abc800_state, sio_rtsb_w),
729782   DEVCB_NULL,
730783   DEVCB_NULL,
731   DEVCB_NULL,
732784
733785   DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0)
734786};
r15736r15737
916968   // register for state saving
917969   save_item(NAME(m_fetch_charram));
918970   save_item(NAME(m_pling));
971   save_item(NAME(m_sb));
972   save_item(NAME(m_ctc_z0));
973   save_item(NAME(m_sio_rxdb));
919974   save_item(NAME(m_sio_rxcb));
920975   save_item(NAME(m_sio_txcb));
976   save_item(NAME(m_sio_txdb));
977   save_item(NAME(m_sio_rtsb));
978   save_item(NAME(m_dfd_out));
979   save_item(NAME(m_dfd_in));
980   save_item(NAME(m_tape_ctr));
921981}
922982
923983
r15736r15737
9481008   // register for state saving
9491009   save_item(NAME(m_lrs));
9501010   save_item(NAME(m_pling));
1011   save_item(NAME(m_sb));
1012   save_item(NAME(m_ctc_z0));
1013   save_item(NAME(m_sio_rxdb));
1014   save_item(NAME(m_sio_rxcb));
1015   save_item(NAME(m_sio_txcb));
1016   save_item(NAME(m_sio_txdb));
1017   save_item(NAME(m_sio_rtsb));
1018   save_item(NAME(m_dfd_out));
1019   save_item(NAME(m_dfd_in));
1020   save_item(NAME(m_tape_ctr));
9511021}
9521022
9531023
r15736r15737
10051075   save_item(NAME(m_eme));
10061076   save_item(NAME(m_fetch_charram));
10071077   save_item(NAME(m_map));
1078   save_item(NAME(m_ctc_z0));
1079   save_item(NAME(m_sio_rxdb));
1080   save_item(NAME(m_sio_rxcb));
1081   save_item(NAME(m_sio_txcb));
1082   save_item(NAME(m_sio_txdb));
1083   save_item(NAME(m_sio_rtsb));
1084   save_item(NAME(m_dfd_out));
1085   save_item(NAME(m_dfd_in));
1086   save_item(NAME(m_tape_ctr));
10081087}
10091088
10101089
r15736r15737
10701149   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
10711150
10721151   // peripheral hardware
1152   MCFG_TIMER_ADD_PERIODIC(TIMER_CASSETTE_TAG, cassette_tick, attotime::from_hz(44100))
10731153   MCFG_Z80CTC_ADD(Z80CTC_TAG, ABC800_X01/2/2, ctc_intf)
10741154   MCFG_TIMER_ADD_PERIODIC("ctc", ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))
10751155   MCFG_Z80SIO2_ADD(Z80SIO_TAG, ABC800_X01/2/2, sio_intf)
r15736r15737
11131193   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
11141194
11151195   // peripheral hardware
1196   MCFG_TIMER_ADD_PERIODIC(TIMER_CASSETTE_TAG, cassette_tick, attotime::from_hz(44100))
11161197   MCFG_Z80CTC_ADD(Z80CTC_TAG, ABC800_X01/2/2, ctc_intf)
11171198   MCFG_TIMER_ADD_PERIODIC("ctc", ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))
11181199   MCFG_Z80SIO2_ADD(Z80SIO_TAG, ABC800_X01/2/2, sio_intf)
r15736r15737
11561237   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
11571238
11581239   // peripheral hardware
1240   MCFG_TIMER_ADD_PERIODIC(TIMER_CASSETTE_TAG, cassette_tick, attotime::from_hz(44100))
11591241   MCFG_Z80CTC_ADD(Z80CTC_TAG, ABC800_X01/2/2, ctc_intf)
11601242   MCFG_TIMER_ADD_PERIODIC("ctc", ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))
11611243   MCFG_Z80SIO2_ADD(Z80SIO_TAG, ABC800_X01/2/2, sio_intf)
r15736r15737
11891271   MCFG_FRAGMENT_ADD(abc806_video)
11901272
11911273   // peripheral hardware
1274   MCFG_TIMER_ADD_PERIODIC(TIMER_CASSETTE_TAG, cassette_tick, attotime::from_hz(44100))
11921275   MCFG_E0516_ADD(E0516_TAG, ABC806_X02)
11931276   MCFG_Z80CTC_ADD(Z80CTC_TAG, ABC800_X01/2/2, ctc_intf)
11941277   MCFG_TIMER_ADD_PERIODIC("ctc", ctc_tick, attotime::from_hz(ABC800_X01/2/2/2))

Previous 15994 Revisions Next


© 1998-2018 The MESS Team