-
Notifications
You must be signed in to change notification settings - Fork 2.2k
att6300p.cpp: Initial driver for AT&T 6300 Plus #14149
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
…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.
There was a problem hiding this 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: | ||
/* |
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
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 ) |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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);
.
There was a problem hiding this comment.
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.
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).