2011年8月1日月曜日

BHT-300シリーズで4倍角数字を表示しよう


倉庫業務から、読み取り件数文字が見づらいとの打ち上げがあり、いろいろ検討した結果、自分でユーザフォントを作成して4倍角数字を実現することにしました。
写真の通り、上段が今回作成した4倍角数字で、下段はBHT-300の(半角文字で)標準で出せる最大の大きさです。


事前条件

  • カーソル位置など全てBHT-300シリーズで使うことが事前条件になっています。手持ちのBHT-800シリーズで確認しましたが表示が乱れてしまいました。また、フォントとしてもBHT-800では標準で表示できる最大とさほど変わらなかったです
  • 数字のみ対応 (プラス、マイナス、小数点には未対応)

とりあえず、メモ程度にアップしておきます。

ソースリスト


まずは、外部関数定義ファイル bigNUMfonts.def

'
    Declare Function SetBigNumFonts%(byval paramADR&)
    Declare Sub SetScreen(byval paramMode%)
    Declare Sub PrintBigNum(byval num%)


そして、4倍角文字表示関数ファイル bigNUMfonts.src

'
    private bigNumbaseADR&
    private xPosOffset%
    private yPosOffset%
    private xPosMax%
    private yPosMax%

    Sub bn.setFonts
        private kp%(15)
        
        '0
        kp%(0) = &HFFC0
        kp%(1) = &HFFF8
        kp%(2) = &HFFFC
        kp%(3) = &HFFFE
        kp%(4) = &HFFFF
        kp%(5) = &H01FF
        kp%(6) = &H003F
        kp%(7) = &H003F
        kp%(8) = &H003F
        kp%(9) = &H01FF
        kp%(10) = &HFFFF
        kp%(11) = &HFFFE
        kp%(12) = &HFFFC
        kp%(13) = &HFFF8
        kp%(14) = &HFFC0
        kp%(15) = &H0000
        kpload bigNumbaseADR&+0, kp%

        kp%(0) = &H00FF
        kp%(1) = &H07FF
        kp%(2) = &H1FFF
        kp%(3) = &H3FFF
        kp%(4) = &H7FFF
        kp%(5) = &H7FE0
        kp%(6) = &H7F00
        kp%(7) = &H7F00
        kp%(8) = &H7F00
        kp%(9) = &H7FE0
        kp%(10) = &H7FFF
        kp%(11) = &H3FFF
        kp%(12) = &H1FFF
        kp%(13) = &H07FF
        kp%(14) = &H00FF
        kp%(15) = &H0000
        KPLOAD bigNumbaseADR&+1, kp%

        '1
        kp%(0) = &H0000
        kp%(1) = &H0000
        kp%(2) = &HFF00
        kp%(3) = &H7F80
        kp%(4) = &H3FC0
        kp%(5) = &H1FE0
        kp%(6) = &H0FF8
        kp%(7) = &HFFFF
        kp%(8) = &HFFFF
        kp%(9) = &HFFFF
        kp%(10) = &HFFFF
        kp%(11) = &H0000
        kp%(12) = &H0000
        kp%(13) = &H0000
        kp%(14) = &H0000
        kp%(15) = &H0000
        KPLOAD bigNumbaseADR&+2, kp%

        kp%(0) = &H0000
        kp%(1) = &H0000
        kp%(2) = &H0000
        kp%(3) = &H0000
        kp%(4) = &H0000
        kp%(5) = &H0000
        kp%(6) = &H0000
        kp%(7) = &H7FFF
        kp%(8) = &H7FFF
        kp%(9) = &H7FFF
        kp%(10) = &H7FFF
        kp%(11) = &H0000
        kp%(12) = &H0000
        kp%(13) = &H0000
        kp%(14) = &H0000
        kp%(15) = &H0000
        kpload bigNumbaseADR&+3, kp%

    '2
        kp%(0) = &H03C0
        kp%(1) = &H03F8
        kp%(2) = &H03FC
        kp%(3) = &H03FE
        kp%(4) = &H07FF
        kp%(5) = &H07FF
        kp%(6) = &H007F
        kp%(7) = &HC03F
        kp%(8) = &HE07F
        kp%(9) = &HFCFF
        kp%(10) = &HFFFF
        kp%(11) = &HFFFE
        kp%(12) = &HFFFE
        kp%(13) = &H7FF8
        kp%(14) = &H0FE0
        kp%(15) = &H0000
        kpload bigNumbaseADR&+4, kp%

        kp%(0) = &H7800
        kp%(1) = &H7F80
        kp%(2) = &H7FE0
        kp%(3) = &H7FF0
        kp%(4) = &H7FFC
        kp%(5) = &H7FFE
        kp%(6) = &H7FFF
        kp%(7) = &H7FFF
        kp%(8) = &H7F3F
        kp%(9) = &H7F1F
        kp%(10) = &H7F0F
        kp%(11) = &H7F07
        kp%(12) = &H7F01
        kp%(13) = &H7F00
        kp%(14) = &H7F00
        kp%(15) = &H0000
        kpload bigNumbaseADR&+5, kp%
    '3
        kp%(0) = &H00E0
        kp%(1) = &H00F8
        kp%(2) = &H01FC
        kp%(3) = &H01FE
        kp%(4) = &H03FF
        kp%(5) = &H00FF
        kp%(6) = &HF83F
        kp%(7) = &HF81F
        kp%(8) = &HFC3F
        kp%(9) = &HFFFF
        kp%(10) = &HFFFF
        kp%(11) = &HFFFE
        kp%(12) = &HDFFC
        kp%(13) = &H8FF8
        kp%(14) = &H03C0
        kp%(15) = &H0000
        kpload bigNumbaseADR&+6, kp%

        kp%(0) = &H03C0
        kp%(1) = &H0FC0
        kp%(2) = &H1FC0
        kp%(3) = &H3FC0
        kp%(4) = &H7FE0
        kp%(5) = &H7F80
        kp%(6) = &H7E01
        kp%(7) = &H7C01
        kp%(8) = &H7E03
        kp%(9) = &H7F8F
        kp%(10) = &H7FFF
        kp%(11) = &H3FFF
        kp%(12) = &H1FFF
        kp%(13) = &H0FFF
        kp%(14) = &H03FE
        kp%(15) = &H0000
        kpload bigNumbaseADR&+7, kp%
    '4
        kp%(0) = &H0000
        kp%(1) = &H8000
        kp%(2) = &HE000
        kp%(3) = &HF800
        kp%(4) = &HFE00
        kp%(5) = &HFF80
        kp%(6) = &H3FF0
        kp%(7) = &H0FFC
        kp%(8) = &H03FF
        kp%(9) = &HFFFF
        kp%(10) = &HFFFF
        kp%(11) = &HFFFF
        kp%(12) = &HFFFF
        kp%(13) = &H0000
        kp%(14) = &H0000
        kp%(15) = &H0000
        kpload bigNumbaseADR&+8, kp%

        kp%(0) = &H01FE
        kp%(1) = &H01FF
        kp%(2) = &H01FF
        kp%(3) = &H01FF
        kp%(4) = &H01FB
        kp%(5) = &H01F8
        kp%(6) = &H01F8
        kp%(7) = &H01F8
        kp%(8) = &H01F8
        kp%(9) = &H7FFF
        kp%(10) = &H7FFF
        kp%(11) = &H7FFF
        kp%(12) = &H7FFF
        kp%(13) = &H01F8
        kp%(14) = &H01F8
        kp%(15) = &H0000
        kpload bigNumbaseADR&+9, kp%
    '5
        kp%(0) = &HE000
        kp%(1) = &HFFF0
        kp%(2) = &HFFFF
        kp%(3) = &HFFFF
        kp%(4) = &HFFFF
        kp%(5) = &HFFFF
        kp%(6) = &HF87F
        kp%(7) = &HFC7F
        kp%(8) = &HFC7F
        kp%(9) = &HFC7F
        kp%(10) = &HFC7F
        kp%(11) = &HFC7F
        kp%(12) = &HF87F
        kp%(13) = &HE07F
        kp%(14) = &H8000
        kp%(15) = &H0000
        kpload bigNumbaseADR&+10, kp%

        kp%(0) = &H03C1
        kp%(1) = &H0FC1
        kp%(2) = &H1FC1
        kp%(3) = &H3FC3
        kp%(4) = &H7FE3
        kp%(5) = &H7F81
        kp%(6) = &H7E00
        kp%(7) = &H7E00
        kp%(8) = &H7E00
        kp%(9) = &H7FC3
        kp%(10) = &H7FFF
        kp%(11) = &H3FFF
        kp%(12) = &H1FFF
        kp%(13) = &H0FFF
        kp%(14) = &H03FF
        kp%(15) = &H0000
        kpload bigNumbaseADR&+11, kp%
    '6
        kp%(0) = &HFF80
        kp%(1) = &HFFF0
        kp%(2) = &HFFFC
        kp%(3) = &HFFFE
        kp%(4) = &HFFFE
        kp%(5) = &HFFFF
        kp%(6) = &HF87F
        kp%(7) = &HFC3F
        kp%(8) = &HFC3F
        kp%(9) = &HFDFF
        kp%(10) = &HFDFF
        kp%(11) = &HF8FE
        kp%(12) = &HF0FE
        kp%(13) = &HE0F8
        kp%(14) = &H8060
        kp%(15) = &H0000
        kpload bigNumbaseADR&+12, kp%

        kp%(0) = &H00FF
        kp%(1) = &H07FF
        kp%(2) = &H1FFF
        kp%(3) = &H3FFF
        kp%(4) = &H7FFF
        kp%(5) = &H7FFF
        kp%(6) = &H7F01
        kp%(7) = &H7E00
        kp%(8) = &H7E00
        kp%(9) = &H7F01
        kp%(10) = &H7FFF
        kp%(11) = &H3FFF
        kp%(12) = &H1FFF
        kp%(13) = &H0FFF
        kp%(14) = &H03FF
        kp%(15) = &H0000
        kpload bigNumbaseADR&+13, kp%
    '7
        kp%(0) = &H007F
        kp%(1) = &H007F
        kp%(2) = &H007F
        kp%(3) = &H007F
        kp%(4) = &H007F
        kp%(5) = &H807F
        kp%(6) = &HF07F
        kp%(7) = &HFC7F
        kp%(8) = &HFF7F
        kp%(9) = &HFFFF
        kp%(10) = &HFFFF
        kp%(11) = &H3FFF
        kp%(12) = &H07FF
        kp%(13) = &H01FF
        kp%(14) = &H007F
        kp%(15) = &H0000
        kpload bigNumbaseADR&+14, kp%

        kp%(0) = &H0000
        kp%(1) = &H0000
        kp%(2) = &H0000
        kp%(3) = &H7E00
        kp%(4) = &H7FF8
        kp%(5) = &H7FFF
        kp%(6) = &H7FFF
        kp%(7) = &H7FFF
        kp%(8) = &H7FFF
        kp%(9) = &H001F
        kp%(10) = &H0001
        kp%(11) = &H0000
        kp%(12) = &H0000
        kp%(13) = &H0000
        kp%(14) = &H0000
        kp%(15) = &H0000
        kpload bigNumbaseADR&+15, kp%
    '8
        kp%(0) = &H07C0
        kp%(1) = &H1FF8
        kp%(2) = &HBFFC
        kp%(3) = &HFFFE
        kp%(4) = &HFFFF
        kp%(5) = &HFFFF
        kp%(6) = &HF83F
        kp%(7) = &HF83F
        kp%(8) = &HF83F
        kp%(9) = &HFFFF
        kp%(10) = &HFFFF
        kp%(11) = &HFFFE
        kp%(12) = &HBFFC
        kp%(13) = &H1FF8
        kp%(14) = &H03C0
        kp%(15) = &H0000
        kpload bigNumbaseADR&+16, kp%

        kp%(0) = &H07FE
        kp%(1) = &H0FFF
        kp%(2) = &H3FFF
        kp%(3) = &H3FFF
        kp%(4) = &H7FFF
        kp%(5) = &H7F8F
        kp%(6) = &H7E03
        kp%(7) = &H7E03
        kp%(8) = &H7E03
        kp%(9) = &H7F8F
        kp%(10) = &H7FFF
        kp%(11) = &H3FFF
        kp%(12) = &H3FFF
        kp%(13) = &H0FFF
        kp%(14) = &H03FE
        kp%(15) = &H0000
        kpload bigNumbaseADR&+17, kp%
    '9
        kp%(0) = &H7FE0
        kp%(1) = &HFFF8
        kp%(2) = &HFFFC
        kp%(3) = &HFFFE
        kp%(4) = &HFFFF
        kp%(5) = &HE07F
        kp%(6) = &H803F
        kp%(7) = &H803F
        kp%(8) = &HC03F
        kp%(9) = &HFFFF
        kp%(10) = &HFFFE
        kp%(11) = &HFFFE
        kp%(12) = &HFFFC
        kp%(13) = &HFFF0
        kp%(14) = &HFF80
        kp%(15) = &H0000
        kpload bigNumbaseADR&+18, kp%

        kp%(0) = &H0100
        kp%(1) = &H0F83
        kp%(2) = &H3F87
        kp%(3) = &H7F8F
        kp%(4) = &H7F9F
        kp%(5) = &H7FDF
        kp%(6) = &H7E1F
        kp%(7) = &H7C0F
        kp%(8) = &H7F0F
        kp%(9) = &H7FE7
        kp%(10) = &H3FFF
        kp%(11) = &H3FFF
        kp%(12) = &H1FFF
        kp%(13) = &H07FF
        kp%(14) = &H00FF
        kp%(15) = &H0000
        kpload bigNumbaseADR&+19, kp%
    end Sub


    Function bn.getMSB&(byval adr&)
        bn.getMSB&=(adr& / &H100)
    end Function


    Function bn.getLSB&(byval adr&)
        bn.getLSB&=(adr& And &HFF)
    end Function

    Function bn.canDrowing%(byref x%,byref y%)
    '''描画可能位置なのか確認する
        private res%
        res%=1
        if x%<1 OR x%>xPosMax% then res%=0 end if
        if y%<1 OR y%>yPosMax% then res%=0 end if
        bn.canDrowing%=res%
    end Function

    
    Sub bn.drow(byval i%,byval part%)
    '''指定された数字の指定の上下パートを描画する
    '''ただし、描画可能範囲を超えた場合は描画しない
        private MSB&
        private LSB&
        private adr&
        private x%
        private y%
        private prevX%
        private prevY%
        
        x%=POS(0)
        y%=CSRLIN
        prevX%=x%
        prevY%=y%
        y%=y%+(yPosOffset%*part%)
        if bn.canDrowing%(x%,y%) then
            adr& = bigNumbaseADR&+part%+i%*2
            MSB&= bn.getMSB&(adr&)
            LSB&= bn.getLSB&(adr&)
            locate x%,y%
            print chr$(MSB&); : print chr$(LSB&);
        end if
        locate prevX%,prevY%
    end Sub


    Sub bn.drowBigNum(byval i%)
    '''一文字表示する
        Const upperPart = 0
        Const lowerPart = 1
        private prevX%
        private prevY%

        prevX%=POS(0)
        prevY%=CSRLIN
        
      '上半分を描画
        bn.drow(i%,upperPart )


      '下半分を描画
        bn.drow(i%,lowerPart)

        locate prevX%,prevY%
    end Sub
    
    Function bn.nextPosition%
    '''次の描画位置までカーソル移動する
        private x%
        private y%
        private res%
        private tmp$
        res%=0

        
        x%=POS(0)
        y%=CSRLIN
        if x%+xPosOffset% < xPosMax% then
            locate x%+xPosOffset%,y%
        else 
            if y%+yPosOffset%*2 < yPosMax% then
                locate 1,y%+yPosOffset%*2
            else
                res%=1
            end if
        end if
        
        bn.nextPosition%=res%
    end Function


    Function bn.AcceptAdrRange%(ADR&)
    '''ユーザーフォントの受入範囲か判断する
        private res%
        res%=1 'とりあえず受入可とする
        
        '不可能な範囲の条件を以下に記入
        if ADR&    >= &H0EC80 THEN res%=0 : endif
        if ADR&    <  &H0EBC0 THEN res%=0 : endif
        if ADR&+19 >  &H0EBFC THEN res%=0 : endif

        if res%=-1 THEN
            if ADR&    <  &H0EC40 THEN res%=0 : endif
            if ADR&+19 >  &H0EC7E THEN res%=0 : endif
        end if
        bn.AcceptAdrRange%=res%
    end Function
    
    Sub initScreenMax
    '''カーソル位置の最大値を初期化
    '''機種別に判断するようにすれば柔軟性が増す
        xPosMax% = 16
        yPosMax% = 8
    end Sub


