PC-8001mk2のグラフィック変数について

このQ&Aのポイント
  • NEC PC-8001mk2のグラフィック機能で、cmd put,cmd get命令を使用してグラフィックをコピー、ペーストする方法があり、そのグラフィックを格納する変数がある。
  • この変数はa%(50)のように配列変数であり、cmd getでグラフィックを変数に格納した後、printすると数字の羅列が表示される。
  • それぞれの数字は二進法で表され、十進法に変換されたものであると予想されているが、具体的な意味は不明。
回答を見る
  • ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • poohron
  • ベストアンサー率59% (574/971)
回答No.1

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」の部分だけ塗りつぶすしてドット絵を描くような感じでしょうか。 ・・・うーん、分かりにくいかもしれませんね。説明下手でスミマセン。

hello_poor_tea
質問者

お礼

>多分、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で埋められる。 他のデータでも試してみましたが、 すべてこの方法でうまくいきました。 どうもありがとうございました。

関連するQ&A

  • 【sed】変数に設定したコマンドの実行について

    お世話になります。 一度変数に文字列として格納したsedコマンドの実行についての質問です。 以下、「実装1」のように、「あるファイルの最終行を除外して別のファイルに書き込む」という処理を行おうとしています。 ログ出力などの関係で、実行するコマンドを一度変数に格納する必要があるのですが 一度変数に格納して実行すると「実装2」のようにエラーが出てしまいます。 変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか? なお、シェルはbashです。 実行例ではターミナルから直接実行していますが、実際にはシェルスクリプトにして実行します。 以上、どなたかご教示頂けないでしょうか。 ■実装1 [root@localhost tmp]# cat /tmp/data aaa bbb ccc [root@localhost tmp]# sed -e '$d' /tmp/data >/tmp/data2 [root@localhost tmp]# cat /tmp/data2 aaa bbb [root@localhost tmp]# ■実装2 [root@localhost tmp]# CMD='sed -e $d /tmp/data >/tmp/data2' [root@localhost tmp]# echo $CMD sed -e $d /tmp/data >/tmp/data2 [root@localhost tmp]# $CMD aaa bbb sed: >/tmp/data2を読み込めません: そのようなファイルやディレクトリはありません [root@localhost tmp]#

  • fputsと変数

    フォームを使って日々のサイト更新をしたいのですが、途中からどうしたらいいのかわかりません。 ほかの質問を読んでも、なさけないのですが解決しませんでした(涙) たとえば、 aaa.html(更新したいhtmlファイル 上書きしていく) form.html(更新に使うフォームがあるhtmlファイル) get.php(フォームで飛ばしたデータを受け取り処理するphpファイル) があるとします。 aaa.html内にあるテーブルに入っている値 NO.1 001 NO.2 002 NO.3 003 の数値 001 002 003 部分を更新したい時、 ↓ form.htmlのフォームから更新するデータを入力して、 <INPUT size="2" name="NO1"> データをget.phpに送信 ↓ get.phpで受け取り、変数に値を格納  &no1=$_POST['NO1']; そして、fopenでaaa.htmlを開くんだろうなーとまではわかるのですが、そしてどうしたらいいのか・・・。 aaa.htmlはhtmlファイルだから、変数をどう使えばいいのでしょう? お願いします。助けてください。

    • 締切済み
    • PHP
  • 命令を変数に応じて変化させるには?

    「テーブル1」というテーブルの「データ」というフィールドにA~Jまで10個データが格納されていたとします。 このデータを変数 DATA01~DATA10 にそれぞれ格納したいと思っています。 下記ソースでは、レコードの終端までループしても、DATA01に「テーブル1」の1レコード目の値、"A"しか格納できませんが、これをDATA02に"B",DATA03に"C"・・・と順々に格納するにはどうしたら良いのでしょうか? それぞれの変数に応じた命令を一つ一つ書くのではなく、Countの値に応じて命令そのものを変化させて行いたいと思っています。他の言語ではわかるのですが、VBではどうするのかわかりません。 ご指導程お願い致します。 Private Sub テスト_Click()   Set DB = CurrentDb   Set RS = DB.OpenRecordset("テーブル1")   Count = 1   Do Until RS.EOF    DATA01 = RS!データ    RS.MoveNext    Count = Count + 1   Loop   End Sub

  • グラフィックカードを積んだのですが、動画のエンコードが速くなりません。

    グラフィックカードを積んだのですが、動画のエンコードが速くなりません。 この質問に目を留めていただきありがとうございます。 皆さん、よろしくお願いいたします。 さて、SAPPHIRE社製グラフィックカード、「HD5670」を買ってきて パソコン本体 Gateway 5084j に積みました。 スペックはこちらです。↓ http://www.tsukumo.co.jp/gateway/gt5084j.html ※メインメモリは3GBに増設しています。 OSは Vista SP2 (32bit) と 7 (32bit) のマルチブート環境で、 7 では、Windows Live ムービーメーカー、 Vista では、ムービーメーカーで30分ほどのMpeg2動画を .wmv に変換しました。 しかし、グラフィックカードを積むとエンコードの時間が短縮されると雑誌で読んだのですが、 その気配がまったくありません。 CPU使用率も、ほぼ100%なのです。 ちなみに、Windows のエクスペリエンス インデックスではグラフィックは7.0あります。 グラフィックカードのドライバは、当然組み込みました。 あと、PCのチップセットがG965 Expressで、オンボードグラフィック X3000が 生きているかもしれません。 何が原因に考えられるでしょうか? 皆さん、知恵をお貸しください。 お願いします。

  • 変数の型について

    お世話になります。 Oracle11gと .NET C#で開発をしております初心者です。 オラクルから得たデータをSPREADに表示しており、 そして、表示した表の「合計」列で0より大きい数字のセル に色を付けようとしているのですが、 実は、データの中身は違うのですが、表形式が全く同じ シートがsheet2からsheet5まで全部で5枚有り、下記の 様な記述を1回で済ませたいと思っており、sheet1の部分を 変数化してfor{ }でループさせようとしたのですが、 変数化させる型が分かりません。 stringの変数でやろうとしたらエラーになりました。 どなたかご親切な方、ご教示頂きたく宜しくお願い致します。               記 int gouKei = Spread.FindColumnIndex(sheet1, "合計");   for (int i = 0; i < sheet1.Rows.Count; i++)     { if (int.Parse(sheet1.Cells[i, gouKei].Text) > 0) {         sheet1.Cells[i, gouKei].BackColor = Color.LightCyan;       }     }

  • 2つのリストのマージ方法について

    2つのリストのマージ方法について 下記の要件を満たしたいと考えています。 ・リスト1・2をkeyをキーにマージしたい。  リスト1[0]:key=2, value1=b  リスト1[1]:key=3, value1=d  リスト1[2]:key=4, value1=e  ・  ・  ・  リスト2[0]:key=1, value2=A  リスト2[1]:key=2, value2=B  リスト2[2]:key=5, value2=F  リスト2[3]:key=6, value2=G  ・  ・  ・  ↓  リスト3[0]:key=1, value1=A, value=""  リスト3[1]:key=2, value1=b, value=B  リスト3[2]:key=3, value1=d, value=""  リスト3[3]:key=4, value1=e, value=""  リスト3[4]:key=5, value1="", value=F  リスト3[5]:key=6, value1="", value=G  ・  ・  ・ ・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。 ・マージ後もkeyの昇順にしたい。 ・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。 下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか? int checkedCount = 0; for (int i = 0; i < list1.size(); i++) { String str1 = list1.get(i).get("key"); for (int j = checkedCount; j < list2.size(); j++) { Map<String, String> map3 = new HashMap<String, String>(); String str2 = list2.get(j).get("key"); if (str1.compareTo(str2) < 0) { if (i != list1.size() - 1) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); break; } else { Map<String, String> map4 = new HashMap<String, String>(); map4.put("key", str2); map4.put("value1", ""); map4.put("value2", list2.get(j).get("value2")); list3.add(map4); } } else if (str1.compareTo(str2) == 0) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; break; } else { map3.put("key", str2); map3.put("value1", ""); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; } } }

    • ベストアンサー
    • Java
  • python/変数の変換

    今ソフトを作っていて調べてもわからないので困っています 合計した数字をtotalという変数に格納しているんですが ファイルへの書き込みの際にf1.write(total)と書くと typeerror: argument 1 must be string or read-only character buffer, not int というメッセージが出ます totalの中身はintengerなのですが それをstringに変換する方法はありませんでしょうか? これがソースコードの一部です n = input("N_data> ") p = input("P_data> ") total = n + p f1.write(total) また三行目と四行目の間に str(total)といれてみましたができませんでした 以上です よろしくお願いいたします

  • シートの全データを2次元のテーブルに格納したい

    シートにある全データを2次元のテーブルに格納したいです EXCEL VBA 初心者です。 シートにあるデータを一時的に同じ状態で二次元のテーブルに格納するにはどのようにしたら良いでしょうか 変数宣言から教えてください。 なお、このデータの中身は文字、数字、日付と様々で、行数も列数も随時変わります。 宜しくお願い致します。

  • perl 変数 代入

    恐れ入ります。 Perlで、フォームから送信して、変数に代入したいのですがうまくいきません。 print qq!<form action="./xxx.cgi" method="get">!; opendir(DIRHANDLE, "./xxx"); foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; print qq! <input type="checkbox" name="$_" value="$_"> <input type="submit" value="送信"></form> とし、ディレクトリ内のフォルダ名をnameに格納してxxx.cgiへ送信します。 xxx.cgi側では、 #!/usr/bin/perl use cgi; $form = CGI->new; として、送信されたデータを次々と代入したいのですが、どのようにしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • グラフィックボードについての質問です。

    グラフィックボードについての質問です。 こんにちは、新しく mini-ITXのPCを自作している者です。 なるべく性能の良いグラフィックボードを探しています。 主要な構成は以下のとおりです。 ケース: WiNDy MC3 FX M/B: GIGABYTE GA-H55N-USB3 Rev.1.0 CPU: intel Core i7 875K 電源: オウルテック SS-650KM 光学ドライブ: pioneer BDR-S05J-BK/DVR-S17J-BK HDD: WESTERN DIGITAL WD1500HLFS×2 (RAID 0 を構築) メモリ: A-DATA AX3U2000XB2G9-2X です。 ケースの仕様により。1スロット分のスペースで運用できる高性能なグラフィックボードを探しています。 どなたか、ご教示頂ければ幸いです。 よろしくお願い致します。