Previous 15994 Revisions Next

r15440 Sunday 10th June, 2012 at 16:43:33 UTC by R. Belmont
Apple II: fix crash on hard reset/multisession and improved IIgs soft reset behavior. [R. Belmont]
[src/mess/includes]apple2.h apple2gs.h
[src/mess/machine]apple2.c apple2gs.c

src/mess/machine/apple2gs.c
r15439r15440
13391339static void apple2gs_mem_000400(running_machine &machine,offs_t begin, offs_t end, apple2_meminfo *meminfo)
13401340{
13411341   apple2gs_state *state = machine.driver_data<apple2gs_state>();
1342    static write8_delegate write_delegates[] =
1343    {
1344        write8_delegate(FUNC(apple2gs_state::apple2gs_aux0400_w), state),
1345        write8_delegate(FUNC(apple2gs_state::apple2gs_main0400_w), state)
1346    };
1347
13481342   if (state->m_flags & VAR_80STORE)
13491343   {
13501344      meminfo->read_mem      = (state->m_flags & VAR_PAGE2)   ? 0x010400 : 0x000400;
13511345      meminfo->write_mem      = (state->m_flags & VAR_PAGE2)   ? 0x010400 : 0x000400;
1352      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &write_delegates[0] : &write_delegates[1];
1346      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &state->write_delegates_2gs0400[0] : &state->write_delegates_2gs0400[1];
13531347   }
13541348   else
13551349   {
13561350      meminfo->read_mem      = (state->m_flags & VAR_RAMRD)   ? 0x010400 : 0x000400;
13571351      meminfo->write_mem      = (state->m_flags & VAR_RAMWRT)   ? 0x010400 : 0x000400;
1358      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &write_delegates[0] : &write_delegates[1];
1352      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &state->write_delegates_2gs0400[0] : &state->write_delegates_2gs0400[1];
13591353   }
13601354}
13611355
r15439r15440
13691363static void apple2gs_mem_002000(running_machine &machine,offs_t begin, offs_t end, apple2_meminfo *meminfo)
13701364{
13711365   apple2gs_state *state = machine.driver_data<apple2gs_state>();
1372    static write8_delegate write_delegates[] =
1373    {
1374        write8_delegate(FUNC(apple2gs_state::apple2gs_aux2000_w), state),
1375        write8_delegate(FUNC(apple2gs_state::apple2gs_main2000_w), state)
1376    };
13771366   if ((state->m_flags & (VAR_80STORE|VAR_HIRES)) == (VAR_80STORE|VAR_HIRES))
13781367   {
13791368      meminfo->read_mem      = (state->m_flags & VAR_PAGE2)   ? 0x012000 : 0x002000;
13801369      meminfo->write_mem      = (state->m_flags & VAR_PAGE2)   ? 0x012000 : 0x002000;
1381      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &write_delegates[0] : &write_delegates[1];
1370      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &state->write_delegates_2gs2000[0] : &state->write_delegates_2gs2000[1];
13821371   }
13831372   else
13841373   {
13851374      meminfo->read_mem      = (state->m_flags & VAR_RAMRD)   ? 0x012000 : 0x002000;
13861375      meminfo->write_mem      = (state->m_flags & VAR_RAMWRT)   ? 0x012000 : 0x002000;
1387      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &write_delegates[0] : &write_delegates[1];
1376      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &state->write_delegates_2gs2000[0] : &state->write_delegates_2gs2000[1];
13881377   }
13891378}
13901379
13911380static void apple2gs_mem_004000(running_machine &machine,offs_t begin, offs_t end, apple2_meminfo *meminfo)
13921381{
13931382   apple2gs_state *state = machine.driver_data<apple2gs_state>();
1394    static write8_delegate write_delegates[] =
1395    {
1396        write8_delegate(FUNC(apple2gs_state::apple2gs_aux4000_w), state),
1397        write8_delegate(FUNC(apple2gs_state::apple2gs_main4000_w), state)
1398    };
13991383   meminfo->read_mem         = (state->m_flags & VAR_RAMRD)   ? 0x014000 : 0x004000;
1400   meminfo->write_handler      = (state->m_flags & VAR_RAMWRT)   ? &write_delegates[0] : &write_delegates[1];
1384   meminfo->write_handler      = (state->m_flags & VAR_RAMWRT)   ? &state->write_delegates_2gs4000[0] : &state->write_delegates_2gs4000[1];
14011385}
14021386
14031387static void apple2gs_mem_xxD000(running_machine &machine,apple2_meminfo *meminfo, UINT32 lcmem)
r15439r15440
19001884
19011885MACHINE_RESET( apple2gs )
19021886{
1903/* Something needs to be here?
1904    When F3 pressed, the video mode changes and the machine goes into Basic */
1905}
1906
1907MACHINE_START( apple2gscommon )
1908{
19091887   apple2gs_state *state = machine.driver_data<apple2gs_state>();
1910   apple2_init_common(machine);
19111888
1912   /* set up Apple IIgs vectoring */
1913   g65816_set_read_vector_callback(machine.device("maincpu"), apple2gs_read_vector);
1889    state->apple2gs_refresh_delegates();
19141890
1915   /* setup globals */
19161891   state->m_cur_slot6_image = NULL;
19171892   state->m_newvideo = 0x00;
19181893   state->m_vgcint = 0x00;
r15439r15440
19541929   state->m_sndglu_ctrl = 0x00;
19551930   state->m_sndglu_addr = 0;
19561931   state->m_sndglu_dummy_read = 0;
1932}
19571933
1934MACHINE_START( apple2gscommon )
1935{
1936   apple2gs_state *state = machine.driver_data<apple2gs_state>();
1937
1938    state->apple2gs_refresh_delegates();
1939   apple2_init_common(machine);
1940
1941   /* set up Apple IIgs vectoring */
1942   g65816_set_read_vector_callback(machine.device("maincpu"), apple2gs_read_vector);
1943
1944   /* setup globals */
19581945   state->m_is_rom3 = true;
19591946
19601947   machine.device<nvram_device>("nvram")->set_base(state->m_clock_bram, sizeof(state->m_clock_bram));
r15439r15440
20332020   state->m_is_rom3 = false;
20342021   apple2gs_setup_memory(machine);
20352022}
2023
2024void apple2gs_state::apple2gs_refresh_delegates()
2025{
2026    write_delegates_2gs0400[0] = write8_delegate(FUNC(apple2gs_state::apple2gs_aux0400_w), this);
2027    write_delegates_2gs0400[1] = write8_delegate(FUNC(apple2gs_state::apple2gs_main0400_w), this);
2028    write_delegates_2gs2000[0] = write8_delegate(FUNC(apple2gs_state::apple2gs_aux2000_w), this);
2029    write_delegates_2gs2000[1] = write8_delegate(FUNC(apple2gs_state::apple2gs_main2000_w), this);
2030    write_delegates_2gs4000[0] = write8_delegate(FUNC(apple2gs_state::apple2gs_aux4000_w), this);
2031    write_delegates_2gs4000[1] = write8_delegate(FUNC(apple2gs_state::apple2gs_main4000_w), this);
2032}
2033
src/mess/machine/apple2.c
r15439r15440
7171   UINT32 rom_length, offset;
7272   bank_disposition_t bank_disposition;
7373   int wh_nop = 0;
74    static read8_delegate read_delegates[] =
75    {
76        read8_delegate(FUNC(apple2_state::read_floatingbus), state),
77        read8_delegate(FUNC(apple2_state::apple2_c1xx_r), state),
78        read8_delegate(FUNC(apple2_state::apple2_c3xx_r), state),
79        read8_delegate(FUNC(apple2_state::apple2_c4xx_r), state)
80    };
81    static write8_delegate write_delegates[] =
82    {
83        write8_delegate(FUNC(apple2_state::apple2_c1xx_w), state),
84        write8_delegate(FUNC(apple2_state::apple2_c3xx_w), state),
85        write8_delegate(FUNC(apple2_state::apple2_c4xx_w), state)
86    };
8774
8875   /* need to build list of current info? */
8976   if (!state->m_current_meminfo)
r15439r15440
131118         else if (meminfo.read_mem == APPLE2_MEM_FLOATING)
132119         {
133120            /* floating RAM */
134            rh = &read_delegates[0];
121            rh = &state->read_delegates_master[0];
135122         }
136123         else if ((meminfo.read_mem & 0xC0000000) == APPLE2_MEM_AUX)
137124         {
r15439r15440
145132            // slots 1-2
146133            if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0)
147134            {
148                    rh = &read_delegates[1];
135                    rh = &state->read_delegates_master[1];
149136            }
150137            else if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0x200)
151138            {   // slot 3
152                    rh = &read_delegates[2];
139                    rh = &state->read_delegates_master[2];
153140            }
154141            else if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0x300)
155142            {   // slots 4-7
156                    rh = &read_delegates[3];
143                    rh = &state->read_delegates_master[3];
157144            }
158145                else
159146                {
r15439r15440
237224            // slots 1-2
238225            if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0)
239226            {
240               wh = &write_delegates[0];
227               wh = &state->write_delegates_master[0];
241228            }
242229            else if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0x200)
243230            {   // slot 3
244               wh = &write_delegates[1];
231               wh = &state->write_delegates_master[1];
245232            }
246233            else if ((meminfo.write_mem & APPLE2_MEM_MASK) == 0x300)
247234            {   // slots 4-7
248               wh = &write_delegates[2];
235               wh = &state->write_delegates_master[2];
249236            }
250237         }
251238         else if ((meminfo.write_mem & 0xC0000000) == APPLE2_MEM_ROM)
r15439r15440
750737static void apple2_mem_0400(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
751738{
752739   apple2_state *state = machine.driver_data<apple2_state>();
753    static write8_delegate write_delegates[] =
754    {
755        write8_delegate(FUNC(apple2_state::apple2_auxram0400_w), state),
756        write8_delegate(FUNC(apple2_state::apple2_mainram0400_w), state)
757    };
740
758741   if (state->m_flags & VAR_80STORE)
759742   {
760743      meminfo->read_mem      = (state->m_flags & VAR_PAGE2)   ? 0x010400 : 0x000400;
761744      meminfo->write_mem      = (state->m_flags & VAR_PAGE2)   ? 0x010400 : 0x000400;
762      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &write_delegates[0] : &write_delegates[1];
745      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &state->write_delegates_0400[0] : &state->write_delegates_0400[1];
763746   }
764747   else
765748   {
766749      meminfo->read_mem      = (state->m_flags & VAR_RAMRD)   ? 0x010400 : 0x000400;
767750      meminfo->write_mem      = (state->m_flags & VAR_RAMWRT)   ? 0x010400 : 0x000400;
768      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &write_delegates[0] : &write_delegates[1];
751      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &state->write_delegates_0400[0] : &state->write_delegates_0400[1];
769752   }
770753}
771754
r15439r15440
779762static void apple2_mem_2000(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
780763{
781764   apple2_state *state = machine.driver_data<apple2_state>();
782    static write8_delegate write_delegates[] =
783    {
784        write8_delegate(FUNC(apple2_state::apple2_auxram2000_w), state),
785        write8_delegate(FUNC(apple2_state::apple2_mainram2000_w), state)
786    };
787765   if ((state->m_flags & (VAR_80STORE|VAR_HIRES)) == (VAR_80STORE|VAR_HIRES))
788766   {
789767      meminfo->read_mem      = (state->m_flags & VAR_PAGE2)   ? 0x012000 : 0x002000;
790768      meminfo->write_mem      = (state->m_flags & VAR_PAGE2)   ? 0x012000 : 0x002000;
791      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &write_delegates[0] : &write_delegates[1];
769      meminfo->write_handler   = (state->m_flags & VAR_PAGE2)   ? &state->write_delegates_2000[0] : &state->write_delegates_2000[1];
792770   }
793771   else
794772   {
795773      meminfo->read_mem      = (state->m_flags & VAR_RAMRD)   ? 0x012000 : 0x002000;
796774      meminfo->write_mem      = (state->m_flags & VAR_RAMWRT)   ? 0x012000 : 0x002000;
797      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &write_delegates[0] : &write_delegates[1];
775      meminfo->write_handler   = (state->m_flags & VAR_RAMWRT)   ? &state->write_delegates_2000[0] : &state->write_delegates_2000[1];
798776   }
799777}
800778
r15439r15440
808786static void apple2_mem_C000(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
809787{
810788   apple2_state *state = machine.driver_data<apple2_state>();
811    static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_c0xx_r), state);
812    static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_c0xx_w), state);
813
814   meminfo->read_handler = &rd;
815   meminfo->write_handler = &wd;
789   meminfo->read_handler = &state->rd_c000;
790   meminfo->write_handler = &state->wd_c000;
816791}
817792
818793static void apple2_mem_C080(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
819794{
820795   apple2_state *state = machine.driver_data<apple2_state>();
821    static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_c080_r), state);
822    static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_c080_w), state);
823796
824   meminfo->read_handler = &rd;
825   meminfo->write_handler = &wd;
797   meminfo->read_handler = &state->rd_c080;
798   meminfo->write_handler = &state->wd_c080;
826799}
827800
828801static void tk2000_mem_C100(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
r15439r15440
844817static void apple2_mem_CFFF(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
845818{
846819   apple2_state *state = machine.driver_data<apple2_state>();
847    static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_cfff_r), state);
848    static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_cfff_w), state);
849820
850   meminfo->read_handler = &rd;
851   meminfo->write_handler = &wd;
821   meminfo->read_handler = &state->rd_cfff;
822   meminfo->write_handler = &state->wd_cfff;
852823}
853824
854825static void apple2_mem_Cx00(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
r15439r15440
891862   }
892863   else
893864   {
894        static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_c800_r), state);
895        static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_c800_w), state);
896
897        meminfo->read_handler = &rd;
898      meminfo->write_handler = &wd;
865        meminfo->read_handler = &state->rd_c800;
866      meminfo->write_handler = &state->wd_c800;
899867   }
900868}
901869
r15439r15440
916884      }
917885      else
918886      {
919            static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_ce00_r), state);
920            static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_ce00_w), state);
921
922            meminfo->read_handler = &rd;
923            meminfo->write_handler = &wd;
887            meminfo->read_handler = &state->rd_c800;
888            meminfo->write_handler = &state->wd_c800;
924889      }
925890   }
926891}
r15439r15440
958923    }
959924    else
960925    {
961        static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_inh_d000_r), state);
962        static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_inh_d000_w), state);
963
964        meminfo->read_handler = &rd;
965      meminfo->write_handler = &wd;
926        meminfo->read_handler = &state->rd_inh_d000;
927      meminfo->write_handler = &state->wd_inh_d000;
966928    }
967929}
968930
r15439r15440
993955    }
994956    else
995957    {
996        static read8_delegate rd = read8_delegate(FUNC(apple2_state::apple2_inh_e000_r), state);
997        static write8_delegate wd = write8_delegate(FUNC(apple2_state::apple2_inh_e000_w), state);
998
999        meminfo->read_handler = &rd;
1000      meminfo->write_handler = &wd;
958        meminfo->read_handler = &state->rd_inh_e000;
959      meminfo->write_handler = &state->wd_inh_e000;
1001960    }
1002961}
1003962
r15439r15440
12231182   int need_intcxrom;
12241183
12251184    state->m_rambase = state->m_ram->pointer();
1185    state->apple2_refresh_delegates();
12261186
12271187   need_intcxrom = !strcmp(machine.system().name, "apple2c")
12281188      || !strcmp(machine.system().name, "apple2c0")
r15439r15440
18191779
18201780   if (machine.device<ram_device>(RAM_TAG)->size() <= 64*1024)
18211781      state->m_a2_mask &= ~(VAR_RAMRD | VAR_RAMWRT | VAR_80STORE | VAR_ALTZP | VAR_80COL);
1782
1783    state->apple2_refresh_delegates();
18221784}
18231785
18241786
r15439r15440
19491911   return (machine.root_device().ioport("keyb_special")->read() & key)
19501912      || (machine.root_device().ioport("joystick_buttons")->read_safe(0x00) & key);
19511913}
1914
1915void apple2_state::apple2_refresh_delegates()
1916{
1917    read_delegates_master[0] = read8_delegate(FUNC(apple2_state::read_floatingbus), this);
1918    read_delegates_master[1] = read8_delegate(FUNC(apple2_state::apple2_c1xx_r), this);
1919    read_delegates_master[2] = read8_delegate(FUNC(apple2_state::apple2_c3xx_r), this);
1920    read_delegates_master[3] = read8_delegate(FUNC(apple2_state::apple2_c4xx_r), this);
1921    write_delegates_master[0] = write8_delegate(FUNC(apple2_state::apple2_c1xx_w), this);
1922    write_delegates_master[1] = write8_delegate(FUNC(apple2_state::apple2_c3xx_w), this);
1923    write_delegates_master[2] = write8_delegate(FUNC(apple2_state::apple2_c4xx_w), this);
1924
1925    write_delegates_2000[0] = write8_delegate(FUNC(apple2_state::apple2_auxram2000_w), this);
1926    write_delegates_2000[1] = write8_delegate(FUNC(apple2_state::apple2_mainram2000_w), this);
1927
1928    rd_c000 = read8_delegate(FUNC(apple2_state::apple2_c0xx_r), this);
1929    wd_c000 = write8_delegate(FUNC(apple2_state::apple2_c0xx_w), this);
1930
1931    rd_c080 = read8_delegate(FUNC(apple2_state::apple2_c080_r), this);
1932    wd_c080 = write8_delegate(FUNC(apple2_state::apple2_c080_w), this);
1933
1934    rd_cfff = read8_delegate(FUNC(apple2_state::apple2_cfff_r), this);
1935    wd_cfff = write8_delegate(FUNC(apple2_state::apple2_cfff_w), this);
1936
1937    rd_c800 = read8_delegate(FUNC(apple2_state::apple2_c800_r), this);
1938    wd_c800 = write8_delegate(FUNC(apple2_state::apple2_c800_w), this);
1939
1940    rd_ce00 = read8_delegate(FUNC(apple2_state::apple2_ce00_r), this);
1941    wd_ce00 = write8_delegate(FUNC(apple2_state::apple2_ce00_w), this);
1942
1943    rd_inh_d000 = read8_delegate(FUNC(apple2_state::apple2_inh_d000_r), this);
1944    wd_inh_d000 = write8_delegate(FUNC(apple2_state::apple2_inh_d000_w), this);
1945
1946    rd_inh_e000 = read8_delegate(FUNC(apple2_state::apple2_inh_e000_r), this);
1947    wd_inh_e000 = write8_delegate(FUNC(apple2_state::apple2_inh_e000_w), this);
1948
1949    write_delegates_0400[0] = write8_delegate(FUNC(apple2_state::apple2_auxram0400_w), this);
1950    write_delegates_0400[1] = write8_delegate(FUNC(apple2_state::apple2_mainram0400_w), this);
1951
1952}
src/mess/includes/apple2gs.h
r15439r15440
129129
130130    UINT8 adb_read_datareg();
131131    UINT8 adb_read_kmstatus();
132
133    void apple2gs_refresh_delegates();
134
135    write8_delegate write_delegates_2gs0400[2];
136    write8_delegate write_delegates_2gs2000[2];
137    write8_delegate write_delegates_2gs4000[2];
132138};
133139
134140
src/mess/includes/apple2.h
r15439r15440
215215    READ8_MEMBER(apple2_cfff_r);
216216    WRITE8_MEMBER(apple2_cfff_w);
217217
218    void apple2_refresh_delegates();
219
220    read8_delegate read_delegates_master[4];
221    write8_delegate write_delegates_master[3];
222    write8_delegate write_delegates_0400[2];
223    write8_delegate write_delegates_2000[2];
224    read8_delegate rd_c000;
225    write8_delegate wd_c000;
226    read8_delegate rd_c080;
227    write8_delegate wd_c080;
228    read8_delegate rd_cfff;
229    write8_delegate wd_cfff;
230    read8_delegate rd_c800;
231    write8_delegate wd_c800;
232    read8_delegate rd_ce00;
233    write8_delegate wd_ce00;
234    read8_delegate rd_inh_d000;
235    write8_delegate wd_inh_d000;
236    read8_delegate rd_inh_e000;
237    write8_delegate wd_inh_e000;
218238};
219239
220240

Previous 15994 Revisions Next


© 1998-2018 The MESS Team