Saturday, August 26, 2017

Getting the Third Millenium Arcade Board MLDEMOS to run

I loaded up the MLDEMOS on the Third Millenium arcade board and took a look at where it was hanging up.

./mame64 apple2e -sl4 arcbd -flop1 Amparcade_1983_Third_Millenium_Engineering_Corporation.do -debug


It was spinning in a loop around 088e and proceeding no further.

I set a break point at 088e with "bpset 088e" and after it hit the breakpoint, did a "history".

It was obviously writing data to $c0c1 and $c0c0.



I also did a disassembly from 800 to 1800 with "dasm mldemo.asm,800,1000" to take a look at.


less mldemo.asm | grep '$c0c1'
08E4: AD C1 C0 lda $c0c1
0990: 8D C1 C0 sta $c0c1
0993: 8E C1 C0 stx $c0c1
0A80: 8D C1 C0 sta $c0c1
0A83: 8C C1 C0 sty $c0c1



less mldemo.asm | grep '$c0c0'
0859: 8D C0 C0 sta $c0c0
09B3: 8D C0 C0 sta $c0c0
09DE: 8D C0 C0 sta $c0c0
0A09: 8D C0 C0 sta $c0c0
0A3B: 8D C0 C0 sta $c0c0
0A68: 8D C0 C0 sta $c0c0


The arcade board is supposed to be in slot#4 which maps to the $c0cx memory space, and the code in a2arcade.cpp looks like this:

======================================================


/*
    C0nx map:
    0 - TMS read vram
    1 - TMS read status
    2 - TMS write vram
    3 - TMS write register
    5 - AY register select
    6 - AY data
*/


void a2bus_arcboard_device::write_c0nx(address_space &space, uint8_t offset, uint8_t data)
{
 switch (offset)
 {
  case 2:
   m_tms->vram_write(space, 0, data);
   break;

  case 3:
   m_tms->register_write(space, 0, data);
   break;

  case 5:
   m_ay->address_w(space, 0, data);
   break;

  case 6:
   m_ay->data_w(space, 0, data);
   break;
 }
}






So if it's writing c0c0 and c0c1, nothing is happening since we've got no cases for that.

So let's add case 0 and case 1: (assuming they're just like case 2 and 3)
=================================



void a2bus_arcboard_device::write_c0nx(address_space &space, uint8_t offset, uint8_t data)
{
 switch (offset)
 {
  case 0:
   m_tms->vram_write(space, 0, data);
   break;
  case 1:
   m_tms->register_write(space, 0, data);
   break;
  case 2:
   m_tms->vram_write(space, 0, data);
   break;

  case 3:
   m_tms->register_write(space, 0, data);
   break;

  case 5:
   m_ay->address_w(space, 0, data);
   break;

  case 6:
   m_ay->data_w(space, 0, data);
   break;
 }
}



And things start working!








Happy guy from the MLDEMO hotel scene:

No comments:

Post a Comment