summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/bus/sunkbd/hlekbd.cpp
blob: 48b16f13348db083043633fce22057e386757ae0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                              
                
                   
 
                               
                    


  
                                     
                                                              
                                                             
                                                                     
 
                                                              

                                   


                                                                              
                                                                               
                                            
                                                                                                             
                                                                                   
 





                                                                                                       









































                                                                                          

 
                        


                                                                                                        



                                                                                                        

                                                                                                        
 
                          
 
                                                                                                        
 



                                                                                                        
                                                                                                        
 
                         















                                                                                                        
















                                                                                                        

  




                                                                            





                                                                                                                                                   



                                  
 
           


                                                                            
 

                                                                                     
                                                                                     


































                                                                                     
                          

                                                        



                                                        

                                                                                                                                             
                                                        
                                                                                                                                             
                                                        
                                                                                                                                             
                                                        
                                                                                                                                             
                                                        






                                                                                                                                             
                                                                                                          








                                                        
















                                                                                                                                              



                                                        

                          




                                                        














                                                                                                                                              
                                                                                                                                              







                                                        
















                                                                                                                                                   





                                                        

                          


                                                        
                                                                                                                                         

                                                                                                                                              




                                                                                                                                              



                                                                                                                                                 
                                                        

                          


                                                        


                                                        
                                                        
                                                                                                                                                   
                                                                                                                                               
                                                                                                                               

                                                                                                                                               
                                                        
                                                        




                                                        
                             

















                                                                                                                                                                    




































                                                                                                                                                                 




























                                                                                                                                                  


                                                                                                                                


               




















































































                                                                                                                                                    




                                                                                                                                              
                                                                                                                                         








                                                                                                                                                   






                                                                                                                                                


                                                                                                                                                 



                                                                                                                                               
                                                                                                                                              





































                                                                                                                                               


























                                                                                                                                                  




                                     


                                                                                                                              





                                          



                                         

                           




                                                                                                                                                  
                                                                                                                                                     
 






























































                                                                                                                              



                               
 
 

                                        

                               


               






                                        





                                        
                                                                                                                    

               


                        
 


                                                                            
 



                                                    
 
                                 

                                              

                                

                                                    
                                                          
                                                            
                                                                                                                          
                              
                                
                                   
                                    
                          
                             

                            



 





                                                    
 


 
                                                    

                                    

                                                    
                                               
 
                                                      

 

                                                    

                                       

                                                    
                                                         
                                               
                                                                                             

                                                  
 



                                                    
                                      


                                                    
 
                         
                                                    
 
                                      
                                    
                                    



                                        


                                                    
                   


                                                    

                           
                     
                          
                             

                               
 
                                                     

                                                                           


                                  
                                                       
                      
 
                                       




                                
 






                                                   
                              

                                    
                              
                                     


 





                                                                                              


                   
                            
                                                         
                                                            


                      
                      



         


                                                    
           


                                                    




                                                     





                                                    
 

                                                           
 








                                                         
                                                           






                                                                  
         
                                                        

                                                             
         











                                                    
                                                            











                                                                            


 
                                                    



                                                    
                                                 








                                                              


                                                    
                                                 
 


                           




                                                   





                                              
                             
                 
                                   


                                       
                                     
                                                               



                                                                    
                                      
                                                                



                                                                    
                                      
                                        


                                             
                                       
                                        
                                               
                                                                 
                                                                    


                                             
                                 


                                            
                                    
                                             
                                                                       



                                             
                                                                  





                                             

                                                                            








                                                                            
                                           






                                                                            











                                                                            
                               

                                
                                               

                              
                              




                                                    











                                                               

                                                 

                                                    
                                      


















                                                                            
                               

                                
                                               

                              
                              




                                                    









                                                               













                                                                            
                               

                                
                                               

                              
                              




                                                    









                                                               





                                                                            
                                            


                                                    
                                         


                                              
                               

                                
                                                  

                              
                              




                                                    

                                           

                                                    
                                                                  
 
                                                     


 




                                                                            
                                                    

                                            

                                                    



                                              
                               

                                
                                                  

                              
                              
 



                                                    

                                           

                                                    
                                                                  
 
                                                     

 














                                                                            
                               

                                
                                                  

                              
                              













                                                                  
                            
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#include "emu.h"
#include "hlekbd.h"

#include "machine/keyboard.ipp"
#include "speaker.h"


