N88-BASIC(86)用グラフィック描画デモプログラム

NECパーソナルコンピュータ PC-9800シリーズ のN88-BASIC(86)上で動くグラフィックデモプログラムをBASICの習得がてら作ってみた。

これを実行すると20秒間だけ画面上のランダムな位置に正円を描画します。時間経過後、描画した円の数を表示してプログラムを終了します。ただ円を描画するだけだと表示が地味なので、4096色中16色表示のモードに切り替えたり、パレットの色を変えたりしています。CPU・メモリの処理速度とVRAMのアクセス速度がスコアに影響します。
初めの行にある「TESTTIME%=20」を置き換えればベンチマークの実行時間を変更できます。
もともとはグラフィック描画性能の比較のために作ったものですが、ベンチマークと言うよりはグラフィック描画のデモンストレーションプログラムと言えます。

N88-日本語BASIC(86) DISKモードで動作確認しています。640x400ドット、4096色中16色表示モードをサポートしていることが最低条件です。
スコアは単精度実数型で加算するため、6桁を上回ると正確な数字が出なくなります。(改造機でも無い限りそこまでスコアが伸びることはないでしょう。)

10 TESTTIME%=20
20 SCREEN 3
30 CONSOLE ,,0
40 CLS 2
50 COLOR 4,,,,2
60 PRINT "*** N88-BASIC(86) Benchmark Test: Drawing circles ***
70 PRINT "*** Copyright (C) 2013 kari. All rights reserved. ***
80 COLOR=(7,&HEEE)
90 COLOR=(9,&HAAF)
100 COLOR=(10,&HAFA)
110 COLOR=(11,&HAFF)
120 COLOR=(12,&HFAA)
130 COLOR=(13,&HFAF)
140 COLOR=(14,&HFFA)
150 COLOR=(15,&H9F0)
160 COUNT=0
170 IF TESTTIME%=0 THEN GOTO *ERRORTESTTIME
180 PRINT "Start time: "+TIME$
190 H%=VAL(MID$(TIME$,1,2))
200 M%=VAL(MID$(TIME$,4,2))
210 S%=VAL(MID$(TIME$,7,2))
220 S%=S%+TESTTIME%
230 WHILE S%>=60
240 M%=M%+1
250 IF M%>=60 THEN H%=H%+1:M%=0
260 IF H%>=24 THEN H%=0
270 S%=S%-60
280 WEND
290 TIMECHH$=MID$(STR$(H%),2)
300 TIMECHM$=MID$(STR$(M%),2)
310 TIMECHS$=MID$(STR$(S%),2)
320 IF LEN(TIMECHH$)=1 THEN TIMECHH$="0"+TIMECHH$
330 IF LEN(TIMECHM$)=1 THEN TIMECHM$="0"+TIMECHM$
340 IF LEN(TIMECHS$)=1 THEN TIMECHS$="0"+TIMECHS$
350 TIMESTR$=TIMECHH$+":"+TIMECHM$+":"+TIMECHS$
360 PRINT "Estimated end time: "+TIMESTR$
370 ON TIME$=TIMESTR$ GOSUB *SHOWRESULT
380 TIME$ ON
390 *BENCHLOOP
400 SEED%=(M%+1)*(S%+1)
410 RANDOMIZE SEED%
420 WHILE 1
430 CL=INT(RND*15)+1
440 CX=INT(RND*640)
450 CY=INT(RND*400)
460 CIRCLE(CX,CY),40,0,,,,F,CL
470 COUNT=COUNT+1
480 WEND
490 *SHOWRESULT
500 TIME$ OFF
510 PRINT "End time: "+TIME$
520 PRINT "Result: "+COUNT
530 PRINT "*** To clear the graphic screen, type 'cls 2'. ***
540 PRINT "*** Program terminated with no error. ***"
550 GOTO *EXIT
560 *ERRORTESTTIME
570 PRINT "Error: TESTTIME% is invalid value.
580 GOTO *EXIT
590 *EXIT
600 COLOR 0
610 CONSOLE ,,1

○プログラムの簡単な解説

以前にも言いましたが、N88-BASIC(86)に関する情報はネット上にはほとんど出ていません。命令・関数についての解説はともかく、サンプルプログラムや利用例もあまり出てこないのはちょっと寂しいです。
BASICの文法や用例はパソコン活用研究BASIC&VB&EXCEL達人道場のBASIC活用研究が参考になるでしょう。

このプログラムではそれほど難しいことはしていません。流れは以下の通りです。

  1. 画面表示の各種設定(画面モード、グラフィック画面消去、テキストの反転表示属性、カラーパレットの設定)
  2. 現在時刻にベンチマーク設定時間を加算してベンチマーク終了時間を計算
  3. ベンチマーク終了時間にリアルタイムタイマー割り込みを発生するように設定(ON TIME$ GOSUB)
  4. 時刻からシード値を計算してRANDOMIZE命令で乱数配列を設定
  5. 円を描画しながら数をカウント
  6. 5の処理を繰り返す
  7. 割り込みが発生したらループを抜けて、結果を表示する
  8. 画面表示(テキスト画面の反転表示属性やファンクションキー表示)を元の状態に戻す

少し手こずったしたのは時刻を加算してタイマー割り込みを設定する処理。文字列・数値のデータ型変換だけなら大したことはありませんが、時刻は文字列で取得・設定するため、時刻の演算に苦労しました。まず、時刻を時・分・秒に分けて整数型の数値に変換。そして各要素の加算・繰り上げ処理。それぞれの数値を文字列(HH:MM:SS)に変換するのですが、PRINT USING命令のように書式を指定して変換することができないので、自分で変換処理を組む必要がありました。まあ作ってみれば案外大したことありませんでした。

○プログラムの使い方

このプログラムはROM-BASIC上でも動きますが、コード全てをキーボードで入力するのはやや手間が掛かります。なので、あらかじめDISK-BASICでフォーマットしたデータディスクを用意して、このコードをMS-DOS上でFILECONVコマンドを使ってデータディスクに転送してからDISK-BASIC上でプログラムをロードするといいでしょう。

NEC PC-9821Xp (IntelDX4 100MHz、GDCクロック 5MHz)においてDISK-BASIC上で20秒間実行したスコアは23941でした。


QLOOK ANALYTICS