ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:hello_poor_tea PC-8001mk2のグラフィック変数について
困り度:
  • 暇なときにでも
NEC PC-8001mk2のグラフィック機能で、
cmd put,cmd get命令を使用してグラフィックをコピー、ペーストする方法があり、そのグラフィックを格納する変数があります。

この変数はa%(50)のように配列変数なのですが、この中身がいったいどうなっているのか知りたいです。

cmd getでグラフィックを変数に格納した後、その変数をprintすれば、数字の羅列が表示されます。
その数字をプログラム内でread,dataで読み込めば、cmd getしなくてもよいために、昔のマイコン雑誌などでよく使用されていた手法です。
しかし、それらの数字が何を意味しているのか理解していた人はほとんどいませんし、解説されている雑誌も見つけられませんでした。

予想としてはそれぞれのドット情報を二進法で表し、それを十進法にしたものだと思いますが、この変数に格納された数字の意味をどなたかご教授下さい。

ちなみに、サンプルは次の通りです。
10 CMD SCREEN 2,0,6
20 DIM G%(20)
30 FOR J=0 TO 19:READ G%(J):NEXT J
40 CMD PUT(38,38),G%,PSET
50 DATA 2,36,-32768,16384,64,128,0,0,0,0,0,-32768,16384,16448,16448,16448,16448,64,-32640,128
質問投稿日時:07/05/27 01:28
質問番号:3033587
この質問に対する回答は締め切られました。

回答

良回答20pt

回答者:poohron PC-8001やPC-8801を扱ったことはありませんが、
当時の8ビット機でいろいろしていた者です。

機種によってコマンド名やパラメータの書式が異なっていたので
ちょっと違っているかもしれませんが、
私が使用していたSHARP X1の「Hu BASIC」で使用していた
PUTやPSETに(うろ覚えですが)当てはめて考えると、

10 画面出力のモードを指定(X1のSCREEN命令とは異なるので2,0,6の意味は分かりません。どれかの数字が色指定かも)
20 配列変数G%(20)を宣言
30 G%(0)〜G%(19)に50行のDATA(20個のデータがあります)を格納
40 画面出力
50 データ

※40行のPUTは「出力」を意味し、(38,38)は出力する画面上の座標だと思われます。
 また、出力する内容はG%の内容、PSETはドット描画。PRESETだとドット消去。


さて、50行のデータですが、ご推察のとおり「ドット情報を二進法で表し、それを十進法にしたもの」で間違いないでしょう。
多分、16桁の2進数を10進数にしているはずです。
0000000000000010 (2)
0000000000100100 (36)
1000000000000000 (-32768)
0100000000000000 (16384)
0000000001000000 (64)
0000000010000000 (128)
0000000000000000 (0)

1の部分はドットが描画され、0の部分は描画されません。
イメージとしては上記のように2進数を方眼紙のマス目に書き込み、
「1」の部分だけ塗りつぶすしてドット絵を描くような感じでしょうか。


・・・うーん、分かりにくいかもしれませんね。説明下手でスミマセン。
種類:回答
どんな人:経験者
自信:参考意見
回答日時:07/05/27 02:44
回答番号:No.1
この回答へのお礼>多分、16桁の2進数を10進数にしているはずです
知りたかったのは、この部分でした!

お陰様で、以下のように解析することができました。


サンプルで描かれるのは、
横1ドット×縦36ドット

最初の2,36 とは、
1ドットは4色を表すために2ビット必要なので
横1ドット=「2」ビット
縦「36」ドット

残りの数字を16桁の2進数にする。
-32768 → 1000000000000000

それを8ビットに区切る(2つに区切る)
1000000000000000 → 10000000 00000000

右から順番に縦に並べる
10000000 00000000
    ↓
00000000
10000000

これで上記の数字を並べ替えると、

-32768 00000000 黒
    10000000 緑
16384 00000000 黒
    01000000 赤
64 01000000 赤
    00000000 黒
128 10000000 緑
    00000000 黒
0 00000000 黒
    00000000 黒
0 00000000 黒
    00000000 黒
0 00000000 黒
    00000000 黒
0 00000000 黒
    00000000 黒
0 00000000 黒
    00000000 黒
-32768 00000000 黒
    10000000 緑
16384 00000000 黒
    01000000 赤
16448 01000000 赤
    01000000 赤
16448 01000000 赤
    01000000 赤
16448 01000000 赤
    01000000 赤
16448 01000000 赤
    01000000 赤
64 01000000 赤
    00000000 黒
-32640 10000000 緑
    10000000 緑
128 10000000 緑
    00000000 黒

となる。

4ドット単位でデータが構成されるため、
右側の3ドット分(6ビット)は0で埋められる。

他のデータでも試してみましたが、
すべてこの方法でうまくいきました。

どうもありがとうございました。