/*
    TODO: other international layouts
    TODO: localised labels on Solaris group for Swedish layout
    TODO: suppress LED command processing for Type 3 keyboard
    TODO: work out what actually happens with DIPs on Type 3 keyboard

    HLE SPARC serial keyboard compatible with Sun Type 3/4/5/6

    messages from host to keyboard:
    0000 0001               reset (keyboard responds with self test pass/fail)
    0000 0010               bell on (480us period)
    0000 0011               bell off
    0000 1010               enable keyclick (5ms duration 480us period on make)
    0000 1011               disable keyclick
    0000 1110  ---k lscn    LED (1 = on, k = kana, l = caps lock, s = scroll lock, c = compose, n = num lock)
    0000 1111               layout request (keyboard responds with layout response)

    message from keyboad to host:
    0xxx xxxx               key make
    1xxx xxxx               key break
    0111 1111               all keys up
    1111 1110  00dd dddd    layout response (DIP switches 3 to 8 from MSB to LSB)
    1111 1111  0000 0100    reset response (self test pass, always followed by all keys up or key make)
    0111 1110  0000 0001    self test fail


    Type 3 layout:

    01  03    05  06    08      0a      0c      0e      10    11  12  2b    15  16  17
    19  1a    1d  1e  1f  20  21  22  23  24  25  26  27  28  29  58  2a    2d  2e  2f
    31  33    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41    42    44  45  46
    48  49    4c     4d  4e  4f  50  51  52  53  54  55  56  57       59    5b  5c  5d
    5f  61    63       64  65  66  67  68  69  6a  6b  6c  6d    6e   6f    70  71  72
              77     78                  79                   7a      13

    no LEDs
    top row function keys are F1-F9 and backspace
    delete key is above return
    meta keys labelled "Left" and "Right"
    linefeed key to the right of right shift (removed for Type 5)
    single control key (still the case on later Sun keyboards)
    "Alternate" key at bottom right of main area (moved to left for Type 4)
    left group of function keys labelled L1-L10
    right group of function keys labelled R1-R15
    cursor up/down/left/right on R8/R10/R12/R14


    Type 4 layout:

    01  03    05  06  08  0a  0c  0e  10  11  12  07  09  0b  58      42    15  16  17  62
    19  1a    1d  1e  1f  20  21  22  23  24  25  26  27  28  29      2b    2d  2e  2f  47
    31  33    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41          44  45  46
    48  49    4c     4d  4e  4f  50  51  52  53  54  55  56  57  2a   59    5b  5c  5d  7d
    5f  61    63       64  65  66  67  68  69  6a  6b  6c  6d   6e    6f    70  71  72
      76      77  13  78                  79                  7a  43  0d      5e    32  5a

    double-height return key, backspace above return
    top row F1-F12, backslash and delete
    dedicated labels for left function group with "Help" key added at bottom
    meta keys labelled with diamonds, "Alt" on left, "Alt Graph" on right
    "tenkey" keypad layout mostly re-using codes from R1-R15 on Type 3
    top row of keypad is Pause, PrSc, Scroll Lock/Break, Num Lock
    2d is = key on keypad (removed for Type 5 and scancode reused for mute)
    introduces the "Compose" key
    Caps Lock/Compose/Scroll Lock/Num Lock LEDs above keypad


    Type 5 US PC layout:

      76      1d      05  06  08  0a    0c  0e  10  11    12  07  09  0b    16  17  15    2d  02  04  30

    01  03    2a  1e  1f  20  21  22  23  24  25  26  27  28  29      2b    2c  34  60    62  2e  2f  47
    19  1a    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41    58    42  4a  7b    44  45  46
    31  33    77     4d  4e  4f  50  51  52  53  54  55  56  57       59                  5b  5c  5d  7d
    48  49    63       64  65  66  67  68  69  6a  6b  6c  6d         6e        14        70  71  72
    5f  61    4c     13   78                79                7a  43  0d    18  1b  1c      5e    32  5a


    Type 5 US UNIX layout:

      76      0f      05  06  08  0a    0c  0e  10  11    12  07  09  0b    16  17  15    2d  02  04  30

    01  03    1d  1e  1f  20  21  22  23  24  25  26  27  28  29  58  2a    2c  34  60    62  2e  2f  47
    19  1a    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41    2b    42  4a  7b    44  45  46
    31  33    4c     4d  4e  4f  50  51  52  53  54  55  56  57       59                  5b  5c  5d  7d
    48  49    63       64  65  66  67  68  69  6a  6b  6c  6d         6e        14        70  71  72
    5f  61    77     13   78                79                7a  43  0d    18  1b  1c      5e    32  5a

    0f has a blank keycap
    backspace immediately above return
    backslash and backtick/tilde at top right of main area
    control on home row, caps lock at bottom left corner of main area


    Type 5 International layout:

      76      1d      05  06  08  0a    0c  0e  10  11    12  07  09  0b    16  17  15    2d  02  04  30

    01  03    2a  1e  1f  20  21  22  23  24  25  26  27  28  29      2b    2c  34  60    62  2e  2f  47
    19  1a    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41          42  4a  7b    44  45  46
    31  33    77     4d  4e  4f  50  51  52  53  54  55  56  57  58   59                  5b  5c  5d  7d
    48  49    63   7c  64  65  66  67  68  69  6a  6b  6c  6d         6e        14        70  71  72
    5f  61    4c     13   78                79                7a  43  0d    18  1b  1c      5e    32  5a

    double-height return key, 58 (US backslash) moved to home row, 7c added on left of bottom row


    Type 5 Japanese layout:

      76      1d      05  06  08  0a    0c  0e  10  11    12  07  09  0b    16  17  15    2d  02  04  30

    01  03    2a  1e  1f  20  21  22  23  24  25  26  27  28  29      2b    2c  34  60    62  2e  2f  47
    19  1a    35    36  37  38  39  3a  3b  3c  3d  3e  3f  40  41          42  4a  7b    44  45  46
    31  33    77     4d  4e  4f  50  51  52  53  54  55  56  57  58   59                  5b  5c  5d  7d
    48  49    63       64  65  66  67  68  69  6a  6b  6c  6d  6f     6e        14        70  71  72
    5f  61    4c  13  78   73           79           74   75  7a  43  0d    18  1b  1c      5e    32  5a

    double-height return key
    yen/pipe replaces backtick/tilde at top left corner of main area
    linefeed scancode repurposed for backslash/underscore
    kana replaces alt graph (with LED window)
    extra kakutei, henkan and nihongo on-off keys
*/


/***************************************************************************
    DEVICE TYPE GLOBALS
***************************************************************************/

DEFINE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD,    bus::sunkbd, hle_type3_device,    "kbd_type3_hle",    "Sun Type 3 Keyboard (HLE)")
DEFINE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD,    bus::sunkbd, hle_type4_device,    "kbd_type4_hle",    "Sun Type 4 Keyboard (HLE)")
DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD,    bus::sunkbd, hle_type5_device,    "kbd_type5_hle_us", "Sun Type 5 Keyboard (U.S.A. - HLE)")
DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_type5_gb_device, "kbd_type5_hle_gb", "Sun Type 5 Keyboard (Great Britain - HLE)")
DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_type5_se_device, "kbd_type5_hle_se", "Sun Type 5 Keyboard (Sweden - HLE)")
DEFINE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_device, "kbd_type5_hle_jp", "Sun Type 5 Keyboard (Japan - HLE)")



