Previous 199869 Revisions Next

r20887 Sunday 10th February, 2013 at 10:42:55 UTC by Wilbert Pol
(MESS) bbc.c: Reduce tagmap lookups (nw)
[src/mess/includes]bbc.h
[src/mess/machine]bbc.c
[src/mess/video]bbc.c

trunk/src/mess/machine/bbc.c
r20886r20887
3737/* for the model A just address the 4 on board ROM sockets */
3838WRITE8_MEMBER(bbc_state::bbc_page_selecta_w)
3939{
40   membank("bank4")->set_base(m_region_user1->base()+((data&0x03)<<14));
40   m_bank4->set_base(m_region_user1->base()+((data&0x03)<<14));
4141}
4242
4343
r20886r20887
5757   m_rombank=data&0x0f;
5858   if (m_rombank!=1)
5959   {
60      membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
60      m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
6161   }
6262   else
6363   {
64      membank("bank4")->set_base(m_region_user2->base() + ((m_DFSType) << 14));
64      m_bank4->set_base(m_region_user2->base() + ((m_DFSType) << 14));
6565   }
6666}
6767
r20886r20887
138138      if (m_pagedRAM)
139139      {
140140         /* if paged ram then set 8000 to afff to read from the ram 8000 to afff */
141         membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
141         m_bank4->set_base(m_region_maincpu->base() + 0x8000);
142142      }
143143      else
144144      {
145145         /* if paged rom then set the rom to be read from 8000 to afff */
146         membank("bank4")->set_base(m_region_user1->base() + (m_rombank << 14));
146         m_bank4->set_base(m_region_user1->base() + (m_rombank << 14));
147147      };
148148
149149      /* set the rom to be read from b000 to bfff */
150      membank("bank6")->set_entry(m_rombank);
150      m_bank6->set_entry(m_rombank);
151151   }
152152   else
153153   {
154154      //the video display should now use this flag to display the shadow ram memory
155155      m_vdusel=(data>>7)&0x01;
156      bbcbp_setvideoshadow(machine(), m_vdusel);
156      bbcbp_setvideoshadow(m_vdusel);
157157      //need to make the video display do a full screen refresh for the new memory area
158      membank("bank2")->set_base(m_region_maincpu->base()+0x3000);
158      m_bank2->set_base(m_region_maincpu->base()+0x3000);
159159   }
160160}
161161
r20886r20887
186186   if (m_vdusel == 0)
187187   {
188188      // not in shadow ram mode so just read normal ram
189      membank("bank2")->set_base(ram + 0x3000);
189      m_bank2->set_base(ram + 0x3000);
190190   }
191191   else
192192   {
193193      if (vdudriverset(machine()))
194194      {
195195         // if VDUDriver set then read from shadow ram
196         membank("bank2")->set_base(ram + 0xb000);
196         m_bank2->set_base(ram + 0xb000);
197197      }
198198      else
199199      {
200200         // else read from normal ram
201         membank("bank2")->set_base(ram + 0x3000);
201         m_bank2->set_base(ram + 0x3000);
202202      }
203203   }
204204   return address;
r20886r20887
360360
361361   if (m_ACCCON_Y)
362362   {
363      membank("bank7")->set_base(m_region_maincpu->base() + 0x9000);
363      m_bank7->set_base(m_region_maincpu->base() + 0x9000);
364364   }
365365   else
366366   {
367      membank("bank7")->set_base(m_region_user1->base() + 0x40000);
367      m_bank7->set_base(m_region_user1->base() + 0x40000);
368368   }
369369
370   bbcbp_setvideoshadow(machine(), m_ACCCON_D);
370   bbcbp_setvideoshadow(m_ACCCON_D);
371371
372372
373373   if (m_ACCCON_X)
374374   {
375      membank("bank2")->set_base(m_region_maincpu->base() + 0xb000 );
375      m_bank2->set_base(m_region_maincpu->base() + 0xb000 );
376376   }
377377   else
378378   {
379      membank("bank2")->set_base(m_region_maincpu->base() + 0x3000 );
379      m_bank2->set_base(m_region_maincpu->base() + 0x3000 );
380380   }
381381
382382   /* ACCCON_TST controls paging of rom reads in the 0xFC00-0xFEFF reigon */
r20886r20887
384384   /* if 1 the the ROM is paged in for reads but writes still go to I/O   */
385385   if (m_ACCCON_TST)
386386   {
387      membank("bank8")->set_base(m_region_user1->base()+0x43c00);
387      m_bank8->set_base(m_region_user1->base()+0x43c00);
388388      space.install_read_bank(0xFC00,0xFEFF,"bank8");
389389   }
390390   else
r20886r20887
410410
411411   if (m_pagedRAM)
412412   {
413      membank("bank4")->set_base(m_region_maincpu->base() + 0x8000);
414      membank("bank5")->set_entry(m_rombank);
413      m_bank4->set_base(m_region_maincpu->base() + 0x8000);
414      m_bank5->set_entry(m_rombank);
415415   }
416416   else
417417   {
418      membank("bank4")->set_base(m_region_user1->base() + ((m_rombank) << 14));
419      membank("bank5")->set_entry(m_rombank);
418      m_bank4->set_base(m_region_user1->base() + ((m_rombank) << 14));
419      m_bank5->set_entry(m_rombank);
420420   }
421421}
422422
r20886r20887
432432{
433433   if (m_ACCCON_X)
434434   {
435      membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
435      m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
436436   }
437437   else
438438   {
439439      if (m_ACCCON_E && bbcm_vdudriverset(machine()))
440440      {
441         membank( "bank2" )->set_base( m_region_maincpu->base() + 0xb000 );
441         m_bank2->set_base( m_region_maincpu->base() + 0xb000 );
442442      }
443443      else
444444      {
445         membank( "bank2" )->set_base( m_region_maincpu->base() + 0x3000 );
445         m_bank2->set_base( m_region_maincpu->base() + 0x3000 );
446446      }
447447   }
448448
r20886r20887
19931993{
19941994   UINT8 *ram = m_region_maincpu->base();
19951995   m_RAMSize = 1;
1996   membank("bank1")->set_base(ram);
1997   membank("bank3")->set_base(ram);
1996   m_bank1->set_base(ram);
1997   m_bank3->set_base(ram);
19981998
1999   membank("bank4")->set_base(m_region_user1->base());          /* bank 4 is the paged ROMs     from 8000 to bfff */
2000   membank("bank7")->set_base(m_region_user1->base()+0x10000);  /* bank 7 points at the OS rom  from c000 to ffff */
1999   m_bank4->set_base(m_region_user1->base());          /* bank 4 is the paged ROMs     from 8000 to bfff */
2000   m_bank7->set_base(m_region_user1->base()+0x10000);  /* bank 7 points at the OS rom  from c000 to ffff */
20012001
20022002   bbcb_IC32_initialise(this);
20032003}
r20886r20887
20292029   m_SWRAMtype = (machine().root_device().ioport("BBCCONFIG")->read() >> 3) & 0x03;
20302030   m_RAMSize=    (machine().root_device().ioport("BBCCONFIG")->read() >> 5) & 0x01;
20312031
2032   membank("bank1")->set_base(ram);
2032   m_bank1->set_base(ram);
20332033   if (m_RAMSize)
20342034   {
20352035      /* 32K Model B */
2036      membank("bank3")->set_base(ram + 0x4000);
2036      m_bank3->set_base(ram + 0x4000);
20372037      m_memorySize=32;
20382038   }
20392039   else
20402040   {
20412041      /* 16K just repeat the lower 16K*/
2042      membank("bank3")->set_base(ram);
2042      m_bank3->set_base(ram);
20432043      m_memorySize=16;
20442044   }
20452045
2046   membank("bank4")->set_base(m_region_user1->base());          /* bank 4 is the paged ROMs     from 8000 to bfff */
2047   membank("bank7")->set_base(m_region_user1->base() + 0x40000);  /* bank 7 points at the OS rom  from c000 to ffff */
2046   m_bank4->set_base(m_region_user1->base());          /* bank 4 is the paged ROMs     from 8000 to bfff */
2047   m_bank7->set_base(m_region_user1->base() + 0x40000);  /* bank 7 points at the OS rom  from c000 to ffff */
20482048
20492049   bbcb_IC32_initialise(this);
20502050
r20886r20887
20672067   m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcbp_direct_handler), this));
20682068
20692069   /* bank 6 is the paged ROMs     from b000 to bfff */
2070   membank("bank6")->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14);
2070   m_bank6->configure_entries(0, 16, m_region_user1->base() + 0x3000, 1<<14);
20712071}
20722072
20732073MACHINE_RESET_MEMBER(bbc_state,bbcbp)
20742074{
2075   membank("bank1")->set_base(m_region_maincpu->base());
2076   membank("bank2")->set_base(m_region_maincpu->base()+0x03000);  /* bank 2 screen/shadow ram     from 3000 to 7fff */
2077   membank("bank4")->set_base(m_region_user1->base());         /* bank 4 is paged ROM or RAM   from 8000 to afff */
2078   membank("bank6")->set_entry(0);
2079   membank("bank7")->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom  from c000 to ffff */
2075   m_bank1->set_base(m_region_maincpu->base());
2076   m_bank2->set_base(m_region_maincpu->base()+0x03000);  /* bank 2 screen/shadow ram     from 3000 to 7fff */
2077   m_bank4->set_base(m_region_user1->base());         /* bank 4 is paged ROM or RAM   from 8000 to afff */
2078   m_bank6->set_entry(0);
2079   m_bank7->set_base(m_region_user1->base()+0x40000); /* bank 7 points at the OS rom  from c000 to ffff */
20802080
20812081   bbcb_IC32_initialise(this);
20822082
r20886r20887
20932093   m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(bbc_state::bbcm_direct_handler), this));
20942094
20952095   /* bank 5 is the paged ROMs     from 9000 to bfff */
2096   membank("bank5")->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
2096   m_bank5->configure_entries(0, 16, m_region_user1->base()+0x01000, 1<<14);
20972097
20982098   /* Set ROM/IO bank to point to rom */
2099   membank( "bank8" )->set_base( m_region_user1->base()+0x43c00);
2099   m_bank8->set_base( m_region_user1->base()+0x43c00);
21002100   m_maincpu->space(AS_PROGRAM).install_read_bank(0xFC00, 0xFEFF, "bank8");
21012101}
21022102
21032103MACHINE_RESET_MEMBER(bbc_state,bbcm)
21042104{
2105   membank("bank1")->set_base(m_region_maincpu->base());           /* bank 1 regular lower ram     from 0000 to 2fff */
2106   membank("bank2")->set_base(m_region_maincpu->base() + 0x3000);  /* bank 2 screen/shadow ram     from 3000 to 7fff */
2107   membank("bank4")->set_base(m_region_user1->base());         /* bank 4 is paged ROM or RAM   from 8000 to 8fff */
2108   membank("bank5")->set_entry(0);
2109   membank("bank7")->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM          from c000 to dfff */
2105   m_bank1->set_base(m_region_maincpu->base());           /* bank 1 regular lower ram     from 0000 to 2fff */
2106   m_bank2->set_base(m_region_maincpu->base() + 0x3000);  /* bank 2 screen/shadow ram     from 3000 to 7fff */
2107   m_bank4->set_base(m_region_user1->base());         /* bank 4 is paged ROM or RAM   from 8000 to 8fff */
2108   m_bank5->set_entry(0);
2109   m_bank7->set_base(m_region_user1->base() + 0x40000); /* bank 6 OS rom of RAM          from c000 to dfff */
21102110
21112111   bbcb_IC32_initialise(this);
21122112
trunk/src/mess/includes/bbc.h
r20886r20887
2626   bbc_state(const machine_config &mconfig, device_type type, const char *tag)
2727      : driver_device(mconfig, type, tag)
2828      , m_maincpu(*this, "maincpu")
29      , m_mc6845(*this, "mc6845")
2930      , m_sn(*this, "sn76489")
3031      , m_trom(*this, "saa505x")
3132      , m_ACCCON_IRR(CLEAR_LINE)
r20886r20887
3536      , m_region_maincpu(*this, "maincpu")
3637      , m_region_user1(*this, "user1")
3738      , m_region_user2(*this, "user2")
39      , m_bank1(*this, "bank1")
40      , m_bank2(*this, "bank2")
41      , m_bank3(*this, "bank3")
42      , m_bank4(*this, "bank4")
43      , m_bank5(*this, "bank5")
44      , m_bank6(*this, "bank6")
45      , m_bank7(*this, "bank7")
46      , m_bank8(*this, "bank8")
3847   { }
3948
4049   required_device<cpu_device> m_maincpu;
50   required_device<mc6845_device> m_mc6845;
4151   optional_device<sn76489_device> m_sn;
4252   required_device<saa5050_device> m_trom;
4353
r20886r20887
314324   required_memory_region m_region_maincpu;
315325   required_memory_region m_region_user1;
316326   optional_memory_region m_region_user2;
327   required_memory_bank m_bank1; // bbca bbcb bbcbp bbcbp128 bbcm
328   optional_memory_bank m_bank2; //           bbcbp bbcbp128 bbcm
329   optional_memory_bank m_bank3; // bbca bbcb
330   required_memory_bank m_bank4; // bbca bbcb bbcbp bbcbp128 bbcm
331   optional_memory_bank m_bank5; //                          bbcm
332   optional_memory_bank m_bank6; //           bbcbp bbcbp128
333   required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm
334   optional_memory_bank m_bank8; //                          bbcm
335
336   void bbcbp_setvideoshadow(int vdusel);
337   void common_init(int memorySize);
338   void set_pixel_lookup();
317339};
318340
319341
r20886r20887
329351
330352/* tape support */
331353
332
333354extern const i8271_interface bbc_i8271_interface;
334355extern const uPD7002_interface bbc_uPD7002;
335356
336/*----------- defined in video/bbc.c -----------*/
337
338void bbc_set_video_memory_lookups(running_machine &machine, int ramsize);
339void bbc_setscreenstart(running_machine &machine, int b4, int b5);
340void bbcbp_setvideoshadow(running_machine &machine, int vdusel);
341
342357#endif /* BBC_H_ */
trunk/src/mess/video/bbc.c
r20886r20887
9797
9898/* this is a quick lookup array that puts bits 0,2,4,6 into bits 0,1,2,3
9999   this is used by the pallette lookup in the video ULA */
100static void set_pixel_lookup(bbc_state *state)
100void bbc_state::set_pixel_lookup()
101101{
102102   int i;
103103   for (i=0; i<256; i++)
104104   {
105      state->m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0);
105      m_pixel_bits[i] = (((i>>7)&1)<<3) | (((i>>5)&1)<<2) | (((i>>3)&1)<<1) | (((i>>1)&1)<<0);
106106   }
107107}
108108
r20886r20887
143143      } else {
144144         m_pixels_per_byte=pixels_per_byte_set[m_videoULA_characters_per_line|(m_videoULA_6845_clock_rate<<2)];
145145      }
146      mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
147      mc6845->set_hpixels_per_column(m_pixels_per_byte);
146      m_mc6845->set_hpixels_per_column(m_pixels_per_byte);
148147      if (m_videoULA_6845_clock_rate)
149         mc6845->set_clock(2000000);
148         m_mc6845->set_clock(2000000);
150149      else
151         mc6845->set_clock(1000000);
150         m_mc6845->set_clock(1000000);
152151      }
153152      break;
154153   // Set a pallet register in the Video ULA
r20886r20887
305304
306305WRITE8_MEMBER(bbc_state::bbc_6845_w)
307306{
308   mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
309307   switch(offset & 1)
310308   {
311309      case 0 :
312         mc6845->address_w(space,0,data);
310         m_mc6845->address_w(space,0,data);
313311         break;
314312      case 1 :
315         mc6845->register_w(space,0,data);
313         m_mc6845->register_w(space,0,data);
316314         break;
317315   }
318316   return;
r20886r20887
320318
321319READ8_MEMBER(bbc_state::bbc_6845_r)
322320{
323   mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
324
325321   switch (offset&1)
326322   {
327      case 0: return mc6845->status_r(space,0);
328      case 1: return mc6845->register_r(space,0);
323      case 0: return m_mc6845->status_r(space,0);
324      case 1: return m_mc6845->register_r(space,0);
329325   }
330326   return 0;
331327}
r20886r20887
336332
337333/**** BBC B+ Shadow Ram change ****/
338334
339void bbcbp_setvideoshadow(running_machine &machine, int vdusel)
335void bbc_state::bbcbp_setvideoshadow(int vdusel)
340336{
341   bbc_state *state = machine.driver_data<bbc_state>();
342337   if (vdusel)
343338   {
344      state->m_BBC_Video_RAM= state->memregion("maincpu")->base()+0x8000;
339      m_BBC_Video_RAM= m_region_maincpu->base()+0x8000;
345340   } else {
346      state->m_BBC_Video_RAM= machine.root_device().memregion("maincpu")->base();
341      m_BBC_Video_RAM= m_region_maincpu->base();
347342   }
348343}
349344
r20886r20887
352347 * Initialize the BBC video emulation
353348 ************************************************************************/
354349
355static void common_init(running_machine &machine, int memorySize)
350void bbc_state::common_init(int memorySize)
356351{
357   bbc_state *state = machine.driver_data<bbc_state>();
358   state->m_emulation_cursor_size = 1;
352   m_emulation_cursor_size = 1;
359353
360   state->m_VideoULA_CR = 7;
361   state->m_VideoULA_CR_counter = 0;
354   m_VideoULA_CR = 7;
355   m_VideoULA_CR_counter = 0;
362356
363   set_pixel_lookup(state);
357   set_pixel_lookup();
364358
365   state->m_BBC_Video_RAM = state->memregion("maincpu")->base();
366   state->m_memorySize=memorySize;
359   m_BBC_Video_RAM = m_region_maincpu->base();
360   m_memorySize=memorySize;
367361
368362}
369363
370364VIDEO_START_MEMBER(bbc_state,bbca)
371365{
372   common_init(machine(),16);
366   common_init(16);
373367}
374368
375369VIDEO_START_MEMBER(bbc_state,bbcb)
376370{
377   common_init(machine(),32);
371   common_init(32);
378372}
379373
380374VIDEO_START_MEMBER(bbc_state,bbcbp)
381375{
382   common_init(machine(),32);
376   common_init(32);
383377}
384378
385379VIDEO_START_MEMBER(bbc_state,bbcm)
386380{
387   common_init(machine(),32);
381   common_init(32);
388382}
389383
390384
r20886r20887
582576
583577WRITE8_MEMBER(bbc_state::bbc_6845_w)
584578{
585    mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
586    switch(offset & 1)
587    {
588        case 0 :
589            mc6845->address_w(space,0,data);
590            break;
591        case 1 :
592            mc6845->register_w(space,0,data);
593            break;
594    }
595    return;
596
597    switch (offset&1)
598    {
599        case 0:
600            m6845_address_w(0,data);
601            break;
602        case 1:
603            m6845_register_w(0,data);
604            break;
605    }
606
579   switch(offset & 1)
580   {
581      case 0 :
582         m_mc6845->address_w(space,0,data);
583         break;
584      case 1 :
585         m_mc6845->register_w(space,0,data);
586         break;
587   }
607588}
608589
590
609591 READ8_HANDLER (bbc_6845_r)
610592{
611
612    mc6845_device *mc6845 = space.machine().device<mc6845_device>("mc6845");
613
614    switch (offset&1)
615    {
616        case 0: return mc6845->status_r(space,0); break;
617        case 1: return mc6845->register_r(space,0); break;
618    }
619    return 0;
620
621    int retval=0;
622
623    switch (offset&1)
624    {
625        case 0:
626            break;
627        case 1:
628            retval=m6845_register_r(0);
629            break;
630    }
631    return retval;
593   switch (offset&1)
594   {
595      case 0: return m_mc6845->status_r(space,0); break;
596      case 1: return m_mc6845->register_r(space,0); break;
597   }
598   return 0;
632599}
633600
634601
r20886r20887
638605UINT32 bbc_state::screen_update_bbc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
639606{
640607
641    mc6845_device *mc6845 = machine().device<mc6845_device>("mc6845");
642    mc6845->update( bitmap, cliprect);
608    m_mc6845->update( bitmap, cliprect);
643609
644610    return 0;
645611

Previous 199869 Revisions Next


© 1997-2024 The MAME Team