ORANGE BASIC テクニック

ORANGE BASIC ならではの利用方法などをまとめています。

ORANGE BASIC をある程度使いこなしている人向けになるかもしれません。 


特定のバージョンに依存した動作

バージョンによってコマンドや指定する値が変化する場合、

if ver() を用いて分岐する方法が有効です。

ORANGE BASIC は if ver() に該当しない場合、
その後ろ(then)に記載するコマンドは無視するため、

古いバージョンで非対応のコマンドが記載されていてもエラーになる事はありません。

下のサンプルは 0.28 以降で cpoke の実行を行います。オレンジが表示されます。

 

10 if ver()>=28 cpoke 144,16

20 print chr$(144)

 

ver() の値は例えば 0.01 の場合は 1、0.10 の場合は 10 が返されます。


真と偽

ORANGE BASIC では条件が正しい場合 1、異なる場合は 0 が返されます。

 

print 5=5 → 1 と表示されます。

print 5=3 → 0 と表示されます。

 

1980 年代に採用されていたパソコンでは正しい場合は -1 だったため、

+・ー が逆になっている事にご注意下さい。これは論理式に影響があります。

 

y=y-(i=30)+(i=31) → 30 はカーソルキー ↑ 、31 はカーソルキー ↓ です。

 


READ・DATA の代用

ORANGE BASIC には複数のデータを入れておく READ・DATA が存在しません。

その代用として、次の方法があります。

 

文字列にデータを入れる

ORANGE BASIC は初期バージョンのファームウェアから文字列を扱えます。

しかも文字列はコードで指定が可能です。

そこで、数値データをコードで文字列に入れておき、

mid$ で場所を指定する事で複数のデータを取り出す事ができます。

下のサンプルは d(1)〜d(10) に 1〜10 が入ります。

 

10 dim d(10)

20 d$="\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a"

30 for i=1 to 10

40 d(i)=asc(mid$(d$,i,1))

50 next i

 

\x●● は 16 進数表記です。\x0a で 10 となり、

文字列は \x00 を終端とするため、これをデータに含めないで下さい。

つまり 1 文字で \x01〜\xff(1〜255)となります。

多くのデータを扱う場合、対応するキャラクターが入力できる場合は
その文字に変えると短くなりますが、手入力には厳しいかもしれません。

 

古いファームウェアでは約 80 文字を超えると表示がおかしくなる不具合があります。

 

mptr・mdata で汎用メモリーにデータを入れる

0.33 より採用されている mptr・mdata を用いて、

複数のデータを汎用メモリーに蓄えておけます。

下のサンプルは汎用メモリー 1〜10 番地に 1〜10 を入れます。

 

10 mptr 1

20 mdata 1,2,3,4,5,6,7,8,9,10

 

汎用メモリーは一つの番地に 0〜255 が入ります。

mdata の値は 16 進数も使用できますが、&h を含むため 3〜4 文字となります。

特に多くのデータを入れたい場合、10 進数にすると 1〜3 文字で短くなります。

 

運営者が試したところで、0.37 以降のファームウェアで 10 進数の値にすると

1プログラム(8k バイト)で 2000 番地前後入れられます。

これは 0〜255 のキャラクター(下項目参照)がちょうど入る大きさです。

 

応用

256 以上の値を扱いたい場合は、単に 2 つの値を使えば良いです。

 

10 dim d(10)

20 mptr 0

30 mdata 0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10

40 for i=1 to 10

50 d(i)=asc(mid$(d$,i*2-1,1))*256+asc(mid$(d$,i*2,1))

60 next i

 


キャラクターの設定 (PCG)

キャラクターは 0〜255 全てのコードに対して変更する事が可能です。
大きさは 8×8 ピクセルで、仮想メモリ 8 バイト(= 8 番地)分となります。

32〜255 を入れた場合は 1792 バイト、0〜255 を入れた場合は 2048 バイトとなり、

仮想メモリに全キャラクターを 3〜4 パターン入れておく事ができます。

現在のところ 0〜31 もキャラクターを設定して print 文で表示される事ができます。

127 はカーソル形状に反映されます。


0.33 からは mpoke を用いて仮想メモリ 8000〜8007 番地にフォントデータを入れます。

下では 16 進数表記(&h〜)にしていますが、もちろん 10 進数でも構いません。

 

  8 4 2 1 8 4 2 1 &h0e mpoke 8000,&h0e
  8 4 2 1 8 4 2 1 &h1f mpoke 8001,&h1f
  8 4 2 1 8 4 2 1 &h1f mpoke 8002,&h1f
  8 4 2 1 8 4 2 1 &h1f mpoke 8003,&h1f
  8 4 2 1 8 4 2 1 &h0e mpoke 8004,&h0e
  8 4 2 1 8 4 2 1 &h08 mpoke 8005,&h08
  8 4 2 1 8 4 2 1 &h10 mpoke 8006,&h10
  8 4 2 1 8 4 2 1 &he0 mpoke 8007,&he0

 

その後 cpoke <キャラクターコード>,-1 でフォントに反映します。

 

cpoke 255,-1

print chr$(255)

 

 

なお、0.39 からは mptr と mdata を用いて、このようにできます。

 

10 mptr 8000

20 mdata &h0e,&h1f,&h1f,&h1f

30 mdata &h0e,&h08,&h10,&he0

40 cpoke 255,-1

50 print chr$(255)

 

 

0.32 以前でも設定方法がありますが、不具合があり使用を推奨しません。

 

&h00〜&hff 16 進数コードがよく分からない場合は

キャラクターエディタ を使って下さい。

キャラクターを作成し、生成したキャラクターの 16 進数コードを生成できます。

この 16 進数コードは mdata で使用できます。

 