namespace bus { namespace sunkbd {

namespace {
/***************************************************************************
    INPUT PORT DEFINITIONS
***************************************************************************/

#define TYPE5_DIPS(dflt)                                                    \
		PORT_START("DIP")                                                   \
		PORT_DIPNAME( 0x1f, dflt, "Layout") PORT_DIPLOCATION("S:5,4,3,2,1") \
		/* 0x00 */                                                          \
		PORT_DIPSETTING(    0x01, "U.S.A. (US5.kt)"                      )  \
		PORT_DIPSETTING(    0x02, "U.S.A./UNIX (US_UNIX5.kt)"            )  \
		PORT_DIPSETTING(    0x03, "France (France5.kt)"                  )  \
		PORT_DIPSETTING(    0x04, "Denmark (Denmark5.kt)"                )  \
		PORT_DIPSETTING(    0x05, "Germany (Germany5.kt)"                )  \
		PORT_DIPSETTING(    0x06, "Italy (Italy5.kt)"                    )  \
		PORT_DIPSETTING(    0x07, "The Netherlands (Netherland5.kt)"     )  \
		PORT_DIPSETTING(    0x08, "Norway (Norway5.kt)"                  )  \
		PORT_DIPSETTING(    0x09, "Portugal (Portugal5.kt)"              )  \
		PORT_DIPSETTING(    0x0a, "Spain (Spain5.kt)"                    )  \
		PORT_DIPSETTING(    0x0b, "Sweden (Sweden5.kt)"                  )  \
		PORT_DIPSETTING(    0x0c, "Switzerland/French (Switzer_Fr5.kt)"  )  \
		PORT_DIPSETTING(    0x0d, "Switzerland/German (Switzer_Ge5.kt)"  )  \
		PORT_DIPSETTING(    0x0e, "Great Britain (UK5.kt)"               )  \
		PORT_DIPSETTING(    0x0f, "Korea (Korea5.kt)"                    )  \
		PORT_DIPSETTING(    0x10, "Taiwan (Taiwan5.kt)"                  )  \
		PORT_DIPSETTING(    0x11, "Japan (Japan5.kt)"                    )  \
		PORT_DIPSETTING(    0x12, "Canada/French (Canada_Fr5.kt)"        )  \
		PORT_DIPSETTING(    0x13, "Hungary (Hungary5.kt)"                )  \
		PORT_DIPSETTING(    0x14, "Poland (Poland5.kt)"                  )  \
		PORT_DIPSETTING(    0x15, "Czech (Czech5.kt)"                    )  \
		PORT_DIPSETTING(    0x16, "Russia (Russia5.kt)"                  )  \
		PORT_DIPSETTING(    0x17, "Latvia (Latvia5.kt)"                  )  \
		PORT_DIPSETTING(    0x18, "Turkey-Q5 (TurkeyQ5.kt)"              )  \
		PORT_DIPSETTING(    0x19, "Greece (Greece5.kt)"                  )  \
		PORT_DIPSETTING(    0x1a, "Arabic (Arabic5.kt)"                  )  \
		PORT_DIPSETTING(    0x1b, "Lithuania (Lithuania5.kt)"            )  \
		PORT_DIPSETTING(    0x1c, "Belgium (Belgium5.kt)"                )  \
		/* 0x1d */                                                          \
		PORT_DIPSETTING(    0x1e, "Turkey-F5 (TurkeyF5.kt)"              )  \
		PORT_DIPSETTING(    0x1f, "Canada/French (Canada_Fr5_TBITS5.kt)" )  \
		PORT_BIT( 0xe0, 0x20, IPT_UNUSED )


INPUT_PORTS_START( basic )
	PORT_START("ROW0")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1")           PORT_CODE(KEYCODE_F1)         PORT_CHAR(UCHAR_MAMEKEY(F1))
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F2")           PORT_CODE(KEYCODE_F2)         PORT_CHAR(UCHAR_MAMEKEY(F2))
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3")           PORT_CODE(KEYCODE_F3)         PORT_CHAR(UCHAR_MAMEKEY(F3))
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4")           PORT_CODE(KEYCODE_F4)         PORT_CHAR(UCHAR_MAMEKEY(F4))
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F5")           PORT_CODE(KEYCODE_F5)         PORT_CHAR(UCHAR_MAMEKEY(F5))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F6")           PORT_CODE(KEYCODE_F6)         PORT_CHAR(UCHAR_MAMEKEY(F6))
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED   )

