Skip to content

Conversation

donohoe00
Copy link
Contributor

Initial driver for the AT&T 6300 plus. It seems to run DOS just fine.

The 6300 Plus contains unique hardware to support a virtual 8086 environment allowing DOS to run concurrently with, and under the control of, a version of AT&T SVR 2.0 Unix that was specifically provided for this machine. While I've attempted to implement the virtualization hardware, it's largely untested and would definitely need more work. Unless someone unearths a copy of the right version of Unix (and the accompanying OS Merge software), the virtualization implementation cannot be completed and fully verified. There are more details in the code comments about the exact version of Unix that's needed.

This is not your run-of-the-mill PC clone, and I'm expecting to get a lot of feedback, especially about how I hooked into accesses from the CPU to implement the virtualization.

Note that this PR includes a proposed change to how the i86/i286 registers are initialized upon reset. This is obviously a risky change, but the BIOS fails when performing the memory check without it (since it fails to return from protected mode to real mode when testing memory above 640K).

…ork.

The 6300 Plus has external logic to reset the 80286 via the reset pin,
so that it can return to Real Mode from protected mode.  Upon return to
Real Mode, the BIOS code is clearly depending on the fact that SP register
is preserved upon reset (the BIOS does however explicitly load the
SS register after reset, before it is used).

The 8086 and 80286 documentation call out which registers are to be
initialized upon reset, and SS is one of them.  For AX, BX, CX,
DX, BP, SP, SI and DI, the behaviour is not specified.  However, based
on what the 6300 Plus BIOS is doing, it appears the actual hardware
behaviour is to leave them untouched.  Although we can only be fully
confident that the real 286 behaves this way with respect to the SP
register, it's likely that the other registers which do not have
explicitly defined initialization behavior are also not touched during
reset.

Note that this observed behaviour only pertains to reset via the reset
pin, and not to power-on initialization.
Copy link
Member

@startaq startaq left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your contribution! I just added some notes about things I've noticed.

virtual void machine_reset() override ATTR_COLD;

private:
/*
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is really quite verbose. Maybe it can moved down to where it's used and be a bit more condensed (assuming this isn't reverse engineered but also mentioned in the manual).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the code review!

These registers are not documented anywhere that I could find, and I wrote the descriptions based on my understanding from the schematics. I thought it best to put it near the register bit field enums, but I could move it down to where the register reads/writes are implemented.



// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1985, att6300p, ibm5150, 0, att6300p, att6300p, att6300p_state, empty_init, "AT&T", "6300 Plus", MACHINE_NOT_WORKING )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very likely the ibm5150 shouldn't be the parent, this seems to be a fully original machine.

Also add MACHINE_SUPPORTS_SAVE if the relevant state is saved.

Copy link
Contributor Author

@donohoe00 donohoe00 Sep 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was inherited from m24.cpp. Like the M24 and the original 6300, this machine was at least intended to be PC compatible :-)

The lack of MACHINE_SUPPORTS_SAVE also came from m24.cpp. I'll do some testing and see if saving actually works.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to work fine. I can push the change when the other issues are resolved.

(m_nmi_enable && BIT(m_ctrlport_b, 6) && !BIT(m_ctrlport_a, 4)));

if (m_nmi_active)
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure this isn't pulsed? I. e. something like m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is that NMI is to remain asserted, and gets cleared when TRAPCE register is accessed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants