mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +03:00
layout/bfm_sc5_gu96x8.lay: Use loops and save many lines.
Also various cleanup.
This commit is contained in:
parent
6f513cfb74
commit
654dbd8285
@ -68,37 +68,37 @@ void atapi_cdrom_device::device_start()
|
||||
|
||||
memset(m_identify_buffer, 0, sizeof(m_identify_buffer));
|
||||
|
||||
m_identify_buffer[ 0 ] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||
m_identify_buffer[0] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||
|
||||
m_identify_buffer[ 23 ] = ('1' << 8) | '.';
|
||||
m_identify_buffer[ 24 ] = ('0' << 8) | ' ';
|
||||
m_identify_buffer[ 25 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 26 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[23] = ('1' << 8) | '.';
|
||||
m_identify_buffer[24] = ('0' << 8) | ' ';
|
||||
m_identify_buffer[25] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[26] = (' ' << 8) | ' ';
|
||||
|
||||
m_identify_buffer[ 27 ] = ('M' << 8) | 'A';
|
||||
m_identify_buffer[ 28 ] = ('M' << 8) | 'E';
|
||||
m_identify_buffer[ 29 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 30 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 31 ] = ('V' << 8) | 'i';
|
||||
m_identify_buffer[ 32 ] = ('r' << 8) | 't';
|
||||
m_identify_buffer[ 33 ] = ('u' << 8) | 'a';
|
||||
m_identify_buffer[ 34 ] = ('l' << 8) | ' ';
|
||||
m_identify_buffer[ 35 ] = ('C' << 8) | 'D';
|
||||
m_identify_buffer[ 36 ] = ('R' << 8) | 'O';
|
||||
m_identify_buffer[ 37 ] = ('M' << 8) | ' ';
|
||||
m_identify_buffer[ 38 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 39 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 40 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 41 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 42 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 43 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 44 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 45 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 46 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[27] = ('M' << 8) | 'A';
|
||||
m_identify_buffer[28] = ('M' << 8) | 'E';
|
||||
m_identify_buffer[29] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[30] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[31] = ('V' << 8) | 'i';
|
||||
m_identify_buffer[32] = ('r' << 8) | 't';
|
||||
m_identify_buffer[33] = ('u' << 8) | 'a';
|
||||
m_identify_buffer[34] = ('l' << 8) | ' ';
|
||||
m_identify_buffer[35] = ('C' << 8) | 'D';
|
||||
m_identify_buffer[36] = ('R' << 8) | 'O';
|
||||
m_identify_buffer[37] = ('M' << 8) | ' ';
|
||||
m_identify_buffer[38] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[39] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[40] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[41] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[42] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[43] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[44] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[45] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[46] = (' ' << 8) | ' ';
|
||||
|
||||
m_identify_buffer[ 49 ] = 0x0600; // Word 49=Capabilities, IORDY may be disabled (bit_10), LBA Supported mandatory (bit_9)
|
||||
m_identify_buffer[49] = 0x0600; // Word 49=Capabilities, IORDY may be disabled (bit_10), LBA Supported mandatory (bit_9)
|
||||
|
||||
m_identify_buffer[ 88 ] = m_ultra_dma_mode;
|
||||
m_identify_buffer[88] = m_ultra_dma_mode;
|
||||
|
||||
atapi_hle_device::device_start();
|
||||
}
|
||||
|
@ -236,8 +236,8 @@ void atapi_hle_device::process_command()
|
||||
|
||||
for( int w = 0; w < 256; w++ )
|
||||
{
|
||||
m_buffer[w * 2] = m_identify_buffer[ w ] & 0xff;
|
||||
m_buffer[(w * 2) + 1] = m_identify_buffer[ w ] >> 8;
|
||||
m_buffer[w * 2] = m_identify_buffer[w] & 0xff;
|
||||
m_buffer[(w * 2) + 1] = m_identify_buffer[w] >> 8;
|
||||
}
|
||||
|
||||
m_buffer_size = 512;
|
||||
|
@ -16,8 +16,8 @@ static constexpr char download_identity[] = "MATSHITA CD98Q4 DOWNLOADGS0N";
|
||||
|
||||
void matsushita_cr589_device::nvram_default()
|
||||
{
|
||||
memset( buffer, 0, sizeof(buffer));
|
||||
memcpy( &buffer[ identity_offset ], "MATSHITACD-ROM CR-589 GS0N", 28 );
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
memcpy(&buffer[identity_offset], "MATSHITACD-ROM CR-589 GS0N", 28);
|
||||
}
|
||||
|
||||
|
||||
@ -50,27 +50,27 @@ bool matsushita_cr589_device::nvram_write(util::write_stream &file)
|
||||
|
||||
void matsushita_cr589_device::ExecCommand()
|
||||
{
|
||||
switch( command[ 0 ] )
|
||||
switch( command[0] )
|
||||
{
|
||||
case T10SPC_CMD_INQUIRY:
|
||||
logerror("T10MMC: INQUIRY\n");
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
break;
|
||||
|
||||
case 0x3b: // WRITE BUFFER
|
||||
bufferOffset = get_u24be( &command[ 3 ] );
|
||||
bufferOffset = get_u24be( &command[3] );
|
||||
m_phase = SCSI_PHASE_DATAOUT;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
m_transfer_length = get_u24be( &command[ 6 ] );
|
||||
m_transfer_length = get_u24be( &command[6] );
|
||||
break;
|
||||
|
||||
case 0x3c: // READ BUFFER
|
||||
bufferOffset = get_u24be( &command[ 3 ] );
|
||||
bufferOffset = get_u24be( &command[3] );
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
m_transfer_length = get_u24be( &command[ 6 ] );
|
||||
m_transfer_length = get_u24be( &command[6] );
|
||||
break;
|
||||
|
||||
case 0xcc: // FIRMWARE DOWNLOAD ENABLE
|
||||
@ -87,7 +87,7 @@ void matsushita_cr589_device::ExecCommand()
|
||||
|
||||
void matsushita_cr589_device::ReadData( uint8_t *data, int dataLength )
|
||||
{
|
||||
switch( command[ 0 ] )
|
||||
switch( command[0] )
|
||||
{
|
||||
case T10SPC_CMD_INQUIRY:
|
||||
memset(data, 0, dataLength);
|
||||
@ -96,16 +96,16 @@ void matsushita_cr589_device::ReadData( uint8_t *data, int dataLength )
|
||||
|
||||
if( download )
|
||||
{
|
||||
memcpy( &data[ 8 ], download_identity, 28 );
|
||||
memcpy( &data[8], download_identity, 28 );
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy( &data[ 8 ], &buffer[ identity_offset ], 28 );
|
||||
memcpy( &data[8], &buffer[identity_offset], 28 );
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x3c: // READ BUFFER
|
||||
memcpy( data, &buffer[ bufferOffset ], dataLength );
|
||||
memcpy( data, &buffer[bufferOffset], dataLength );
|
||||
bufferOffset += dataLength;
|
||||
break;
|
||||
|
||||
@ -117,15 +117,15 @@ void matsushita_cr589_device::ReadData( uint8_t *data, int dataLength )
|
||||
|
||||
void matsushita_cr589_device::WriteData( uint8_t *data, int dataLength )
|
||||
{
|
||||
switch( command[ 0 ] )
|
||||
switch( command[0] )
|
||||
{
|
||||
case 0x3b: // WRITE BUFFER
|
||||
memcpy( &buffer[ bufferOffset ], data + 32, dataLength - 32 );
|
||||
memcpy( &buffer[bufferOffset], data + 32, dataLength - 32 );
|
||||
bufferOffset += dataLength;
|
||||
break;
|
||||
|
||||
case 0xcc: // FIRMWARE DOWNLOAD ENABLE
|
||||
if( memcmp( data, &buffer[ identity_offset ], 28 ) == 0 )
|
||||
if( memcmp( data, &buffer[identity_offset], 28 ) == 0 )
|
||||
{
|
||||
download = 1;
|
||||
}
|
||||
@ -161,35 +161,35 @@ void matsushita_cr589_device::device_start()
|
||||
/// TODO: split identify buffer into another method as device_start() should be called after it's filled in, but the atapi_cdrom_device has it's own.
|
||||
memset(m_identify_buffer, 0, sizeof(m_identify_buffer));
|
||||
|
||||
m_identify_buffer[ 0 ] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||
m_identify_buffer[0] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||
|
||||
m_identify_buffer[ 23 ] = ('1' << 8) | '.';
|
||||
m_identify_buffer[ 24 ] = ('0' << 8) | ' ';
|
||||
m_identify_buffer[ 25 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 26 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[23] = ('1' << 8) | '.';
|
||||
m_identify_buffer[24] = ('0' << 8) | ' ';
|
||||
m_identify_buffer[25] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[26] = (' ' << 8) | ' ';
|
||||
|
||||
m_identify_buffer[ 27 ] = ('M' << 8) | 'A';
|
||||
m_identify_buffer[ 28 ] = ('T' << 8) | 'S';
|
||||
m_identify_buffer[ 29 ] = ('H' << 8) | 'I';
|
||||
m_identify_buffer[ 30 ] = ('T' << 8) | 'A';
|
||||
m_identify_buffer[ 31 ] = (' ' << 8) | 'C';
|
||||
m_identify_buffer[ 32 ] = ('R' << 8) | '-';
|
||||
m_identify_buffer[ 33 ] = ('5' << 8) | '8';
|
||||
m_identify_buffer[ 34 ] = ('9' << 8) | ' ';
|
||||
m_identify_buffer[ 35 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 36 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 37 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 38 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 39 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 40 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 41 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 42 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 43 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 44 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 45 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[ 46 ] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[27] = ('M' << 8) | 'A';
|
||||
m_identify_buffer[28] = ('T' << 8) | 'S';
|
||||
m_identify_buffer[29] = ('H' << 8) | 'I';
|
||||
m_identify_buffer[30] = ('T' << 8) | 'A';
|
||||
m_identify_buffer[31] = (' ' << 8) | 'C';
|
||||
m_identify_buffer[32] = ('R' << 8) | '-';
|
||||
m_identify_buffer[33] = ('5' << 8) | '8';
|
||||
m_identify_buffer[34] = ('9' << 8) | ' ';
|
||||
m_identify_buffer[35] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[36] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[37] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[38] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[39] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[40] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[41] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[42] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[43] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[44] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[45] = (' ' << 8) | ' ';
|
||||
m_identify_buffer[46] = (' ' << 8) | ' ';
|
||||
|
||||
m_identify_buffer[ 49 ] = 0x0400; // IORDY may be disabled
|
||||
m_identify_buffer[49] = 0x0400; // IORDY may be disabled
|
||||
}
|
||||
|
||||
void matsushita_cr589_device::device_reset()
|
||||
|
@ -39,7 +39,7 @@ protected:
|
||||
|
||||
private:
|
||||
int download;
|
||||
uint8_t buffer[ 65536 ];
|
||||
uint8_t buffer[65536];
|
||||
int bufferOffset;
|
||||
};
|
||||
|
||||
|
@ -191,7 +191,7 @@ void gdrom_device::ExecCommand()
|
||||
case 0x10:
|
||||
{
|
||||
transferOffset = command[2];
|
||||
u8 allocation_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
u8 allocation_length = SCSILengthFromUINT8( &command[4] );
|
||||
// any game that enables [redbook]
|
||||
LOGCMD("REQ_STAT 10h offset %02x length %02x\n", transferOffset, allocation_length);
|
||||
|
||||
@ -209,9 +209,9 @@ void gdrom_device::ExecCommand()
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
|
||||
// if (SCSILengthFromUINT8( &command[ 4 ] ) < 32) return -1;
|
||||
// if (SCSILengthFromUINT8( &command[4] ) < 32) return -1;
|
||||
transferOffset = command[2];
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
if (transferOffset & 1)
|
||||
throw emu_fatalerror("GDROM: REQ_MODE with odd offset %02x %02x", transferOffset, m_transfer_length);
|
||||
break;
|
||||
@ -222,7 +222,7 @@ void gdrom_device::ExecCommand()
|
||||
m_phase = SCSI_PHASE_DATAOUT;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
//transferOffset = command[2];
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
if (command[2])
|
||||
throw emu_fatalerror("GDROM: SET_MODE with offset %02x %02x", transferOffset, m_transfer_length);
|
||||
|
||||
@ -246,7 +246,7 @@ void gdrom_device::ExecCommand()
|
||||
// TODO: it's supposed to write a single and a double density TOC request
|
||||
//if (command[1])
|
||||
// throw emu_fatalerror("Double density unsupported");
|
||||
u16 allocation_length = SCSILengthFromUINT16( &command[ 3 ] );
|
||||
u16 allocation_length = SCSILengthFromUINT16( &command[3] );
|
||||
LOGCMD("READ_TOC 14h %02x %02x %d\n",
|
||||
command[1], command[2], allocation_length
|
||||
);
|
||||
@ -272,7 +272,7 @@ void gdrom_device::ExecCommand()
|
||||
{
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
LOGCMD("REQ_SES 15h %02x %02x\n", command[2], m_transfer_length);
|
||||
break;
|
||||
}
|
||||
@ -431,7 +431,7 @@ void gdrom_device::ExecCommand()
|
||||
|
||||
case 0x40:
|
||||
{
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
//LOGCMD("CD_SCD 40h %02x %d\n", command[1] & 0xf, m_transfer_length);
|
||||
|
||||
switch(command[1] & 0xf)
|
||||
@ -439,7 +439,7 @@ void gdrom_device::ExecCommand()
|
||||
case 0x00:
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
m_status_code = SCSI_STATUS_CODE_GOOD;
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[ 4 ] );
|
||||
m_transfer_length = SCSILengthFromUINT8( &command[4] );
|
||||
break;
|
||||
case 0x01:
|
||||
m_phase = SCSI_PHASE_DATAIN;
|
||||
@ -753,7 +753,7 @@ void gdrom_device::ReadData( uint8_t *data, int dataLength )
|
||||
|
||||
void gdrom_device::WriteData( uint8_t *data, int dataLength )
|
||||
{
|
||||
switch (command[ 0 ])
|
||||
switch (command[0])
|
||||
{
|
||||
case 0x12: // SET_MODE
|
||||
memcpy(&GDROM_Cmd11_Reply[transferOffset], data, (dataLength >= 32-transferOffset) ? 32-transferOffset : dataLength);
|
||||
|
@ -82,7 +82,7 @@ void s1c33209_device::device_reset()
|
||||
template <offs_t RomBytes>
|
||||
void s1c33209_device::memory_map(address_map &map)
|
||||
{
|
||||
map(0x000'0000, 0x000'1fff).mirror(0x000'2000).ram();
|
||||
map(0x000'0000, 0x000'1fff).mirror(0x000'2000).ram(); // actually 32 bits wide (single cycle word access)
|
||||
map(0x003'0000, 0x003'ffff).m(*this, FUNC(s1c33209_device::peripheral_map));
|
||||
map(0x004'0000, 0x004'ffff).mirror(0x001'0000).m(*this, FUNC(s1c33209_device::peripheral_map));
|
||||
//map(0x006'0000, 0x007'ffff) area 2 reserved for debug mode
|
||||
|
@ -2,16 +2,16 @@
|
||||
// copyright-holders:David Haywood
|
||||
/* Scorpion 4 + 5 driver related includes */
|
||||
/* mainly used for stuff which is currently shared between sc4 / 5 sets to avoid duplication */
|
||||
#ifndef MAME_BFM_BFP_SC4_H
|
||||
#define MAME_BFM_BFP_SC4_H
|
||||
#ifndef MAME_BFM_BFM_SC4_H
|
||||
#define MAME_BFM_BFM_SC4_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "sec.h"
|
||||
#include "machine/steppers.h" // stepper motor
|
||||
|
||||
#include "bfm_gu96x8m_k657c2.h"
|
||||
#include "bfm_bda.h"
|
||||
#include "bfm_gu96x8m_k657c2.h"
|
||||
|
||||
#include "sound/ymz280b.h"
|
||||
#include "machine/mc68681.h"
|
||||
@ -3378,4 +3378,4 @@ INPUT_PORTS_EXTERN( sc4_raw );
|
||||
/* not for either of these games? */ \
|
||||
ROM_LOAD( "casroysnd.bin", 0x00000, 0x80000, CRC(cf1d4b59) SHA1(1b2bc74c6fcc43197a6f295bc34554da01f7b517) )
|
||||
|
||||
#endif // MAME_BFM_BFP_SC4_H
|
||||
#endif // MAME_BFM_BFM_SC4_H
|
||||
|
@ -40,7 +40,6 @@ namespace {
|
||||
class hh_ht11xx_state : public driver_device
|
||||
{
|
||||
public:
|
||||
|
||||
virtual DECLARE_INPUT_CHANGED_MEMBER(input_wakeup);
|
||||
|
||||
protected:
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,8 +5,8 @@
|
||||
Explorer 85
|
||||
|
||||
12/05/2009 Skeleton driver.
|
||||
29/12/2023 Reworked driver to enable extended RAM memory,
|
||||
MS BASIC and disable ROM mirror after boot/interrupt.
|
||||
29/12/2023 Reworked driver to enable extended RAM memory,
|
||||
MS BASIC and disable ROM mirror after boot/interrupt.
|
||||
|
||||
Setting Up
|
||||
==========
|
||||
@ -18,15 +18,16 @@
|
||||
Once started, press Space. The system will start up.
|
||||
All input must be in upper case.
|
||||
|
||||
Microsoft Basic is executed entering the following 2 commands
|
||||
in the monitor prompt:
|
||||
.XS nnnn-F87F mmmm-C000 <CR>
|
||||
Microsoft Basic is executed entering the following 2 commands
|
||||
in the monitor prompt:
|
||||
.XS nnnn-F87F mmmm-C000 <CR>
|
||||
.G <CR>
|
||||
|
||||
where nnnn is the previous value of the stack pointer, and mmmm is the previous
|
||||
value of the program counter.
|
||||
where nnnn is the previous value of the stack pointer, and mmmm is the
|
||||
previous value of the program counter.
|
||||
|
||||
Basic will request the amount of RAM memory available, 8192 (bytes) must be entered.
|
||||
BASIC will request the amount of RAM memory available, 8192 (bytes) must
|
||||
be entered.
|
||||
|
||||
|
||||
****************************************************************************/
|
||||
@ -37,7 +38,7 @@
|
||||
|
||||
- dump of the hexadecimal keyboard monitor ROM
|
||||
- 64K RAM expansion
|
||||
- Disk drive and CP/M OS support
|
||||
- Disk drive and CP/M OS support
|
||||
|
||||
*/
|
||||
|
||||
@ -70,7 +71,7 @@ public:
|
||||
, m_rs232(*this, "rs232")
|
||||
, m_cassette(*this, "cassette")
|
||||
, m_speaker(*this, "speaker")
|
||||
, m_rom(*this, "u105") // the 8355 chip contains the monitor ROM
|
||||
, m_rom(*this, "u105") // the 8355 chip contains the monitor ROM
|
||||
, m_low_memory_view(*this, "low_memory_view")
|
||||
, m_is_preparing_interrupt_call(false)
|
||||
, m_ignore_timer_out(true)
|
||||
@ -103,7 +104,7 @@ private:
|
||||
// Member variables
|
||||
required_device<i8085a_cpu_device> m_maincpu;
|
||||
required_device<i8355_device> m_i8355;
|
||||
required_device<i8155_device> m_i8155;
|
||||
required_device<i8155_device> m_i8155;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
required_device<speaker_sound_device> m_speaker;
|
||||
@ -113,7 +114,7 @@ private:
|
||||
bool m_is_preparing_interrupt_call;
|
||||
bool m_ignore_timer_out;
|
||||
bool m_tape_control;
|
||||
emu_timer *m_timer;
|
||||
emu_timer *m_timer;
|
||||
};
|
||||
|
||||
|
||||
@ -123,14 +124,14 @@ void exp85_state::exp85_mem(address_map &map)
|
||||
map.unmap_value_high();
|
||||
// Extended RAM or mapped monitor ROM (only during interrupt and reset)
|
||||
map(0x0000, 0x1fff).view(m_low_memory_view);
|
||||
// Microsoft Basic ROM
|
||||
// Microsoft BASIC ROM
|
||||
map(0xc000, 0xdfff).rom();
|
||||
// Monitor ROM in the 8355 chip
|
||||
map(0xf000, 0xf7ff).rom().region(m_rom, 0);
|
||||
// 256 bytes of RAM of level A in the 8155 chip.
|
||||
map(0xf800, 0xf8ff).rw(m_i8155, FUNC(i8155_device::memory_r), FUNC(i8155_device::memory_w));
|
||||
|
||||
// monitor ROM mirror
|
||||
// monitor ROM mirror
|
||||
m_low_memory_view[LOW_MEMORY_ROM_MIRROR_ENTRY](0x0000, 0x07ff).rom().region(m_rom, 0);
|
||||
// extended RAM
|
||||
m_low_memory_view[LOW_MEMORY_RAM_ENTRY](0x0000, 0x1fff).ram();
|
||||
@ -243,9 +244,9 @@ void exp85_state::sod_w(int state)
|
||||
|
||||
void exp85_state::status_out(u8 status)
|
||||
{
|
||||
// In the real hardware this is monitored via the IO/M, S0, S1
|
||||
// In the real hardware this is monitored via the IO/M, S0, S1
|
||||
// and ALE output pins of the 8085.
|
||||
// Since these pins are not emulated, then we must explicitly get the internal
|
||||
// Since these pins are not emulated, then we must explicitly get the internal
|
||||
// interrupt acknowledge state (0x23 or 0x26) and behave as the monitor expects.
|
||||
auto current_pc = m_maincpu->pc();
|
||||
if (status == 0x23 || status == 0x26)
|
||||
@ -253,20 +254,20 @@ void exp85_state::status_out(u8 status)
|
||||
// When an interrupt is triggered the low memory shall be set to the ROM mirror
|
||||
m_is_preparing_interrupt_call = true;
|
||||
m_low_memory_view.select(LOW_MEMORY_ROM_MIRROR_ENTRY);
|
||||
}
|
||||
}
|
||||
else if (m_is_preparing_interrupt_call && (current_pc & 0xff00) == 0x0000)
|
||||
{
|
||||
// Avoids setting the lower memory back to RAM until
|
||||
// it branches to the interrupt handler.
|
||||
m_is_preparing_interrupt_call = false;
|
||||
}
|
||||
}
|
||||
else if (!m_is_preparing_interrupt_call && (current_pc & 0xf000) == 0xf000)
|
||||
{
|
||||
// When the interrupt handler is executing and the address is >= 0xf000
|
||||
// the low memory is mapped to RAM
|
||||
m_low_memory_view.select(LOW_MEMORY_RAM_ENTRY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
@ -303,7 +304,7 @@ void exp85_state::to_change(int to)
|
||||
{
|
||||
// In the 8155 implementation the TIMER-OUT line (to) is
|
||||
// asserted by default on initialization; this generates a spurious exception
|
||||
// avoided here via an ignore flag.
|
||||
// avoided here via an ignore flag.
|
||||
if (m_ignore_timer_out)
|
||||
{
|
||||
m_ignore_timer_out = false;
|
||||
@ -313,16 +314,16 @@ void exp85_state::to_change(int to)
|
||||
// The 8155 has a max TIMER-IN to TIMER-OUT delay of 400ns (datasheet page 3-256). In a real system
|
||||
// this delay was measured in ~70ns. This is enough for the next instruction cycle to start
|
||||
// and for the interrupt to be acknowledged one instruction later. This effect is fundamental
|
||||
// for the ROM monitor stepping functionality, since it depends heavily on interrupting when the
|
||||
// for the ROM monitor stepping functionality, since it depends heavily on interrupting when the
|
||||
// next instruction of the user program is being executed.
|
||||
// MAME allows to set a timer of 70ns but that is not enough to get the CPU scheduled for at least 1 cycle
|
||||
// before the interrupt is serviced, so we program a timer to expire beyond a full clock cycle.
|
||||
// before the interrupt is serviced, so we program a timer to expire beyond a full clock cycle.
|
||||
m_timer->adjust(m_i8155->clocks_to_attotime(2), to);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(exp85_state::trap_delay)
|
||||
{
|
||||
// The 8155 TIMER-OUT line is connected to the TRAP input line of the 8085;
|
||||
// The 8155 TIMER-OUT line is connected to the TRAP input line of the 8085;
|
||||
// that line is set from the start high, and since there is no change in that line, the
|
||||
// interrup is never requested (datasheet, page 6-13).
|
||||
m_maincpu->set_input_line(I8085_TRAP_LINE, param == 1 ? ASSERT_LINE : CLEAR_LINE);
|
||||
@ -338,18 +339,18 @@ void exp85_state::exp85(machine_config &config)
|
||||
m_maincpu->in_sid_func().set(FUNC(exp85_state::sid_r));
|
||||
m_maincpu->out_sod_func().set(FUNC(exp85_state::sod_w));
|
||||
m_maincpu->out_status_func().set(FUNC(exp85_state::status_out));
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25);
|
||||
|
||||
/* devices */
|
||||
|
||||
// The Explorer-85 uses a 6.144MHz clock, but the Intel 8085 divides by 2 this
|
||||
// The Explorer-85 uses a 6.144MHz clock, but the Intel 8085 divides by 2 this
|
||||
// input frequency to give the processor internal operating frequency.
|
||||
// The bus is connected to the CLK (out) of the 8085, running also
|
||||
// at 6.144MHz divided by 2.
|
||||
I8155(config, m_i8155, 6.144_MHz_XTAL/2);
|
||||
// The bus is connected to the CLK (out) of the 8085, running also
|
||||
// at 6.144MHz divided by 2.
|
||||
I8155(config, m_i8155, 6.144_MHz_XTAL/2);
|
||||
m_i8155->out_to_callback().set(FUNC(exp85_state::to_change));
|
||||
|
||||
|
||||
@ -368,14 +369,14 @@ void exp85_state::exp85(machine_config &config)
|
||||
/* ROMs */
|
||||
|
||||
ROM_START( exp85 )
|
||||
ROM_REGION( 0x10000, "u100", 0 ) // Microsoft Basic
|
||||
ROM_REGION( 0x10000, "u100", 0 ) // Microsoft BASIC
|
||||
ROM_DEFAULT_BIOS("eia")
|
||||
ROM_LOAD( "c000.bin", 0xc000, 0x0800, CRC(73ce4aad) SHA1(2c69cd0b6c4bdc92f4640bce18467e4e99255bab) )
|
||||
ROM_LOAD( "c800.bin", 0xc800, 0x0800, CRC(eb3fdedc) SHA1(af92d07f7cb7533841b16e1176401363176857e1) )
|
||||
ROM_LOAD( "d000.bin", 0xd000, 0x0800, CRC(c10c4a22) SHA1(30588ba0b27a775d85f8c581ad54400c8521225d) )
|
||||
ROM_LOAD( "d800.bin", 0xd800, 0x0800, CRC(dfa43ef4) SHA1(56a7e7a64928bdd1d5f0519023d1594cacef49b3) )
|
||||
|
||||
ROM_REGION( 0x800, "u105", 0 ) // Explorer 85 Monitor
|
||||
|
||||
ROM_REGION( 0x800, "u105", 0 ) // Explorer 85 Monitor
|
||||
ROM_SYSTEM_BIOS( 0, "eia", "EIA Terminal" ) // Serial terminal ROM
|
||||
ROMX_LOAD( "ex 85.u105", 0x0000, 0x0800, CRC(1a99d0d9) SHA1(57b6d48e71257bc4ef2d3dddc9b30edf6c1db766), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS( 1, "hex", "Hex Keyboard" ) // Keypad ROM (not available)
|
||||
|
@ -29,7 +29,7 @@ C6 10738 Bus Interface Circuit } These 2 interface the C5 eprom to the CPU
|
||||
|
||||
ToDo:
|
||||
- Everything (the code below is mostly a carry-over from gts1 and is incomplete or guesswork).
|
||||
- There's lots of manuals, with lots of info, but not what we need. For example, no proper schematics.
|
||||
- There are lots of manuals, with lots of info, but not what we need. For example, no proper schematics.
|
||||
- No info on the sound (all it says is 4 TTL chips controlled by 6 bits of the IO expander).
|
||||
- A plug-in printer is used to view and alter settings. We have no info about it.
|
||||
- Default layout.
|
||||
@ -382,18 +382,18 @@ void recel_state::recel(machine_config & config)
|
||||
genpin_audio(config);
|
||||
}
|
||||
|
||||
/* The BIOS is the same for all sets, but is labeled different depending on the ROM type:
|
||||
/* The BIOS is the same for all sets, but is labeled differently depending on the ROM type:
|
||||
-13: For machines with personality PROM 1702.
|
||||
-14: For machines with 2716 EPROM.
|
||||
On both cases, the second half of each chip is not used, having their A11 ping grounded
|
||||
In both cases, the second half of each chip is not used, with their A11 pins grounded
|
||||
(these chips have A1 to A11, there's no A0).
|
||||
*/
|
||||
#define RECEL_BIOS \
|
||||
ROM_REGION( 0x800, "maincpu", ROMREGION_ERASEFF ) \
|
||||
ROM_LOAD("a2361.b1", 0x0000, 0x0400, CRC(d0c4695d) SHA1(4846adb3f6c292626840ba5255ffc5e788a69301) ) \
|
||||
ROM_IGNORE( 0x400 ) \
|
||||
ROM_IGNORE( 0x400 ) \
|
||||
ROM_LOAD("a2362.b2", 0x0400, 0x0400, CRC(39a70611) SHA1(8545e168a5f256150bcff12d1e6d8efffd08c3cd) ) \
|
||||
ROM_IGNORE( 0x400 )
|
||||
ROM_IGNORE( 0x400 )
|
||||
|
||||
ROM_START( recel )
|
||||
RECEL_BIOS
|
||||
|
Loading…
Reference in New Issue
Block a user