	PORT_START("ROW1")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F7")           PORT_CODE(KEYCODE_F7)         PORT_CHAR(UCHAR_MAMEKEY(F7))
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F8")           PORT_CODE(KEYCODE_F8)         PORT_CHAR(UCHAR_MAMEKEY(F8))
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F9")           PORT_CODE(KEYCODE_F9)         PORT_CHAR(UCHAR_MAMEKEY(F9))
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Alternate")    PORT_CODE(KEYCODE_LALT)
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Esc")          PORT_CODE(KEYCODE_ESC)        PORT_CHAR(UCHAR_MAMEKEY(ESC))
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_1)          PORT_CHAR('1') PORT_CHAR('!')
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_2)          PORT_CHAR('2') PORT_CHAR('@')

	PORT_START("ROW2")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_3)          PORT_CHAR('3') PORT_CHAR('#')
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_4)          PORT_CHAR('4') PORT_CHAR('$')
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_5)          PORT_CHAR('5') PORT_CHAR('%')
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_6)          PORT_CHAR('6') PORT_CHAR('^')
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_7)          PORT_CHAR('7') PORT_CHAR('&')
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_8)          PORT_CHAR('8') PORT_CHAR('*')
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_9)          PORT_CHAR('9') PORT_CHAR('(')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_0)          PORT_CHAR('0') PORT_CHAR(')')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_MINUS)      PORT_CHAR('-') PORT_CHAR('_')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Backspace")    PORT_CODE(KEYCODE_BACKSPACE)  PORT_CHAR(8)
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED   )

	PORT_START("ROW3")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Tab")          PORT_CODE(KEYCODE_TAB)        PORT_CHAR(9)
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_Q)          PORT_CHAR('q') PORT_CHAR('Q')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_W)          PORT_CHAR('w') PORT_CHAR('W')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_E)          PORT_CHAR('e') PORT_CHAR('E')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_R)          PORT_CHAR('r') PORT_CHAR('R')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_T)          PORT_CHAR('t') PORT_CHAR('T')
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_Y)          PORT_CHAR('y') PORT_CHAR('Y')
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_U)          PORT_CHAR('u') PORT_CHAR('U')
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_I)          PORT_CHAR('i') PORT_CHAR('I')
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_O)          PORT_CHAR('o') PORT_CHAR('O')
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_P)          PORT_CHAR('p') PORT_CHAR('P')

	PORT_START("ROW4")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Delete")       PORT_CODE(KEYCODE_DEL)        PORT_CHAR(UCHAR_MAMEKEY(DEL))
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL)   PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_A)          PORT_CHAR('a') PORT_CHAR('A')
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_S)          PORT_CHAR('s') PORT_CHAR('S')
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_D)          PORT_CHAR('d') PORT_CHAR('D')

	PORT_START("ROW5")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_F)          PORT_CHAR('f') PORT_CHAR('F')
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_G)          PORT_CHAR('g') PORT_CHAR('G')
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_H)          PORT_CHAR('h') PORT_CHAR('H')
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_J)          PORT_CHAR('j') PORT_CHAR('J')
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_K)          PORT_CHAR('k') PORT_CHAR('K')
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_L)          PORT_CHAR('l') PORT_CHAR('L')
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR('\'') PORT_CHAR('"')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Return")       PORT_CODE(KEYCODE_ENTER)      PORT_CHAR(13)
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED   )

	PORT_START("ROW6")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L Shift")      PORT_CODE(KEYCODE_LSHIFT)     PORT_CHAR(UCHAR_SHIFT_1)
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_Z)          PORT_CHAR('z') PORT_CHAR('Z')
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_X)          PORT_CHAR('x') PORT_CHAR('X')
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_C)          PORT_CHAR('c') PORT_CHAR('C')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_V)          PORT_CHAR('v') PORT_CHAR('V')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_B)          PORT_CHAR('b') PORT_CHAR('B')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_N)          PORT_CHAR('n') PORT_CHAR('N')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_M)          PORT_CHAR('m') PORT_CHAR('M')
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_COMMA)      PORT_CHAR(',') PORT_CHAR('<')
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_STOP)       PORT_CHAR('.') PORT_CHAR('>')
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_SLASH)      PORT_CHAR('/') PORT_CHAR('?')
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R Shift")      PORT_CODE(KEYCODE_RSHIFT)     PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED   )

	PORT_START("ROW7")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK)   PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Left Meta")    PORT_CODE(KEYCODE_LWIN)       PORT_CHAR(UCHAR_MAMEKEY(LWIN))
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Space")        PORT_CODE(KEYCODE_SPACE)      PORT_CHAR(' ')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Right Meta")   PORT_CODE(KEYCODE_RWIN)       PORT_CHAR(UCHAR_MAMEKEY(RWIN))
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED   )
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED   )
INPUT_PORTS_END


INPUT_PORTS_START( basic_gb )
	PORT_INCLUDE( basic )

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_2)          PORT_CHAR('2') PORT_CHAR('"')

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_3)          PORT_CHAR('3') PORT_CHAR(0x00a3U)
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR(0x00acU) PORT_CHAR(0x00a6)

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR('\'') PORT_CHAR('@')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('#') PORT_CHAR('~')

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('|')
INPUT_PORTS_END


INPUT_PORTS_START( basic_se )
	PORT_INCLUDE( basic )

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_2)          PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR('@')

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_3)          PORT_CHAR('3') PORT_CHAR('#') PORT_CHAR(0x00a3U)
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_4)          PORT_CHAR('4') PORT_CHAR(0x00a4U) PORT_CHAR('$')
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_6)          PORT_CHAR('6') PORT_CHAR('&')
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_7)          PORT_CHAR('7') PORT_CHAR('/') PORT_CHAR('{')
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_8)          PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR('[')
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_9)          PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(']')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_0)          PORT_CHAR('0') PORT_CHAR('=') PORT_CHAR('}')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_MINUS)      PORT_CHAR('+') PORT_CHAR('?') PORT_CHAR('\\')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR(0x00b4U) PORT_CHAR('`')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_TILDE)      PORT_CHAR(0x00a7U) PORT_CHAR(0x00bdU)

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR(0x00e5U) PORT_CHAR(0x00c5U)
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0x00a8U) PORT_CHAR('^') PORT_CHAR('~')

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_COLON)      PORT_CHAR(0x00f6U) PORT_CHAR(0x00d6U)
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR(0x00e4U) PORT_CHAR(0x00c4U)
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\'') PORT_CHAR('*') PORT_CHAR('`')

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_COMMA)      PORT_CHAR(',') PORT_CHAR(';')
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_STOP)       PORT_CHAR('.') PORT_CHAR(':')
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_SLASH)      PORT_CHAR('-') PORT_CHAR('_')

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('<') PORT_CHAR('>') PORT_CHAR('|')
INPUT_PORTS_END


INPUT_PORTS_START( basic_jp )
	PORT_INCLUDE( basic )

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_2)          PORT_CHAR('2') PORT_CHAR('"')

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_6)          PORT_CHAR('6') PORT_CHAR('&')
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_7)          PORT_CHAR('7') PORT_CHAR('\'')
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_8)          PORT_CHAR('8') PORT_CHAR('(')
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_9)          PORT_CHAR('9') PORT_CHAR(')')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_0)          PORT_CHAR('0')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_MINUS)      PORT_CHAR('-') PORT_CHAR('=')
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('^') PORT_CHAR('~')
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_TILDE)      PORT_CHAR(0x00a5U) PORT_CHAR('|')

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('@') PORT_CHAR('`')
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{')

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR('+')
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_QUOTE)      PORT_CHAR(':') PORT_CHAR('*')
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR(']') PORT_CHAR('}')

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD )                           PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('_')

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Kakutei")                                // 確定
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Henkan")                                 // 変換
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Nihongo On-Off") PORT_CODE(KEYCODE_MENU) // 日本語 On-Off
INPUT_PORTS_END


