mac.cpp: Move V8 family machines (LC, LC II, Classic II, Color Classic) to new separate driver. [R. Belmont]

This commit is contained in:
arbee 2022-07-24 19:02:21 -04:00
parent 97f76ebc14
commit d3aba0d63d
8 changed files with 1805 additions and 672 deletions

View File

@ -6,7 +6,9 @@
Macintosh II family emulation
TODO:
- V8 and friends (LC, LC2, Classic 2, Color Classic) to own driver
- Move RBV machines (IIci/IIsi) to separate driver?
- Move IIfx to separate driver?
- Rewrite this driver in the newer (maclc3/maciivx/maclc) style as macii.cpp?
****************************************************************************/
@ -79,72 +81,24 @@ void mac_state::rbv_ramdac_w(offs_t offset, uint32_t data)
if (m_rbv_count == 3)
{
// for portrait display, force monochrome by using the blue channel
if (m_model != MODEL_MAC_CLASSIC_II)
if (m_montype.read_safe(2) == 1)
{
// Color Classic has no MONTYPE so the default gets us 512x384, which is right
if (m_montype.read_safe(2) == 1)
{
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]);
m_rbv_clutoffs++;
m_rbv_count = 0;
}
else
{
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]);
m_rbv_clutoffs++;
m_rbv_count = 0;
}
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]);
m_rbv_clutoffs++;
m_rbv_count = 0;
}
else
{
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]);
m_rbv_clutoffs++;
m_rbv_count = 0;
}
}
}
}
void mac_state::ariel_ramdac_w(offs_t offset, uint32_t data, uint32_t mem_mask) // this is for the "Ariel" style RAMDAC
{
if (mem_mask == 0xff000000)
{
m_rbv_clutoffs = data>>24;
m_rbv_count = 0;
}
else if (mem_mask == 0x00ff0000)
{
m_rbv_colors[m_rbv_count++] = (data>>16) & 0xff;
if (m_rbv_count == 3)
{
// for portrait display, force monochrome by using the blue channel
if (m_model != MODEL_MAC_CLASSIC_II)
{
// Color Classic has no MONTYPE so the default gets us 512x384, which is right
if (m_montype.read_safe(2) == 1)
{
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[2], m_rbv_colors[2], m_rbv_colors[2]);
m_rbv_clutoffs = (m_rbv_clutoffs + 1) & 0xff;
m_rbv_count = 0;
}
else
{
m_palette->set_pen_color(m_rbv_clutoffs, rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]));
m_rbv_palette[m_rbv_clutoffs] = rgb_t(m_rbv_colors[0], m_rbv_colors[1], m_rbv_colors[2]);
m_rbv_clutoffs = (m_rbv_clutoffs + 1) & 0xff;
m_rbv_count = 0;
}
}
}
}
else if (mem_mask == 0x0000ff00)
{
// config reg
// printf("Ariel: %02x to config\n", (data>>8)&0xff);
}
else // color key reg
{
}
}
void mac_state::rbv_recalc_irqs()
{
// check slot interrupts and bubble them down to IFR
@ -234,22 +188,6 @@ void mac_state::mac_rbv_w(offs_t offset, uint8_t data)
// printf("rbv_w: %02x to offset %x (PC=%x)\n", data, offset, m_maincpu->pc());
switch (offset)
{
case 0x00:
if (m_model == MODEL_MAC_LC)
{
m68000_base_device *m68k = downcast<m68000_base_device *>(m_maincpu.target());
m68k->set_hmmu_enable((data & 0x8) ? M68K_HMMU_DISABLE : M68K_HMMU_ENABLE_LC);
}
break;
case 0x01:
if (((data & 0xc0) != (m_rbv_regs[1] & 0xc0)) && (m_rbv_type == RBV_TYPE_V8))
{
m_rbv_regs[1] = data;
this->v8_resize();
}
break;
case 0x02:
data &= 0x40;
m_rbv_regs[offset] &= ~data;
@ -442,24 +380,6 @@ uint8_t mac_state::maciifx_8040_r()
ADDRESS MAPS
***************************************************************************/
void mac_state::maclc_map(address_map &map)
{
map.global_mask(0x80ffffff); // V8 uses bit 31 and 23-0 for address decoding only
map(0xa00000, 0xafffff).rom().region("bootrom", 0); // ROM (in 32-bit mode)
map(0xf00000, 0xf01fff).rw(FUNC(mac_state::mac_via_r), FUNC(mac_state::mac_via_w));
map(0xf04000, 0xf05fff).rw(FUNC(mac_state::mac_scc_r), FUNC(mac_state::mac_scc_2_w));
map(0xf06000, 0xf07fff).rw(FUNC(mac_state::macii_scsi_drq_r), FUNC(mac_state::macii_scsi_drq_w));
map(0xf10000, 0xf11fff).rw(FUNC(mac_state::macplus_scsi_r), FUNC(mac_state::macii_scsi_w));
map(0xf12000, 0xf13fff).rw(FUNC(mac_state::macii_scsi_drq_r), FUNC(mac_state::macii_scsi_drq_w));
map(0xf14000, 0xf15fff).rw(m_asc, FUNC(asc_device::read), FUNC(asc_device::write));
map(0xf16000, 0xf17fff).rw(FUNC(mac_state::mac_iwm_r), FUNC(mac_state::mac_iwm_w));
map(0xf24000, 0xf24003).rw(FUNC(mac_state::rbv_ramdac_r), FUNC(mac_state::ariel_ramdac_w));
map(0xf26000, 0xf27fff).rw(FUNC(mac_state::mac_rbv_r), FUNC(mac_state::mac_rbv_w)); // VIA2 (V8)
map(0xf40000, 0xfbffff).ram().share("vram");
}
void mac_state::macii_map(address_map &map)
{
map(0x40000000, 0x4003ffff).rom().region("bootrom", 0).mirror(0x0ffc0000);
@ -534,14 +454,6 @@ void mac_state::maciifx_map(address_map &map)
map(0x50040000, 0x50041fff).rw(FUNC(mac_state::mac_via_r), FUNC(mac_state::mac_via_w)).mirror(0x00f00000);
}
/***************************************************************************
DEVICE CONFIG
***************************************************************************/
static void mac_lcpds_cards(device_slot_interface &device)
{
}
/***************************************************************************
MACHINE DRIVERS
***************************************************************************/
@ -653,18 +565,6 @@ void mac_state::add_egret(machine_config &config, int type)
config.set_perfect_quantum(m_maincpu);
}
void mac_state::add_cuda(machine_config &config, int type)
{
CUDA(config, m_cuda, type);
m_cuda->reset_callback().set(FUNC(mac_state::cuda_reset_w));
m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w));
m_cuda->via_clock_callback().set(m_via1, FUNC(via6522_device::write_cb1));
m_cuda->via_data_callback().set(m_via1, FUNC(via6522_device::write_cb2));
m_macadb->set_mcu_mode(true);
m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line));
config.set_perfect_quantum(m_maincpu);
}
void mac_state::add_asc(machine_config &config, asc_device::asc_type type)
{
SPEAKER(config, "lspeaker").front_left();
@ -826,68 +726,6 @@ void mac_state::maciifx(machine_config &config)
nubus.out_irqe_callback().set(FUNC(mac_state::oss_interrupt<5>));
}
void mac_state::maclc(machine_config &config, bool cpu, bool egret, asc_device::asc_type asc_type, int woz_version)
{
macii(config, false, asc_type, false, true, true, woz_version);
if (cpu)
{
M68020HMMU(config, m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map);
m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override));
}
MCFG_VIDEO_START_OVERRIDE(mac_state,macv8)
MCFG_VIDEO_RESET_OVERRIDE(mac_state,macrbv)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(25175000, 800, 0, 640, 525, 0, 480);
m_screen->set_size(1024, 768);
m_screen->set_visarea(0, 640-1, 0, 480-1);
m_screen->set_screen_update(FUNC(mac_state::screen_update_macv8));
m_screen->screen_vblank().set(FUNC(mac_state::mac_rbv_vbl));
config.set_default_layout(layout_monitors);
m_ram->set_default_size("2M");
m_ram->set_extra_options("4M,6M,8M,10M");
m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_egadb));
add_nubus_pds(config, "lcpds", mac_lcpds_cards);
if (egret)
{
add_egret(config, EGRET_341S0850);
}
}
void mac_state::maclc2(machine_config &config, bool egret, int woz_version)
{
maclc(config, false, egret, asc_device::asc_type::V8, woz_version);
M68030(config, m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map);
m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override));
m_ram->set_default_size("4M");
m_ram->set_extra_options("6M,8M,10M");
}
void mac_state::maccclas(machine_config &config)
{
maclc(config, false, false, asc_device::asc_type::VASP, 2);
M68030(config, m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map);
m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override));
m_ram->set_default_size("4M");
m_ram->set_extra_options("6M,8M,10M");
add_cuda(config, CUDA_341S0788); // should be 0417, but that version won't sync up properly with the '030 right now
m_via1->writepb_handler().set(FUNC(mac_state::mac_via_out_b_cdadb));
}
void mac_state::maciix(machine_config &config, bool nubus_bank1, bool nubus_bank2)
{
macii(config, false, asc_device::asc_type::ASC, true, nubus_bank1, nubus_bank2);
@ -956,29 +794,6 @@ void mac_state::macse30(machine_config &config)
SOFTWARE_LIST(config, "flop35_list").set_original("mac_flop");
}
void mac_state::macclas2(machine_config &config)
{
maclc(config, false, true, asc_device::asc_type::EAGLE);
M68030(config, m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &mac_state::maclc_map);
m_maincpu->set_dasm_override(FUNC(mac_state::mac_dasm_override));
MCFG_VIDEO_START_OVERRIDE(mac_state,macv8)
MCFG_VIDEO_RESET_OVERRIDE(mac_state,maceagle)
m_screen->set_size(MAC_H_TOTAL, MAC_V_TOTAL);
m_screen->set_visarea(0, MAC_H_VIS-1, 0, MAC_V_VIS-1);
m_screen->set_screen_update(FUNC(mac_state::screen_update_macrbv));
m_asc->set_type(asc_device::asc_type::EAGLE);
m_ram->set_default_size("10M");
m_ram->set_extra_options("2M,4M,6M,8M,10M");
m_egret->set_type(EGRET_341S0851);
}
void mac_state::maciici(machine_config &config)
{
macii(config, false, asc_device::asc_type::ASC, true, false, true, 1);
@ -1049,14 +864,6 @@ INPUT_PORTS_END
***************************************************************************/
ROM_START( maclc )
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD("350eacf0.rom", 0x000000, 0x080000, CRC(71681726) SHA1(6bef5853ae736f3f06c2b4e79772f65910c3b7d4))
ROM_REGION(0x1100, "egret", 0)
ROM_LOAD( "341s0851.bin", 0x000000, 0x001100, CRC(ea9ea6e4) SHA1(8b0dae3ec66cdddbf71567365d2c462688aeb571) )
ROM_END
ROM_START( macii )
ROM_REGION32_BE(0x40000, "bootrom", 0)
ROM_SYSTEM_BIOS(0, "default", "rev. B")
@ -1114,29 +921,6 @@ ROM_START( maciisi )
ROM_LOAD( "36b7fb6c.rom", 0x000000, 0x080000, CRC(f304d973) SHA1(f923de4125aae810796527ff6e25364cf1d54eec) )
ROM_END
ROM_START( macclas2 )
ROM_REGION32_BE(0x100000, "bootrom", 0) // 3193670e
//ROM_LOAD( "3193670e.rom", 0x000000, 0x080000, CRC(96d2e1fd) SHA1(50df69c1b6e805e12a405dc610bc2a1471b2eac2) )
ROM_LOAD32_BYTE( "341-0867__ba16__=c=apple_91.romhh.27c010.u25", 0x000000, 0x020000, CRC(88230887) SHA1(8f45f6d7eb6a8ec9242a46db4773af1d154409c6) )
ROM_LOAD32_BYTE( "341-0866__5be9__=c=apple_91.rommh.27c010.u24", 0x000001, 0x020000, CRC(eae68c36) SHA1(e6ce79647dfe7e66590a012836d0b6e985ff672b) )
ROM_LOAD32_BYTE( "341-0865__821e__=c=apple_91.romml.27c010.u23", 0x000002, 0x020000, CRC(cb306c01) SHA1(4d6e409995fd9a4aa9afda0fd790a5b09b1c2aca) )
ROM_LOAD32_BYTE( "341-0864__6fc6__=c=apple_91.romll.27c010.u22", 0x000003, 0x020000, CRC(21a51e72) SHA1(bb513c1a5b8a41c7534d66aeacaeea47f58dae92) )
ROM_END
ROM_START( maclc2 )
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD32_BYTE( "341-0476_ue2-hh.bin", 0x000000, 0x020000, CRC(0c3b0ce4) SHA1(e4e8c883d7f2e002a3f7b7aefaa3840991e57025) )
ROM_LOAD32_BYTE( "341-0475_ud2-mh.bin", 0x000001, 0x020000, CRC(7b013595) SHA1(0b82d8fac570270db9774f6254017d28611ae756) )
ROM_LOAD32_BYTE( "341-0474_uc2-ml.bin", 0x000002, 0x020000, CRC(2ff2f52b) SHA1(876850df61d0233c1dd3c00d48d8d6690186b164) )
ROM_LOAD32_BYTE( "341-0473_ub2-ll.bin", 0x000003, 0x020000, CRC(8843c37c) SHA1(bb5104110507ca543d106f11c6061245fd90c1a7) )
ROM_END
ROM_START( maccclas )
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD( "ecd99dc0.rom", 0x000000, 0x100000, CRC(c84c3aa5) SHA1(fd9e852e2d77fe17287ba678709b9334d4d74f1e) )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
COMP( 1987, macii, 0, 0, macii, macadb, mac_state, init_macii, "Apple Computer", "Macintosh II", MACHINE_SUPPORTS_SAVE )
COMP( 1987, maciihmu, macii, 0, maciihmu, macadb, mac_state, init_macii, "Apple Computer", "Macintosh II (w/o 68851 MMU)", MACHINE_SUPPORTS_SAVE )
@ -1146,8 +930,4 @@ COMP( 1989, macse30, mac2fdhd, 0, macse30, macadb, mac_state, init_macs
COMP( 1989, maciicx, mac2fdhd, 0, maciicx, macadb, mac_state, init_maciicx, "Apple Computer", "Macintosh IIcx", MACHINE_SUPPORTS_SAVE )
COMP( 1989, maciici, 0, 0, maciici, maciici, mac_state, init_maciici, "Apple Computer", "Macintosh IIci", MACHINE_SUPPORTS_SAVE )
COMP( 1990, maciifx, 0, 0, maciifx, macadb, mac_state, init_maciifx, "Apple Computer", "Macintosh IIfx", MACHINE_NOT_WORKING )
COMP( 1990, maclc, 0, 0, maclc, maciici, mac_state, init_maclc, "Apple Computer", "Macintosh LC", MACHINE_IMPERFECT_SOUND )
COMP( 1990, maciisi, 0, 0, maciisi, maciici, mac_state, init_maciisi, "Apple Computer", "Macintosh IIsi", MACHINE_SUPPORTS_SAVE )
COMP( 1991, macclas2, 0, 0, macclas2, macadb, mac_state, init_macclassic2, "Apple Computer", "Macintosh Classic II", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND )
COMP( 1991, maclc2, 0, 0, maclc2, maciici, mac_state, init_maclc2, "Apple Computer", "Macintosh LC II", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_SOUND )
COMP( 1993, maccclas, 0, 0, maccclas, macadb, mac_state, init_maclrcclassic, "Apple Computer", "Macintosh Color Classic", MACHINE_NOT_WORKING )

View File

@ -19,7 +19,6 @@
#include "machine/ram.h"
#include "machine/timer.h"
#include "egret.h"
#include "cuda.h"
#include "macadb.h"
#include "bus/nubus/nubus.h"
#include "bus/macpds/macpds.h"
@ -36,8 +35,7 @@
// model helpers
#define ADB_IS_BITBANG_CLASS ((m_model >= MODEL_MAC_II && m_model <= MODEL_MAC_IICI) || (m_model == MODEL_MAC_SE30))
#define ADB_IS_EGRET (m_model >= MODEL_MAC_LC && m_model <= MODEL_MAC_CLASSIC_II) || ((m_model >= MODEL_MAC_IISI) && (m_model <= MODEL_MAC_IIVI))
#define ADB_IS_CUDA ((m_model >= MODEL_MAC_COLOR_CLASSIC && m_model <= MODEL_MAC_LC_580) || ((m_model >= MODEL_MAC_QUADRA_660AV) && (m_model <= MODEL_MAC_QUADRA_630)))
#define ADB_IS_EGRET (m_model == MODEL_MAC_IISI)
// video parameters for classic Macs
#define MAC_H_VIS (512)
@ -57,7 +55,6 @@ public:
m_via2(*this, "via6522_1"),
m_asc(*this, "asc"),
m_egret(*this, EGRET_TAG),
m_cuda(*this, CUDA_TAG),
m_macadb(*this, "macadb"),
m_ram(*this, RAM_TAG),
m_scc(*this, "scc"),
@ -88,34 +85,24 @@ public:
void add_via1_adb(machine_config &config, bool macii);
void add_via2(machine_config &config);
void add_egret(machine_config &config, int type);
void add_cuda(machine_config &config, int type);
void maclc(machine_config &config, bool cpu = true, bool egret = true, asc_device::asc_type asc_type = asc_device::asc_type::V8, int woz_version = 1);
void maciisi(machine_config &config);
void maclc2(machine_config &config, bool egret = true, int woz_version = 1);
void macpd210(machine_config &config);
void maciici(machine_config &config);
void maciix(machine_config &config, bool nubus_bank1 = true, bool nubus_bank2 = true);
void maccclas(machine_config &config);
void maciicx(machine_config &config);
void macse30(machine_config &config);
void maciifx(machine_config &config);
void macclas2(machine_config &config);
void macii(machine_config &config, bool cpu = true, asc_device::asc_type asc_type = asc_device::asc_type::ASC,
bool nubus = true, bool nubus_bank1 = true, bool nubus_bank2 = true, int woz_version = 0);
void maciihmu(machine_config &config);
void maciihd(machine_config &config);
void init_maclc2();
void init_maciifdhd();
void init_macse30();
void init_macii();
void init_macclassic2();
void init_maciifx();
void init_maclc();
void init_maciici();
void init_maciix();
void init_maclrcclassic();
void init_maciisi();
void init_maciicx();
@ -128,54 +115,8 @@ public:
MODEL_MAC_IICX,
MODEL_MAC_IICI,
MODEL_MAC_IISI,
MODEL_MAC_IIVX,
MODEL_MAC_IIVI,
MODEL_MAC_IIFX,
MODEL_MAC_SE30,
MODEL_MAC_LC, // LC class 68030 machines, generally using a V8 or compatible gate array
MODEL_MAC_LC_II,
MODEL_MAC_LC_III,
MODEL_MAC_LC_III_PLUS,
MODEL_MAC_CLASSIC_II,
MODEL_MAC_COLOR_CLASSIC,
MODEL_MAC_LC_475, // LC III clones with Cuda instead of Egret and 68LC040 on most models
MODEL_MAC_LC_520,
MODEL_MAC_LC_550,
MODEL_MAC_TV,
MODEL_MAC_LC_575,
MODEL_MAC_LC_580,
MODEL_MAC_PB140, // 68030 PowerBooks. 140/145/145B/170 all have the same machine ID
MODEL_MAC_PB160, // 160/180/165 all have the same machine ID too
MODEL_MAC_PB165c,
MODEL_MAC_PB180c,
MODEL_MAC_PB150, // 150 is fairly radically different from the other 1x0s
MODEL_MAC_PBDUO_210, // 68030 PowerBook Duos
MODEL_MAC_PBDUO_230,
MODEL_MAC_PBDUO_250,
MODEL_MAC_PBDUO_270c,
MODEL_MAC_QUADRA_700, // 68(LC)040 desktops
MODEL_MAC_QUADRA_610,
MODEL_MAC_QUADRA_650,
MODEL_MAC_QUADRA_800,
MODEL_MAC_QUADRA_900,
MODEL_MAC_QUADRA_950,
MODEL_MAC_QUADRA_660AV,
MODEL_MAC_QUADRA_840AV,
MODEL_MAC_QUADRA_605,
MODEL_MAC_QUADRA_630,
MODEL_MAC_PB550c, // 68(LC)040 PowerBooks
MODEL_MAC_PB520,
MODEL_MAC_PB520c,
MODEL_MAC_PB540,
MODEL_MAC_PB540c,
MODEL_MAC_PB190,
MODEL_MAC_PB190cs,
MODEL_MAC_SE30
};
model_t m_model;
@ -186,7 +127,6 @@ private:
optional_device<via6522_device> m_via2;
optional_device<asc_device> m_asc;
optional_device<egret_device> m_egret;
optional_device<cuda_device> m_cuda;
optional_device<macadb_device> m_macadb;
required_device<ram_device> m_ram;
required_device<scc8530_legacy_device> m_scc;
@ -195,22 +135,11 @@ private:
required_device<applefdintf_device> m_fdc;
required_device_array<floppy_connector, 2> m_floppy;
optional_device<rtc3430042_device> m_rtc;
//required_ioport m_mouse0, m_mouse1, m_mouse2;
//optional_ioport_array<7> m_keys;
optional_ioport m_montype;
virtual void machine_start() override;
virtual void machine_reset() override;
enum
{
RBV_TYPE_RBV = 0,
RBV_TYPE_V8,
RBV_TYPE_DAFB
};
uint32_t m_overlay = 0;
uint32_t m_via2_vbl = 0;
@ -235,7 +164,7 @@ private:
WRITE_LINE_MEMBER(adb_irq_w) { m_adb_irq_pending = state; }
// RBV and friends (V8, etc)
uint8_t m_rbv_regs[256]{}, m_rbv_ier = 0, m_rbv_ifr = 0, m_rbv_type = 0, m_rbv_montype = 0, m_rbv_vbltime = 0;
uint8_t m_rbv_regs[256]{}, m_rbv_ier = 0, m_rbv_ifr = 0, m_rbv_montype = 0, m_rbv_vbltime = 0;
uint32_t m_rbv_colors[3]{}, m_rbv_count = 0, m_rbv_clutoffs = 0, m_rbv_immed10wr = 0;
uint32_t m_rbv_palette[256]{};
emu_timer *m_vbl_timer = nullptr, *m_cursor_timer = nullptr;
@ -283,12 +212,9 @@ private:
uint32_t rbv_ramdac_r();
void rbv_ramdac_w(offs_t offset, uint32_t data);
void ariel_ramdac_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
uint8_t mac_rbv_r(offs_t offset);
void mac_rbv_w(offs_t offset, uint8_t data);
uint32_t mac_read_id();
uint16_t mac_config_r();
uint32_t biu_r(offs_t offset, uint32_t mem_mask = ~0);
@ -349,7 +275,6 @@ private:
uint32_t screen_update_macse30(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_macrbv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_macrbvvram(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_macv8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(mac_rbv_vbl);
TIMER_CALLBACK_MEMBER(mac_6015_tick);
@ -363,7 +288,6 @@ private:
void mac_via_out_b(uint8_t data);
void mac_via_out_b_bbadb(uint8_t data);
void mac_via_out_b_egadb(uint8_t data);
void mac_via_out_b_cdadb(uint8_t data);
uint8_t mac_via2_in_a();
uint8_t mac_via2_in_b();
void mac_via2_out_a(uint8_t data);

View File

@ -20,10 +20,6 @@
- Mac IIcx 030 SWIM MacII ADB ext NuBus card
- Mac IIci 030 SWIM MacII ADB ext Internal "RBV" type
- Mac IIsi 030 SWIM Egret ADB n/a Internal "RBV" type
- Mac LC 020 SWIM Egret ADB n/a Internal "V8" type
- Mac LC II 030 SWIM Egret ADB n/a Internal "V8" type
- Mac Classic II 030 SWIM Egret ADB n/a Internal "Eagle" type (V8 clone)
- Mac Color Classic 030 SWIM Cuda ADB n/a Internal "Spice" type (V8 clone)
Notes:
- On the SE and most later Macs, the first access to ROM turns off the overlay.
@ -51,7 +47,7 @@
#include "emu.h"
#include "mac.h"
#define INTS_RBV ((m_model >= MODEL_MAC_IICI) && (m_model <= MODEL_MAC_IIVI)) || ((m_model >= MODEL_MAC_LC) && (m_model <= MODEL_MAC_LC_580))
#define INTS_RBV ((m_model == MODEL_MAC_IICI) || (m_model == MODEL_MAC_IISI))
#ifdef MAME_DEBUG
#define LOG_ADB 0
@ -207,89 +203,6 @@ void mac_state::set_scc_waitrequest(int waitrequest)
/* Not Yet Implemented */
}
void mac_state::v8_resize()
{
offs_t memory_size;
uint8_t *memory_data;
int is_rom;
is_rom = (m_overlay) ? 1 : 0;
// get what memory we're going to map
if (is_rom)
{
/* ROM mirror */
memory_size = m_rom_size;
memory_data = reinterpret_cast<uint8_t *>(m_rom_ptr);
is_rom = true;
}
else
{
/* RAM */
memory_size = m_ram->size();
memory_data = m_ram->pointer();
is_rom = false;
}
// printf("mac_v8_resize: memory_size = %x, ctrl bits %02x (overlay %d = %s)\n", memory_size, m_rbv_regs[1] & 0xe0, m_overlay, is_rom ? "ROM" : "RAM");
if (is_rom)
{
mac_install_memory(0x00000000, memory_size-1, memory_size, memory_data, is_rom);
// install catcher in place of ROM that will detect the first access to ROM in its real location
m_maincpu->space(AS_PROGRAM).install_read_handler(0xa00000, 0xafffff, read32sm_delegate(*this, FUNC(mac_state::rom_switch_r)), 0xffffffff);
}
else
{
address_space& space = m_maincpu->space(AS_PROGRAM);
uint32_t onboard_amt, simm_amt, simm_size;
static const uint32_t simm_sizes[4] = { 0, 2*1024*1024, 4*1024*1024, 8*1024*1024 };
// re-install ROM in its normal place
size_t rom_mirror = 0xfffff ^ (m_rom_size - 1);
m_maincpu->space(AS_PROGRAM).install_rom(0xa00000, 0xafffff, rom_mirror, m_rom_ptr);
// force unmap of entire RAM region
space.unmap_write(0, 0x9fffff);
// LC and Classic II have 2 MB built-in, all other V8-style machines have 4 MB
// we reserve the first 2 or 4 MB of mess_ram for the onboard,
// RAM above that mark is the SIMM
onboard_amt = ((m_model == MODEL_MAC_LC) || (m_model == MODEL_MAC_CLASSIC_II)) ? 2*1024*1024 : 4*1024*1024;
simm_amt = (m_rbv_regs[1]>>6) & 3; // size of SIMM RAM window
simm_size = memory_size - onboard_amt; // actual amount of RAM available for SIMMs
// installing SIMM RAM?
if (simm_amt != 0)
{
// printf("mac_v8_resize: SIMM region size is %x, SIMM size is %x, onboard size is %x\n", simm_sizes[simm_amt], simm_size, onboard_amt);
if ((simm_amt > 0) && (simm_size > 0))
{
// mac_install_memory(0x000000, simm_sizes[simm_amt]-1, simm_sizes[simm_amt], memory_data + onboard_amt, is_rom);
mac_install_memory(0x000000, simm_size-1, simm_size, memory_data + onboard_amt, is_rom);
}
// onboard RAM sits immediately above the SIMM, if any
if (simm_sizes[simm_amt] + onboard_amt <= 0x800000)
{
mac_install_memory(simm_sizes[simm_amt], simm_sizes[simm_amt] + onboard_amt - 1, onboard_amt, memory_data, is_rom);
}
// a mirror of the first 2 MB of on board RAM always lives at 0x800000
mac_install_memory(0x800000, 0x9fffff, 0x200000, memory_data, is_rom);
}
else
{
// printf("mac_v8_resize: SIMM off, mobo RAM at 0 and top\n");
mac_install_memory(0x000000, onboard_amt-1, onboard_amt, memory_data, is_rom);
mac_install_memory(0x900000, 0x9fffff, 0x200000, memory_data+0x100000, is_rom);
}
}
}
void mac_state::set_memory_overlay(int overlay)
{
offs_t memory_size;
@ -318,12 +231,7 @@ void mac_state::set_memory_overlay(int overlay)
}
/* install the memory */
if (((m_model >= MODEL_MAC_LC) && (m_model <= MODEL_MAC_COLOR_CLASSIC)) || (m_model == MODEL_MAC_CLASSIC_II))
{
m_overlay = overlay;
v8_resize();
}
else if ((m_model == MODEL_MAC_IICI) || (m_model == MODEL_MAC_IISI))
if ((m_model == MODEL_MAC_IICI) || (m_model == MODEL_MAC_IISI))
{
// ROM is OK to flood to 3fffffff
if (is_rom)
@ -503,13 +411,6 @@ void mac_state::macii_scsi_w(offs_t offset, uint16_t data, uint16_t mem_mask)
WRITE_LINE_MEMBER(mac_state::mac_scsi_irq)
{
/* mac_state *mac = machine.driver_data<mac_state>();
if ((mac->m_scsiirq_enable) && ((mac->m_model == MODEL_MAC_SE) || (mac->m_model == MODEL_MAC_CLASSIC)))
{
mac->m_scsi_interrupt = state;
mac->field_interrupts();
}*/
}
void mac_state::scsi_berr_w(uint8_t data)
@ -591,10 +492,6 @@ WRITE_LINE_MEMBER(mac_state::mac_adb_via_out_cb2)
{
m_egret->set_via_data(state & 1);
}
else if (ADB_IS_CUDA)
{
m_cuda->set_via_data(state & 1);
}
else
{
if (m_macadb)
@ -654,10 +551,6 @@ uint8_t mac_state::mac_via_in_a()
case MODEL_MAC_SE30:
return 0x81 | PA6;
case MODEL_MAC_LC:
case MODEL_MAC_LC_II:
return 0x81 | PA6 | PA4 | PA2;
case MODEL_MAC_IICI:
return 0x81 | PA6 | PA2 | PA1;
@ -670,16 +563,6 @@ uint8_t mac_state::mac_via_in_a()
case MODEL_MAC_IICX:
return 0x81 | PA6;
case MODEL_MAC_CLASSIC_II:
case MODEL_MAC_QUADRA_800:
return 0x81 | PA4 | PA1;
case MODEL_MAC_QUADRA_900:
return 0x81 | PA6 | PA4;
case MODEL_MAC_COLOR_CLASSIC:
return 0x81 | PA1;
default:
return 0x80;
}
@ -707,11 +590,6 @@ uint8_t mac_state::mac_via_in_b()
{
val |= m_egret->get_xcvr_session()<<3;
}
else if (ADB_IS_CUDA)
{
logerror("%s cuda treq %d\n", machine().time().to_string(), m_cuda->get_treq());
val |= m_cuda->get_treq()<<3;
}
// printf("%s VIA1 IN_B = %02x\n", machine().describe_context().c_str(), val);
@ -737,10 +615,6 @@ uint8_t mac_state::mac_via_in_b_ii()
{
val |= m_egret->get_xcvr_session()<<3;
}
else if (ADB_IS_CUDA)
{
val |= m_cuda->get_treq()<<3;
}
// printf("%s VIA1 IN_B_II = %02x\n", machine().describe_context().c_str(), val);
@ -799,17 +673,6 @@ void mac_state::mac_via_out_b_egadb(uint8_t data)
m_egret->set_sys_session((data&0x20) ? 1 : 0);
}
void mac_state::mac_via_out_b_cdadb(uint8_t data)
{
// printf("%s VIA1 OUT B: %02x\n", machine().describe_context().c_str(), data);
#if LOG_ADB
printf("%s 68K: New Cuda state: TIP %d BYTEACK %d\n", machine().describe_context().c_str(), (data>>5)&1, (data>>4)&1);
#endif
m_cuda->set_byteack((data&0x10) ? 1 : 0);
m_cuda->set_tip((data&0x20) ? 1 : 0);
}
WRITE_LINE_MEMBER(mac_state::mac_via_irq)
{
/* interrupt the 68k (level 1) */
@ -913,29 +776,13 @@ void mac_state::mac_via2_w(offs_t offset, uint16_t data, uint16_t mem_mask)
uint8_t mac_state::mac_via2_in_a()
{
uint8_t result;
if ((m_model == MODEL_MAC_QUADRA_900) || (m_model == MODEL_MAC_QUADRA_950))
{
result = 0x80 | m_nubus_irq_state;
}
else
{
result = 0xc0 | m_nubus_irq_state;
}
return result;
return 0xc0 | m_nubus_irq_state;
}
uint8_t mac_state::mac_via2_in_b()
{
// logerror("%s VIA2 IN B\n", machine().describe_context());
if ((m_model == MODEL_MAC_LC) || (m_model == MODEL_MAC_LC_II) || (m_model == MODEL_MAC_CLASSIC_II))
{
return 0x4f;
}
if ((m_model == MODEL_MAC_SE30) || (m_model == MODEL_MAC_IIX))
{
return 0x87; // bits 3 and 6 are tied low on SE/30
@ -1015,7 +862,7 @@ void mac_state::machine_start()
void mac_state::machine_reset()
{
if ((ADB_IS_EGRET) || (ADB_IS_CUDA))
if (ADB_IS_EGRET)
{
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
}
@ -1026,18 +873,11 @@ void mac_state::machine_reset()
m_rbv_vbltime = 0;
// start 60.15 Hz timer for most systems
if (((m_model >= MODEL_MAC_IICI) && (m_model <= MODEL_MAC_IIFX)) || (m_model >= MODEL_MAC_LC))
if ((m_model >= MODEL_MAC_IICI) && (m_model <= MODEL_MAC_IIFX))
{
m_6015_timer->adjust(attotime::from_hz(60.15), 0, attotime::from_hz(60.15));
}
// default to 32-bit mode on LC
if (m_model == MODEL_MAC_LC)
{
m68000_base_device *m68k = downcast<m68000_base_device *>(m_maincpu.target());
m68k->set_hmmu_enable(M68K_HMMU_DISABLE);
}
m_last_taken_interrupt = -1;
/* setup the memory overlay */
@ -1046,14 +886,7 @@ void mac_state::machine_reset()
if (m_overlay_timeout != (emu_timer *)nullptr)
{
if (((m_model >= MODEL_MAC_LC) && (m_model <= MODEL_MAC_COLOR_CLASSIC)) || (m_model == MODEL_MAC_CLASSIC_II))
{
m_overlay_timeout->adjust(attotime::never);
}
else
{
m_overlay_timeout->adjust(m_maincpu->cycles_to_attotime(8));
}
m_overlay_timeout->adjust(m_maincpu->cycles_to_attotime(8));
}
/* setup videoram */
@ -1106,47 +939,6 @@ TIMER_CALLBACK_MEMBER(mac_state::overlay_timeout_func)
m_overlay_timeout->adjust(attotime::never);
}
uint32_t mac_state::mac_read_id()
{
// printf("Mac read ID reg @ PC=%x\n", m_maincpu->pc());
switch (m_model)
{
case MODEL_MAC_LC_475:
return 0xa55a2221;
case MODEL_MAC_LC_550:
return 0xa55a0101;
case MODEL_MAC_LC_575:
return 0xa55a222e;
case MODEL_MAC_PBDUO_210:
return 0xa55a1004;
case MODEL_MAC_PBDUO_230:
return 0xa55a1005;
case MODEL_MAC_PBDUO_250:
return 0xa55a1006;
case MODEL_MAC_QUADRA_605:
return 0xa55a2225;
case MODEL_MAC_QUADRA_610:
case MODEL_MAC_QUADRA_650:
case MODEL_MAC_QUADRA_800:
return 0xa55a2bad;
case MODEL_MAC_QUADRA_660AV:
case MODEL_MAC_QUADRA_840AV:
return 0xa55a2830;
default:
return 0;
}
}
void mac_state::mac_driver_init(model_t model)
{
m_overlay = 1;
@ -1164,8 +956,7 @@ void mac_state::mac_driver_init(model_t model)
memset(m_ram->pointer(), 0, m_ram->size());
if ((model == MODEL_MAC_CLASSIC_II) || (model == MODEL_MAC_LC) || (model == MODEL_MAC_COLOR_CLASSIC) ||
(model == MODEL_MAC_LC_II) || ((m_model >= MODEL_MAC_II) && (m_model <= MODEL_MAC_SE30)))
if ((m_model >= MODEL_MAC_II) && (m_model <= MODEL_MAC_SE30))
{
m_overlay_timeout = timer_alloc(FUNC(mac_state::overlay_timeout_func), this);
}
@ -1184,14 +975,10 @@ void mac_state::init_##label() \
mac_driver_init(model); \
}
MAC_DRIVER_INIT(maclc, MODEL_MAC_LC)
MAC_DRIVER_INIT(maclc2, MODEL_MAC_LC_II)
MAC_DRIVER_INIT(maciici, MODEL_MAC_IICI)
MAC_DRIVER_INIT(maciisi, MODEL_MAC_IISI)
MAC_DRIVER_INIT(macii, MODEL_MAC_II)
MAC_DRIVER_INIT(macse30, MODEL_MAC_SE30)
MAC_DRIVER_INIT(macclassic2, MODEL_MAC_CLASSIC_II)
MAC_DRIVER_INIT(maclrcclassic, MODEL_MAC_COLOR_CLASSIC)
MAC_DRIVER_INIT(maciifx, MODEL_MAC_IIFX)
MAC_DRIVER_INIT(maciicx, MODEL_MAC_IICX)
MAC_DRIVER_INIT(maciifdhd, MODEL_MAC_II_FDHD)

View File

@ -2,12 +2,10 @@
// copyright-holders:Nathan Woods, Raphael Nabet, R. Belmont
/***************************************************************************
video/mac.cpp
mac_v.cpp
Macintosh video hardware
Emulates the video hardware for systems with the
RBV, V8, and Eagle chips.
Emulates the video hardware for systems with RBV and SE/30 video
----------------------------------------------------------------------
Monitor sense codes
@ -107,8 +105,6 @@ VIDEO_RESET_MEMBER(mac_state,macrbv)
m_rbv_regs[2] = 0x7f;
m_rbv_regs[3] = 0;
m_rbv_type = RBV_TYPE_RBV;
view = 0;
m_rbv_montype = m_montype.read_safe(2);
@ -145,21 +141,6 @@ VIDEO_RESET_MEMBER(mac_state,macrbv)
target->set_view(view);
}
VIDEO_START_MEMBER(mac_state,macv8)
{
memset(m_rbv_regs, 0, sizeof(m_rbv_regs));
m_rbv_count = 0;
m_rbv_clutoffs = 0;
m_rbv_immed10wr = 0;
m_rbv_regs[0] = 0x4f;
m_rbv_regs[1] = 0x06;
m_rbv_regs[2] = 0x7f;
m_rbv_type = RBV_TYPE_V8;
}
uint32_t mac_state::screen_update_macrbv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t const *vram8 = (uint8_t *)m_ram->pointer();
@ -167,12 +148,6 @@ uint32_t mac_state::screen_update_macrbv(screen_device &screen, bitmap_rgb32 &bi
switch (m_rbv_montype)
{
case 32: // classic II built-in display
hres = MAC_H_VIS;
vres = MAC_V_VIS;
vram8 += 0x1f9a80; // Classic II apparently doesn't use VRAM?
break;
case 1: // 15" portrait display
hres = 640;
vres = 870;
@ -267,111 +242,3 @@ uint32_t mac_state::screen_update_macrbv(screen_device &screen, bitmap_rgb32 &bi
return 0;
}
uint32_t mac_state::screen_update_macv8(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
int hres, vres;
switch (m_rbv_montype)
{
case 1: // 15" portrait display
hres = 640;
vres = 870;
break;
case 2: // 12" RGB
hres = 512;
vres = 384;
break;
case 6: // 13" RGB
default:
hres = 640;
vres = 480;
break;
}
switch (m_rbv_regs[0x10] & 7)
{
case 0: // 1bpp
{
uint8_t const *const vram8 = (uint8_t *)m_vram.target();
for (int y = 0; y < vres; y++)
{
uint32_t *scanline = &bitmap.pix(y);
for (int x = 0; x < hres; x+=8)
{
uint8_t const pixels = vram8[(y * 1024) + ((x/8)^3)];
*scanline++ = m_rbv_palette[0x7f|(pixels&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<1)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<2)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<3)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<4)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<5)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<6)&0x80)];
*scanline++ = m_rbv_palette[0x7f|((pixels<<7)&0x80)];
}
}
}
break;
case 1: // 2bpp
{
uint8_t const *const vram8 = (uint8_t *)m_vram.target();
for (int y = 0; y < vres; y++)
{
uint32_t *scanline = &bitmap.pix(y);
for (int x = 0; x < hres/4; x++)
{
uint8_t const pixels = vram8[(y * 1024) + (BYTE4_XOR_BE(x))];
*scanline++ = m_rbv_palette[0x3f|(pixels&0xc0)];
*scanline++ = m_rbv_palette[0x3f|((pixels<<2)&0xc0)];
*scanline++ = m_rbv_palette[0x3f|((pixels<<4)&0xc0)];
*scanline++ = m_rbv_palette[0x3f|((pixels<<6)&0xc0)];
}
}
}
break;
case 2: // 4bpp
{
uint8_t const *const vram8 = (uint8_t *)m_vram.target();
for (int y = 0; y < vres; y++)
{
uint32_t *scanline = &bitmap.pix(y);
for (int x = 0; x < hres/2; x++)
{
uint8_t const pixels = vram8[(y * 1024) + (BYTE4_XOR_BE(x))];
*scanline++ = m_rbv_palette[(pixels&0xf0) | 0xf];
*scanline++ = m_rbv_palette[((pixels&0x0f)<<4) | 0xf];
}
}
}
break;
case 3: // 8bpp
{
uint8_t const *const vram8 = (uint8_t *)m_vram.target();
for (int y = 0; y < vres; y++)
{
uint32_t *scanline = &bitmap.pix(y);
for (int x = 0; x < hres; x++)
{
uint8_t const pixels = vram8[(y * 1024) + (BYTE4_XOR_BE(x))];
*scanline++ = m_rbv_palette[pixels];
}
}
}
break;
}
return 0;
}

478
src/mame/apple/maclc.cpp Normal file
View File

@ -0,0 +1,478 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont
/****************************************************************************
maclc.cpp
Mac LC, LC II, Classic II, Color Classic
By R. Belmont
These are all lower-end machines based on versions of the "V8" system
controller, which has a 10 MB hard limit on RAM.
****************************************************************************/
#include "emu.h"
#include "bus/nscsi/devices.h"
#include "bus/rs232/rs232.h"
#include "cpu/m68000/m68000.h"
#include "machine/applefdintf.h"
#include "machine/ncr5380.h"
#include "machine/nscsi_bus.h"
#include "machine/ram.h"
#include "machine/swim1.h"
#include "machine/timer.h"
#include "machine/z80scc.h"
#include "cuda.h"
#include "egret.h"
#include "macadb.h"
#include "macscsi.h"
#include "v8.h"
#include "emupal.h"
#include "screen.h"
#include "softlist_dev.h"
namespace {
#define C32M (31.3344_MHz_XTAL)
#define C15M (C32M/2)
#define C7M (C32M/4)
class maclc_state : public driver_device
{
public:
maclc_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_macadb(*this, "macadb"),
m_ram(*this, RAM_TAG),
m_v8(*this, "v8"),
m_fdc(*this, "fdc"),
m_floppy(*this, "fdc:%d", 0U),
m_scsibus1(*this, "scsi"),
m_ncr5380(*this, "scsi:7:ncr5380"),
m_scsihelp(*this, "scsihelp"),
m_scc(*this, "scc"),
m_egret(*this, "egret"),
m_cuda(*this, "cuda"),
m_cur_floppy(nullptr),
m_hdsel(0)
{
}
void maclc_base(machine_config &config);
void maclc(machine_config &config);
void maclc2(machine_config &config);
void macclas2(machine_config &config);
void maccclas(machine_config &config);
void maclc_map(address_map &map);
void maccclassic_map(address_map &map);
private:
required_device<m68000_base_device> m_maincpu;
required_device<macadb_device> m_macadb;
required_device<ram_device> m_ram;
required_device<v8_device> m_v8;
optional_device<applefdintf_device> m_fdc;
optional_device_array<floppy_connector, 2> m_floppy;
required_device<nscsi_bus_device> m_scsibus1;
required_device<ncr5380_device> m_ncr5380;
required_device<mac_scsi_helper_device> m_scsihelp;
required_device<z80scc_device> m_scc;
optional_device<egret_device> m_egret;
optional_device<cuda_device> m_cuda;
virtual void machine_start() override;
u16 scc_r(offs_t offset)
{
u16 result = m_scc->dc_ab_r(offset);
return (result << 8) | result;
}
void scc_w(offs_t offset, u16 data)
{
m_scc->dc_ab_w(offset, data >> 8);
}
u16 scsi_r(offs_t offset, u16 mem_mask = ~0);
void scsi_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u32 scsi_drq_r(offs_t offset, u32 mem_mask = ~0);
void scsi_drq_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void scsi_berr_w(u8 data)
{
m_maincpu->pulse_input_line(M68K_LINE_BUSERROR, attotime::zero);
}
WRITE_LINE_MEMBER(cuda_reset_w)
{
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
m_maincpu->set_input_line(INPUT_LINE_RESET, state);
}
floppy_image_device *m_cur_floppy = nullptr;
int m_hdsel;
void phases_w(uint8_t phases);
void devsel_w(uint8_t devsel);
uint16_t swim_r(offs_t offset, u16 mem_mask);
void swim_w(offs_t offset, u16 data, u16 mem_mask);
WRITE_LINE_MEMBER(hdsel_w);
WRITE_LINE_MEMBER(egret_reset_w)
{
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
m_maincpu->set_input_line(INPUT_LINE_RESET, state);
}
WRITE_LINE_MEMBER(set_hmmu)
{
m_maincpu->set_hmmu_enable((state == ASSERT_LINE) ? M68K_HMMU_DISABLE : M68K_HMMU_ENABLE_LC);
}
};
void maclc_state::machine_start()
{
m_v8->set_ram_info((u32 *) m_ram->pointer(), m_ram->size());
save_item(NAME(m_hdsel));
}
/***************************************************************************
ADDRESS MAPS
***************************************************************************/
void maclc_state::maclc_map(address_map &map)
{
map.global_mask(0x80ffffff); // V8 uses bit 31 and 23-0 for address decoding only
// RAM, ROM, and base I/O mappings come from V8
map(0xa00000, 0xffffff).m(m_v8, FUNC(v8_device::map));
map(0xf04000, 0xf05fff).rw(FUNC(maclc_state::scc_r), FUNC(maclc_state::scc_w));
map(0xf06000, 0xf07fff).rw(FUNC(maclc_state::scsi_drq_r), FUNC(maclc_state::scsi_drq_w));
map(0xf10000, 0xf11fff).rw(FUNC(maclc_state::scsi_r), FUNC(maclc_state::scsi_w));
map(0xf12000, 0xf13fff).rw(FUNC(maclc_state::scsi_drq_r), FUNC(maclc_state::scsi_drq_w));
map(0xf16000, 0xf17fff).rw(FUNC(maclc_state::swim_r), FUNC(maclc_state::swim_w));
}
void maclc_state::maccclassic_map(address_map &map)
{
map.global_mask(0x80ffffff); // V8 uses bit 31 and 23-0 for address decoding only
// RAM, ROM, and base I/O mappings come from V8
map(0xa00000, 0xffffff).m(m_v8, FUNC(v8_device::map));
map(0xf04000, 0xf05fff).rw(FUNC(maclc_state::scc_r), FUNC(maclc_state::scc_w));
map(0xf06000, 0xf07fff).rw(FUNC(maclc_state::scsi_drq_r), FUNC(maclc_state::scsi_drq_w));
map(0xf10000, 0xf11fff).rw(FUNC(maclc_state::scsi_r), FUNC(maclc_state::scsi_w));
map(0xf12000, 0xf13fff).rw(FUNC(maclc_state::scsi_drq_r), FUNC(maclc_state::scsi_drq_w));
}
u16 maclc_state::scsi_r(offs_t offset, u16 mem_mask)
{
const int reg = (offset >> 3) & 0xf;
const bool pseudo_dma = (reg == 6) && (offset == 0x130);
return m_scsihelp->read_wrapper(pseudo_dma, reg) << 8;
}
void maclc_state::scsi_w(offs_t offset, u16 data, u16 mem_mask)
{
const int reg = (offset >> 3) & 0xf;
const bool pseudo_dma = (reg == 0) && (offset == 0x100);
m_scsihelp->write_wrapper(pseudo_dma, reg, data >> 8);
}
u32 maclc_state::scsi_drq_r(offs_t offset, u32 mem_mask)
{
switch (mem_mask)
{
case 0xff000000:
return m_scsihelp->read_wrapper(true, 6) << 24;
case 0xffff0000:
return (m_scsihelp->read_wrapper(true, 6) << 24) | (m_scsihelp->read_wrapper(true, 6) << 16);
case 0xffffffff:
return (m_scsihelp->read_wrapper(true, 6) << 24) | (m_scsihelp->read_wrapper(true, 6) << 16) | (m_scsihelp->read_wrapper(true, 6) << 8) | m_scsihelp->read_wrapper(true, 6);
default:
logerror("scsi_drq_r: unknown mem_mask %08x\n", mem_mask);
}
return 0;
}
void maclc_state::scsi_drq_w(offs_t offset, u32 data, u32 mem_mask)
{
switch (mem_mask)
{
case 0xff000000:
m_scsihelp->write_wrapper(true, 0, data >> 24);
break;
case 0xffff0000:
m_scsihelp->write_wrapper(true, 0, data >> 24);
m_scsihelp->write_wrapper(true, 0, data >> 16);
break;
case 0xffffffff:
m_scsihelp->write_wrapper(true, 0, data >> 24);
m_scsihelp->write_wrapper(true, 0, data >> 16);
m_scsihelp->write_wrapper(true, 0, data >> 8);
m_scsihelp->write_wrapper(true, 0, data & 0xff);
break;
default:
logerror("scsi_drq_w: unknown mem_mask %08x\n", mem_mask);
break;
}
}
uint16_t maclc_state::swim_r(offs_t offset, u16 mem_mask)
{
if (!machine().side_effects_disabled())
{
m_maincpu->adjust_icount(-5);
}
u16 result = m_fdc->read((offset >> 8) & 0xf);
return result << 8;
}
void maclc_state::swim_w(offs_t offset, u16 data, u16 mem_mask)
{
if (ACCESSING_BITS_0_7)
m_fdc->write((offset >> 8) & 0xf, data & 0xff);
else
m_fdc->write((offset >> 8) & 0xf, data >> 8);
}
void maclc_state::phases_w(uint8_t phases)
{
if (m_cur_floppy)
m_cur_floppy->seek_phase_w(phases);
}
void maclc_state::devsel_w(uint8_t devsel)
{
if (devsel == 1)
m_cur_floppy = m_floppy[0]->get_device();
else if (devsel == 2)
m_cur_floppy = m_floppy[1]->get_device();
else
m_cur_floppy = nullptr;
m_fdc->set_floppy(m_cur_floppy);
if (m_cur_floppy)
m_cur_floppy->ss_w(m_hdsel);
}
WRITE_LINE_MEMBER(maclc_state::hdsel_w)
{
if (state != m_hdsel)
{
if (m_cur_floppy)
{
m_cur_floppy->ss_w(state);
}
}
m_hdsel = state;
}
/***************************************************************************
DEVICE CONFIG
***************************************************************************/
static INPUT_PORTS_START( maclc )
INPUT_PORTS_END
/***************************************************************************
MACHINE DRIVERS
***************************************************************************/
void maclc_state::maclc_base(machine_config &config)
{
M68020HMMU(config, m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &maclc_state::maclc_map);
RAM(config, m_ram);
NSCSI_BUS(config, "scsi");
NSCSI_CONNECTOR(config, "scsi:0", mac_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:1", mac_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:2", mac_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:3", mac_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:4", mac_scsi_devices, "cdrom");
NSCSI_CONNECTOR(config, "scsi:5", mac_scsi_devices, nullptr);
NSCSI_CONNECTOR(config, "scsi:6", mac_scsi_devices, "harddisk");
NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5380", NCR53C80).machine_config([this](device_t *device)
{
ncr53c80_device &adapter = downcast<ncr53c80_device &>(*device);
adapter.drq_handler().set(m_scsihelp, FUNC(mac_scsi_helper_device::drq_w));
});
MAC_SCSI_HELPER(config, m_scsihelp);
m_scsihelp->scsi_read_callback().set(m_ncr5380, FUNC(ncr53c80_device::read));
m_scsihelp->scsi_write_callback().set(m_ncr5380, FUNC(ncr53c80_device::write));
m_scsihelp->scsi_dma_read_callback().set(m_ncr5380, FUNC(ncr53c80_device::dma_r));
m_scsihelp->scsi_dma_write_callback().set(m_ncr5380, FUNC(ncr53c80_device::dma_w));
m_scsihelp->cpu_halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
m_scsihelp->timeout_error_callback().set(FUNC(maclc_state::scsi_berr_w));
SOFTWARE_LIST(config, "hdd_list").set_original("mac_hdd");
SOFTWARE_LIST(config, "flop35hd_list").set_original("mac_hdflop");
SCC85C30(config, m_scc, C7M);
m_scc->configure_channels(3'686'400, 3'686'400, 3'686'400, 3'686'400);
m_scc->out_int_callback().set(m_v8, FUNC(v8_device::scc_irq_w));
m_scc->out_txda_callback().set("printer", FUNC(rs232_port_device::write_txd));
m_scc->out_txdb_callback().set("modem", FUNC(rs232_port_device::write_txd));
rs232_port_device &rs232a(RS232_PORT(config, "printer", default_rs232_devices, nullptr));
rs232a.rxd_handler().set(m_scc, FUNC(z80scc_device::rxa_w));
rs232a.dcd_handler().set(m_scc, FUNC(z80scc_device::dcda_w));
rs232a.cts_handler().set(m_scc, FUNC(z80scc_device::ctsa_w));
rs232_port_device &rs232b(RS232_PORT(config, "modem", default_rs232_devices, nullptr));
rs232b.rxd_handler().set(m_scc, FUNC(z80scc_device::rxb_w));
rs232b.dcd_handler().set(m_scc, FUNC(z80scc_device::dcdb_w));
rs232b.cts_handler().set(m_scc, FUNC(z80scc_device::ctsb_w));
V8(config, m_v8, C15M);
m_v8->set_maincpu_tag("maincpu");
m_v8->set_rom_tag("bootrom");
m_v8->hdsel_callback().set(FUNC(maclc_state::hdsel_w));
m_v8->hmmu_enable_callback().set(FUNC(maclc_state::set_hmmu));
MACADB(config, m_macadb, C15M);
m_macadb->set_mcu_mode(true);
EGRET(config, m_egret, EGRET_341S0850);
m_egret->reset_callback().set(FUNC(maclc_state::egret_reset_w));
m_egret->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w));
m_egret->via_clock_callback().set(m_v8, FUNC(v8_device::cb1_w));
m_egret->via_data_callback().set(m_v8, FUNC(v8_device::cb2_w));
m_macadb->adb_data_callback().set(m_egret, FUNC(egret_device::set_adb_line));
config.set_perfect_quantum(m_maincpu);
m_v8->pb3_callback().set(m_egret, FUNC(egret_device::get_xcvr_session));
m_v8->pb4_callback().set(m_egret, FUNC(egret_device::set_via_full));
m_v8->pb5_callback().set(m_egret, FUNC(egret_device::set_sys_session));
m_v8->cb2_callback().set(m_egret, FUNC(egret_device::set_via_data));
SWIM1(config, m_fdc, C15M);
m_fdc->devsel_cb().set(FUNC(maclc_state::devsel_w));
m_fdc->phases_cb().set(FUNC(maclc_state::phases_w));
applefdintf_device::add_35_hd(config, m_floppy[0]);
applefdintf_device::add_35_nc(config, m_floppy[1]);
}
void maclc_state::maclc(machine_config &config)
{
maclc_base(config);
m_ram->set_default_size("2M");
m_ram->set_extra_options("4M,6M,10M");
m_v8->set_baseram_is_4M(false);
}
void maclc_state::maclc2(machine_config &config)
{
maclc_base(config);
M68030(config.replace(), m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &maclc_state::maclc_map);
m_ram->set_default_size("4M");
m_ram->set_extra_options("6M,8M,10M");
m_v8->set_baseram_is_4M(true);
}
void maclc_state::maccclas(machine_config &config)
{
maclc_base(config);
M68030(config.replace(), m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &maclc_state::maccclassic_map);
config.device_remove("egret");
config.device_remove("fdc");
CUDA(config, m_cuda, CUDA_341S0788); // should be 0417, but that version won't sync up properly with the '030
m_cuda->reset_callback().set(FUNC(maclc_state::egret_reset_w));
m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w));
m_cuda->via_clock_callback().set(m_v8, FUNC(v8_device::cb1_w));
m_cuda->via_data_callback().set(m_v8, FUNC(v8_device::cb2_w));
m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line));
config.set_perfect_quantum(m_maincpu);
SPICE(config.replace(), m_v8, C15M);
m_v8->set_maincpu_tag("maincpu");
m_v8->set_rom_tag("bootrom");
m_v8->hdsel_callback().set(FUNC(maclc_state::hdsel_w));
m_v8->pb3_callback().set(m_cuda, FUNC(cuda_device::get_treq));
m_v8->pb4_callback().set(m_cuda, FUNC(cuda_device::set_byteack));
m_v8->pb5_callback().set(m_cuda, FUNC(cuda_device::set_tip));
m_v8->cb2_callback().set(m_cuda, FUNC(cuda_device::set_via_data));
m_ram->set_default_size("4M");
m_ram->set_extra_options("6M,8M,10M");
m_v8->set_baseram_is_4M(true);
}
void maclc_state::macclas2(machine_config &config)
{
maclc_base(config);
M68030(config.replace(), m_maincpu, C15M);
m_maincpu->set_addrmap(AS_PROGRAM, &maclc_state::maclc_map);
EAGLE(config.replace(), m_v8, C15M);
m_v8->set_maincpu_tag("maincpu");
m_v8->set_rom_tag("bootrom");
m_v8->hdsel_callback().set(FUNC(maclc_state::hdsel_w));
m_v8->pb3_callback().set(m_egret, FUNC(egret_device::get_xcvr_session));
m_v8->pb4_callback().set(m_egret, FUNC(egret_device::set_via_full));
m_v8->pb5_callback().set(m_egret, FUNC(egret_device::set_sys_session));
m_v8->cb2_callback().set(m_egret, FUNC(egret_device::set_via_data));
m_ram->set_default_size("4M");
m_ram->set_extra_options("6M,8M,10M");
m_v8->set_baseram_is_4M(true);
}
ROM_START(maclc)
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD("350eacf0.rom", 0x000000, 0x080000, CRC(71681726) SHA1(6bef5853ae736f3f06c2b4e79772f65910c3b7d4))
ROM_END
ROM_START( maclc2 )
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD32_BYTE( "341-0476_ue2-hh.bin", 0x000000, 0x020000, CRC(0c3b0ce4) SHA1(e4e8c883d7f2e002a3f7b7aefaa3840991e57025) )
ROM_LOAD32_BYTE( "341-0475_ud2-mh.bin", 0x000001, 0x020000, CRC(7b013595) SHA1(0b82d8fac570270db9774f6254017d28611ae756) )
ROM_LOAD32_BYTE( "341-0474_uc2-ml.bin", 0x000002, 0x020000, CRC(2ff2f52b) SHA1(876850df61d0233c1dd3c00d48d8d6690186b164) )
ROM_LOAD32_BYTE( "341-0473_ub2-ll.bin", 0x000003, 0x020000, CRC(8843c37c) SHA1(bb5104110507ca543d106f11c6061245fd90c1a7) )
ROM_END
ROM_START( macclas2 )
ROM_REGION32_BE(0x100000, "bootrom", 0) // 3193670e
ROM_LOAD32_BYTE( "341-0867__ba16__=c=apple_91.romhh.27c010.u25", 0x000000, 0x020000, CRC(88230887) SHA1(8f45f6d7eb6a8ec9242a46db4773af1d154409c6) )
ROM_LOAD32_BYTE( "341-0866__5be9__=c=apple_91.rommh.27c010.u24", 0x000001, 0x020000, CRC(eae68c36) SHA1(e6ce79647dfe7e66590a012836d0b6e985ff672b) )
ROM_LOAD32_BYTE( "341-0865__821e__=c=apple_91.romml.27c010.u23", 0x000002, 0x020000, CRC(cb306c01) SHA1(4d6e409995fd9a4aa9afda0fd790a5b09b1c2aca) )
ROM_LOAD32_BYTE( "341-0864__6fc6__=c=apple_91.romll.27c010.u22", 0x000003, 0x020000, CRC(21a51e72) SHA1(bb513c1a5b8a41c7534d66aeacaeea47f58dae92) )
ROM_END
ROM_START(maccclas)
ROM_REGION32_BE(0x100000, "bootrom", 0)
ROM_LOAD("ecd99dc0.rom", 0x000000, 0x100000, CRC(c84c3aa5) SHA1(fd9e852e2d77fe17287ba678709b9334d4d74f1e))
ROM_END
} // anonymous namespace
COMP(1990, maclc, 0, 0, maclc, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh LC", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND)
COMP(1991, maclc2, 0, 0, maclc2, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh LC II", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND)
COMP(1991, macclas2, 0, 0, macclas2, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh Classic II", MACHINE_SUPPORTS_SAVE|MACHINE_IMPERFECT_SOUND )
COMP(1993, maccclas, 0, 0, maccclas, maclc, maclc_state, empty_init, "Apple Computer", "Macintosh Color Classic", MACHINE_NOT_WORKING)

1135
src/mame/apple/v8.cpp Normal file

File diff suppressed because it is too large Load Diff

160
src/mame/apple/v8.h Normal file
View File

@ -0,0 +1,160 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont
#ifndef MAME_APPLE_V8_H
#define MAME_APPLE_V8_H
#pragma once
#include "machine/6522via.h"
#include "machine/applefdintf.h"
#include "machine/swim2.h"
#include "sound/asc.h"
#include "emupal.h"
#include "speaker.h"
#include "screen.h"
// ======================> v8_device
class v8_device : public device_t
{
friend class eagle_device;
friend class spice_device;
public:
// construction/destruction
v8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
v8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// interface routines
auto pb4_callback() { return write_pb4.bind(); }
auto pb5_callback() { return write_pb5.bind(); }
auto cb2_callback() { return write_cb2.bind(); }
auto hdsel_callback() { return write_hdsel.bind(); }
auto hmmu_enable_callback() { return write_hmmu_enable.bind(); }
auto pb3_callback() { return read_pb3.bind(); }
virtual void map(address_map &map);
template <typename... T> void set_maincpu_tag(T &&... args) { m_maincpu.set_tag(std::forward<T>(args)...); }
template <typename... T> void set_rom_tag(T &&... args) { m_rom.set_tag(std::forward<T>(args)...); }
void set_ram_info(u32 *ram, u32 size);
void set_baseram_is_4M(bool ramSize) { m_baseIs4M = ramSize; }
DECLARE_WRITE_LINE_MEMBER(cb1_w);
DECLARE_WRITE_LINE_MEMBER(cb2_w);
DECLARE_WRITE_LINE_MEMBER(vbl_w);
DECLARE_WRITE_LINE_MEMBER(scc_irq_w);
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
private:
devcb_write_line write_pb4, write_pb5, write_cb2, write_hdsel, write_hmmu_enable;
devcb_read_line read_pb3;
required_device<cpu_device> m_maincpu;
optional_ioport m_montype;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<via6522_device> m_via1;
required_device<asc_device> m_asc;
required_region_ptr<u32> m_rom;
std::unique_ptr<u32[]> m_vram;
emu_timer *m_6015_timer;
int m_via_interrupt, m_via2_interrupt, m_scc_interrupt, m_last_taken_interrupt;
u8 m_pseudovia_regs[256], m_pseudovia_ier, m_pseudovia_ifr;
u8 m_pal_address, m_pal_idx, m_pal_control, m_pal_colkey;
bool m_overlay;
u32 *m_ram_ptr, *m_rom_ptr;
u32 m_ram_size, m_rom_size;
bool m_baseIs4M;
u32 rom_switch_r(offs_t offset);
void ram_size(u8 config);
virtual u8 pseudovia_r(offs_t offset);
void pseudovia_w(offs_t offset, u8 data);
void pseudovia_recalc_irqs();
u16 mac_via_r(offs_t offset);
void mac_via_w(offs_t offset, u16 data, u16 mem_mask);
virtual u8 via_in_a();
u8 via_in_b();
virtual void via_out_a(u8 data);
void via_out_b(u8 data);
void via_sync();
void field_interrupts();
DECLARE_WRITE_LINE_MEMBER(via_out_cb2);
DECLARE_WRITE_LINE_MEMBER(via1_irq);
DECLARE_WRITE_LINE_MEMBER(via2_irq);
TIMER_CALLBACK_MEMBER(mac_6015_tick);
u32 vram_r(offs_t offset);
void vram_w(offs_t offset, u32 data, u32 mem_mask);
u8 dac_r(offs_t offset);
void dac_w(offs_t offset, u8 data);
virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
};
// ======================> eagle_device
class eagle_device : public v8_device
{
public:
eagle_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
private:
u8 via_in_a() override;
u8 pseudovia_r(offs_t offset) override;
virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
};
// ======================> spice_device
class spice_device : public v8_device
{
public:
spice_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void map(address_map &map) override;
required_device<applefdintf_device> m_fdc;
required_device_array<floppy_connector, 2> m_floppy;
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
private:
u8 via_in_a() override;
virtual void via_out_a(u8 data) override;
u8 pseudovia_r(offs_t offset) override;
virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
floppy_image_device *m_cur_floppy = nullptr;
int m_hdsel;
void phases_w(u8 phases);
void devsel_w(u8 devsel);
u16 swim_r(offs_t offset, u16 mem_mask);
void swim_w(offs_t offset, u16 data, u16 mem_mask);
};
// device type definition
DECLARE_DEVICE_TYPE(V8, v8_device)
DECLARE_DEVICE_TYPE(EAGLE, eagle_device)
DECLARE_DEVICE_TYPE(SPICE, spice_device)
#endif // MAME_APPLE_V8_H

View File

@ -20728,8 +20728,6 @@ uccopsu // (c) 1992 Irem America (US)
@source:apple/mac.cpp
mac2fdhd // 1988 Apple Macintosh II (FDHD)
maccclas // 1993 Apple Macintosh Color Classic
macclas2 // 1991 Apple Macintosh Classic II
macii // 1987 Apple Macintosh II
maciici // 1989 Apple Macintosh IIci
maciicx // 1989 Apple Macintosh IIcx
@ -20737,9 +20735,13 @@ maciifx // 1990 Apple Macintosh IIfx
maciihmu // 1987 Apple Macintosh II (w/o 68851 MMU)
maciisi // 1990 Apple Macintosh IIsi
maciix // 1988 Apple Macintosh IIx
macse30 // 1989 Apple Macintosh SE/30
@source:apple/maclc.cpp
maclc // 1990 Apple Macintosh LC
maclc2 // 1991 Apple Macintosh LC II
macse30 // 1989 Apple Macintosh SE/30
macclas2 // 1991 Apple Macintosh Classic II
maccclas // 1993 Apple Macintosh Color Classic
@source:apple/maciivx.cpp
maciivx // 1993 Apple Macintosh IIvx