キャラクターエディタ ORANGE BASIC プログラム内 


全画面を変化させる

テキスト画面の背景は chr$(0) で埋まっています。(chr$(32) ではありません)

そのため、chr$(0) を設定すると、全体が変化します。下を試してみて下さい。

 

10 cls

20 cursor 0

30 for i=8000 to 8007

40 mpoke i,rnd(256)

50 next i

60 cpoke 0,-1

70 goto 30

 

ESC(Ctrl+C)で中断した後 cpoke で元に戻せます。


テキスト画面のまるごと保存・取り出し

テキスト画面はまるごと汎用メモリーへ保存できます。

下でテキストの状態を汎用メモリーの 1000〜1999 番地へ保存します。

 

vmove 1000,0

 

この後、汎用メモリーから画面の状態を参照・編集する事ができます。

1000 番地は左上、その右が 1001 番地、下は +40 の 1040 番地で、

右下の 1999 番地までのデータとなります。各値はキャラクターコードです。 

汎用メモリーは 8007 番地まであり、1000 番地毎に 8 画面分保存できます。

mwrite で汎用メモリーを EEPROM に保存できます。(mread で取り出し)

汎用メモリーから画面へ反映するには、0 のところを 0 以外にします。

 

vmove 1000,1

 


グラフィックへの文字表示

gprint を用いてグラフィック画面へ文字を表示できます。

 

テキスト画面では座標が文字単位になりますが、
グラフィックの場合はピクセル(ドット)単位になります。
1 文字=8×8 ピクセルで、locate 1,1=グラフィック座標 8,8 となります。

PCG で自由にキャラクターを設定できるため、

特定のキャラクターを動かすのに有効です。

下のサンプルではテキスト画面から横に 1 ピクセル(ドット)ずらして

同じ文字をグラフィック画面に表示する事で、太文字にします。

 

10 cls

20 locate 1,1

30 print "ORANGE pico"

40 gprint 9,8,"ORANGE pico",&hffff

 

ただしキャラクターを動かすためには、削除して線画しなおす必要があります。

またグラフィック画面はスクロールしません。

そのため、用途によってはテキスト画面の方が無難な場合があります。

 

gprint の代わりに gput を用いて特定のパターンを出力する方法もあります。


グラフィック情報の保存

ORANGE BASIC ではグラフィック画面の特定座標にある
色コードを取り出す手段(point)が当初存在しませんでした。

0.63 より point が追加されています。

 

ビデオ信号出力のグラフィック画面であれば、

1 番地を 1×8 ピクセル(ドット)で扱うと、320×200÷8=8000 となり、

ちょうど汎用メモリーの 0〜7999 番地に収まります。

 

GIVE UP! はこの方法と用いてグラフィック画面を汎用メモリーに保存しています。

 

画面丸ごとのグラフィック出力はプログラムの製作を要しますが、行う事は可能です。


JIS 第一・第二水準文字(漢字など)の出力

JIS 第一・第二水準の記号や漢字などを gprint によって
グラフィック画面へ出力する事ができます。

 

シフト JIS(Shift_JIS)で文字コードを含めます。

2コード分で漢字1文字になります。

例えば「漢」ならシフト JIS のコードは 8ABF なので、\x8a\xbf となります。

chr$(&h8a)+chr$(&hbf) といった指定も可能です。

gprint の文字列は英数・カナ(いわゆる半角文字)と

JIS 第一・第二水準文字(いわゆる全角文字)を混ぜる事ができます。

ただし ORANGE piko ではJIS 第一・第二水準文字も通常の文字同様 8×8 ドットです。

 

なお、数字 0 は通常テキストでは斜体が入っていますが、
シフト JIS コード 824f の数字 0 には斜体が入っていません。

 

下のコマンドを試してみて下さい。

 

gprint 0,100,"\x8a\xbf\x8e\x9a\x82\xaa\x8e\x67\x82\xa6\x82\xe9\x81\x9a",65535

 

 

0.33 以降は英数・カナ以外に JIS 第一・第二推奨文字を含むフォントパターンを

cpeek を用いて得る事ができます。シフト JIS 指定です。
「漢」ならシフト JIS のコードは 8ABF で、数値 &h8abf をコード指定します。

 

cpeek &h8abf

cpoke 255,-1

print chr$(255)

 

グラフィック画面では gput で出力する方法もあります。
幅を 8 ピクセル(ドット)、仮想メモリーの開始番地を 8000 にします。

 

cpeek &h8abf

gput 100,100,8,8000,&hffff

 


演奏する

beep は音階がトレミになっているため、つなげる事で演奏できます。

下は ドレミファソラシド を再生します。

 

10 beep 12,500

20 beep 14,500

30 beep 16,500

40 beep 17,500

50 beep 19,500

60 beep 21,500

70 beep 23,500

80 beep 24,500

 

休符は pause が使えます。

長くなるので、このページ「READ・DATA の代用」を使用するのが良いでしょう。

beep の音階は下のとおりです。

 

音階 低 ← 基準    
0 12 24 36 48 60 
ド#  レ♭ 1 13 25 37 49  
2 14 26 38 50  
レ#  ミ♭ 3 15 27 39 51  
4 16 28 40 52  
ファ 5 17 29 41 53  
ファ# ソ♭ 6 18 30 42 54  
7 19 31 43 55  
ソ#  ラ♭ 8 20 32 44 56  
9 21 33 45 57  
ラ#  シ♭ 10 22 34 46 58  
11 23 35 47 59  

 

beep・pause の長さはミリ秒です。

テンポの値は 120BPM なら 1 分で 120 拍なので、

1 拍は 0.5 秒=500 ミリ秒という事になります。