diff options
-rw-r--r-- | src/mame/drivers/hp3478a.cpp | 26 | ||||
-rw-r--r-- | src/mame/layout/hp3478a.lay | 176 |
2 files changed, 135 insertions, 67 deletions
diff --git a/src/mame/drivers/hp3478a.cpp b/src/mame/drivers/hp3478a.cpp index cc23c1e3eae..9e76b665cda 100644 --- a/src/mame/drivers/hp3478a.cpp +++ b/src/mame/drivers/hp3478a.cpp @@ -18,18 +18,18 @@ * era, such as the 3468, 3457, 3488?, 4263?, 6623?, and probably others. * * TODO next level -* * do something for analog CPU serial link (not quite uart), or dump+emulate CPU -* * better display render and layout (annunciators + show button subtext) +* * do something for analog CPU serial link (not quite uart), or emulate CPU +* * better display render and layout - actual photo ? * * TODO level 9000 * * Connect this with the existing i8291.cpp driver -* * dump + add analog CPU (8049) +* * add analog CPU (8049) * * validate one single chipselect active when doing external access (movx) **** Hardware details (refer to service manual for schematics) Main CPU : i8039 , no internal ROM -Analog (floating) CPU : i8049, internal ROM (never dumped ?) +Analog (floating) CPU : i8049, internal ROM (, dump available at ko4bb.com) ROM : 2764 (64kbit, org 8kB) RAM : 5101 , 256 * 4bit (!), battery-backed calibration data GPIB: i8291 @@ -153,10 +153,12 @@ protected: /////////////// stuff for internal LCD emulation // shoud be split to a separate driver std::unique_ptr<output_finder<16> > m_outputs; + std::unique_ptr<output_finder<12> > m_annuns; void lcd_interface(uint8_t p2new); void lcd_update_hinib(uint64_t shiftreg); void lcd_update_lonib(uint64_t shiftreg); + void lcd_update_annuns(uint64_t shiftreg); void lcd_map_chars(); static uint32_t lcd_set_display(uint32_t segin); @@ -179,6 +181,7 @@ protected: uint8_t m_lcd_chrbuf[12]; //raw digits (not ASCII) uint8_t m_lcd_text[13]; //mapped to ASCII, only for debug output uint32_t m_lcd_segdata[12]; + bool m_lcd_annuns[12]; //local copy of annunciators /////////////////////////// @@ -374,6 +377,18 @@ void hp3478a_state::lcd_update_lonib(uint64_t shiftreg) } } + +/** update annunciators : 12 bits */ +void hp3478a_state::lcd_update_annuns(uint64_t shiftreg) +{ + int i; + for (i=11; i >= 0; i--) { + m_lcd_annuns[i] = (shiftreg & 0x01); + shiftreg >>=1; + } + std::copy(std::begin(m_lcd_annuns), std::end(m_lcd_annuns), std::begin(*m_annuns)); +} + /** map LCD char to ASCII and segment data + update * * discards extra bits @@ -532,6 +547,7 @@ void hp3478a_state::lcd_interface(uint8_t p2new) LOGMASKED(DEBUG_LCD, "LCD : data 0x%X\n", m_lcd_bitbuf); switch (m_lcdiwa) { case lcd_iwatype::ANNUNS: + lcd_update_annuns(m_lcd_bitbuf); LOGMASKED(DEBUG_LCD2, "LCD : write annuns 0x%02X\n", m_lcd_bitbuf & 0xFF); break; case lcd_iwatype::REG_A: @@ -567,6 +583,8 @@ void hp3478a_state::machine_start() m_outputs = std::make_unique<output_finder<16> >(*this, "vfd%u", (unsigned) 0); m_outputs->resolve(); + m_annuns = std::make_unique<output_finder<12> >(*this, "ann%u", (unsigned) 0); + m_annuns->resolve(); m_watchdog->watchdog_enable(); diff --git a/src/mame/layout/hp3478a.lay b/src/mame/layout/hp3478a.lay index a333a1d1186..c733d6d6732 100644 --- a/src/mame/layout/hp3478a.lay +++ b/src/mame/layout/hp3478a.lay @@ -4,11 +4,26 @@ license:CC0 loosely based on tranz330.lay note, the led16seg renderer is hardcoded to have OFF segments darker than ON, which is good for LEDs but not LCDs. -TODO : fix that -TODO : add button subtext for shifted functions +TODO : fix that ? not sure if possible --> <mamelayout version="2"> - <element name="vfd0"><led16segsc><color red="0.8" green="0.8" blue="0.8" /></led16segsc></element> + <element name="vfd"><led16segsc><color red="0.8" green="0.8" blue="0.8" /></led16segsc></element> + + <!-- set text for 12 annunciators --> + <element name="ann0"><text string="SRQ"></text></element> + <element name="ann1"><text string="LSTN"/></element> + <element name="ann2"><text string="TLK"/></element> + <element name="ann3"><text string="RMT"/></element> + <element name="ann4"><text string="MATH"/></element> + <element name="ann5"><text string="AZ OFF"/></element> + <element name="ann6"><text string="2Ω"></text></element> + <element name="ann7"><text string="4Ω"/></element> + <element name="ann8"><text string="M RNG"/></element> + <element name="ann9"><text string="S TRG"/></element> + <element name="ann10"><text string="CAL"/></element> + <element name="ann11"><text string="SHIFT"/></element> + + <element name="front"><rect><color red="0.6" green="0.63" blue="0.65" /></rect></element> <element name="vfd_back"><rect><color red="0.29" green="0.33" blue="0.32" /></rect></element> @@ -20,116 +35,118 @@ TODO : add button subtext for shifted functions </rect> </element> - <element name="button_dcv_text"> + + <element name="btn00_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="DCV"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_acv_text"> + <element name="btn01_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="ACV"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_2w_text"> + <element name="btn02_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="2W"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_4w_text"> + <element name="btn03_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="4W"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_dca_text"> + <element name="btn04_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="DCA"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_aca_text"> + <element name="btn05_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="ACA"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_shift_text"> + <element name="btn06_text"> <rect><color red="0.3" green="0.35" blue="0.85" /></rect> <text string=""><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_auto_text"> + <element name="btn10_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> - <text string="AUTO"><color red="0.0" green="0.0" blue="0.0" /></text> + <text string="AUTO/MAN"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_up_text"> + <element name="btn11_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="UP"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_dn_text"> + <element name="btn12_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="DN"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_int_text"> + <element name="btn13_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="INT"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_sgl_text"> + <element name="btn14_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="SGL"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_srq_text"> + <element name="btn15_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="SRQ"><color red="0.0" green="0.0" blue="0.0" /></text> </element> - <element name="button_local_text"> + <element name="btn16_text"> <rect><color red="0.75" green="0.75" blue="0.75" /></rect> <text string="LCL"><color red="0.0" green="0.0" blue="0.0" /></text> </element> + <!-- a few extra labels --> + <element name="3dig"><text string="3"/></element> + <element name="4dig"><text string="4"/></element> + <element name="5dig"><text string="5"/></element> + <element name="az"><text string="Autozero"/></element> + <element name="trst"><text string="Test/Rst"/></element> + <element name="adrs"><text string="Adrs"/></element> + <element name="cal"><text string="Cal"/></element> + <view name="Internal Layout"> <element name="case_bg" ref="front"> <bounds x=" 0" y=" 0" width="126" height="70"/></element> - <!-- 2 rows of 7 buttons , but electrical switch matrix is different --> - <element name="button_dcv" ref="button_digit_back"><bounds x="5" y="35" width="10" height="10"/></element> - <element name="button_acv" ref="button_digit_back"><bounds x="20" y="35" width="10" height="10"/></element> - <element name="button_2w" ref="button_digit_back"><bounds x="35" y="35" width="10" height="10"/></element> - <element name="button_4w" ref="button_digit_back"><bounds x="50" y="35" width="10" height="10"/></element> - <element name="button_dca" ref="button_digit_back"><bounds x="65" y="35" width="10" height="10"/></element> - <element name="button_aca" ref="button_digit_back"><bounds x="80" y="35" width="10" height="10"/></element> - <element name="button_shift" ref="button_digit_back"><bounds x="95" y="35" width="10" height="10"/></element> - - <element name="button_auto" ref="button_digit_back"><bounds x="5" y="50" width="10" height="10"/></element> - <element name="button_up" ref="button_digit_back"><bounds x="20" y="50" width="10" height="10"/></element> - <element name="button_dn" ref="button_digit_back"><bounds x="35" y="50" width="10" height="10"/></element> - <element name="button_int" ref="button_digit_back"><bounds x="50" y="50" width="10" height="10"/></element> - <element name="button_sgl" ref="button_digit_back"><bounds x="65" y="50" width="10" height="10"/></element> - <element name="button_srq" ref="button_digit_back"><bounds x="80" y="50" width="10" height="10"/></element> - <element name="button_local" ref="button_digit_back"><bounds x="95" y="50" width="10" height="10"/></element> - <element name="vfd_backdrop" ref="vfd_back"> <bounds x="0" y="0" width="126" height="32"/></element> - <element name="vfd0" ref="vfd0" state="0"><bounds x=" 9" y="9" width="9" height="14"/></element> - <element name="vfd1" ref="vfd0" state="0"><bounds x="18" y="9" width="9" height="14"/></element> - <element name="vfd2" ref="vfd0" state="0"><bounds x="27" y="9" width="9" height="14"/></element> - <element name="vfd3" ref="vfd0" state="0"><bounds x="36" y="9" width="9" height="14"/></element> - <element name="vfd4" ref="vfd0" state="0"><bounds x="45" y="9" width="9" height="14"/></element> - <element name="vfd5" ref="vfd0" state="0"><bounds x="54" y="9" width="9" height="14"/></element> - <element name="vfd6" ref="vfd0" state="0"><bounds x="63" y="9" width="9" height="14"/></element> - <element name="vfd7" ref="vfd0" state="0"><bounds x="72" y="9" width="9" height="14"/></element> - <element name="vfd8" ref="vfd0" state="0"><bounds x="81" y="9" width="9" height="14"/></element> - <element name="vfd9" ref="vfd0" state="0"><bounds x="90" y="9" width="9" height="14"/></element> - <element name="vfd10" ref="vfd0" state="0"><bounds x="99" y="9" width="9" height="14"/></element> - <element name="vfd11" ref="vfd0" state="0"><bounds x="108" y="9" width="9" height="14"/></element> - - <element name="button_dcv_text1" ref="button_dcv_text"> <bounds x="5" y="37" width="10" height="8"/></element> - <element name="button_acv_text1" ref="button_acv_text"> <bounds x="20" y="37" width="10" height="8"/></element> - <element name="button_2w_text1" ref="button_2w_text"> <bounds x="35" y="37" width="10" height="8"/></element> - <element name="button_4w_text1" ref="button_4w_text"> <bounds x="50" y="37" width="10" height="8"/></element> - <element name="button_dca_text1" ref="button_dca_text"> <bounds x="65" y="37" width="10" height="8"/></element> - <element name="button_aca_text1" ref="button_aca_text"> <bounds x="80" y="37" width="10" height="8"/></element> - <element name="button_shift_text1" ref="button_shift_text"> <bounds x="95" y="35" width="10" height="10"/></element> - - <element name="button_auto_text1" ref="button_auto_text"> <bounds x="5" y="52" width="10" height="8"/></element> - <element name="button_up_text1" ref="button_up_text"> <bounds x="20" y="52" width="10" height="8"/></element> - <element name="button_dn_text1" ref="button_dn_text"> <bounds x="35" y="52" width="10" height="8"/></element> - <element name="button_int_text1" ref="button_int_text"> <bounds x="50" y="52" width="10" height="8"/></element> - <element name="button_sgl_text1" ref="button_sgl_text"> <bounds x="65" y="52" width="10" height="8"/></element> - <element name="button_srq_text1" ref="button_srq_text"> <bounds x="80" y="52" width="10" height="8"/></element> - <element name="button_local_text1" ref="button_local_text"> <bounds x="95" y="52" width="10" height="8"/></element> + <!-- pattern of 12 digits --> + <repeat count="12"> + <param name="vfdnum" start="0" increment="1" /> + <param name="vfd_xpos" start="9" increment="9" /> + <element name="vfd~vfdnum~" ref="vfd" state="0"> + <bounds x="~vfd_xpos~" y="9" width="9" height="14" /> + </element> + </repeat> + + <!-- pattern of 12 text annunciators --> + <repeat count="12"> + <param name="ann_i" start="0" increment="1" /> + <param name="ann_xpos" start="9" increment="9" /> + <element name="ann~ann_i~" ref="ann~ann_i~"> + <bounds x="~ann_xpos~" y="24" width="8" height="3" /> + <color state="0" alpha="0.1" red="1.0" green="1.0" blue="1.0" /> + <color state="1" red="1.0" green="1.0" blue="1.0" /> + </element> + </repeat> + <!-- 2 rows of 7 button backgrounds and text elements, but electrical switch matrix is different --> + <repeat count="2"> + <param name="brow" start="0" increment="1"/> + <param name="by" start="35" increment="15" /> + <param name="ty" start="37" increment="15" /> + <repeat count="7"> + <param name="bcol" start="0" increment="1"/> + <param name="bx" start="5" increment="15" /> + <element name="btn~brow~~bcol~_back" ref="button_digit_back"> + <bounds x="~bx~" y="~by~" width="10" height="10"/> + </element> + <element name="btn~brow~~bcol~_text1" ref="btn~brow~~bcol~_text"> + <bounds x="~bx~" y="~ty~" width="10" height="8"/> + </element> + </repeat> + </repeat> + +<!-- not sure how to parametrize this one : switch matrix doesn't match button layout. --> <!-- to match the schematics, we consider Col.0-3 to be driven by P14-17. The value in "inputmask" is the one read as "p1 & 0x0F", i.e. P13-P10. --> <!-- col.0 : (nc)|shift|ACA|DCA col.1 : 4W|2W|ACV|DCV @@ -151,5 +168,38 @@ TODO : add button subtext for shifted functions <element ref="hl" inputtag="COL.3" inputmask="0x02"><bounds x="80" y="50" width="10" height="10" /><color alpha="0.2" /></element> <element ref="hl" inputtag="COL.3" inputmask="0x04"><bounds x="95" y="50" width="10" height="10" /><color alpha="0.2" /></element> <!--element ref="hl" inputtag="COL.3" inputmask="0x08"><bounds x="" y="5" width="10" height="10" /><color alpha="0.2" /></element --> + + <!-- misc text above buttons --> + <param name="bluetext_r" value="0.1"/> + <param name="bluetext_g" value="0.1"/> + <param name="bluetext_b" value="0.6"/> + <element name="3dig" ref="3dig"> + <bounds x="5" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="4dig" ref="4dig"> + <bounds x="20" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="5dig" ref="5dig"> + <bounds x="35" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="az" ref="az"> + <bounds x="50" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="trst" ref="trst"> + <bounds x="65" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="adrs" ref="adrs"> + <bounds x="80" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> + <element name="cal" ref="cal"> + <bounds x="95" y="47" width="10" height="3" /> + <color red="~bluetext_r~" green="~bluetext_g~" blue="~bluetext_b~"/> + </element> </view> </mamelayout> |