From 9ca1b442a0120fd3bd396f737da9d99433253a39 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 23 Jan 2024 20:56:28 +0100 Subject: [PATCH] New working systems ------------------- Triomphe [hap, Berger, Sean Riddle] --- src/devices/cpu/m6800/m6800.cpp | 24 +- src/devices/cpu/m6800/m6801.cpp | 3 +- src/mame/chess/cking_master.cpp | 38 +-- src/mame/chess/cking_triomphe.cpp | 186 ++++++++++++++ src/mame/chess/yeno_301xl.cpp | 6 +- src/mame/fidelity/elite.cpp | 2 +- src/mame/layout/cking_master.lay | 57 ++--- src/mame/layout/cking_triomphe.lay | 390 +++++++++++++++++++++++++++++ src/mame/mame.lst | 3 + src/mame/novag/accord.cpp | 2 +- src/mame/novag/constjr.cpp | 2 +- src/mame/saitek/leonardo.cpp | 4 +- src/mame/saitek/renaissance.cpp | 2 +- 13 files changed, 643 insertions(+), 76 deletions(-) create mode 100644 src/mame/chess/cking_triomphe.cpp create mode 100644 src/mame/layout/cking_triomphe.lay diff --git a/src/devices/cpu/m6800/m6800.cpp b/src/devices/cpu/m6800/m6800.cpp index 83aa8511f70..8d8dddfc3bb 100644 --- a/src/devices/cpu/m6800/m6800.cpp +++ b/src/devices/cpu/m6800/m6800.cpp @@ -470,8 +470,7 @@ void m6800_cpu_device::enter_interrupt(uint16_t irq_vector) SEI; PCD = RM16(irq_vector); - if (cycles_to_eat > 0) - increment_counter(cycles_to_eat); + increment_counter(cycles_to_eat); } /* check the IRQ lines for pending interrupts */ @@ -483,22 +482,19 @@ void m6800_cpu_device::check_irq_lines() m_nmi_pending = false; enter_interrupt(0xfffc); } - else + else if (m_irq_state[M6800_IRQ_LINE] != CLEAR_LINE) { - if (m_irq_state[M6800_IRQ_LINE] != CLEAR_LINE) - { - /* standard IRQ */ - m_wai_state &= ~M6800_SLP; + /* standard IRQ */ + m_wai_state &= ~M6800_SLP; - if (!(CC & 0x10)) - { - standard_irq_callback(M6800_IRQ_LINE, m_pc.w.l); - enter_interrupt(0xfff8); - } + if (!(CC & 0x10)) + { + standard_irq_callback(M6800_IRQ_LINE, m_pc.w.l); + enter_interrupt(0xfff8); } - else - check_irq2(); } + else + check_irq2(); } void m6800_cpu_device::increment_counter(int amount) diff --git a/src/devices/cpu/m6800/m6801.cpp b/src/devices/cpu/m6800/m6801.cpp index e15fb8ee2d5..34270f76572 100644 --- a/src/devices/cpu/m6800/m6801.cpp +++ b/src/devices/cpu/m6800/m6801.cpp @@ -2010,8 +2010,7 @@ void hd6301y_cpu_device::p6_csr_w(uint8_t data) LOGPORT("Port 6 Control/Status Register: %02x\n", data); m_p6csr = (m_p6csr & 0x80) | (data & 0x7f); - if (!(m_cc & 0x10) && data & 0x40) - check_irq2(); + check_irq2(); } diff --git a/src/mame/chess/cking_master.cpp b/src/mame/chess/cking_master.cpp index c3eb8840504..1bba074fe47 100644 --- a/src/mame/chess/cking_master.cpp +++ b/src/mame/chess/cking_master.cpp @@ -5,9 +5,9 @@ Chess King Master (yes, it's plainly named "Master") -Chess King was a UK business formed by Intelligent Software, so logically, -all the programs were by them. According to the manual, the chess engine is -Cyrus (by Richard Lang). +Chess King was a UK business formed by Intelligent Software (aka Intelligent Chess +Software), so logically, all the programs were by them. According to the manual, +the chess engine is Cyrus (by Richard Lang). To start a new game, press CHANGE POSITION, NEW GAME, and CHANGE POSITION again. @@ -191,24 +191,24 @@ void master_state::main_trampoline(address_map &map) static INPUT_PORTS_START( master ) PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Change Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Clear Board") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("White") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Black") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") INPUT_PORTS_END @@ -262,4 +262,4 @@ ROM_END *******************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -SYST( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King / Intelligent Software", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +SYST( 1983, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King / Intelligent Software", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/cking_triomphe.cpp b/src/mame/chess/cking_triomphe.cpp new file mode 100644 index 00000000000..ee191a75148 --- /dev/null +++ b/src/mame/chess/cking_triomphe.cpp @@ -0,0 +1,186 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/******************************************************************************* + +Chess King Triomphe + +For some reason, the programmer decided to (ab)use the HD6301 undefined opcode +TRAP interrupt for the beeper routine. Very strange. + +Hardware notes: +- PCB label: TRIUMPHE CHESS KING +- Hitachi HD6301V1P, 4MHz XTAL +- 8*8 chessboard buttons, 32 LEDs (not counting power-on LED, piezo + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6800/m6801.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "cking_triomphe.lh" + + +namespace { + +class triomphe_state : public driver_device +{ +public: + triomphe_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + void triomphe(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<2> m_inputs; + + u16 m_inp_mux = 0; + + u8 input_r(); + void board_w(u8 data); + void control_w(u8 data); +}; + +void triomphe_state::machine_start() +{ + save_item(NAME(m_inp_mux)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +u8 triomphe_state::input_r() +{ + // P10-P17: multiplexed inputs + u8 data = 0; + + // read buttons + for (int i = 0; i < 2; i++) + if (BIT(m_inp_mux, i + 8)) + data |= m_inputs[i]->read(); + + // read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i); + + return ~data; +} + +void triomphe_state::board_w(u8 data) +{ + // P30-P37: input mux (chessboard), led data + m_inp_mux = (m_inp_mux & 0x300) | (data ^ 0xff); + m_display->write_mx(~data); +} + +void triomphe_state::control_w(u8 data) +{ + // P40,P41: input mux (buttons) + m_inp_mux = (m_inp_mux & 0xff) | (~data << 8 & 0x300); + + // P44,P45: led select + m_display->write_my(~data >> 4 & 3); + + // P47: speaker out + m_dac->write(BIT(~data, 7)); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( triomphe ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Take Back") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0xe0, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void triomphe_state::triomphe(machine_config &config) +{ + // basic machine hardware + HD6301V1(config, m_maincpu, 4_MHz_XTAL); + m_maincpu->in_p1_cb().set(FUNC(triomphe_state::input_r)); + m_maincpu->out_p3_cb().set(FUNC(triomphe_state::board_w)); + m_maincpu->in_p4_cb().set_constant(0); // freq sel + m_maincpu->out_p4_cb().set(FUNC(triomphe_state::control_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 8); + config.set_default_layout(layout_cking_triomphe); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( triomphe ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD("chessking_triomphe_m1_hd6301v1e53p", 0x0000, 0x1000, CRC(01f30f08) SHA1(5d8949b8e0a5d15024bb2c13ee6f3eb2ed02f94b) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1985, triomphe, 0, 0, triomphe, triomphe, triomphe_state, empty_init, "Chess King / Intelligent Software", "Triomphe", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/yeno_301xl.cpp b/src/mame/chess/yeno_301xl.cpp index e5d2537a32a..9f006d22b68 100644 --- a/src/mame/chess/yeno_301xl.cpp +++ b/src/mame/chess/yeno_301xl.cpp @@ -8,8 +8,8 @@ Yeno 301 XL NOTE: It triggers an IRQ when the power switch is changed from ON to SAVE. If this is not done, NVRAM won't save properly. -For some reason, the programmer decided to (ab)use the HD6301 undefined opcode -TRAP interrupt for the beeper routine. Very strange. +It's by the same programmer as Chess King Triomphe / Counter Gambit, also using +the TRAP interrupt for the beeper routine. Hardware notes: - PCB label: WSE 8108A @@ -108,7 +108,7 @@ INPUT_CHANGED_MEMBER(y301xl_state::power_off) { // IRQ1 when power switch is set to SAVE, followed by STBY after a short delay m_maincpu->set_input_line(HD6301_IRQ_LINE, ASSERT_LINE); - m_standbytimer->adjust(attotime::from_msec(50), M6801_STBY_LINE); + m_standbytimer->adjust(attotime::from_msec(50)); } } diff --git a/src/mame/fidelity/elite.cpp b/src/mame/fidelity/elite.cpp index 2a87386990c..aaa8dad71e3 100644 --- a/src/mame/fidelity/elite.cpp +++ b/src/mame/fidelity/elite.cpp @@ -36,7 +36,7 @@ hardware overview: *In West Germany, some distributors released it with overclocked CPUs, advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL. Though model EWC(improved Budapest) had a 3.57MHz XTAL and EAS-C(Glasgow) had -a 4MHz XTAL. +a 4MHz XTAL. Model E4.0 is also assumed to be 4MHz. A condensator/battery keeps RAM contents alive for a while when powered off. diff --git a/src/mame/layout/cking_master.lay b/src/mame/layout/cking_master.lay index 7ea20eea45f..1ed620bd702 100644 --- a/src/mame/layout/cking_master.lay +++ b/src/mame/layout/cking_master.lay @@ -11,31 +11,24 @@ license:CC0-1.0 - + - + - - - - - - - - + - - - - - - - + + + + + + + @@ -389,21 +382,21 @@ license:CC0-1.0 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/mame/layout/cking_triomphe.lay b/src/mame/layout/cking_triomphe.lay new file mode 100644 index 00000000000..5d8c33381bb --- /dev/null +++ b/src/mame/layout/cking_triomphe.lay @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8a6f6df8a63..b7ac8f6357c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -15983,6 +15983,9 @@ arbv2 // @source:chess/cking_master.cpp ckmaster // +@source:chess/cking_triomphe.cpp +triomphe + @source:chess/compuchess.cpp ccmk1 // Chess Champion MK I cmpchess diff --git a/src/mame/novag/accord.cpp b/src/mame/novag/accord.cpp index c612b1e9a09..3b1b5f3da89 100644 --- a/src/mame/novag/accord.cpp +++ b/src/mame/novag/accord.cpp @@ -110,7 +110,7 @@ INPUT_CHANGED_MEMBER(accord_state::power_off) { // NMI when power goes off, followed by STBY after a short delay m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - m_standbytimer->adjust(attotime::from_msec(50), M6801_STBY_LINE); + m_standbytimer->adjust(attotime::from_msec(10)); } } diff --git a/src/mame/novag/constjr.cpp b/src/mame/novag/constjr.cpp index e32a40191dd..7a989579042 100644 --- a/src/mame/novag/constjr.cpp +++ b/src/mame/novag/constjr.cpp @@ -115,7 +115,7 @@ INPUT_CHANGED_MEMBER(constjr_state::power_off) { // NMI when power goes off, followed by STBY after a short delay m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - m_standbytimer->adjust(attotime::from_msec(50), M6801_STBY_LINE); + m_standbytimer->adjust(attotime::from_msec(10)); } } diff --git a/src/mame/saitek/leonardo.cpp b/src/mame/saitek/leonardo.cpp index ab083fd994d..53bebe5588d 100644 --- a/src/mame/saitek/leonardo.cpp +++ b/src/mame/saitek/leonardo.cpp @@ -26,7 +26,7 @@ be entered first (from eg. a terminal), and then the Comm. LED will turn on. Hardware notes: Leonardo (1986): -- 6301Y0 MCU @ 12MHz +- HD6301Y0P MCU @ 12MHz - 32KB ROM(27C256) - 8KB RAM(M5M5165P-15 or compatible) - magnet sensors chessboard with 16 leds @@ -34,7 +34,7 @@ Leonardo (1986): The 6301Y0 was seen with internal maskrom serial A96 and B40. It is actually one from another SciSys chesscomputer (Turbo 16K or Turbo S-24K). It appears to be running in mode 1 (expanded mode): the internal ROM is disabled and the MCU -can be emulated as if it's a HD6303Y. +can be emulated as if it's a 6303Y. Galileo (1988): - HD6303YP MCU @ 12MHz diff --git a/src/mame/saitek/renaissance.cpp b/src/mame/saitek/renaissance.cpp index c136612eb7a..1c830051a0f 100644 --- a/src/mame/saitek/renaissance.cpp +++ b/src/mame/saitek/renaissance.cpp @@ -13,7 +13,7 @@ the chesscomputer before exiting MAME. Unlike Leonardo/Galileo, it looks like it will always do a cold boot if you reset without having pressed STOP. Hardware notes: -- 6301Y0(mode 1) or HD6303YP MCU @ 10MHz +- HD6301Y0P (mode 1) or HD6303YP MCU @ 10MHz - 8KB RAM, 32KB ROM - "HELIOS" I/O (NEC gate array) - Epson SED1502F, LCD screen