'/////////// public ///////////
    Function SetBigNumFonts%(byval paramADR&)
    '''ユーザ定義の漢字フォントを登録
        private res%
        res%=0
        if bn.AcceptAdrRange%(paramADR&) THEN
            bigNumbaseADR&=paramADR&
            Call bn.setFonts
        else
            res%=1            'AddressOutOfRangeException
        end if
        SetBigNumFonts%=res%
    end Function
    

    Sub SetScreen(byval paramMode%)
    '''スクリーンモード変更しつつ
    '''カーソルの移動量を決定
    '''機種別に判断するようにすれば柔軟性が増す
    '''
        call initScreenMax
        
        select case paramMode%
        case 0
            xPosOffset% = 2
            yPosOffset% = 2
            screen 1,0
        case 1
            xPosOffset% = 2
            yPosOffset% = 2
            screen 1,1
        case 2
            xPosOffset% = 4
            yPosOffset% = 2
            screen 1,2
        case 3
            xPosOffset% = 4
            yPosOffset% = 2
            screen 1,3
        end select
    end Sub

    Sub PrintBigNum(byval num%)
        private tmpStr$
        private lp%
        private i%
        if(num% >= 0) then 
            tmpStr$=mid$(str$(num%),2)
            for lp%=0 to len(tmpStr$)-1
                i% = val(mid$(tmpStr$,lp%+1,1))
                call bn.drowBigNum(i%)
                if bn.nextPosition% then
                    exit sub
                end if
            next
        end if
    end Sub



上記関数を利用したサンプル兼動作テストプログラム fontTest.src

'定数・関数宣言ファイルインクルード
'$Include:'\bigNUMfonts.def'

    private tempKey$

    out &h6080,0 '標準フォント

    private num%(4) 
    private lp%
    private mode%
    private x%
    private y%
    
    
    num%(0)=1
    num%(1)=12
    num%(2)=123
    num%(3)=1234
    num%(4)=12345
    

    if SetBigNumFonts%(&H0EBC0) <> 0 then
        print "外字設定に失敗しました"
    else
        flg%=1
        while(flg%)
            screen 0,0
            print "input mode(0-3):";
            mode%    = val(Input$(1))
            cls
            if mode%>=0 AND mode%=<3 then
                call SetScreen(mode%)
                print "sample1"
                tempKey$=input$(1)
                for lp%=0 to 4
                    locate 1,1
                    PrintBigNum(num%(lp%))
                    locate 1,5
                    print num%(lp%)
                    beep 1,1,1 :timea = 2 : wait 0,&h10
                next
                print "sample2"
                tempKey$=input$(1)
                for y%= 1 to 7
                    for x%=1 to 16
                        cls
                        call SetScreen(mode%)
                        locate x%,y%
                        PrintBigNum(y%)
                        screen 0,0
                        locate 1,1
                        print x% ; "," ; y%
                        timea = 2 : wait 0,&h10
                    next
                next
            else
                flg%=0
            end if
        wend
    end if

コンパイル方法

コンパイルにはBHT-BASICコンパイラ4.0で新たにプロジェクトを作成して、対象ソースファイルを登録してコンパイルします。 ファイルが分けてあるので、流用可能だと思っています。

使用時の注意点

  1. 表示する前にプログラムどこかで、一度だけフォント登録(SetBigNumFonts%)をしてください
  2. 表示の事前にスクリーンモードを指定(SetScreen(mode%))してください。この場合のモードはScreenステートメントの第2添字と同じです





0 件のコメント:

コメントを投稿

デル株式会社

最近人気の投稿