Previous 199869 Revisions Next

r20132 Tuesday 8th January, 2013 at 16:17:06 UTC by Carl
[mess] partially implement sb16 mixer
fixes Simcity 2000
[src/mess/machine]isa_sblaster.c isa_sblaster.h

trunk/src/mess/machine/isa_sblaster.c
r20131r20132
715715
716716}
717717
718READ8_MEMBER( sb_device::mixer_r )
718void sb16_device::mixer_set()
719719{
720   ymf262_device *ymf = subdevice<ymf262_device>("ymf262");
721   float lmain = m_mixer.main_vol[0]/248.0;
722   float rmain = m_mixer.main_vol[1]/248.0;
723   m_dacl->set_output_gain(ALL_OUTPUTS, lmain*(m_mixer.dac_vol[0]/248.0));
724   m_dacr->set_output_gain(ALL_OUTPUTS, rmain*(m_mixer.dac_vol[1]/248.0));
725   ymf->set_output_gain(0, lmain*(m_mixer.fm_vol[0]/248.0));
726   ymf->set_output_gain(1, rmain*(m_mixer.fm_vol[1]/248.0));
727   ymf->set_output_gain(2, lmain*(m_mixer.fm_vol[0]/248.0));
728   ymf->set_output_gain(3, rmain*(m_mixer.fm_vol[1]/248.0));
729}
730
731void sb16_device::mixer_reset()
732{
733   m_mixer.status = 0x80;
734   m_mixer.main_vol[0] = 0xc0;
735   m_mixer.main_vol[1] = 0xc0;
736   m_mixer.dac_vol[0] = 0xc0;
737   m_mixer.dac_vol[1] = 0xc0;
738   m_mixer.fm_vol[0] = 0xc0;
739   m_mixer.fm_vol[1] = 0xc0;
740   m_mixer.cd_vol[0] = 0x00;
741   m_mixer.cd_vol[1] = 0x00;
742   m_mixer.line_vol[0] = 0x00;
743   m_mixer.line_vol[1] = 0x00;
744   m_mixer.mic_vol = 0x00;
745   m_mixer.pc_speaker_vol = 0x00;
746   m_mixer.output_ctl = 0x1f;
747   m_mixer.input_ctl[0] = 0x15;
748   m_mixer.input_ctl[1] = 0x0b;
749   m_mixer.input_gain[0] = 0x00;
750   m_mixer.input_gain[1] = 0x00;
751   m_mixer.output_gain[0] = 0x00;
752   m_mixer.output_gain[1] = 0x00;
753   m_mixer.agc = 0x00;
754   m_mixer.treble[0] = 0x80;
755   m_mixer.treble[1] = 0x80;
756   m_mixer.bass[0] = 0x80;
757   m_mixer.bass[1] = 0x80;
758   mixer_set();
759}
760
761READ8_MEMBER( sb16_device::mixer_r )
762{
720763   if(offset == 0)
721      return m_mixer_index;
722   switch(m_mixer_index)
723   {
724      case 0: // reset
725         return 0;
726      default:
727         if(m_dsp.version >= 0x0400)
728         {
729            switch(m_mixer_index)
730            {
731               case 0x82: // irqs
732                  return m_dsp.irq_active;
733            }
734         }
735   }
736   logerror("SB: Unimplemented read mixer command %02x\n", m_mixer_index);
737   return 0;
764      return m_mixer.status;
765   return m_mixer.data;
738766}
739767
740WRITE8_MEMBER( sb_device::mixer_w )
768WRITE8_MEMBER( sb16_device::mixer_w )
741769{
742770   if(offset == 0)
743771   {
744      m_mixer_index = data;
772      switch(data)
773      {
774         case 0x00:
775            mixer_reset();
776            return;
777         case 0x01:
778            m_mixer.data = m_mixer.status;
779            break;
780         case 0x04:
781            m_mixer.data = (m_mixer.dac_vol[0] & 0xf0) | (m_mixer.dac_vol[1] >> 4);
782            break;
783         case 0x0a:
784            m_mixer.data = m_mixer.mic_vol >> 5;
785            break;
786         case 0x22:
787            m_mixer.data = (m_mixer.main_vol[0] & 0xf0) | (m_mixer.main_vol[1] >> 4);
788            break;
789         case 0x26:
790            m_mixer.data = (m_mixer.fm_vol[0] & 0xf0) | (m_mixer.fm_vol[1] >> 4);
791            break;
792         case 0x28:
793            m_mixer.data = (m_mixer.cd_vol[0] & 0xf0) | (m_mixer.cd_vol[1] >> 4);
794            break;
795         case 0x2e:
796            m_mixer.data = (m_mixer.line_vol[0] & 0xf0) | (m_mixer.line_vol[1] >> 4);
797            break;
798         case 0x30:
799         case 0x31:
800            m_mixer.data = m_mixer.main_vol[data & 1];
801            break;
802         case 0x32:
803         case 0x33:
804            m_mixer.data = m_mixer.dac_vol[data & 1];
805            break;
806         case 0x34:
807         case 0x35:
808            m_mixer.data = m_mixer.fm_vol[data & 1];
809            break;
810         case 0x36:
811         case 0x37:
812            m_mixer.data = m_mixer.cd_vol[data & 1];
813            break;
814         case 0x38:
815         case 0x39:
816            m_mixer.data = m_mixer.line_vol[data & 1];
817            break;
818         case 0x3a:
819            m_mixer.data = m_mixer.mic_vol;
820            break;
821         case 0x3b:
822            m_mixer.data = m_mixer.pc_speaker_vol;
823            break;
824         case 0x3c:
825            m_mixer.data = m_mixer.output_ctl;
826            break;
827         case 0x3d:
828         case 0x3e:
829            m_mixer.data = m_mixer.input_ctl[(data + 1) & 1];
830            break;
831         case 0x3f:
832         case 0x40:
833            m_mixer.data = m_mixer.input_gain[(data + 1) & 1];
834            break;
835         case 0x41:
836         case 0x42:
837            m_mixer.data = m_mixer.output_gain[(data + 1) & 1];
838            break;
839         case 0x43:
840            m_mixer.data = m_mixer.agc;
841            break;
842         case 0x44:
843         case 0x45:
844            m_mixer.data = m_mixer.treble[data & 1];
845            break;
846         case 0x46:
847         case 0x47:
848            m_mixer.data = m_mixer.bass[data & 1];
849            break;
850         case 0x80:
851            m_mixer.data = 0x12; // irq5
852            break;
853         case 0x81:
854            m_mixer.data = 0x22;  // dma1&5
855            break;
856         case 0x82:
857            m_mixer.data = m_dsp.irq_active | 0x20;
858            break;
859         default:
860            logerror("SB: Unimplemented mixer index %02x\n", data);
861            m_mixer.status = data | 0x80;
862            m_mixer.data = 0x0a;
863            return;
864      }
865      m_mixer.status = data;
745866      return;
746867   }
747   switch(m_mixer_index)
868   switch(m_mixer.status)
748869   {
749      case 0: // reset
870      case 0x04:
871         m_mixer.dac_vol[0] = (data & 0xf0) | 8;
872         m_mixer.dac_vol[1] = (data << 4) | 8;
873         break;
874      case 0x0a:
875         m_mixer.mic_vol = (data << 5) | 0x18;
876         break;
877      case 0x22:
878         m_mixer.main_vol[0] = (data & 0xf0) | 8;
879         m_mixer.main_vol[1] = (data << 4) | 8;
880         break;
881      case 0x26:
882         m_mixer.fm_vol[0] = (data & 0xf0) | 8;
883         m_mixer.fm_vol[1] = (data << 4) | 8;
884         break;
885      case 0x28:
886         m_mixer.cd_vol[0] = (data & 0xf0) | 8;
887         m_mixer.cd_vol[1] = (data << 4) | 8;
888         break;
889      case 0x2e:
890         m_mixer.line_vol[0] = (data & 0xf0) | 8;
891         m_mixer.line_vol[1] = (data << 4) | 8;
892         break;
893      case 0x30:
894      case 0x31:
895         m_mixer.main_vol[m_mixer.status & 1] = data & 0xf8;
896         break;
897      case 0x32:
898      case 0x33:
899         m_mixer.dac_vol[m_mixer.status & 1] = data & 0xf8;
900         break;
901      case 0x34:
902      case 0x35:
903         m_mixer.fm_vol[m_mixer.status & 1] = data & 0xf8;
904         break;
905      case 0x36:
906      case 0x37:
907         m_mixer.cd_vol[m_mixer.status & 1] = data & 0xf8;
908         break;
909      case 0x38:
910      case 0x39:
911         m_mixer.line_vol[m_mixer.status & 1] = data & 0xf8;
912         break;
913      case 0x3a:
914         m_mixer.mic_vol = data & 0xf8;
915         break;
916      case 0x3b:
917         m_mixer.pc_speaker_vol = data & 0xc0;
918         break;
919      case 0x3c:
920         m_mixer.output_ctl = data & 0x1f;
921         break;
922      case 0x3d:
923      case 0x3e:
924         m_mixer.input_ctl[(m_mixer.status + 1) & 1] = data & 0x7f;
925         break;
926      case 0x3f:
927      case 0x40:
928         m_mixer.input_gain[(m_mixer.status + 1) & 1] = data & 0xc0;
929         break;
930      case 0x41:
931      case 0x42:
932         m_mixer.output_gain[(m_mixer.status + 1) & 1] = data & 0xc0;
933         break;
934      case 0x43:
935         m_mixer.agc = data & 1;
936         break;
937      case 0x44:
938      case 0x45:
939         m_mixer.treble[m_mixer.status & 1] = data & 0xf0;
940         break;
941      case 0x46:
942      case 0x47:
943         m_mixer.bass[m_mixer.status & 1] = data & 0xf0;
944         break;
945      case 0x80:
946      case 0x81:
947         // don't support these yet
948         break;
949      default:
750950         return;
751951   }
752   logerror("SB: Unimplemented write mixer command %02x\n", m_mixer_index);
952   m_mixer.data = data;
953   mixer_set();
753954   return;
754955}
755956
r20131r20132
8371038   m_isa->install_device(                   0x022e, 0x022f, 0, 0, read8_delegate(FUNC(sb_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_rbuf_status_w), this) );
8381039   if(m_dsp.version >= 0x0301)
8391040   {
840      m_isa->install_device(0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb_device::mixer_r), this), write8_delegate(FUNC(sb_device::mixer_w), this));
1041      //m_isa->install_device(0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb8_device::mixer_r), this), write8_delegate(FUNC(sb8_device::mixer_w), this));
8411042      m_isa->install_device(subdevice("ymf262"),    0x0388, 0x038b, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
8421043      m_isa->install_device(subdevice("ymf262"),    0x0220, 0x0223, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
8431044      m_isa->install_device(subdevice("ymf262"),    0x0228, 0x0229, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
r20131r20132
8741075void sb16_device::device_start()
8751076{
8761077   m_isa->install_device(                   0x0200, 0x0207, 0, 0, read8_delegate(FUNC(pc_joy_device::joy_port_r), subdevice<pc_joy_device>("joy")), write8_delegate(FUNC(pc_joy_device::joy_port_w), subdevice<pc_joy_device>("joy")));
877   m_isa->install_device(                   0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb_device::mixer_r), this), write8_delegate(FUNC(sb_device::mixer_w), this));
1078   m_isa->install_device(                   0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb16_device::mixer_r), this), write8_delegate(FUNC(sb16_device::mixer_w), this));
8781079   m_isa->install_device(                   0x0226, 0x0227, 0, 0, read8_delegate(FUNC(sb_device::dsp_reset_r), this), write8_delegate(FUNC(sb_device::dsp_reset_w), this));
8791080   m_isa->install_device(                   0x022a, 0x022b, 0, 0, read8_delegate(FUNC(sb_device::dsp_data_r), this), write8_delegate(FUNC(sb_device::dsp_data_w), this) );
8801081   m_isa->install_device(                   0x022c, 0x022d, 0, 0, read8_delegate(FUNC(sb_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_cmd_w), this) );
r20131r20132
9131114    m_dsp.rbuf_status = 0;
9141115   m_dsp.frequency = 8000; // per stereo-fx
9151116   m_dsp.irq_active = 0;
916   m_mixer_index = 0;
9171117   m_dsp.dma_no_irq = false;
1118   mixer_reset();
9181119}
9191120
9201121UINT8 sb_device::dack_r(int line)
trunk/src/mess/machine/isa_sblaster.h
r20131r20132
5353   UINT8 adpcm_count;
5454};
5555
56struct sb8_mixer
57{
58   UINT8 status;
59   UINT8 main_vol;
60   UINT8 dac_vol;
61   UINT8 fm_vol;
62   UINT8 mic_vol;
63   UINT8 in_filter;
64   UINT8 stereo_sel;
65   UINT8 cd_vol;
66   UINT8 line_vol;
67};
68
69struct sb16_mixer
70{
71   UINT8 data;
72   UINT8 status;
73   UINT8 main_vol[2];
74   UINT8 dac_vol[2];
75   UINT8 fm_vol[2];
76   UINT8 cd_vol[2];
77   UINT8 line_vol[2];
78   UINT8 mic_vol;
79   UINT8 pc_speaker_vol;
80   UINT8 output_ctl;
81   UINT8 input_ctl[2];
82   UINT8 input_gain[2];
83   UINT8 output_gain[2];
84   UINT8 agc;
85   UINT8 treble[2];
86   UINT8 bass[2];
87};
88
5689// ======================> sb8_device (parent)
5790
5891class sb_device :
r20131r20132
79112        DECLARE_READ8_MEMBER(dsp_wbuf_status_r);
80113        DECLARE_WRITE8_MEMBER(dsp_rbuf_status_w);
81114        DECLARE_WRITE8_MEMBER(dsp_cmd_w);
82      DECLARE_READ8_MEMBER(mixer_r);
83      DECLARE_WRITE8_MEMBER(mixer_w);
84115
85116protected:
86117        // device-level overrides
r20131r20132
91122      virtual void drq16_w(int state) { }
92123      virtual void drq_w(int state) { }
93124      virtual void irq_w(int state, int source) { }
125      virtual void mixer_reset() {}
94126      void adpcm_decode(UINT8 sample, int size);
95127
96128        struct sb8_dsp_state m_dsp;
97129        UINT8 m_dack_out;
98      UINT8 m_mixer_index;
99130
100131        emu_timer *m_timer;
101132};
r20131r20132
154185        sb16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name);
155186        DECLARE_READ8_MEMBER(mpu401_r);
156187        DECLARE_WRITE8_MEMBER(mpu401_w);
188      DECLARE_READ8_MEMBER(mixer_r);
189      DECLARE_WRITE8_MEMBER(mixer_w);
157190protected:
158191        virtual void device_start();
159192      virtual UINT16 dack16_r(int line);
r20131r20132
163196      virtual void drq16_w(int state) { m_isa->drq5_w(state); }
164197      virtual void drq_w(int state) { m_isa->drq1_w(state); }
165198      virtual void irq_w(int state, int source) { (state?m_dsp.irq_active|=source:m_dsp.irq_active&=~source); m_isa->irq5_w(m_dsp.irq_active);  }
199      virtual void mixer_reset();
200      void mixer_set();
166201private:
167202      UINT8 m_mpu_queue[16];
168203      UINT8 m_tail;
169204      UINT8 m_head;
205      struct sb16_mixer m_mixer;
170206};
171207
172208class isa16_sblaster16_device : public sb16_device

Previous 199869 Revisions Next


© 1997-2024 The MAME Team