倉庫業務から、読み取り件数文字が見づらいとの打ち上げがあり、いろいろ検討した結果、自分でユーザフォントを作成して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で新たにプロジェクトを作成して、対象ソースファイルを登録してコンパイルします。 ファイルが分けてあるので、流用可能だと思っています。使用時の注意点
- 表示する前にプログラムどこかで、一度だけフォント登録(SetBigNumFonts%)をしてください
- 表示の事前にスクリーンモードを指定(SetScreen(mode%))してください。この場合のモードはScreenステートメントの第2添字と同じです
0 件のコメント:
コメントを投稿