Previous 199869 Revisions Next

r45086 Sunday 21st February, 2016 at 09:52:41 UTC by Sandro Ronco
Convert avigo.cpp, mstation.cpp and rex6000.cpp to use bankdev. (nw)
[src/mame/drivers]avigo.cpp mstation.cpp rex6000.cpp
[src/mame/includes]avigo.h

trunk/src/mame/drivers/avigo.cpp
r253597r253598
7777#define LOG(x) do { if (AVIGO_LOG) logerror x; } while (0)
7878
7979
80/* memory 0x0000-0x03fff */
81READ8_MEMBER(avigo_state::flash_0x0000_read_handler)
82{
83   return m_flashes[0]->read(offset);
84}
85
86/* memory 0x0000-0x03fff */
87WRITE8_MEMBER(avigo_state::flash_0x0000_write_handler)
88{
89   m_flashes[0]->write(offset, data);
90}
91
92/* memory 0x04000-0x07fff */
93READ8_MEMBER(avigo_state::flash_0x4000_read_handler)
94{
95   return m_flashes[m_flash_at_0x4000]->read((m_bank1_l<<14) | offset);
96}
97
98/* memory 0x04000-0x07fff */
99WRITE8_MEMBER(avigo_state::flash_0x4000_write_handler)
100{
101   m_flashes[m_flash_at_0x4000]->write((m_bank1_l<<14) | offset, data);
102}
103
104/* memory 0x08000-0x0bfff */
105READ8_MEMBER(avigo_state::flash_0x8000_read_handler)
106{
107   return m_flashes[m_flash_at_0x8000]->read((m_bank2_l<<14) | offset);
108}
109
110/* memory 0x08000-0x0bfff */
111WRITE8_MEMBER(avigo_state::flash_0x8000_write_handler)
112{
113   m_flashes[m_flash_at_0x8000]->write((m_bank2_l<<14) | offset, data);
114}
115
116
11780/*
11881    IRQ bits (port 3) ordered by priority:
11982
r253597r253598
150113//#endif
151114}
152115
153void avigo_state::refresh_memory(UINT8 bank, UINT8 chip_select)
154{
155   address_space& space = m_maincpu->space(AS_PROGRAM);
156   int &active_flash = (bank == 1 ? m_flash_at_0x4000 : m_flash_at_0x8000);
157   char bank_tag[6];
158
159   LOG(("Chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff));
160
161   switch (chip_select)
162   {
163      case 0x06:  // videoram
164         space.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, read8_delegate(FUNC(avigo_state::vid_memory_r), this), write8_delegate(FUNC(avigo_state::vid_memory_w), this));
165         active_flash = -1;
166         break;
167
168      case 0x01: // banked RAM
169         sprintf(bank_tag,"bank%d", bank);
170         membank(bank_tag)->set_base(m_ram_base + (((bank == 1 ? m_bank1_l : m_bank2_l) & 0x07)<<14));
171         space.install_readwrite_bank (bank * 0x4000, bank * 0x4000 + 0x3fff, bank_tag);
172         active_flash = -1;
173         break;
174
175      case 0x00:  // flash 0
176      case 0x03:  // flash 1
177      case 0x05:  // flash 2
178      case 0x07:  // flash 0
179         if (active_flash < 0)   // to avoid useless calls to install_readwrite_handler that cause slowdowns
180         {
181            if (bank == 1)
182               space.install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(avigo_state::flash_0x4000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x4000_write_handler), this));
183            else
184               space.install_readwrite_handler(0x8000, 0xbfff, read8_delegate(FUNC(avigo_state::flash_0x8000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x8000_write_handler), this));
185         }
186
187         switch (chip_select)
188         {
189            case 0x00:
190            case 0x07: active_flash = 0; break;
191            case 0x03: active_flash = 1; break;
192            case 0x05: active_flash = 2; break;
193         }
194         break;
195
196      default:
197         logerror("Unknown chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff);
198         space.unmap_readwrite(bank * 0x4000, bank * 0x4000 + 0x3fff);
199         active_flash = -1;
200         break;
201   }
202}
203
204
205116WRITE_LINE_MEMBER( avigo_state::com_interrupt )
206117{
207118   LOG(("com int\r\n"));
r253597r253598
218129
219130void avigo_state::machine_reset()
220131{
221   /* if is a cold start initialize flash contents */
222   if (!m_warm_start)
223   {
224      memcpy(m_flashes[0]->space().get_read_ptr(0), memregion("bios")->base() + 0x000000, 0x100000);
225      memcpy(m_flashes[1]->space().get_read_ptr(0), memregion("bios")->base() + 0x100000, 0x100000);
226   }
227
228132   m_irq = 0;
229133   m_bank1_l = 0;
230134   m_bank1_h = 0;
231135   m_bank2_l = 0;
232136   m_bank2_h = 0;
233   m_flash_at_0x4000 = -1;
234   m_flash_at_0x8000 = -1;
235137
236   refresh_memory(1, m_bank1_h & 0x07);
237   refresh_memory(2, m_bank2_h & 0x07);
138   m_bankdev1->set_bank(0);
139   m_bankdev2->set_bank(0);
238140}
239141
240142void avigo_state::machine_start()
241143{
242   m_ram_base = (UINT8*)m_ram->pointer();
243
244144   // bank3 always first ram bank
245   membank("bank3")->set_base(m_ram_base);
145   membank("bank2")->set_base(m_nvram);
246146
247   /* keep machine pointers to flash devices */
248   m_flashes[0] = machine().device<intelfsh8_device>("flash0");
249   m_flashes[1] = machine().device<intelfsh8_device>("flash1");
250   m_flashes[2] = machine().device<intelfsh8_device>("flash2");
251
252   machine().device<nvram_device>("nvram")->set_base(m_ram_base, m_ram->size());
253147   m_warm_start = 1;
254148
255149   // register for state saving
r253597r253598
261155   save_item(NAME(m_bank1_l));
262156   save_item(NAME(m_bank1_h));
263157   save_item(NAME(m_ad_control_status));
264   save_item(NAME(m_flash_at_0x4000));
265   save_item(NAME(m_flash_at_0x8000));
266158   save_item(NAME(m_ad_value));
267159   save_item(NAME(m_screen_column));
268160   save_item(NAME(m_warm_start));
161}
269162
270   // save all flash contents
271   save_pointer(NAME((UINT8*)m_flashes[0]->space().get_read_ptr(0)), 0x100000);
272   save_pointer(NAME((UINT8*)m_flashes[1]->space().get_read_ptr(0)), 0x100000);
273   save_pointer(NAME((UINT8*)m_flashes[2]->space().get_read_ptr(0)), 0x100000);
163static ADDRESS_MAP_START(avigo_banked_map, AS_PROGRAM, 8, avigo_state)
164   AM_RANGE(0x0000000, 0x00fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write)
165   AM_RANGE(0x0400000, 0x041ffff) AM_MIRROR(0x03e0000) AM_RAM AM_SHARE("nvram")
274166
275   // register postload callback
276   machine().save().register_postload(save_prepost_delegate(FUNC(avigo_state::postload), this));
277}
167   AM_RANGE(0x0c00000, 0x0cfffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash1", intelfsh8_device, read, write)
168   AM_RANGE(0x1400000, 0x14fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash2", intelfsh8_device, read, write)
169   AM_RANGE(0x1c00000, 0x1cfffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write)
278170
279void avigo_state::postload()
280{
281   // refresh the bankswitch
282   refresh_memory(1, m_bank1_h & 0x07);
283   refresh_memory(2, m_bank2_h & 0x07);
284}
171   AM_RANGE(0x1800000, 0x1803fff) AM_MIRROR(0x03fc000) AM_READWRITE(vid_memory_r, vid_memory_w)
172ADDRESS_MAP_END
285173
286174static ADDRESS_MAP_START( avigo_mem , AS_PROGRAM, 8, avigo_state)
287   AM_RANGE(0x0000, 0x3fff) AM_READWRITE(flash_0x0000_read_handler, flash_0x0000_write_handler)
288   AM_RANGE(0x4000, 0x7fff) AM_READWRITE_BANK("bank1")
289   AM_RANGE(0x8000, 0xbfff) AM_READWRITE_BANK("bank2")
290   AM_RANGE(0xc000, 0xffff) AM_READWRITE_BANK("bank3")
175   AM_RANGE(0x0000, 0x3fff) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write)
176   AM_RANGE(0x4000, 0x7fff) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8)
177   AM_RANGE(0x8000, 0xbfff) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8)
178   AM_RANGE(0xc000, 0xffff) AM_RAMBANK("bank2")
291179ADDRESS_MAP_END
292180
293181
r253597r253598
378266      m_bank1_l = data & 0x3f;
379267   }
380268
381   refresh_memory(1, m_bank1_h & 0x07);
269   m_bankdev1->set_bank(((m_bank1_h & 0x07) << 8) | m_bank1_l);
382270}
383271
384272WRITE8_MEMBER(avigo_state::bank2_w)
r253597r253598
394282      m_bank2_l = data & 0x3f;
395283   }
396284
397   refresh_memory(2, m_bank2_h & 0x07);
285   m_bankdev2->set_bank(((m_bank2_h & 0x07) << 8) | m_bank2_l);
398286}
399287
400288READ8_MEMBER(avigo_state::ad_control_status_r)
r253597r253598
775663};
776664
777665static GFXDECODE_START( avigo )
778   GFXDECODE_ENTRY( "bios", 0x08992, avigo_charlayout, 0, 1 )
779   GFXDECODE_ENTRY( "bios", 0x0c020, avigo_8_by_14, 0, 1 )
780   GFXDECODE_ENTRY( "bios", 0x0c020, avigo_16_by_15, 0, 1 )
781   GFXDECODE_ENTRY( "bios", 0x14020, avigo_15_by_16, 0, 1 )
782   GFXDECODE_ENTRY( "bios", 0x1c020, avigo_8_by_8, 0, 1 )
783   GFXDECODE_ENTRY( "bios", 0x1e020, avigo_6_by_8, 0, 1 )
666   GFXDECODE_ENTRY( "flash0", 0x08992, avigo_charlayout, 0, 1 )
667   GFXDECODE_ENTRY( "flash0", 0x0c020, avigo_8_by_14, 0, 1 )
668   GFXDECODE_ENTRY( "flash0", 0x0c020, avigo_16_by_15, 0, 1 )
669   GFXDECODE_ENTRY( "flash0", 0x14020, avigo_15_by_16, 0, 1 )
670   GFXDECODE_ENTRY( "flash0", 0x1c020, avigo_8_by_8, 0, 1 )
671   GFXDECODE_ENTRY( "flash0", 0x1e020, avigo_6_by_8, 0, 1 )
784672GFXDECODE_END
785673
786674
r253597r253598
800688
801689QUICKLOAD_LOAD_MEMBER( avigo_state,avigo)
802690{
803   address_space& flash1 = m_flashes[1]->space(0);
691   address_space& flash1 = m_flash1->space(0);
804692   const char *systemname = machine().system().name;
805693   UINT32 first_app_page = (0x50000>>14);
806694   int app_page;
r253597r253598
833721      logerror("Application loaded at 0x%05x-0x%05x\n", app_page<<14, (app_page<<14) + (UINT32)image.length());
834722
835723      // copy app file into flash memory
836      image.fread((UINT8*)m_flashes[1]->space().get_read_ptr(app_page<<14), image.length());
724      image.fread((UINT8*)flash1.get_read_ptr(app_page<<14), image.length());
837725
838726      // update the application ID
839727      flash1.write_byte((app_page<<14) + 0x1a5, 0x80 + (app_page - (first_app_page>>14)));
r253597r253598
907795   MCFG_RAM_ADD(RAM_TAG)
908796   MCFG_RAM_DEFAULT_SIZE("128K")
909797
798   MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0)
799   MCFG_DEVICE_PROGRAM_MAP(avigo_banked_map)
800   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
801   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
802   MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
803
804   MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0)
805   MCFG_DEVICE_PROGRAM_MAP(avigo_banked_map)
806   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
807   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
808   MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
809
910810   MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", avigo_state, nvram_init)
911811
912812   // IRQ 1 is used for scan the pen and for cursor blinking
r253597r253598
926826
927827***************************************************************************/
928828ROM_START(avigo)
929   ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF)
930
829   ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF)
931830   ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" )
932831   ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1))
933   ROMX_LOAD("english_1004.rom", 0x100000, 0x050000, CRC(c9c3a225) SHA1(7939993a5615ca59ff2047e69b6d85122d437dca), ROM_BIOS(1))
934
935832   ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" )
936833   ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2))
937   ROMX_LOAD("english_1002.rom", 0x100000, 0x050000, CRC(31cab0ac) SHA1(87d337830506a12514a4beb9a8502a0de94816f2), ROM_BIOS(2))
938
939834   ROM_SYSTEM_BIOS( 2, "v100", "v1.00" )
940835   ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3))
941   ROMX_LOAD("english_100.rom", 0x100000, 0x050000, CRC(e2824b44) SHA1(3252454b05c3d3a4d7df1cb48dc3441ae82f2b1c), ROM_BIOS(3))
942836
837   ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF)
838   ROMX_LOAD("english_1004.rom", 0x000000, 0x050000, CRC(c9c3a225) SHA1(7939993a5615ca59ff2047e69b6d85122d437dca), ROM_BIOS(1))
839   ROMX_LOAD("english_1002.rom", 0x000000, 0x050000, CRC(31cab0ac) SHA1(87d337830506a12514a4beb9a8502a0de94816f2), ROM_BIOS(2))
840   ROMX_LOAD("english_100.rom",  0x000000, 0x050000, CRC(e2824b44) SHA1(3252454b05c3d3a4d7df1cb48dc3441ae82f2b1c), ROM_BIOS(3))
943841ROM_END
944842
945843ROM_START(avigo_de)
946   ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF)
947
844   ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF)
948845   ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" )
949846   ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1))
950   ROMX_LOAD("german_1004.rom", 0x100000, 0x060000, CRC(0fa437b3) SHA1(e9352aa8fee6d93b898412bd129452b82baa9a21), ROM_BIOS(1))
951
952847   ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" )
953848   ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2))
954   ROMX_LOAD("german_1002.rom", 0x100000, 0x060000, CRC(c6bf07ba) SHA1(d3185687aa510f6c3b3ab3baaabe7e8ce1a79e3b), ROM_BIOS(2))
955
956849   ROM_SYSTEM_BIOS( 2, "v100", "v1.00" )
957850   ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3))
958   ROMX_LOAD("german_100.rom", 0x100000, 0x060000, CRC(117d9189) SHA1(7e959ab1381ba831821fcf87973b25d87f12d34e), ROM_BIOS(3))
959851
852   ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF)
853   ROMX_LOAD("german_1004.rom", 0x000000, 0x060000, CRC(0fa437b3) SHA1(e9352aa8fee6d93b898412bd129452b82baa9a21), ROM_BIOS(1))
854   ROMX_LOAD("german_1002.rom", 0x000000, 0x060000, CRC(c6bf07ba) SHA1(d3185687aa510f6c3b3ab3baaabe7e8ce1a79e3b), ROM_BIOS(2))
855   ROMX_LOAD("german_100.rom",  0x000000, 0x060000, CRC(117d9189) SHA1(7e959ab1381ba831821fcf87973b25d87f12d34e), ROM_BIOS(3))
960856ROM_END
961857
962858ROM_START(avigo_fr)
963   ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF)
964
859   ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF)
965860   ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" )
966861   ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1))
967   ROMX_LOAD("french_1004.rom", 0x100000, 0x050000, CRC(5e4d90f7) SHA1(07df3af8a431ba65e079d6c987fb5d544f6541d8), ROM_BIOS(1))
968
969862   ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" )
970863   ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2))
971   ROMX_LOAD("french_1002.rom", 0x100000, 0x050000,CRC(caa3eb91) SHA1(ab199986de301d933f069a5e1f5150967e1d7f59), ROM_BIOS(2))
972
973864   ROM_SYSTEM_BIOS( 2, "v100", "v1.00" )
974865   ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3))
975   ROMX_LOAD("french_100.rom", 0x100000, 0x050000, CRC(fffa2345) SHA1(399447cede3cdd0be768952cb24f7e4431147e3d), ROM_BIOS(3))
976866
867   ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF)
868   ROMX_LOAD("french_1004.rom", 0x000000, 0x050000, CRC(5e4d90f7) SHA1(07df3af8a431ba65e079d6c987fb5d544f6541d8), ROM_BIOS(1))
869   ROMX_LOAD("french_1002.rom", 0x000000, 0x050000,CRC(caa3eb91) SHA1(ab199986de301d933f069a5e1f5150967e1d7f59), ROM_BIOS(2))
870   ROMX_LOAD("french_100.rom",  0x000000, 0x050000, CRC(fffa2345) SHA1(399447cede3cdd0be768952cb24f7e4431147e3d), ROM_BIOS(3))
977871ROM_END
978872
979873ROM_START(avigo_es)
980   ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF)
981
874   ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF)
982875   ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" )
983876   ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1))
984   ROMX_LOAD("spanish_1004.rom", 0x100000, 0x060000, CRC(235a7f8d) SHA1(94da4ecafb54dcd5d80bc5063cb4024e66e6a21f), ROM_BIOS(1))
985
986877   ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" )
987878   ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2))
988   ROMX_LOAD("spanish_1002.rom", 0x100000, 0x060000, CRC(a6e80cc4) SHA1(e741657558c11f7bce646ba3d7b5f845bfa275b7), ROM_BIOS(2))
989
990879   ROM_SYSTEM_BIOS( 2, "v100", "v1.00" )
991880   ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3))
992   ROMX_LOAD("spanish_100.rom", 0x100000, 0x060000, CRC(953a5276) SHA1(b9ba1dbdc2127b1ef419c911ef66313024a7351a), ROM_BIOS(3))
993881
882   ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF)
883   ROMX_LOAD("spanish_1004.rom", 0x000000, 0x060000, CRC(235a7f8d) SHA1(94da4ecafb54dcd5d80bc5063cb4024e66e6a21f), ROM_BIOS(1))
884   ROMX_LOAD("spanish_1002.rom", 0x000000, 0x060000, CRC(a6e80cc4) SHA1(e741657558c11f7bce646ba3d7b5f845bfa275b7), ROM_BIOS(2))
885   ROMX_LOAD("spanish_100.rom",  0x000000, 0x060000, CRC(953a5276) SHA1(b9ba1dbdc2127b1ef419c911ef66313024a7351a), ROM_BIOS(3))
994886ROM_END
995887
996888ROM_START(avigo_it)
997   ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF)
998
889   ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF)
999890   ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" )
1000891   ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1))
1001   ROMX_LOAD("italian_1004.rom", 0x100000, 0x050000, CRC(fb7941ec) SHA1(230e8346a3b0da1ee24568ec090ce6860ebfe995), ROM_BIOS(1))
1002
1003892   ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" )
1004893   ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2))
1005   ROMX_LOAD("italian_1002.rom", 0x100000, 0x050000, CRC(093bc032) SHA1(2c75d950d356a7fd1d058808e5f0be8e15b8ea2a), ROM_BIOS(2))
1006
1007894   ROM_SYSTEM_BIOS( 2, "v100", "v1.00" )
1008895   ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3))
1009   ROMX_LOAD("italian_100.rom", 0x100000, 0x050000, CRC(de359218) SHA1(6185727aba8ffc98723f2df74dda388fd0d70cc9), ROM_BIOS(3))
896
897   ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF)
898   ROMX_LOAD("italian_1004.rom", 0x000000, 0x050000, CRC(fb7941ec) SHA1(230e8346a3b0da1ee24568ec090ce6860ebfe995), ROM_BIOS(1))
899   ROMX_LOAD("italian_1002.rom", 0x000000, 0x050000, CRC(093bc032) SHA1(2c75d950d356a7fd1d058808e5f0be8e15b8ea2a), ROM_BIOS(2))
900   ROMX_LOAD("italian_100.rom",  0x000000, 0x050000, CRC(de359218) SHA1(6185727aba8ffc98723f2df74dda388fd0d70cc9), ROM_BIOS(3))
1010901ROM_END
1011902
1012903/*    YEAR  NAME    PARENT  COMPAT  MACHINE INPUT   INIT    COMPANY   FULLNAME */
trunk/src/mame/drivers/mstation.cpp
r253597r253598
2828
2929#include "emu.h"
3030#include "cpu/z80/z80.h"
31#include "machine/bankdev.h"
3132#include "machine/intelfsh.h"
3233#include "machine/rp5c01.h"
3334#include "machine/ram.h"
r253597r253598
3940   mstation_state(const machine_config &mconfig, device_type type, const char *tag)
4041      : driver_device(mconfig, type, tag),
4142         m_maincpu(*this, "maincpu"),
42         m_ram(*this, RAM_TAG)
43         m_ram(*this, RAM_TAG),
44         m_bankdev1(*this, "bank0"),
45         m_bankdev2(*this, "bank1"),
46         m_keyboard(*this, "LINE"),
47         m_nvram(*this, "nvram")
4348      { }
4449
4550   required_device<cpu_device> m_maincpu;
4651   required_device<ram_device> m_ram;
52   required_device<address_map_bank_device> m_bankdev1;
53   required_device<address_map_bank_device> m_bankdev2;
54   required_ioport_array<10> m_keyboard;
55   required_shared_ptr<UINT8> m_nvram;
4756
48   intelfsh8_device *m_flashes[2];
4957   UINT8 m_bank1[2];
5058   UINT8 m_bank2[2];
51   UINT8 *m_ram_base;
52   int m_flash_at_0x4000;
53   int m_flash_at_0x8000;
5459   UINT8 *m_vram;
5560   UINT8 m_screen_column;
5661   UINT8 m_port2;
5762   UINT8 m_irq;
5863   UINT16 m_kb_matrix;
5964
60   DECLARE_READ8_MEMBER( flash_0x0000_read_handler );
61   DECLARE_WRITE8_MEMBER( flash_0x0000_write_handler );
62   DECLARE_READ8_MEMBER( flash_0x4000_read_handler );
63   DECLARE_WRITE8_MEMBER( flash_0x4000_write_handler );
64   DECLARE_READ8_MEMBER( flash_0x8000_read_handler );
65   DECLARE_WRITE8_MEMBER( flash_0x8000_write_handler );
6665   DECLARE_READ8_MEMBER( modem_r );
6766   DECLARE_WRITE8_MEMBER( modem_w );
6867
r253597r253598
7372   DECLARE_READ8_MEMBER( lcd_left_r );
7473   DECLARE_WRITE8_MEMBER( lcd_left_w );
7574
76   void refresh_memory(UINT8 bank, UINT8 chip_select);
7775   DECLARE_READ8_MEMBER( bank1_r );
7876   DECLARE_WRITE8_MEMBER( bank1_w );
7977   DECLARE_READ8_MEMBER( bank2_r );
r253597r253598
9795   TIMER_DEVICE_CALLBACK_MEMBER(mstation_kb_timer);
9896};
9997
100READ8_MEMBER( mstation_state::flash_0x0000_read_handler )
101{
102   return m_flashes[0]->read(offset);
103}
10498
105WRITE8_MEMBER( mstation_state::flash_0x0000_write_handler )
106{
107   m_flashes[0]->write(offset, data);
108}
109
110READ8_MEMBER( mstation_state::flash_0x4000_read_handler )
111{
112   return m_flashes[m_flash_at_0x4000]->read(((m_bank1[0] & 0x3f)<<14) | offset);
113}
114
115WRITE8_MEMBER( mstation_state::flash_0x4000_write_handler )
116{
117   m_flashes[m_flash_at_0x4000]->write(((m_bank1[0] & 0x3f)<<14) | offset, data);
118}
119
120READ8_MEMBER( mstation_state::flash_0x8000_read_handler )
121{
122   return m_flashes[m_flash_at_0x8000]->read(((m_bank2[0] & 0x3f)<<14) | offset);
123}
124
125WRITE8_MEMBER( mstation_state::flash_0x8000_write_handler )
126{
127   m_flashes[m_flash_at_0x8000]->write(((m_bank2[0] & 0x3f)<<14) | offset, data);
128}
129
13099READ8_MEMBER( mstation_state::modem_r )
131100{
132101   return 0xff;
r253597r253598
185154//  Bankswitch
186155//***************************************************************************/
187156
188void mstation_state::refresh_memory(UINT8 bank, UINT8 chip_select)
189{
190   address_space& program = m_maincpu->space(AS_PROGRAM);
191   int &active_flash = (bank == 1 ? m_flash_at_0x4000 : m_flash_at_0x8000);
192   char bank_tag[6];
193
194   switch (chip_select)
195   {
196      case 0: // flash 0
197      case 3: // flash 1
198         if (active_flash < 0)
199         {
200            if (bank == 1)
201               program.install_readwrite_handler(0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(mstation_state::flash_0x4000_read_handler), this), write8_delegate(FUNC(mstation_state::flash_0x4000_write_handler), this));
202            else
203               program.install_readwrite_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(mstation_state::flash_0x8000_read_handler), this), write8_delegate(FUNC(mstation_state::flash_0x8000_write_handler), this));
204         }
205
206         active_flash = chip_select ? 1 : 0;
207         break;
208      case 1: // banked RAM
209         sprintf(bank_tag,"bank%d", bank);
210         membank(bank_tag)->set_base(m_ram_base + (((bank == 1 ? m_bank1[0] : m_bank2[0]) & 0x07)<<14));
211         program.install_readwrite_bank (bank * 0x4000, bank * 0x4000 + 0x3fff, bank_tag);
212         active_flash = -1;
213         break;
214      case 2: // left LCD panel
215         program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0, 0, read8_delegate(FUNC(mstation_state::lcd_left_r), this), write8_delegate(FUNC(mstation_state::lcd_left_w), this));
216         active_flash = -1;
217         break;
218      case 4: // right LCD panel
219         program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0, 0, read8_delegate(FUNC(mstation_state::lcd_right_r), this), write8_delegate(FUNC(mstation_state::lcd_right_w), this));
220         active_flash = -1;
221         break;
222      case 5: // modem
223         program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0x07, 0, read8_delegate(FUNC(mstation_state::modem_r), this), write8_delegate(FUNC(mstation_state::modem_w), this));
224         active_flash = -1;
225         break;
226
227      default:
228         logerror("Unknown chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff);
229         program.unmap_readwrite(bank * 0x4000, bank * 0x4000 + 0x3fff);
230         active_flash = -1;
231         break;
232   }
233}
234
235157READ8_MEMBER( mstation_state::bank1_r )
236158{
237159   return m_bank1[offset];
r253597r253598
246168{
247169   m_bank1[offset] = data;
248170
249   refresh_memory(1, m_bank1[1] & 0x07);
171   m_bankdev1->set_bank(((m_bank1[1] & 0x07) << 8) | m_bank1[0]);
250172}
251173
252174WRITE8_MEMBER( mstation_state::bank2_w )
253175{
254176   m_bank2[offset] = data;
255177
256   refresh_memory(2, m_bank2[1] & 0x07);
178   m_bankdev2->set_bank(((m_bank2[1] & 0x07) << 8) | m_bank2[0]);
257179}
258180
259181
r253597r253598
314236
315237READ8_MEMBER( mstation_state::kb_r )
316238{
317   static const char *const bitnames[] =   { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4",
318                                    "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
319239   UINT8 data = 0xff;
320240
321241   for (int i=0; i<10; i++)
322242   {
323243      if (!(m_kb_matrix & (1<<i)))
324         data &= ioport(bitnames[i])->read();
244         data &= m_keyboard[i]->read();
325245   }
326246
327247   return data;
328248}
329249
330250
251static ADDRESS_MAP_START(mstation_banked_map, AS_PROGRAM, 8, mstation_state)
252   AM_RANGE(0x0000000, 0x00fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write)
253   AM_RANGE(0x0400000, 0x041ffff) AM_MIRROR(0x03e0000) AM_RAM AM_SHARE("nvram")
254   AM_RANGE(0x0c00000, 0x0c7ffff) AM_MIRROR(0x0380000) AM_DEVREADWRITE("flash1", intelfsh8_device, read, write)
255   AM_RANGE(0x0800000, 0x0803fff) AM_MIRROR(0x03fc000) AM_READWRITE(lcd_left_r, lcd_left_w)
256   AM_RANGE(0x1000000, 0x1003fff) AM_MIRROR(0x03fc000) AM_READWRITE(lcd_right_r, lcd_right_w)
257   AM_RANGE(0x1400000, 0x1403fff) AM_MIRROR(0x03fc000) AM_READWRITE(modem_r, modem_w)
258ADDRESS_MAP_END
259
331260static ADDRESS_MAP_START(mstation_mem, AS_PROGRAM, 8, mstation_state)
332   AM_RANGE(0x0000, 0x3fff) AM_READWRITE(flash_0x0000_read_handler, flash_0x0000_write_handler)
333   AM_RANGE(0x4000, 0x7fff) AM_READWRITE_BANK("bank1")     // bank 1
334   AM_RANGE(0x8000, 0xbfff) AM_READWRITE_BANK("bank2")     // bank 2
335   AM_RANGE(0xc000, 0xffff) AM_READWRITE_BANK("sysram")    // system ram always first RAM bank
261   AM_RANGE(0x0000, 0x3fff) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write)
262   AM_RANGE(0x4000, 0x7fff) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8)
263   AM_RANGE(0x8000, 0xbfff) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8)
264   AM_RANGE(0xc000, 0xffff) AM_RAMBANK("sysram")    // system ram always first RAM bank
336265ADDRESS_MAP_END
337266
338267static ADDRESS_MAP_START(mstation_io , AS_IO, 8, mstation_state)
r253597r253598
350279
351280/* Input ports */
352281static INPUT_PORTS_START( mstation )
353   PORT_START( "LINE0" )
282   PORT_START( "LINE.0" )
354283   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Main Menu")  PORT_CODE( KEYCODE_HOME )   PORT_CHAR(UCHAR_MAMEKEY(HOME))
355284   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Back")   PORT_CODE( KEYCODE_DEL )    PORT_CHAR(UCHAR_MAMEKEY(END))
356285   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Print")  PORT_CODE( KEYCODE_F6 )
r253597r253598
360289   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("F4")     PORT_CODE( KEYCODE_F4 )     PORT_CHAR(UCHAR_MAMEKEY(F4))
361290   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("F5")     PORT_CODE( KEYCODE_F5 )     PORT_CHAR(UCHAR_MAMEKEY(F5))
362291
363   PORT_START( "LINE1" )
292   PORT_START( "LINE.1" )
364293   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
365294   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
366295   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
r253597r253598
370299   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Get E-Mail")     PORT_CODE( KEYCODE_F9 )
371300   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("PG Up")      PORT_CODE( KEYCODE_PGUP )   PORT_CHAR(UCHAR_MAMEKEY(PGUP))
372301
373   PORT_START( "LINE2" )
302   PORT_START( "LINE.2" )
374303   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("\xc2\xb4")       PORT_CODE( KEYCODE_0_PAD )
375304   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_1 )      PORT_CHAR('1')      PORT_CHAR('!')
376305   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_2 )      PORT_CHAR('2')      PORT_CHAR('@')
r253597r253598
380309   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_6 )      PORT_CHAR('6')      PORT_CHAR('^')
381310   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_7 )      PORT_CHAR('7')      PORT_CHAR('&')
382311
383   PORT_START( "LINE3" )
312   PORT_START( "LINE.3" )
384313   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_8 )      PORT_CHAR('8')      PORT_CHAR('*')
385314   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_9 )      PORT_CHAR('9')      PORT_CHAR('(')
386315   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_0 )      PORT_CHAR('0')      PORT_CHAR(')')
r253597r253598
390319   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_BACKSLASH )  PORT_CHAR('\\')     PORT_CHAR('|')
391320   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("PG Down")        PORT_CODE( KEYCODE_PGDN )       PORT_CHAR(UCHAR_MAMEKEY(PGDN))
392321
393   PORT_START( "LINE4" )
322   PORT_START( "LINE.4" )
394323   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Tab")    PORT_CODE( KEYCODE_TAB )        PORT_CHAR(9)
395324   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_Q )      PORT_CHAR('q')      PORT_CHAR('Q')
396325   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_W )      PORT_CHAR('w')      PORT_CHAR('W')
r253597r253598
400329   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_Y )      PORT_CHAR('y')      PORT_CHAR('Y')
401330   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_U )      PORT_CHAR('u')      PORT_CHAR('U')
402331
403   PORT_START( "LINE5" )
332   PORT_START( "LINE.5" )
404333   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_I )      PORT_CHAR('i')      PORT_CHAR('I')
405334   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_O )      PORT_CHAR('o')      PORT_CHAR('O')
406335   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_P )      PORT_CHAR('p')      PORT_CHAR('P')
r253597r253598
410339   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_QUOTE )      PORT_CHAR('\'')     PORT_CHAR('\"')
411340   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Enter")      PORT_CODE( KEYCODE_ENTER )  PORT_CHAR(UCHAR_MAMEKEY(ENTER))
412341
413   PORT_START( "LINE6" )
342   PORT_START( "LINE.6" )
414343   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("CapsLock")       PORT_CODE( KEYCODE_CAPSLOCK )       PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
415344   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_A )      PORT_CHAR('a')      PORT_CHAR('A')
416345   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_S )      PORT_CHAR('s')      PORT_CHAR('S')
r253597r253598
420349   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_H )      PORT_CHAR('h')      PORT_CHAR('H')
421350   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_J )      PORT_CHAR('j')      PORT_CHAR('J')
422351
423   PORT_START( "LINE7" )
352   PORT_START( "LINE.7" )
424353   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_K )      PORT_CHAR('K')      PORT_CHAR('K')
425354   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_L )      PORT_CHAR('l')      PORT_CHAR('L')
426355   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_COMMA )  PORT_CHAR(',')      PORT_CHAR('<')
r253597r253598
430359   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Down")       PORT_CODE( KEYCODE_DOWN )   PORT_CHAR(UCHAR_MAMEKEY(DOWN))
431360   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Right")      PORT_CODE( KEYCODE_RIGHT )  PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
432361
433   PORT_START( "LINE8" )
362   PORT_START( "LINE.8" )
434363   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Left Shift")     PORT_CODE( KEYCODE_LSHIFT )         PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
435364   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_Z )      PORT_CHAR('z')      PORT_CHAR('Z')
436365   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_X )      PORT_CHAR('x')      PORT_CHAR('X')
r253597r253598
440369   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_N )      PORT_CHAR('n')      PORT_CHAR('N')
441370   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_CODE( KEYCODE_M )      PORT_CHAR('m')      PORT_CHAR('M')
442371
443   PORT_START( "LINE9" )
372   PORT_START( "LINE.9" )
444373   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD )   PORT_NAME("Function")       PORT_CODE( KEYCODE_LCONTROL )   PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
445374   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
446375   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
r253597r253598
453382
454383void mstation_state::machine_start()
455384{
456   m_flashes[0] = machine().device<intelfsh8_device>("flash0");
457   m_flashes[1] = machine().device<intelfsh8_device>("flash1");
458
459385   // allocate the videoram
460386   m_vram = (UINT8*)machine().memory().region_alloc( "vram", 9600, 1, ENDIANNESS_LITTLE )->base();
461   m_ram_base = (UINT8*)m_ram->pointer();
462387
463388   // map firsh RAM bank at 0xc000-0xffff
464   membank("sysram")->set_base(m_ram_base);
389   membank("sysram")->set_base(m_nvram);
465390}
466391
467392
468393void mstation_state::machine_reset()
469394{
470   m_flash_at_0x4000 = 0;
471   m_flash_at_0x8000 = 0;
472395   m_bank1[0] =  m_bank1[1] = 0;
473396   m_bank2[0] =  m_bank2[1] = 0;
474397   memset(m_vram, 0, 9600);
475398
476399   // reset banks
477   refresh_memory(1, m_bank1[1]);
478   refresh_memory(2, m_bank2[1]);
400   m_bankdev1->set_bank(0);
401   m_bankdev2->set_bank(0);
479402}
480403
481404WRITE_LINE_MEMBER( mstation_state::rtc_irq )
r253597r253598
540463   MCFG_DEVICE_ADD("rtc", RP5C01, XTAL_32_768kHz)
541464   MCFG_RP5C01_OUT_ALARM_CB(WRITELINE(mstation_state, rtc_irq))
542465
466   MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0)
467   MCFG_DEVICE_PROGRAM_MAP(mstation_banked_map)
468   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
469   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
470   MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
471
472   MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0)
473   MCFG_DEVICE_PROGRAM_MAP(mstation_banked_map)
474   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
475   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
476   MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
477
543478   /* internal ram */
544479   MCFG_RAM_ADD(RAM_TAG)
545480   MCFG_RAM_DEFAULT_SIZE("128K")
trunk/src/mame/drivers/rex6000.cpp
r253597r253598
2929#include "emu.h"
3030#include "cpu/z80/z80.h"
3131#include "machine/rp5c01.h"
32#include "machine/bankdev.h"
3233#include "machine/ram.h"
3334#include "machine/intelfsh.h"
3435#include "imagedev/snapquik.h"
r253597r253598
4647#define IRQ_FLAG_IRQ1       0x40
4748#define IRQ_FLAG_EVENT      0x80
4849
49//memory bank types
50#define BANK_FLASH0_B0      0x00
51#define BANK_FLASH0_B1      0x01
52#define BANK_FLASH1_B0      0x02
53#define BANK_FLASH1_B1      0x03
54#define BANK_RAM            0x10
55#define BANK_UNKNOWN        0xff
56
5750#define TC8521_TAG  "rtc"
5851
5952class rex6000_state : public driver_device
r253597r253598
6356      : driver_device(mconfig, type, tag),
6457         m_maincpu(*this, "maincpu"),
6558         m_ram(*this, RAM_TAG),
66         m_beep(*this, "beeper")
59         m_beep(*this, "beeper"),
60         m_bankdev0(*this, "bank0"),
61         m_bankdev1(*this, "bank1"),
62         m_flash0b(*this, "flash0b"),
63         m_nvram(*this, "nvram")
6764      { }
6865
6966   required_device<cpu_device> m_maincpu;
7067   required_device<ram_device> m_ram;
7168   required_device<beep_device> m_beep;
72   fujitsu_29dl16x_device *m_flash[4];
69   required_device<address_map_bank_device> m_bankdev0;
70   required_device<address_map_bank_device> m_bankdev1;
71   optional_device<intelfsh8_device> m_flash0b;
72   required_shared_ptr<UINT8> m_nvram;
7373
7474   UINT8 m_bank[4];
7575   UINT8 m_beep_io[5];
r253597r253598
7777   UINT8 m_touchscreen[0x10];
7878   UINT8 m_lcd_enabled;
7979   UINT8 m_lcd_cmd;
80   UINT8 *m_ram_base;
8180
8281   UINT8 m_irq_mask;
8382   UINT8 m_irq_flag;
8483   UINT8 m_port6;
8584   UINT8 m_beep_mode;
8685
87   struct
88   {
89      UINT8 type;
90      UINT16 page;
91   } m_banks[2];
92
9386   virtual void machine_start() override;
9487   virtual void machine_reset() override;
9588   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
r253597r253598
108101   DECLARE_WRITE8_MEMBER( touchscreen_w );
109102   DECLARE_WRITE_LINE_MEMBER( alarm_irq );
110103
111   DECLARE_READ8_MEMBER( flash_0x0000_r );
112   DECLARE_WRITE8_MEMBER( flash_0x0000_w );
113   DECLARE_READ8_MEMBER( flash_0x8000_r );
114   DECLARE_WRITE8_MEMBER( flash_0x8000_w );
115   DECLARE_READ8_MEMBER( flash_0xa000_r );
116   DECLARE_WRITE8_MEMBER( flash_0xa000_w );
117
118   UINT8 identify_bank_type(UINT32 bank);
119104   DECLARE_PALETTE_INIT(rex6000);
120105   DECLARE_INPUT_CHANGED_MEMBER(trigger_irq);
121106   TIMER_DEVICE_CALLBACK_MEMBER(irq_timer1);
r253597r253598
125110};
126111
127112
128UINT8 rex6000_state::identify_bank_type(UINT32 bank)
129{
130   if (bank < 0x080)
131   {
132      return BANK_FLASH0_B0;
133   }
134   else if (bank >= 0x080 && bank < 0x100)
135   {
136      return BANK_FLASH0_B1;
137   }
138   else if ((bank >= 0xb00 && bank < 0xb80) || (bank >= 0x600 && bank < 0x680))
139   {
140      return BANK_FLASH1_B0;
141   }
142   else if ((bank >= 0xb80 && bank < 0xc00) || (bank >= 0x680 && bank < 0x700))
143   {
144      return BANK_FLASH1_B1;
145   }
146   else if (bank >= 0x1000 && bank < 0x1004)
147   {
148      return BANK_RAM;
149   }
150   else
151   {
152      //logerror("%04x: unkonwn memory bank %x\n", m_maincpu->pc(), bank);
153      return BANK_UNKNOWN;
154   }
155}
156113
157114READ8_MEMBER( rex6000_state::bankswitch_r )
158115{
r253597r253598
161118
162119WRITE8_MEMBER( rex6000_state::bankswitch_w )
163120{
164   address_space& program = m_maincpu->space(AS_PROGRAM);
165
166121   m_bank[offset&3] = data;
167122
168123   switch (offset)
r253597r253598
171126      case 1:     //bank 1 high
172127      {
173128         //bank 1 start at 0x8000
174         m_banks[0].page = (MAKE_BANK(m_bank[0], m_bank[1]&0x0f) + 4);
175         m_banks[0].type = identify_bank_type(m_banks[0].page);
176
177         if (m_banks[0].type != BANK_UNKNOWN)
178         {
179            program.install_readwrite_handler(0x8000, 0x9fff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0x8000_r), this), write8_delegate(FUNC(rex6000_state::flash_0x8000_w), this));
180         }
181         else
182         {
183            program.unmap_readwrite(0x8000, 0x9fff);
184         }
185
129         m_bankdev0->set_bank(MAKE_BANK(m_bank[0], m_bank[1]) + 4);
186130         break;
187131      }
188132      case 2:     //bank 2 low
189133      case 3:     //bank 2 high
190134      {
191         m_banks[1].page = MAKE_BANK(m_bank[2], m_bank[3]&0x1f);
192         m_banks[1].type = identify_bank_type(m_banks[1].page);
193
194         if (m_banks[1].type == BANK_RAM)
195         {
196            program.install_ram(0xa000, 0xbfff, m_ram_base + ((m_banks[1].page & 0x03)<<13));
197         }
198         else if (m_banks[1].type != BANK_UNKNOWN)
199         {
200            program.install_readwrite_handler(0xa000, 0xbfff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0xa000_r), this), write8_delegate(FUNC(rex6000_state::flash_0xa000_w), this));
201         }
202         else
203         {
204            program.unmap_readwrite(0xa000, 0xbfff);
205         }
206
135         m_bankdev1->set_bank(MAKE_BANK(m_bank[2], m_bank[3]));
207136         break;
208137      }
209138   }
r253597r253598
362291   m_touchscreen[offset&0x0f] = data;
363292}
364293
365READ8_MEMBER( rex6000_state::flash_0x0000_r )
366{
367   return m_flash[0]->read(offset);
368}
369294
370WRITE8_MEMBER( rex6000_state::flash_0x0000_w )
371{
372   m_flash[0]->write(offset, data);
373}
295static ADDRESS_MAP_START(rex6000_banked_map, AS_PROGRAM, 8, rex6000_state)
296   AM_RANGE( 0x0000000, 0x00fffff ) AM_DEVREADWRITE("flash0a", intelfsh8_device, read, write)
297   AM_RANGE( 0x0100000, 0x01fffff ) AM_DEVREADWRITE("flash0b", intelfsh8_device, read, write)
298   AM_RANGE( 0x0c00000, 0x0cfffff ) AM_DEVREADWRITE("flash1a", intelfsh8_device, read, write)
299   AM_RANGE( 0x0d00000, 0x0dfffff ) AM_DEVREADWRITE("flash1b", intelfsh8_device, read, write)
300   AM_RANGE( 0x1600000, 0x16fffff ) AM_DEVREADWRITE("flash1a", intelfsh8_device, read, write)
301   AM_RANGE( 0x1700000, 0x17fffff ) AM_DEVREADWRITE("flash1b", intelfsh8_device, read, write)
302   AM_RANGE( 0x2000000, 0x2007fff ) AM_RAM AM_SHARE("nvram")
303ADDRESS_MAP_END
374304
375READ8_MEMBER( rex6000_state::flash_0x8000_r )
376{
377   return m_flash[m_banks[0].type]->read(((m_banks[0].page & 0x7f)<<13) | offset);
378}
379305
380WRITE8_MEMBER( rex6000_state::flash_0x8000_w )
381{
382   m_flash[m_banks[0].type]->write(((m_banks[0].page & 0x7f)<<13) | offset, data);
383}
384306
385READ8_MEMBER( rex6000_state::flash_0xa000_r )
386{
387   return m_flash[m_banks[1].type]->read(((m_banks[1].page & 0x7f)<<13) | offset);
388}
389
390WRITE8_MEMBER( rex6000_state::flash_0xa000_w )
391{
392   m_flash[m_banks[1].type]->write(((m_banks[1].page & 0x7f)<<13) | offset, data);
393}
394
395
396307static ADDRESS_MAP_START(rex6000_mem, AS_PROGRAM, 8, rex6000_state)
397308   ADDRESS_MAP_UNMAP_HIGH
398   AM_RANGE( 0x0000, 0x7fff ) AM_READWRITE(flash_0x0000_r, flash_0x0000_w)
399   AM_RANGE( 0x8000, 0x9fff ) AM_READWRITE(flash_0x8000_r, flash_0x8000_w)
400   AM_RANGE( 0xa000, 0xbfff ) AM_READWRITE(flash_0xa000_r, flash_0xa000_w)
309   AM_RANGE( 0x0000, 0x7fff ) AM_DEVREADWRITE("flash0a", intelfsh8_device, read, write)
310   AM_RANGE( 0x8000, 0x9fff ) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8)
311   AM_RANGE( 0xa000, 0xbfff ) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8)
401312   AM_RANGE( 0xc000, 0xffff ) AM_RAMBANK("ram")            //system RAM
402313ADDRESS_MAP_END
403314
r253597r253598
450361
451362void rex6000_state::machine_start()
452363{
453   m_flash[0] = machine().device<fujitsu_29dl16x_device>("flash0a");
454   m_flash[1] = machine().device<fujitsu_29dl16x_device>("flash0b");
455   m_flash[2] = machine().device<fujitsu_29dl16x_device>("flash1a");
456   m_flash[3] = machine().device<fujitsu_29dl16x_device>("flash1b");
457
458   m_ram_base = m_ram->pointer();
459   membank("ram")->set_base(m_ram_base + 0x4000);
364   membank("ram")->set_base((UINT8*)m_nvram + 0x4000);
460365}
366
461367void rex6000_state::machine_reset()
462368{
463   address_space& program = m_maincpu->space(AS_PROGRAM);
464
465   program.install_readwrite_handler(0x8000, 0x9fff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0x8000_r), this), write8_delegate(FUNC(rex6000_state::flash_0x8000_w), this));
466   program.install_readwrite_handler(0xa000, 0xbfff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0xa000_r), this), write8_delegate(FUNC(rex6000_state::flash_0xa000_w), this));
467
468   m_banks[0].type = 0x04;
469   m_banks[0].type = 0;
470   m_banks[1].type = 0x00;
471   m_banks[1].type = 0;
472
473   memset(m_ram_base, 0, m_ram->size());
474369   memset(m_bank, 0, sizeof(m_bank));
475370   memset(m_beep_io, 0, sizeof(m_beep_io));
476371   memset(m_lcd_base, 0, sizeof(m_lcd_base));
r253597r253598
485380
486381UINT32 rex6000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
487382{
488   UINT16 lcd_bank = MAKE_BANK(m_lcd_base[0], m_lcd_base[1]&0x1f);
489   UINT8 mem_type = identify_bank_type(lcd_bank);
383   UINT16 lcd_bank = MAKE_BANK(m_lcd_base[0], m_lcd_base[1]);
490384
491   if (m_lcd_enabled && mem_type != BANK_UNKNOWN)
385   if (m_lcd_enabled)
492386   {
493387      for (int y=0; y<120; y++)
494388         for (int x=0; x<30; x++)
495389         {
496            UINT8 data = 0;
390            UINT8 data = m_bankdev0->space(AS_PROGRAM).read_byte((lcd_bank << 13) + y*30 + x);
497391
498            if (mem_type == BANK_RAM)
499            {
500               data = (m_ram_base + ((lcd_bank & 0x03)<<13))[y*30 + x];
501            }
502            else
503            {
504               data =  m_flash[mem_type]->space(0).read_byte(((lcd_bank & 0x7f)<<13) | (y*30 + x));
505            }
506
507
508392            for (int b=0; b<8; b++)
509393            {
510394               bitmap.pix16(y, (x * 8) + b) = BIT(data, 7);
r253597r253598
570454QUICKLOAD_LOAD_MEMBER( rex6000_state,rex6000)
571455{
572456   static const char magic[] = "ApplicationName:Addin";
573   address_space& flash = machine().device("flash0b")->memory().space(0);
457   address_space& flash = m_flash0b->space(0);
574458   UINT32 img_start = 0;
575459
576460   dynamic_buffer data(image.length());
r253597r253598
661545   MCFG_PALETTE_INIT_OWNER(rex6000_state, rex6000)
662546   MCFG_GFXDECODE_ADD("gfxdecode", "palette", rex6000)
663547
548   MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0)
549   MCFG_DEVICE_PROGRAM_MAP(rex6000_banked_map)
550   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
551   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
552   MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
553
554   MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0)
555   MCFG_DEVICE_PROGRAM_MAP(rex6000_banked_map)
556   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
557   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
558   MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
559
664560   /* quickload */
665561   MCFG_QUICKLOAD_ADD("quickload", rex6000_state, rex6000, "rex,ds2", 0)
666562
trunk/src/mame/includes/avigo.h
r253597r253598
1414#include "machine/rp5c01.h"
1515#include "machine/ins8250.h"
1616#include "machine/intelfsh.h"
17#include "machine/bankdev.h"
1718#include "machine/nvram.h"
1819#include "sound/speaker.h"
1920#include "machine/ram.h"
r253597r253598
3637         m_speaker(*this, "speaker"),
3738         m_uart(*this, "ns16550"),
3839         m_serport(*this, "serport"),
39         m_palette(*this, "palette")
40         m_palette(*this, "palette"),
41         m_bankdev1(*this, "bank0"),
42         m_bankdev2(*this, "bank1"),
43         m_flash1(*this, "flash1"),
44         m_nvram(*this, "nvram")
4045      { }
4146
4247   required_device<cpu_device> m_maincpu;
r253597r253598
4550   required_device<ns16550_device> m_uart;
4651   required_device<rs232_port_device> m_serport;
4752   required_device<palette_device> m_palette;
53   required_device<address_map_bank_device> m_bankdev1;
54   required_device<address_map_bank_device> m_bankdev2;
55   required_device<intelfsh8_device> m_flash1;
56   required_shared_ptr<UINT8> m_nvram;
4857
4958   // defined in drivers/avigo.c
5059   virtual void machine_start() override;
5160   virtual void machine_reset() override;
52   void postload();
53   void refresh_memory(UINT8 bank, UINT8 chip_select);
5461   void refresh_ints();
5562   void nvram_init(nvram_device &nvram, void *base, size_t size);
5663
5764   DECLARE_WRITE_LINE_MEMBER( tc8521_alarm_int );
5865   DECLARE_WRITE_LINE_MEMBER( com_interrupt );
5966
60   DECLARE_READ8_MEMBER(flash_0x0000_read_handler);
61   DECLARE_WRITE8_MEMBER(flash_0x0000_write_handler);
62   DECLARE_READ8_MEMBER(flash_0x4000_read_handler);
63   DECLARE_WRITE8_MEMBER(flash_0x4000_write_handler);
64   DECLARE_READ8_MEMBER(flash_0x8000_read_handler);
65   DECLARE_WRITE8_MEMBER(flash_0x8000_write_handler);
66
6767   DECLARE_READ8_MEMBER(key_data_read_r);
6868   DECLARE_WRITE8_MEMBER(set_key_line_w);
6969   DECLARE_WRITE8_MEMBER(port2_w);
r253597r253598
9999   UINT8               m_bank1_l;
100100   UINT8               m_bank1_h;
101101   UINT8               m_ad_control_status;
102   intelfsh8_device *  m_flashes[3];
103   int                 m_flash_at_0x4000;
104   int                 m_flash_at_0x8000;
105102   UINT16              m_ad_value;
106103   UINT8 *             m_video_memory;
107104   UINT8               m_screen_column;
108105   UINT8               m_warm_start;
109   UINT8 *             m_ram_base;
110106   DECLARE_PALETTE_INIT(avigo);
111107   TIMER_DEVICE_CALLBACK_MEMBER(avigo_scan_timer);
112108   TIMER_DEVICE_CALLBACK_MEMBER(avigo_1hz_timer);


Previous 199869 Revisions Next


© 1997-2024 The MAME Team