倉庫業務から、読み取り件数文字が見づらいとの打ち上げがあり、いろいろ検討した結果、自分でユーザフォントを作成して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添字と同じです