昨夜、久々にPC-98のBASICを使い
過去のプログラムの動作テストなどを
行っていたのですが、その時に
昔の書籍に書かれていた機能が気になり
ちょっと試してみよう!ってことに。
そんなわけでゲーム記事をお休みして
レトロPCのプログラミング記事です。
あくまでお遊び程度に試しただけなので
こんな情報なんて興味ないよ!って方は
サラッと流し読みしていただければ😅
MS-DOS版N88-BASIC(86)を起動
まずは MS-DOS版 N88-BASIC(86) を
起動させます。Disk版でももちろんOK。
写真で SEMI.BAS をロードしていますが
後半で紹介するプログラムをロード後に
撮影したものなので無視してください😅
テキストVRAMに直接書き込む
今回は PC-98 のテキストVRAM へ
直接書き込む形で実験します。
最初に DEF SEG=&HA000 を実行し
セグメントベースを &HA000 に設定。
ここがテキストVRAMの始点です。
&H2000 以降はアトリビュートエリア。
色などの属性が書き込まれる場所です。
この属性にセミグラフィック機能という
低解像度 160×100ドットで描画する
機能が PC-88 時代から存在します。
試しに &HF1 をテキスト画面 (0,0) に
書き込んでみると、上写真のような
ドットが描かれました。
ドットパターンの詳細
これだけだとサッパリ意味不明なので
次は 4文字分の範囲へ書き込み。
セミグラフィック機能では 1文字当たり
横2ドット×縦4ドットを表現可能。
左ドット | 右ドット | |
1段目 | &H01 | &H10 |
2段目 | &H02 | &H20 |
3段目 | &H04 | &H40 |
4段目 | &H08 | &H80 |
1段目から4段目までの計8ドットで
ONにしたい場所の数字を足した
合計の値をキャラクターコードとして
テキストVRAMに書き込みます。
上写真の例で説明すれば
1段目のドットのみを表示=&H11
2段目のドットのみを表示=&H22
などとなりますね。
パターンコードを書き込んだら次は
アトリビュートエリアへの書き込み。
ビット7~5がGRBの並びで色番号指定、
ビット4を1にしてセミグラフィック、
ビット0を1にすることで表示です。
上写真では &HF1 を書き込んでいるので
白色のセミグラフィックとして表示。
色に関しては少し先で書きます。
これらを踏まえて 2つの模様を
描いてみました。
&H55, &H22 で左側の模様。
右側の市松模様はドットの部分を
先ほどの表に書いた数字に置き換え
足し算したものを書き込みます。
上写真ではわかりやすくするために
あえて4段分順番に足しています。
仕組みがわかってしまえば
そんなに難しくはないですね。
ためしにパターンを作ってみた
後ほどセミグラフィックで描く
パターンデータを作ってみました。
ドット絵を横2×縦4ドットで分割し
足していけば1文字ずつのデータを
作る事ができますね。
出来上がったデータは
330行にある12バイト(16進)です。
アトリビュートで色も付けられる
先ほどまでは属性に &HF1 を書き込み
白でセミグラフィックを描きましたが
当然他の色も付けられます。
黒 | 青 | 赤 | 紫 | 緑 | 水 | 黄 | 白 | |
値 | &H11 | &H31 | &H51 | &H71 | &H91 | &HB1 | &HD1 | &HF1 |
画面一杯に出力してみた!
描くための方法がわかったところで
簡単なプログラムを作って
テキスト画面一杯に「&」記号の
ドット絵パターンを出力!!
さらに、色もランダムにセットして
描いたら上写真のようになりました😅
セミグラフィックで描く場所は
普通のテキスト画面上なので
背景にグラフィック画面を合わせて
表示させることができます。
うまく利用すれば面白い画面を
作る事ができそうですね~。
今回作成したプログラム
それでは、昨夜作成したプログラムを
そのまんま紹介しちゃいます。
PC-98シリーズ用 N88-BASIC(86) の
MS-DOS版・Disk版・ROM版で
動作するので試してみて♪
100 ' セミグラフィック サンプル SEMI.BAS 110 ' 120 DEF SEG=&HA000:CONSOLE 0,25,0,1:CLS 130 DEFINT A-Z:DIM C(7),P(11) 140 FOR I=1 TO 7 :READ A$:C(I)=VAL("&H"+A$):NEXT 150 FOR I=0 TO 11:READ A$:P(I)=VAL("&H"+A$):NEXT 160 ' 170 RANDOMIZE VAL(RIGHT$(TIME$,2)) 180 CX=0:CY=0 190 FOR Y=0 TO 2 200 FOR X=0 TO 3 210 POKE (CY+Y)*&HA0+(CX+X)*2,P(Y*4+X) 220 AT=C(INT(RND(1)*7+1)) 230 POKE &H2000+(CY+Y)*&HA0+(CX+X)*2,AT 240 NEXT 250 NEXT 260 CX=CX+4:IF CX=80 THEN CX=0:CY=CY+3 ELSE 190 270 IF CY<>24 THEN 190 280 LOCATE 0,23:END 290 ' 300 ' Text-vram write data 310 ' 320 DATA 31,51,71,91,B1,D1,F1 330 DATA 1E,11,0E,00, 58,52,08,08, 43,44,34,04 340 ' 350 ' Pattern "&" 360 ' 370 '01|11|00|00 380 '10|00|10|00 390 '10|00|10|00 400 '10|00|10|00 410 '--+--+--+-- 420 '01|01|00|00 430 '00|10|00|00 440 '01|01|00|00 450 '10|00|10|10 460 '--+--+--+-- 470 '10|00|01|00 480 '10|00|11|00 490 '01|11|00|10 500 '00|00|00|00
おまけ
資料を読んでいてもう1つ発見。
OUT &H68,6 を実行すると
テキスト画面のフォントが
PC-88 と同じになります😄
OUT &H68,7 を実行すれば
元のフォントに戻せます。
98なのに88っぽくなって不思議♪
知らなかったことがまだまだ
たくさんあるなぁ~と思いながら
楽しんでいた昨日の夜でした🌟
といったところで今日はおしまい!
5月もあっという間に終わりですね💦
それではまた明日の記事で♪
ポチッと応援してもらえたら嬉しいな♪
コメント