ef9340_1: add pinout reference

This commit is contained in:
hap 2021-01-15 16:40:33 +01:00
parent 968c7cfe05
commit d7f524ac8f
3 changed files with 90 additions and 63 deletions

View File

@ -6,7 +6,7 @@ Thomson EF9340 + EF9341 teletext graphics, this device is a combination of chips
Minimal components:
- Thomson EF9340 "VIN"
- Thomson EF9341 "GEN"
- Thomson EF9341 "GEN" (CPU connects to this one)
- 2*1KB RAM, A for attributes, B for character codes
There's also an optional extended character memory, it can be RAM or ROM.
@ -18,6 +18,7 @@ TODO:
- internal display timing (on g7400, most of it is done externally)
- window boxing
- Y zoom
- RES(restart) pin
***************************************************************************/
@ -61,7 +62,7 @@ void ef9340_1_device::device_start()
m_write_exram.resolve_safe();
m_read_exram.resolve_safe(0xff);
// Let the screen create our temporary bitmap with the screen's dimensions
// let the screen create our temporary bitmap with the screen's dimensions
screen().register_screen_bitmap(m_tmp_bitmap);
m_line_timer = timer_alloc(TIMER_LINE);
@ -169,30 +170,30 @@ void ef9340_1_device::ef9341_write(u8 command, u8 b, u8 data)
m_ef9341.busy = true;
switch (m_ef9341.TB & 0xe0)
{
case 0x00: /* Begin row */
m_ef9340.X = 0;
m_ef9340.Y = m_ef9341.TA & 0x1f;
break;
case 0x20: /* Load Y */
m_ef9340.Y = m_ef9341.TA & 0x1f;
break;
case 0x40: /* Load X */
m_ef9340.X = m_ef9341.TA & 0x3f;
break;
case 0x60: /* INC C */
ef9340_inc_c();
break;
case 0x80: /* Load M */
m_ef9340.M = m_ef9341.TA;
break;
case 0xa0: /* Load R */
m_ef9340.R = m_ef9341.TA;
break;
case 0xc0: /* Load Y0 */
m_ef9340.Y0 = m_ef9341.TA & 0x3f;
break;
case 0xe0: /* Not interpreted */
break;
case 0x00: // begin row
m_ef9340.X = 0;
m_ef9340.Y = m_ef9341.TA & 0x1f;
break;
case 0x20: // load Y
m_ef9340.Y = m_ef9341.TA & 0x1f;
break;
case 0x40: // load X
m_ef9340.X = m_ef9341.TA & 0x3f;
break;
case 0x60: // increment C
ef9340_inc_c();
break;
case 0x80: // load M
m_ef9340.M = m_ef9341.TA;
break;
case 0xa0: // load R
m_ef9340.R = m_ef9341.TA;
break;
case 0xc0: // load Y0
m_ef9340.Y0 = m_ef9341.TA & 0x3f;
break;
case 0xe0: // not interpreted
break;
}
m_ef9341.busy = false;
}
@ -211,32 +212,32 @@ void ef9340_1_device::ef9341_write(u8 command, u8 b, u8 data)
m_ef9341.busy = true;
switch (m_ef9340.M & 0xe0)
{
case 0x00: /* Write */
case 0x00: // write
m_ram_a[addr] = m_ef9341.TA;
m_ram_b[addr] = m_ef9341.TB;
ef9340_inc_c();
break;
case 0x40: /* Write without increment */
case 0x40: // write without increment
m_ram_a[addr] = m_ef9341.TA;
m_ram_b[addr] = m_ef9341.TB;
break;
case 0x80: /* Write slice */
{
u8 a = m_ram_a[addr];
u8 b = m_ram_b[addr];
u8 slice = m_ef9340.M & 0x0f;
case 0x80: // write slice
{
u8 a = m_ram_a[addr];
u8 b = m_ram_b[addr];
u8 slice = m_ef9340.M & 0x0f;
if (b >= 0xa0)
m_write_exram(a << 12 | b << 4 | slice, m_ef9341.TA);
if (b >= 0xa0)
m_write_exram(a << 12 | b << 4 | slice, m_ef9341.TA);
// Increment slice number
m_ef9340.M = (m_ef9340.M & 0xf0) | ((slice + 1) % 10);
}
// increment slice number
m_ef9340.M = (m_ef9340.M & 0xf0) | ((slice + 1) % 10);
break;
}
default: /* Illegal or Read command */
default: // illegal or read command
break;
}
m_ef9341.busy = false;
@ -276,37 +277,37 @@ u8 ef9340_1_device::ef9341_read(u8 command, u8 b)
m_ef9341.busy = true;
switch (m_ef9340.M & 0xe0)
{
case 0x20: /* Read */
case 0x20: // read
m_ef9341.TA = m_ram_a[addr];
m_ef9341.TB = m_ram_b[addr];
ef9340_inc_c();
break;
case 0x60: /* Read without increment */
case 0x60: // read without increment
m_ef9341.TA = m_ram_a[addr];
m_ef9341.TB = m_ram_b[addr];
break;
case 0xa0: /* Read slice */
{
u8 a = m_ram_a[addr];
u8 b = m_ram_b[addr];
u8 slice = m_ef9340.M & 0x0f;
case 0xa0: // read slice
{
u8 a = m_ram_a[addr];
u8 b = m_ram_b[addr];
u8 slice = m_ef9340.M & 0x0f;
m_ef9341.TA = 0xff;
m_ef9341.TB = 0xff;
m_ef9341.TA = 0xff;
m_ef9341.TB = 0xff;
if (b >= 0xa0)
m_ef9341.TA = m_read_exram(a << 12 | b << 4 | slice);
else if (b < 0x80 && slice < 10)
m_ef9341.TA = m_charset[(((a & 0x80) | (b & 0x7f)) * 10) + slice];
if (b >= 0xa0)
m_ef9341.TA = m_read_exram(a << 12 | b << 4 | slice);
else if (b < 0x80 && slice < 10)
m_ef9341.TA = m_charset[(((a & 0x80) | (b & 0x7f)) * 10) + slice];
// Increment slice number
m_ef9340.M = (m_ef9340.M & 0xf0) | ((slice + 1) % 10);
}
// increment slice number
m_ef9340.M = (m_ef9340.M & 0xf0) | ((slice + 1) % 10);
break;
}
default: /* Illegal or Write command */
default: // illegal or write command
break;
}
m_ef9341.busy = false;
@ -346,15 +347,15 @@ void ef9340_1_device::ef9340_scanline(int vpos)
if (vpos < 10)
{
// Service row
// service row
if (m_ef9340.R & 0x08)
{
// Service row is enabled
// service row is enabled
y_row = 31;
}
else
{
// Service row is disabled
// service row is disabled
for (int i = 0; i < 40 * 8; i++)
m_tmp_bitmap.pix(m_offset_y + vpos, m_offset_x + i) = 8;
return;
@ -362,7 +363,7 @@ void ef9340_1_device::ef9340_scanline(int vpos)
}
else
{
// Displaying regular row
// displaying regular row
y_row = ((m_ef9340.Y0 & 0x1f) + (vpos - 10) / 10) % 24;
}

View File

@ -12,6 +12,34 @@
#pragma once
// pinout reference
/*
______ ______ ______ ______
Vss 1 |* \_/ | 40 A4 10*address Vss 1 |* \_/ | 40 A7
A5 2 | | 39 A3 ------------> ADR0 2 | | 39 A6
A6 3 | | 38 A2 | ADR1 3 | | 38 A5
Vss 4 | | 37 A1 | ADR2 4 | | 37 A4
CLK 5 | | 36 A0 v ADR3 5 | | 36 A3
_VE 6 | | 35 ADR0 ___________ R/_WI 6 | | 35 A2
C/_T 7 | | 34 ADR1 | | _SG 7 | | 34 A1
B 8 | | 33 ADR2 | | _SM 8 | | 33 A0
G 9 | | 32 ADR3 | | B7 9 | | 32 D0
R 10 | EF9340 | 31 ADR4 | 2*1KB RAM | B6 10 | EF9341 | 31 D1
I 11 | (VIN) | 30 ADR5 | | B5 11 | (GEN) | 30 D2
_SM 12 | | 29 ADR6 | | B4 12 | | 29 D3
_SG 13 | | 28 ADR7 | | B3 13 | | 28 D4
_ST 14 | | 27 ADR8 |___________| B2 14 | | 27 D5
R/_WI 15 | | 26 ADR9 B1 15 | | 26 D6
TT 16 | | 25 TL ^ B0 16 | | 25 D7
SYT 17 | | 24 TEST | _ST 17 | | 24 C/_T
B7 18 | | 23 _RES v _VE 18 | | 23 R/_W
B6 19 | | 22 A7 <-----------> _CS 19 | | 22 B/_A
B5 20 |_______________| 21 Vcc 16*data E 20 |_______________| 21 Vcc
*/
class ef9340_1_device : public device_t,
public device_video_interface
{
@ -48,7 +76,7 @@ protected:
void ef9340_scanline(int vpos);
/* timers */
// timers
static constexpr device_timer_id TIMER_LINE = 0;
static constexpr device_timer_id TIMER_BLINK = 1;

View File

@ -36,8 +36,6 @@
*/
// ======================> i8244_device
class i8244_device : public device_t
, public device_sound_interface
, public device_video_interface