INPUT_PORTS_START( tenkey )
	PORT_MODIFY("ROW2")
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP /")         PORT_CODE(KEYCODE_SLASH_PAD)
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP *")         PORT_CODE(KEYCODE_ASTERISK)   PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))

	PORT_MODIFY("ROW3")
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP .")         PORT_CODE(KEYCODE_DEL_PAD)    PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 7")         PORT_CODE(KEYCODE_7_PAD)      PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 8")         PORT_CODE(KEYCODE_8_PAD)      PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 9")         PORT_CODE(KEYCODE_9_PAD)      PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP -")         PORT_CODE(KEYCODE_MINUS_PAD)  PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter")        PORT_CODE(KEYCODE_ENTER_PAD)
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 4")         PORT_CODE(KEYCODE_4_PAD)      PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 5")         PORT_CODE(KEYCODE_5_PAD)      PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 6")         PORT_CODE(KEYCODE_6_PAD)      PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 0")         PORT_CODE(KEYCODE_0_PAD)      PORT_CHAR(UCHAR_MAMEKEY(0_PAD))

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num Lock")     PORT_CODE(KEYCODE_NUMLOCK)    PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK))

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 1")         PORT_CODE(KEYCODE_1_PAD)      PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 2")         PORT_CODE(KEYCODE_2_PAD)      PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP 3")         PORT_CODE(KEYCODE_3_PAD)      PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP +")         PORT_CODE(KEYCODE_PLUS_PAD)   PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
INPUT_PORTS_END


INPUT_PORTS_START( l_group )
	PORT_MODIFY("ROW0")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L1")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L2")

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L3")
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L4")

	PORT_MODIFY("ROW3")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L5")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L6")

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L7")
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L8")

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L9")

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("L10")
INPUT_PORTS_END


INPUT_PORTS_START( r_group )
	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R1")           PORT_CODE(KEYCODE_PAUSE)
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R2")           PORT_CODE(KEYCODE_PRTSCR)     PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R3")           PORT_CODE(KEYCODE_SCRLOCK)    PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK))

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R4")           PORT_CODE(KEYCODE_NUMLOCK)    PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK))
	PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R5")           PORT_CODE(KEYCODE_SLASH_PAD)
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R6")           PORT_CODE(KEYCODE_ASTERISK)   PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R7")           PORT_CODE(KEYCODE_7_PAD)      PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R8")           PORT_CODE(KEYCODE_8_PAD)      PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R9")           PORT_CODE(KEYCODE_9_PAD)      PORT_CHAR(UCHAR_MAMEKEY(9_PAD))

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R10")          PORT_CODE(KEYCODE_4_PAD)      PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R11")          PORT_CODE(KEYCODE_5_PAD)      PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R12")          PORT_CODE(KEYCODE_6_PAD)      PORT_CHAR(UCHAR_MAMEKEY(6_PAD))

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R13")          PORT_CODE(KEYCODE_1_PAD)      PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R14")          PORT_CODE(KEYCODE_2_PAD)      PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R15")          PORT_CODE(KEYCODE_3_PAD)      PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
INPUT_PORTS_END


INPUT_PORTS_START( enhanced_function )
	PORT_MODIFY("ROW0")
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F10")          PORT_CODE(KEYCODE_F10)        PORT_CHAR(UCHAR_MAMEKEY(F10))
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F11")          PORT_CODE(KEYCODE_F11)        PORT_CHAR(UCHAR_MAMEKEY(F11))
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F12")          PORT_CODE(KEYCODE_F12)        PORT_CHAR(UCHAR_MAMEKEY(F12))
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Alt Graph")    PORT_CODE(KEYCODE_RALT)       PORT_CHAR(UCHAR_SHIFT_2)

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Alt")          PORT_CODE(KEYCODE_LALT)       PORT_CHAR(UCHAR_MAMEKEY(LALT))

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Compose")      PORT_CODE(KEYCODE_RCONTROL)   PORT_CHAR(UCHAR_MAMEKEY(RCONTROL))
INPUT_PORTS_END


INPUT_PORTS_START( cursor )
	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Up")           PORT_CODE(KEYCODE_UP)         PORT_CHAR(UCHAR_MAMEKEY(UP))
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Left")         PORT_CODE(KEYCODE_LEFT)       PORT_CHAR(UCHAR_MAMEKEY(LEFT))
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Down")         PORT_CODE(KEYCODE_DOWN)       PORT_CHAR(UCHAR_MAMEKEY(DOWN))
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Right")        PORT_CODE(KEYCODE_RIGHT)      PORT_CHAR(UCHAR_MAMEKEY(RIGHT))

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Insert")       PORT_CODE(KEYCODE_INSERT)     PORT_CHAR(UCHAR_MAMEKEY(INSERT))

	PORT_MODIFY("ROW3")
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Home")         PORT_CODE(KEYCODE_HOME)       PORT_CHAR(UCHAR_MAMEKEY(HOME))

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Del")          PORT_CODE(KEYCODE_DEL)        PORT_CHAR(UCHAR_MAMEKEY(DEL))
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("End")          PORT_CODE(KEYCODE_END)        PORT_CHAR(UCHAR_MAMEKEY(END))

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Page Up")      PORT_CODE(KEYCODE_PGUP)       PORT_CHAR(UCHAR_MAMEKEY(PGUP))

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Page Down")    PORT_CODE(KEYCODE_PGDN)       PORT_CHAR(UCHAR_MAMEKEY(PGDN))
INPUT_PORTS_END


INPUT_PORTS_START( solaris )
	PORT_MODIFY("ROW0")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Stop")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Again")

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Props")
	PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Undo")

	PORT_MODIFY("ROW3")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Front")
	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Copy")

	PORT_MODIFY("ROW4")
	PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Open")
	PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Paste")

	PORT_MODIFY("ROW5")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Find")

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Cut")

	PORT_MODIFY("ROW7")
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Help")
INPUT_PORTS_END


INPUT_PORTS_START( power )
	PORT_MODIFY("ROW0")
	PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Vol-")
	PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Vol+")

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Mute")

	PORT_MODIFY("ROW3")
	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Pwr")
INPUT_PORTS_END


INPUT_PORTS_START( type5_ext )
	PORT_INCLUDE( enhanced_function )
	PORT_INCLUDE( tenkey            )
	PORT_INCLUDE( cursor            )
	PORT_INCLUDE( solaris           )
	PORT_INCLUDE( power             )

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Pause")        PORT_CODE(KEYCODE_PAUSE)
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Print Screen") PORT_CODE(KEYCODE_PRTSCR)     PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Scroll Lock")  PORT_CODE(KEYCODE_SCRLOCK)    PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK))
INPUT_PORTS_END


