HBI-J1

HBI-J1

HBI-J1はSONYのMSX2+相当の日本語機能をMSX2に提供するカートリッジです。

汎用ロジックの組み合わせによりスロット拡張されています。 このため拡張スロットではおそらく正常に動作しません。

拡張スロット0はHALNOTE互換マッパーのT5277に接続され、 EGBRIGE系MSX-JE準拠連文節一括変換機能SONY JFEP2の1MB ROM(プログラム64KB+辞書512KB)と学習用16KB SRAMがマップされます。

SRAMはボタン電池CR2032でバックアップされます。

拡張スロット1は漢字ドライバーの32KB ROMがマップされます。

T5277のリンク先にあるように漢字ROMのI/O機能もIORQ_nが接続されたT5277に含まれると思われます。

カートリッジの内容を下記のプログラムでダンプしたところ、 漢字ドライバー・漢字フォント・SONY JFEP2の各sha1ハッシュ値が、 openMSXのXMLに記載されたHB-F1XDJの値と全て一致しました。 別バージョンが存在する可能性も0ではありませんが、 HBI-J1の機能はスロット配置を除いてHB-F1XDJと完全に同一と考えてよさそうです。

DOS2用HBIJ1S.COMソース(sjasm)

;HBI-J1 dumper for DOS2
;build
; sjasm hbij1s.asm hbij1s.com
;usage
; hbij1s [options]
;option
; H show help
; F save font HBIJ1KFN.ROM;256KB
; D save driver HBIJ1KDR.ROM:32KB
; J save JE HBIJ1SJE.ROM:1MB
; S save sram HBIJ1SRM.BIN:16KB
; K disable internal font (I/O port 0F5h)
; 1 primary slot 1 for D&J&S(default)
; 2 primary slot 2 for D&J&S
; 3 primary slot 3 for D&J&S
 
;CP/M
_BDOS           equ             05h
_TERM0          equ             00h
_STROUT         equ             09h
_CPMVER         equ             0ch
 
;DOS1
_DOSCPMVER      equ             22h
;_RDSLT         equ             0ch
_ENASLT         equ             24h
 
_RAMAD0         equ             0f341h
_RAMAD1         equ             0f342h
_RAMAD2         equ             0f343h
_RAMAD3         equ             0f344h
 
;DOS2
_CREATE         equ             44h
_CLOSE          equ             45h
_WRITE          equ             49h
_ERROR          equ             65h
_EXPLAIN        equ             66h
_DOSVER         equ             6fh
 
;_SLTTBL        equ             0fcc5h
;_P0_CALL       equ             0f1d9h
 
;BIOSWORK
;HOKVLD         equ             0FB20h
;EXTBIO         equ             0FFCAh
 
                org             100h
 
                call            CHKDOS2
 
                call            CHKOPT
 
                bit             7,d
                call            nz,PRINTHELP
 
                bit             4,d
                call            nz,KILLFONT
 
                bit             0,d
                call            nz,SAVEFONT
 
                bit             1,d
                call            nz,SAVEDRV
 
                bit             2,d
                call            nz,SAVEJE
 
                bit             3,d
                call            nz,SAVESRAM
 
                ;jr             EXIT
 
EXIT:
                ld              c,_TERM0
                jp              _BDOS
 
CHKDOS2:
                call            CHKDOS2_1
 
                ld              de,CHKDOS2_E1_MSG
                ;jr             ABORT
 
ABORT:
                ld              c,_STROUT
                call            _BDOS
                jr              EXIT
 
BDOS_E:
                call            _BDOS
                or              a
                ret             z
 
                ld              c,_ERROR
                call            _BDOS
 
                ld              de,BUF
                push            de
                ld              c,_EXPLAIN
                call            _BDOS
                pop             hl
                push            hl
 
                xor             a
BDOS_E_LP:
                cp              (hl)
                inc             hl
                jr              nz,BDOS_E_LP
 
                dec             hl
                ld              (hl),0dh
                inc             hl
                ld              (hl),0ah
                inc             hl
                ld              (hl),'$'
 
                pop             de
                jr              ABORT
 
CHKDOS2_1:
                ld              c,_CPMVER
                call            _BDOS
 
                cp              _DOSCPMVER
                ret             nz
                sub             l
                ret             nz
                or              b
                or              h
                ret             nz
 
                ld              c,_DOSVER
                call            _BDOS
                or              a
                ret             nz
                ld              a,b
                cp              2
                ret             c
 
                pop             hl
                ret
 
