// license:GPL-2.0+
// copyright-holders:Peter Trauner
/*****************************************************************************
*
* pc1403.cpp
* Portable Sharp PC1403 video emulator interface
* (Sharp pocket computers)
*
* Copyright (c) 2001 Peter Trauner, all rights reserved.
*
* Change Log:
* 21.07.2001 Several changes listed below were made by Mario Konegger
* (konegger@itp.tu-graz.ac.at)
* Placed the graphical symbols in the right place and added
* some symbols, so the display is correct.
* Added an edge case of the display regarding the on/off
* state and the BUSY symbol, which was found out with testing
* on an actual PC1403.
*
* To Do: Convert to SVG rendering or an internal layout
*
*****************************************************************************/
#include "emu.h"
#include "includes/pocketc.h"
#include "includes/pc1403.h"
void pc1403_state::video_start()
{
m_down = 67;
m_right = 152;
}
void pc1403h_state::video_start()
{
m_down = 69;
m_right = 155;
}
READ8_MEMBER(pc1403_state::lcd_read)
{
return m_reg[offset];
}
WRITE8_MEMBER(pc1403_state::lcd_write)
{
m_reg[offset] = data;
}
const char* const pc1403_state::s_line[5] = /* simple line */
{
" ",
" ",
"11111",
"11111",
"11111"
};
const char* const pc1403_state::s_busy[5] =
{
"11 1 1 11 1 1",
"1 1 1 1 1 1 1",
"11 1 1 1 1 1",
"1 1 1 1 1 1 ",
"11 1 11 1 "
};
const char* const pc1403_state::s_def[5] =
{
"11 111 111",
"1 1 1 1 ",
"1 1 111 11 ",
"1 1 1 1 ",
"11 111 1 "
};
const char* const pc1403_state::s_shift[5] =
{
" 11 1 1 1 111 111",
"1 1 1 1 1 1 ",
" 1 111 1 11 1 ",
" 1 1 1 1 1 1 ",
"11 1 1 1 1 1 "
};
const char* const pc1403_state::s_hyp[5] =
{
"1 1 1 1 11 ",
"1 1 1 1 1 1",
"111 1 1 11 ",
"1 1 1 1 ",
"1 1 1 1 "
};
const char* const pc1403_state::s_de[5] =
{
"11 111",
"1 1 1 ",
"1 1 111",
"1 1 1 ",
"11 111"
};
const char* const pc1403_state::s_g[5] =
{
" 11",
"1 ",
"1 1",
"1 1",
" 11"
};
const char* const pc1403_state::s_rad[5] =
{
"11 1 11 ",
"1 1 1 1 1 1",
"11 111 1 1",
"1 1 1 1 1 1",
"1 1 1 1 11 "
};
const char* const pc1403_state::s_braces[5] =
{
" 1 1 ",
"1 1",
"1 1",
"1 1",
" 1 1 "
};
const char* const pc1403_state::s_m[5] =
{
"1 1",
"11 11",
"1 1 1",
"1 1",
"1 1"
};
const char* const pc1403_state::s_e[5] =
{
"111",
"1 ",
"111",
"1 ",
"111"
};
const char* const pc1403_state::s_kana[5] = // katakana charset
{
" 1 1 ",
" 11111 111",
" 1 1 1 ",
" 1 1 1 ",
"1 1 1 "
};
const char* const pc1403_state::s_shoo[5] = // minor
{
" 1 ",
" 1 1 1 ",
"1 1 1",
" 1 ",
" 1 "
};
const char* const pc1403_state::s_sml[5] =
{
" 11 1 1 1 ",
"1 111 1 ",
" 1 1 1 1 ",
" 1 1 1 1 ",
"11 1 1 111"
};
uint32_t pc1403_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const int contrast = m_dsw0->read() & 7;
int color[3] =
{
7,
BIT(m_portc, 0) ? 8 : 7,
8
};
bitmap.fill(11, cliprect);
if (BIT(m_portc, 0))
{
int x = m_right;
int y = m_down;
for (int i = 0; i < 6*5; x+=2)
for (int j = 0; j < 5; j++, i++, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
for (int i = 9*5; i < 12*5; x+=2)
for (int j = 0; j < 5; j++, i++, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
for (int i = 6*5; i < 9*5; x += 2)
for (int j = 0; j < 5; j++, i++, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
for (int i = 0x7b - 3*5; i > 0x7b - 6*5; x+=2)
for (int j = 0; j < 5; j++, i--, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
for (int i = 0x7b; i > 0x7b - 3*5; x += 2)
for (int j = 0; j < 5; j++, i--, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
for (int i = 0x7b - 6*5; i > 0x7b - 12*5; x += 2)
for (int j = 0; j < 5; j++, i--, x+=2)
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, m_reg[i], contrast, 0, 0, x, y);
}
/* If the display is off, busy is always visible. But if the computer is off, busy is hidden. */
if(!BIT(m_portc, 3))
{
if (BIT(m_portc, 0))
pocketc_draw_special(bitmap, m_right, m_down-13, s_busy, BIT(m_reg[0x3d], 0) ? color[2] : color[0]);
else
pocketc_draw_special(bitmap, m_right, m_down-13, s_busy, color[2]);
}
else
{
pocketc_draw_special(bitmap, m_right, m_down-13, s_busy, color[0]);
}
pocketc_draw_special(bitmap, m_right+155, m_down-13, s_kana, BIT(m_reg[0x3c], 0) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+167, m_down-13, s_shoo, BIT(m_reg[0x3c], 1) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+178, m_down-13, s_sml, BIT(m_reg[0x3c], 2) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+253, m_down+25, s_line, BIT(m_reg[0x3c], 3) ? color[1] : color[0]); // stat
pocketc_draw_special(bitmap, m_right+232, m_down+25, s_line, BIT(m_reg[0x3c], 4) ? color[1] : color[0]); // matrix
pocketc_draw_special(bitmap, m_right+94, m_down+25, s_line, BIT(m_reg[0x3c], 5) ? color[1] : color[0]); // empty
pocketc_draw_special(bitmap, m_right+10, m_down+25, s_line, BIT(m_reg[0x3c], 6) ? color[1] : color[0]); // empty
pocketc_draw_special(bitmap, m_right+18, m_down-13, s_def, BIT(m_reg[0x3d], 1) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+43, m_down-13, s_shift, BIT(m_reg[0x3d], 2) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+63, m_down-13, s_hyp, BIT(m_reg[0x3d], 3) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+73, m_down+25, s_line, BIT(m_reg[0x3d], 4) ? color[1] : color[0]); // prog
pocketc_draw_special(bitmap, m_right+52, m_down+25, s_line, BIT(m_reg[0x3d], 5) ? color[1] : color[0]); // run
pocketc_draw_special(bitmap, m_right+31, m_down+25, s_line, BIT(m_reg[0x3d], 6) ? color[1] : color[0]); // calc
pocketc_draw_special(bitmap, m_right+281, m_down-13, s_e, BIT(m_reg[0x7c], 0) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+274, m_down-13, s_m, BIT(m_reg[0x7c], 1) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+266, m_down-13, s_braces, BIT(m_reg[0x7c], 2) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+203, m_down-13, s_rad, BIT(m_reg[0x7c], 3) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+199, m_down-13, s_g, BIT(m_reg[0x7c], 4) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+191, m_down-13, s_de, BIT(m_reg[0x7c], 5) ? color[1] : color[0]);
pocketc_draw_special(bitmap, m_right+274, m_down+25, s_line, BIT(m_reg[0x7c], 6) ? color[1] : color[0]); // print
return 0;
}