INPUT_PORTS_START( hle_type3_device )
	PORT_INCLUDE( basic   )
	PORT_INCLUDE( l_group )
	PORT_INCLUDE( r_group )

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Line Feed")                                  PORT_CHAR(10)

	PORT_START("DIP")
	PORT_BIT( 0xff, 0x00, IPT_UNUSED )
INPUT_PORTS_END


INPUT_PORTS_START( hle_type4_device )
	PORT_INCLUDE( basic             )
	PORT_INCLUDE( enhanced_function )
	PORT_INCLUDE( tenkey            )
	PORT_INCLUDE( solaris           )

	PORT_MODIFY("ROW1")
	PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Pause")        PORT_CODE(KEYCODE_PAUSE)
	PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PrSc")         PORT_CODE(KEYCODE_PRTSCR)     PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Scroll Lock")  PORT_CODE(KEYCODE_SCRLOCK)    PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK))

	PORT_MODIFY("ROW2")
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("KP =")         PORT_CODE(KEYCODE_INSERT)     PORT_CHAR(UCHAR_MAMEKEY(EQUALS_PAD))

	PORT_MODIFY("ROW6")
	PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Line Feed")                                  PORT_CHAR(10)

	PORT_START("DIP")
	PORT_DIPNAME( 0x3f, 0x00, "Layout"                                 ) PORT_DIPLOCATION("DIP:8,7,6,5,4,3")
	PORT_DIPSETTING(    0x00, "U.S.A. (US4.kt)"                        )
	PORT_DIPSETTING(    0x01, "U.S.A. (US4.kt)"                        )
	PORT_DIPSETTING(    0x02, "Belgium (FranceBelg4.kt)"               )
	PORT_DIPSETTING(    0x03, "Canada (Canada4.kt)"                    )
	PORT_DIPSETTING(    0x04, "Denmark (Denmakr4.kt)"                  )
	PORT_DIPSETTING(    0x05, "Germany (Germany4.kt)"                  )
	PORT_DIPSETTING(    0x06, "Italy (Italy4.kt)"                      )
	PORT_DIPSETTING(    0x07, "The Netherlands (Netherland4.kt)"       )
	PORT_DIPSETTING(    0x08, "Norway (Norway4.kt)"                    )
	PORT_DIPSETTING(    0x09, "Portugal (Portugal4.kt)"                )
	PORT_DIPSETTING(    0x0a, "Latin America/Spanish (SpainLatAm4.kt)" )
	PORT_DIPSETTING(    0x0b, "Sweden (SwedenFin4.kt)"                 )
	PORT_DIPSETTING(    0x0c, "Switzerland/French (Switzer_Fr4.kt)"    )
	PORT_DIPSETTING(    0x0d, "Switzerland/German (Switzer_Ge4.kt)"    )
	PORT_DIPSETTING(    0x0e, "Great Britain (UK4.kt)"                 )
	// 0x0f
	PORT_DIPSETTING(    0x10, "Korea (Korea4.kt)"                      )
	PORT_DIPSETTING(    0x11, "Taiwan (Taiwan4.kt)"                    )
	// 0x12...0x20
	PORT_DIPSETTING(    0x21, "U.S.A. (US5.kt)"                        )
	PORT_DIPSETTING(    0x22, "U.S.A./UNIX (US_UNIX5.kt)"              )
	PORT_DIPSETTING(    0x23, "France (France5.kt)"                    )
	PORT_DIPSETTING(    0x24, "Denmark (Denmark5.kt)"                  )
	PORT_DIPSETTING(    0x25, "Germany (Germany5.kt)"                  )
	PORT_DIPSETTING(    0x26, "Italy (Italy5.kt)"                      )
	PORT_DIPSETTING(    0x27, "The Netherlands (Netherland5.kt)"       )
	PORT_DIPSETTING(    0x28, "Norway (Norway5.kt)"                    )
	PORT_DIPSETTING(    0x29, "Portugal (Portugal5.kt)"                )
	PORT_DIPSETTING(    0x2a, "Spain (Spain5.kt)"                      )
	PORT_DIPSETTING(    0x2b, "Sweden (Sweden5.kt)"                    )
	PORT_DIPSETTING(    0x2c, "Switzerland/French (Switzer_Fr5.kt)"    )
	PORT_DIPSETTING(    0x2d, "Switzerland/German (Switzer_Ge5.kt)"    )
	PORT_DIPSETTING(    0x2e, "Great Britain (UK5.kt)"                 )
	PORT_DIPSETTING(    0x2f, "Korea (Korea5.kt)"                      )
	PORT_DIPSETTING(    0x30, "Taiwan (Taiwan5.kt)"                    )
	PORT_DIPSETTING(    0x31, "Japan (Japan5.kt)"                      )
	PORT_DIPSETTING(    0x32, "Canada/French (Canada_Fr5.kt)"          )
	PORT_DIPSETTING(    0x33, "Hungary (Hungary5.kt)"                  )
	PORT_DIPSETTING(    0x34, "Poland (Poland5.kt)"                    )
	PORT_DIPSETTING(    0x35, "Czech (Czech5.kt)"                      )
	PORT_DIPSETTING(    0x36, "Russia (Russia5.kt)"                    )
	PORT_DIPSETTING(    0x37, "Latvia (Latvia5.kt)"                    )
	PORT_DIPSETTING(    0x38, "Turkey-Q5 (TurkeyQ5.kt)"                )
	PORT_DIPSETTING(    0x39, "Greece (Greece5.kt)"                    )
	PORT_DIPSETTING(    0x3a, "Arabic (Arabic5.kt)"                    )
	PORT_DIPSETTING(    0x3b, "Lithuania (Lithuania5.kt)"              )
	PORT_DIPSETTING(    0x3c, "Belgium (Belgium5.kt)"                  )
	// 0x3d
	PORT_DIPSETTING(    0x3e, "Turkey-F5 (TurkeyF5.kt)"                )
	PORT_DIPSETTING(    0x3f, "Canada/French (Canada_Fr5_TBITS5.kt)"   )
	PORT_DIPUNUSED_DIPLOC( 0x40, 0x00, "DIP:2" )
	PORT_DIPNAME( 0x80, 0x00, "Identify as"                            ) PORT_DIPLOCATION("DIP:1")
	PORT_DIPSETTING(    0x00, "Type 4"                                 )
	PORT_DIPSETTING(    0x80, "Type 3"                                 )