SAVEFONT:
                push            de
 
                ld              de,HBIJ1KFN_N
                xor             a
                ld              b,80h
                ld              c,_CREATE
                call            BDOS_E
                ld              a,b
                ld              (HANDLE),a
 
                xor             a
                ld              h,a
                ld              l,a
 
                ld              c,0d9h
 
SAVEFONT_LP1:
                ld              de,BUF
 
SAVEFONT_LP2:
                dec             c
                out             (c),l
                inc             c
 
                out             (c),h
 
                ld              b,32
 
SAVEFONT_LP3:
                in              a,(c)
                ld              (de),a
                inc             de
                djnz            SAVEFONT_LP3
 
                inc             l
                ld              a,l
                and             63
                jr              nz,SAVEFONT_LP2
 
                push            bc
                push            hl
 
                call            GETHANDLE
                ld              de,BUF
                ld              hl,32*64
                ld              c,_WRITE
                call            BDOS_E
 
                pop             hl
                pop             bc
 
                inc             h
                ld              a,h
                and             63
                jr              nz,SAVEFONT_LP1
 
                ld              a,c
                cp              0dbh
                jr              z,SAVEFONT_END
                inc             c
                inc             c
                jr              SAVEFONT_LP1
 
SAVEFONT_END:
                call            GETHANDLE
                ld              c,_CLOSE
                call            BDOS_E
 
                pop             de
 
                ret
 
GETHANDLE:
                push            af
                ld              a,(HANDLE)
                ld              b,a
                pop             af
                ret
 
CHKOPT:
                ld              de,8001h
                ld              hl,0080h
                ld              a,(hl)
                or              a
                ret             z
 
                ld              d,h
                ld              b,a
                inc             hl
 
CHKOPT_LP:
                inc             hl
                ld              a,(hl)
                cp              '1'
                jr              nz,CHKOPT_S1
                ld              e,01h
CHKOPT_S1:
                cp              '2'
                jr              nz,CHKOPT_S2
                ld              e,02h
CHKOPT_S2:
                cp              '3'
                jr              nz,CHKOPT_S3
                ld              e,03h
CHKOPT_S3:
                or              20h
                cp              'f'
                jr              nz,CHKOPT_SF
                set             0,d
CHKOPT_SF:
                cp              'd'
                jr              nz,CHKOPT_SD
                set             1,d
CHKOPT_SD:
                cp              'j'
                jr              nz,CHKOPT_SJ
                set             2,d
CHKOPT_SJ:
                cp              's'
                jr              nz,CHKOPT_SS
                set             3,d
CHKOPT_SS:
                cp              'k'
                jr              nz,CHKOPT_SK
                set             4,d
CHKOPT_SK:
                cp              'h'
                jr              nz,CHKOPT_SH
                set             7,d
CHKOPT_SH:
                djnz            CHKOPT_LP
                ld              a,d
                or              a
                ret             nz
                set             7,d
                ret
 
PRINTHELP:
                push            de
                ld              de,PRINTHELP_MSG
                ld              c,_STROUT
                call            _BDOS
                pop             de
                ret
 
KILLFONT:
                ld              a,0fch
                out             (0f5h),a
                ret
 
;DI_INT:
;               push            de
;               ld              a,(HOKVLD)
;               rrca
;               jr              nc,DI_INT_S
;               ld              de,2
;               call            EXTBIO
;DI_INT_S:
;               di
;               pop             de
;               ret
 
;EN_INT:
;               push            de
;               ld              a,(HOKVLD)
;               rrca
;               jr              nc,EN_INT_S
;               ld              de,3
;               call            EXTBIO
;EN_INT_S:
;               ei
;               pop             de
;               ret
 
SAVEDRV:
                push            de
 
                ld              de,HBIJ1KDR_N
                xor             a
                ld              b,80h
                ld              c,_CREATE
                call            BDOS_E
                ld              a,b
                ld              (HANDLE),a
 
                pop             de
 
                push            de
                ld              a,084h
                or              e
                ld              h,040h
                call            _ENASLT
 
                ld              bc,04000h
                ld              hl,04000h
                ld              de,08000h
                ldir
 
                ld              a,(_RAMAD1)
                ld              h,040h
                call            _ENASLT
 
                pop             de
 
                push            de
                ld              a,084h
                or              e
                ld              h,080h
                call            _ENASLT
 
                ld              bc,04000h
                ld              hl,08000h
                ld              de,04000h
                ldir
 
                ld              a,(_RAMAD2)
                ld              h,080h
                call            _ENASLT
 
                call            GETHANDLE
                ld              de,08000h
                ld              hl,04000h
                ld              c,_WRITE
                call            BDOS_E
 
                call            GETHANDLE
                ld              de,04000h
                ld              hl,04000h
                ld              c,_WRITE
                call            BDOS_E
 
                call            GETHANDLE
                ld              c,_CLOSE
                call            BDOS_E
 
                pop             de
                ret
 
SAVEJE:
                push            de
 
                ld              de,HBIJ1SJE_N
                xor             a
                ld              b,80h
                ld              c,_CREATE
                call            BDOS_E
                ld              a,b
                ld              (HANDLE),a
 
                pop             de
 
                ld              b,0
 
SAVEJE_LP:
 
                push            de
                push            bc
 
                ld              a,080h
                or              e
                ld              h,040h
                call            _ENASLT
 
                pop             bc
 
                push            bc
                ld              a,b
                add             a
 
                ld              (04fffh),a
                inc             a
                ld              (06fffh),a
 
                ld              bc,04000h
                ld              hl,04000h
                ld              de,08000h
                ldir
 
                xor             a
                ld              (04fffh),a
                inc             a
                ld              (06fffh),a
 
                ld              a,(_RAMAD1)
                ld              h,040h
                call            _ENASLT
 
 
                call            GETHANDLE
                ld              de,08000h
                ld              hl,04000h
                ld              c,_WRITE
                call            BDOS_E
 
                pop             bc
                pop             de
 
                inc             b
                ld              a,b
                and             03fh
 
                jr              nz,SAVEJE_LP
 
                push            de
 
                call            GETHANDLE
                ld              c,_CLOSE
                call            BDOS_E
 
                pop             de
                ret
 
SAVESRAM:
                push            de
 
                ld              de,HBIJ1SRM_N
                xor             a
                ld              b,80h
                ld              c,_CREATE
                call            BDOS_E
                ld              a,b
                ld              (HANDLE),a
 
                ld              bc,PAGE2CODE_LEN
                ld              hl,PAGE2CODE
                ld              de,START_P2
                ldir
 
                pop             de
 
                call            SELECT_SRAM
                call            START_P2
                call            SELECT_BANK0
 
                push            de
 
                call            GETHANDLE
                ld              de,04000h
                ld              hl,04000h
                ld              c,_WRITE
                call            BDOS_E
 
                call            GETHANDLE
                ld              c,_CLOSE
                call            BDOS_E
 
                pop             de
                ret
 
 
SELECT_BANK0:
                push            de
 
                ld              a,080h
                or              e
                ld              h,040h
                call            _ENASLT
 
                xor             a
                ld              (04fffh),a
                inc             a
                ld              (06fffh),a
 
                jr              SELECT_EXIT
 
SELECT_SRAM:
                push            de
 
                ld              a,080h
                or              e
                ld              h,040h
                call            _ENASLT
 
                ld              a,080h
                ld              (04fffh),a
 
SELECT_EXIT:
                ld              a,(_RAMAD1)
                ld              h,040h
                call            _ENASLT
 
                pop             de
                ret
 
 
RAMAD0_P2       equ             08000h
RAMAD3_P2       equ             08001h
SAVEPS_P2       equ             08002h
SAVESS_P2       equ             08003h
START_P2        equ             08004h
 
PAGE2CODE:
 
                push            de
 
                ld              a,(_RAMAD0)
                ld              (RAMAD0_P2),a
                ld              a,(_RAMAD3)
                ld              (RAMAD3_P2),a
 
                in              a,(0a8h)
                ld              (SAVEPS_P2),a
                and             03ch
                rlca
                rlca
                or              e
                rrca
                rrca
                or              e
 
                di
                out             (0a8h),a
 
                ld              a,(0ffffh)
                cpl
                ld              (SAVESS_P2),a
                and             03ch
                ld              (0ffffh),a
 
                ld              bc,04000h
                ld              hl,00000h
                ld              de,04000h
                ldir
 
                ld              a,(SAVESS_P2)
                ld              (0ffffh),a
 
                ld              a,(RAMAD0_P2)
                and             3
                ld              e,a
 
                in              a,(0a8h)
                and             03ch
                rlca
                rlca
                or              e
                rrca
                rrca
                or              e
                out             (0a8h),a
 
                ld              a,(RAMAD0_P2)
                rlca
                jr              nc,SKIP1_P2
                rrca
                rrca
                rrca
                and             3
                ld              e,a
 
                ld              a,(0ffffh)
                cpl
                and             0fch
                or              e
                ld              (0ffffh),a
 
SKIP1_P2:
 
                ld              a,(RAMAD3_P2)
                and             3
                ld              e,a
 
                in              a,(0a8h)
                and             03fh
                rlca
                rlca
                or              e
                rrca
                rrca
                out             (0a8h),a
 
                ld              a,(RAMAD3_P2)
                rlca
                jr              nc,SKIP2_P2
                rlca
                rlca
                rlca
                and             0c0h
                ld              e,a
 
                ld              a,(0ffffh)
                cpl
                and             03fh
                or              e
                ld              (0ffffh),a
 
SKIP2_P2:
                ei
 
                pop             de
 
                ret
 
PAGE2CODE_LEN   equ             $-PAGE2CODE
 
CHKDOS2_E1_MSG:
                db              "Invalid OS version$"
 
PRINTHELP_MSG:
                db              "HBIJ1S.COM v1.0",0dh,0ah
                db              "usage: HBIJ1S.COM [options]",0dh,0ah
                db              "options:",0dh,0ah
                db              " h show this help.",0dh,0ah
                db              " f save font image.",0dh,0ah
                db              " d save driver image.",0dh,0ah
                db              " j save je image.",0dh,0ah
                db              " s save jesram image.",0dh,0ah
                db              " k disable internal font.",0dh,0ah
                db              " 1 slot 1(default).",0dh,0ah
                db              " 2 slot 2.",0dh,0ah
                db              " 3 slot 3.",0dh,0ah
                db              "$"
 
HBIJ1KFN_N:
                db              "HBIJ1KFN.ROM",0
HBIJ1KDR_N:
                db              "HBIJ1KDR.ROM",0
HBIJ1SJE_N:
                db              "HBIJ1SJE.ROM",0
HBIJ1SRM_N:
                db              "HBIJ1SRM.BIN",0
 
HANDLE:
BUF             equ             HANDLE + 1

openMSX用 share\extensions\Sony_HBI-J1.xml

<?xml version="1.0" ?>
<!DOCTYPE msxconfig SYSTEM 'msxconfig2.dtd'>
<msxconfig>
  <info>
    <name>MSX Standard Japanese Cartridge</name>
    <manufacturer>Sony</manufacturer>
    <code>HBI-J1</code>
    <release_year>1988</release_year>
    <description>Sony JFEP2 and kanji BASIC and kanji rom JIS level 1 and 2.</description>
    <type>Japanese expansion</type>
  </info>
  <devices>


    <Kanji id="Kanji ROM">
      <rom>
        <filename>hbi-j1_kanjifont.rom</filename>
        <sha1>218d91eb6df2823c924d3774a9f455492a10aecb</sha1>
      </rom>
      <io base="0xD8" num="2" type="O"/>
      <io base="0xD9" num="1" type="I"/>
      <io base="0xDA" num="2" type="O"/>
      <io base="0xDB" num="1" type="I"/>
    </Kanji>


    <primary slot="any">


      <secondary slot="0">
        <ROM id="HBI-J1 MSX-JE">
          <rom>
            <filename>hbi-j1_jfep2.rom</filename>
            <sha1>ade0c5ba5574f8114d7079050317099b4519e88f</sha1>
          </rom>
          <mem base="0x0000" size="0x10000"/>
          <sramname>hbi-j1_jfep2.sram</sramname>
          <mappertype>Halnote</mappertype>
        </ROM>
      </secondary>


      <secondary slot="1">
        <ROM id="MSX Kanji Driver with BASIC">
          <rom>
            <filename>hbi-j1_kanjibasic.rom</filename>
            <sha1>1ef3956f7f918873fb9b031339bba45d1e5e5878</sha1>
          </rom>
          <mem base="0x4000" size="0x8000"/>
        </ROM>
     </secondary>


    </primary>
  </devices>
</msxconfig>