INPUT_PORTS_END


INPUT_PORTS_START( hle_type5_device )
	PORT_INCLUDE(basic)
	PORT_INCLUDE(type5_ext)
	TYPE5_DIPS(0x01)
INPUT_PORTS_END


INPUT_PORTS_START( hle_type5_gb_device )
	PORT_INCLUDE(basic_gb)
	PORT_INCLUDE(type5_ext)
	TYPE5_DIPS(0x0e)
INPUT_PORTS_END


INPUT_PORTS_START( hle_type5_se_device )
	PORT_INCLUDE(basic_se)
	PORT_INCLUDE(type5_ext)
	TYPE5_DIPS(0x0b)
INPUT_PORTS_END


INPUT_PORTS_START( hle_type5_jp_device )
	PORT_INCLUDE(basic_jp)
	PORT_INCLUDE(type5_ext)
	TYPE5_DIPS(0x11)

	PORT_MODIFY("ROW0")
	PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Kana")         PORT_CODE(KEYCODE_RALT) // かな
INPUT_PORTS_END

} // anonymous namespace



/***************************************************************************
    BASE HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_device_base::hle_device_base
    designated device constructor
--------------------------------------------------*/

hle_device_base::hle_device_base(
		machine_config const &mconfig,
		device_type type,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: device_t(mconfig, type, tag, owner, clock)
	, device_buffered_serial_interface(mconfig, *this)
	, device_sun_keyboard_port_interface(mconfig, *this)
	, device_matrix_keyboard_interface(mconfig, *this, "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7")
	, m_dips(*this, "DIP")
	, m_click_timer(nullptr)
	, m_beeper(*this, "beeper")
	, m_leds(*this, "led%u", 0U)
	, m_make_count(0U)
	, m_rx_state(RX_IDLE)
	, m_keyclick(0U)
	, m_beeper_state(0U)
{
}


/*--------------------------------------------------
    hle_device_base::~hle_device_base
    destructor
--------------------------------------------------*/

hle_device_base::~hle_device_base()
{
}


/*--------------------------------------------------
    hle_device_base::input_txd
    handle serial input line changes
--------------------------------------------------*/

WRITE_LINE_MEMBER( hle_device_base::input_txd )
{
	device_buffered_serial_interface::rx_w(state);
}


/*--------------------------------------------------
    hle_device_base::device_add_mconfig
    add machine configuration
--------------------------------------------------*/

MACHINE_CONFIG_START(hle_device_base::device_add_mconfig)
	SPEAKER(config, "bell").front_center();
	MCFG_DEVICE_ADD("beeper", BEEP, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND))
	MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 1.0)
MACHINE_CONFIG_END


/*--------------------------------------------------
    hle_device_base::device_start
    perform expensive initialisations, allocate
    resources, register for save state
--------------------------------------------------*/

void hle_device_base::device_start()
{
	m_leds.resolve();
	m_click_timer = timer_alloc(CLICK_TIMER_ID);

	save_item(NAME(m_make_count));
	save_item(NAME(m_rx_state));
	save_item(NAME(m_keyclick));
	save_item(NAME(m_beeper_state));
}


/*--------------------------------------------------
    hle_device_base::device_reset
    perform startup tasks, also used for host
    requested reset
--------------------------------------------------*/

void hle_device_base::device_reset()
{
	// initialise state
	clear_fifo();
	m_make_count = 0U;
	m_rx_state = RX_IDLE;
	m_keyclick = 0U;
	m_beeper_state = 0x00U;

	// configure device_buffered_serial_interface
	set_data_frame(START_BIT_COUNT, DATA_BIT_COUNT, PARITY, STOP_BITS);
	set_rate(BAUD);
	receive_register_reset();
	transmit_register_reset();

	// set device_sun_keyboard_port_interface lines
	output_rxd(1);

	// start with keyboard LEDs off
	m_leds[LED_NUM] = 0;
	m_leds[LED_COMPOSE] = 0;
	m_leds[LED_SCROLL] = 0;
	m_leds[LED_CAPS] = 0;
	m_leds[LED_KANA] = 0;

	// no beep
	m_click_timer->reset();

	// kick the base
	reset_key_state();
	start_processing(attotime::from_hz(1'200));

	// send reset response
	transmit_byte(0xffU);
	transmit_byte(ident_byte());
	if (are_all_keys_up())
		transmit_byte(0x7fU);
}


/*--------------------------------------------------
    hle_device_base::device_timer
    handle timed events
--------------------------------------------------*/

void hle_device_base::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
	switch (id)
	{
	case CLICK_TIMER_ID:
		m_beeper_state &= ~uint8_t(BEEPER_CLICK);
		m_beeper->set_state(m_beeper_state ? 1 : 0);
		break;

	default:
		break;
	}
}


/*--------------------------------------------------
    hle_device_base::tra_callback
    send output of serial transmit shift register
    to host
--------------------------------------------------*/

void hle_device_base::tra_callback()
{
	output_rxd(transmit_register_get_data_bit());
}


/*--------------------------------------------------
    hle_device_base::tra_complete
    handle end of transmitted byte frame
--------------------------------------------------*/

void hle_device_base::tra_complete()
{
	if (fifo_full())
		start_processing(attotime::from_hz(1'200));

	device_buffered_serial_interface::tra_complete();
}


/*--------------------------------------------------
    hle_device_base::key_make
    handle a key being pressed
--------------------------------------------------*/

void hle_device_base::key_make(uint8_t row, uint8_t column)
{
	// we should have stopped processing if we filled the FIFO
	assert(!fifo_full());

	// send the make code, click if desired
	transmit_byte((row << 4) | column);
	if (m_keyclick)
	{
		m_beeper_state |= uint8_t(BEEPER_CLICK);
		m_beeper->set_state(m_beeper_state ? 1 : 0);
		m_click_timer->reset(attotime::from_msec(5));
	}

	// count keys
	++m_make_count;
	assert(m_make_count);
}


/*--------------------------------------------------
    hle_device_base::key_break
    handle a key being released
--------------------------------------------------*/

void hle_device_base::key_break(uint8_t row, uint8_t column)
{
	// we should have stopped processing if we filled the FIFO
	assert(!fifo_full());
	assert(m_make_count);

	// send the break code, and the idle code if no other keysa are down
	transmit_byte(0x80U | (row << 4) | column);
	if (!--m_make_count)
		transmit_byte(0x7fU);

	// check our counting
	assert(are_all_keys_up() == !bool(m_make_count));
}


/*--------------------------------------------------
    hle_device_base::transmit_byte
    send a byte or queue it to send later
--------------------------------------------------*/

void hle_device_base::transmit_byte(uint8_t byte)
{
	device_buffered_serial_interface::transmit_byte(byte);
	if (fifo_full())
		stop_processing();
}


/*--------------------------------------------------
    hle_device_base::received_byte
    handle received byte frame
--------------------------------------------------*/

void hle_device_base::received_byte(uint8_t byte)
{
	switch (m_rx_state)
	{
	case RX_LED:
		m_leds[LED_NUM] = BIT(byte, 0);
		m_leds[LED_COMPOSE] = BIT(byte, 1);
		m_leds[LED_SCROLL] = BIT(byte, 2);
		m_leds[LED_CAPS] = BIT(byte, 3);
		m_leds[LED_KANA] = BIT(byte, 4);
		m_rx_state = RX_IDLE;
		break;

	default:
		assert(m_rx_state == RX_IDLE);
	case RX_IDLE:
		switch (byte)
		{
		case COMMAND_RESET:
			device_reset();
			break;

		case COMMAND_BELL_ON:
			m_beeper_state |= uint8_t(BEEPER_BELL);
			m_beeper->set_state(m_beeper_state ? 1 : 0);
			m_rx_state = RX_IDLE;
			break;

		case COMMAND_BELL_OFF:
			m_beeper_state &= ~uint8_t(BEEPER_BELL);
			m_beeper->set_state(m_beeper_state ? 1 : 0);
			m_rx_state = RX_IDLE;
			break;

		case COMMAND_CLICK_ON:
			m_keyclick = 1U;
			m_rx_state = RX_IDLE;
			break;

		case COMMAND_CLICK_OFF:
			m_keyclick = 0U;
			m_click_timer->reset();
			m_beeper_state &= ~uint8_t(BEEPER_CLICK);
			m_beeper->set_state(m_beeper_state ? 1 : 0);
			m_rx_state = RX_IDLE;
			break;

		case COMMAND_LED:
			m_rx_state = RX_LED;
			break;

		case COMMAND_LAYOUT:
			transmit_byte(0xfeU);
			transmit_byte(uint8_t(m_dips->read() & 0x3fU));
			m_rx_state = RX_IDLE;
			break;

		default:
			logerror("Unknown command: 0x%02x", byte);
			m_rx_state = RX_IDLE;
		}
	}
}



/***************************************************************************
    BASE TYPE 4/5/6 HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type4_device_base::ident_byte
    return identification byte for self test pass
    response
--------------------------------------------------*/

uint8_t hle_type4_device_base::ident_byte()
{
	return (m_dips->read() & 0x80U) ? 0x03U : 0x04U;
}



/***************************************************************************
    TYPE 3 HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type3_device::hle_type3_device
    abbreviated constructor
--------------------------------------------------*/

hle_type3_device::hle_type3_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_device_base(
			mconfig,
			SUN_TYPE3_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type3_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type3_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type3_device);
}


/*--------------------------------------------------
    hle_type3_device::ident_byte
    return identification byte for self test pass
    response
--------------------------------------------------*/

uint8_t hle_type3_device::ident_byte()
{
	return 0x03U;
}



/***************************************************************************
    TYPE 4 HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type4_device::hle_type4_device
    abbreviated constructor
--------------------------------------------------*/

hle_type4_device::hle_type4_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_type4_device_base(
			mconfig,
			SUN_TYPE4_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type4_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type4_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type4_device);
}



/***************************************************************************
    TYPE 5 HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type5_device::hle_type5_device
    abbreviated constructor
--------------------------------------------------*/

hle_type5_device::hle_type5_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_type4_device_base(
			mconfig,
			SUN_TYPE5_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type5_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type5_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type5_device);
}



/***************************************************************************
    TYPE 5 UK HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type5_gb_device::hle_type5_gb_device
    abbreviated constructor
--------------------------------------------------*/

hle_type5_gb_device::hle_type5_gb_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_type4_device_base(
			mconfig,
			SUN_TYPE5_GB_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type5_gb_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type5_gb_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type5_gb_device);
}



/***************************************************************************
    TYPE 5 SWEDISH HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type5_se_device::hle_type5_se_device
    abbreviated constructor
--------------------------------------------------*/

hle_type5_se_device::hle_type5_se_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_type4_device_base(
			mconfig,
			SUN_TYPE5_SE_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type5_se_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type5_se_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type5_se_device);
}



/***************************************************************************
    TYPE 5 JAPANESE HLE KEYBOARD DEVICE
***************************************************************************/

/*--------------------------------------------------
    hle_type5_jp_device::hle_type5_jp_device
    abbreviated constructor
--------------------------------------------------*/

hle_type5_jp_device::hle_type5_jp_device(
		machine_config const &mconfig,
		char const *tag,
		device_t *owner,
		uint32_t clock)
	: hle_type4_device_base(
			mconfig,
			SUN_TYPE5_JP_HLE_KEYBOARD,
			tag,
			owner,
			clock)
{
}


/*--------------------------------------------------
    hle_type5_jp_device::device_input_ports
    get input ports for this device
--------------------------------------------------*/

ioport_constructor hle_type5_jp_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(hle_type5_jp_device);
}

} } // namespace bus::sunkbd