Title
アセンブリ言語によるアンケート・データ3次元集計の
事例研究−複数回答、多重回答項目の復元の自動化−
Author(s)
阿部, 亮一
Citation
沖大経済論叢 = OKIDAI KEIZAI RONSO, 12(2): 69-118
Issue Date
1988-03-31
URL
http://hdl.handle.net/20.500.12001/6785
アセンブリ言語によるアンケート
3次元集計の事例研究
・デ
夕-複数回答、多重回答項目の復元の自動化一
阿部亮 I課題と対策 はじめに 1前作プログラムの問題点 1.1限定された自動処理の対象項目 1.2使用言語の問題 2対策 2.1対象項目 2.2使用言語 Ⅱプログラムの詳細 lAssemblerSourcefileの基本構成 2定数定義およびマクロ定義 2.1定数定義 2.2マクロ定義 3諸元テーブル等4progO(その1)対象項目番号の入力
5progO(その2)対象項目諸元テーブルの作成
6proglデータ読みこみと計数
6.1progl主要部 6.23次元分類と計数Subroutine 6.3BUFFER内Record移動Subroutine 7prog2合計算出 7.1prog2主要部 7.2X軸方向合計Subroutine 7.3残余合計routine 8終末処理ほか9prog3BASIC配列領域への配列転送
10BASICからの利用例 おわりに -69-I課題と対策 はじめに 報告者はこれまで、パソコンによるアンケート調査の集計と分析に関する2つ の報告を本誌に掲載してきた〔文献1~3参照〕。それらで述べたように、この 調査は科学研究費助成研究の一環として行われた沖縄県内の1千余の家族を対象 にした大規模なもので、質問も多方面にわたり、コンピュータ処理に適さないも のも含まれていた。これをデータ構造の決定から、入力の実施とチェック、クロ ス・テーブルへの集計、その棒グラフ化を含む表示まで、多くの時間を費やして 実行したが、その経過を再検討し、他の同様の処理にも適用できるようにプログ ラムを整理拡張して発表したのであった。 本誌前号および本号〔文献2,3〕に掲載したプログラムwQNR-ANLLBAS,, で、多様な処理とかなりの汎用性とを両立させた自動処理システムが一応完成し ているが、そこで指摘したようにいくつかの問題点が残されている。 ことに、自動処理可能な項目が、1つの'且I答肢(選択肢)だけを選択するもの に限定されているのは、汎用1性を損ねている。 また、使用言語がインタープリタのBASICであったため、実行速度も遅く、 他機種への移植が難しいという実行上の問題のほか、プログラムの規模が大きく なるにつれ作成や修正が加速的に困難さを増していろ。 この2点の改善を試みたのがこの報告である。 前者については、多重回答項目の処理まで自動処理可能にした。後者について は、マクロ機能のあるアセンブリ言語で記述することにした。 これによってより汎用性の高いシステムを作ることができ、さらに見通しの比 較的よいプログラムで処理の飛躍的な高速化を実現できた。 なお、使用したパソコンは、これまでと同様、NEC社の16ピット機PC-9801 Eに8インチおよび525インチのFloppyDiskDriveを外付けし、printerに はブラザー社製M-1024P(10インチ輻)を用いたシステムである。使用OS は、米国MicroSoft社のライセンスをえてNEC社から発表されているMS- DOS(Version211)、使用言語は、これに付属していたマクロ・アセンブラ MASMである。また、表示等に、前作のプログラムを使うため、同DOS上の -70-
BASIC(NEC社製、N88日本語BASIC(86)VersionLO)も用いている。 1前作プログラムの問題点 1゜1限定された自動処理の対象項目 先の文献2,3に掲載したプログラムwQNR-ANLLBAS,,では、自動処理 できる項目は、回答肢の中から1つだけ選択する形式の項目(単純な形式である ため単純回答項目あるいはたんに単純項目と称した)、それも回答肢の数は記録 と処理の都合から無答とその他回答をいれて16以下のものに限られていた。その
ほかの項目が現れたらプログラムの一部を個別に手直しして処理したのである。
この方針は、この単純項目がもっとも多く見られる形式のため、合理的であった。実際、例外項目の処理問題はおもに分類集計のところだから(総計や平均、百分
率のとり方にも影響が出るが)、ここにスペースを設けておき特殊処理用の
routineを書きこめるようにしておいた。㈱1.1 単純項目以外の項目でも、できるだけ自動処理の対象に加えることが好ましい。 その可能性をみるため、自動化の対象とならなかった項目を分類してみてみよう。 ただし、名称は便宜的につけたものである。また上記のように自動処理に適した回答肢数計16以下の項目を普通項目とよび、これを越えるものを過大項目とよ
ぶことにする。 ①複数(回答)項目Pluralmns.)item 「3つ選べ」というような、回答肢を既定の回数選択させる形式をさす。この 処理は過大項目でなければ簡単である。単純項目がその回数分並んでいるものと して、対象位置を1桁(byte)ずつずらしながら繰り返し集計すればよいからで ある。 ②多重(回答)項目Multiplex(ansjitem 「いくつでも選べ」というような、回数に制限をおかずに回答させる形式をさ す。適当な言葉が見あたらず、また記録のさいにデータを多重化圧縮しているの で、このように称した。この種のデータは、単純に対応すると回答肢の数だけ欄 数を設けること|こなり、RandomfileのRecordの標準容量256bytesを超過する 要因になる。これを回避するために、データの圧縮を当初から意識して行っていろ。 -71-回答肢選択の有無を1と0で表せば、その並びは2進数とみなせるので、それを 4つごとに区切って16進数1桁に変換して記録処理することにしたのである。4 分の1に圧縮できるが、反面、参考リスト1に見るように、専用のcodingと解
読(decoding)のroutineの作成が必要になり、さらにBASIC使用のためか
なりの時間をとられることになった。由L2 ③過大項目 回答肢が15以上もあって、printerへの打ちだしなどが複雑になる項目である。 表示するだけなら、その項目が縦軸方向にくるように指定すれば可能であるが、 他項目と相関関係が不明瞭になりやすいし、それ自体でもあまり細かな分類は データが分散しすぎて統計的な意義が薄くなるので、一般には避けるべきである。 もしあれば、まずより大きな分類に統合してから分析にかけろ。住所や年齢、家 族類型がその例であった。 ④実数項目 面積や収入韻のように連続した数値一数学的意味とは異なるが現実の数値と いう意味でここでは実数と呼ぶ-を、そのまま記入させた項目である。区分け の数が非常に多いことに相当するから、上記の過大項目の1種でもある。したが って同様に、他項目との関係を分析するには、階層分けの作業が必要になるから、 この種の項目は避けてあらかじめ階層分けをして選択させるようにしておくのが望ましい。ただし、対象の統計的構造が不明確な第一次接近の段階では、まず実
数で記入し後で分類を繰り返しながら最適な分類基準を求める必要がある場合も
ある。 住宅広さがその例であった。この場合にはその過程で、怪我の功名に近いが、回答が5坪の整数倍に集中していることが見いだされ、5の公倍数を中央値にし
た区分をすべきことが明らかになった。と同時に、回答の情度を推測させる資料 にもなった。〔文献3、Ⅳ。1.⑤参照〕 ⑤複合項目 関連した複数の`情報を複数のcode系で、たとえば記号化情報と実数の組み合 せの形で、データに盛り込んだ項目である。②と同様、占有桁数を節約できるが、 その解読などは困難をともない、処理に時間を要することになる。 この例の1つは、年齢の項目で、1桁目は年齢階層をアルファベットで、2桁 -72-目は年齢の下1桁を表示していろ。また、出身地の項目はもっと複雑で、1桁目
は、県内出身の場合に県内用数字codeの上位桁が入り、県外の場合にそのアル
ファベッルcodeが入って、国。県の内外区分も兼ねている。また2桁目は県内のみで、通常は数字codeの下位桁が入り、配偶者と同部落出身の場合は上記下
位桁に対応したアルファベット(0にA、1にBのように)が入っていろ。この
ように2桁をそれぞれ2重に使うことで所要桁数を半減しているのである。その 反面、復元は専用routineを必要とし、煩雑になるのは避けられない。 詳しくは後述するが、これらのうち出現例の多かった①と②が自動処理化の対 象となった。) 曲1.1BASICで記述されている前作プログラムでは、:リスト6「原データ 読み込み、集計」が分類集計を担当しているが〔文献2,95頁〕、この部分が1960行で終ると、続くリスト8「合計計算Summing」は3000行からはじめ
ており、1000行分の余裕が特殊処理routineのために設けてある。実際組み込 んだVersionもあったが、複雑になりすぎて、bugが出やすかったうえ、第3者の理解をよりむずかしくするので発表用には単純な方式にした。参考リストlは
多重項目の処理を組みこんだ例である。 ㈱1.2参考リスト1は、文献2のプログラムの原データ読み込み、集計部 (同リスト6)の一部を、多重項目(番号134、問7ほか)の処理用に修正した ものである。1830行のSubroutine名を書き換え、この処理のためのSubroutine↑*Q7.RD,を2000行から書き加えていろ。lrecordCとに変数G
を増加させて桁をずらしながら(Q7は3桁表記なので3回)、8までの2のべ き乗と論理積(AND)をとって解読し、,*CC,でCellの数値を増加させて いくのである。2060行は無答処理である。〔㈱11参照〕 参考リスト1BASICによる多重項目の処理例1720,===二二二二====原データ読み込み、集計
1730*CALC -73-l7700PENGDRV$+":FAMFLoDAT,,AS#1
1820PRINT,,StartedReadingdataon,,TIME$
l830GOSUB傘Q7oRD,*NORMLRD,###point
l840PRINT,,Endedabove,andStartedSummingon
l850GOTO*SUN 1860, 1870*NORMLRD 1960RETURN 1970’ 2000*Q7.RD 2010FORI=lTO11922020GET#1,I
2030YA=VAL("&Ⅱ''+P$(YN))
2040ZA=VAL("M,w+P$(ZN))
2050M$二P$(XN)
20601FM$=''000',THENXA=O:GOSUB*cc:GOTO2140
2070FORG=lTO3:QM=VAL("&H"+HID$(N$,G’1))
2080IFQM=0THEN21302090IFQNAND1THENU=G*4:GOSUB*CC
2100IFQNAND2THENW二G*4-1:GOSUB*CC
2110IFQNAND4TIlENW二G*4-2:GOSUB*CC
2120IFQ1UIAND8THENW=G*4-3:GOSUB*CC
2BONEXT,G 2140NEXT,I2150CLOSE#l
2160RETURN 2170*CC2180C(M,YA,ZA)二C(XA,YZ,ZA)+1
2190RETURN 3000’---Summing---toimp,,TIME$
ユmprove 1.2使用言語の問題 プログラムの記述は、上述 プログラムの記述は、上述のようにパソコンではもっとも多用されているMicro Soft社系のインタプリタBASICのMS-DOS版で行った。このBASICは、 与えられたすべての機能を単独で実行できるインタープリタなので、操作が簡単 で、記述や修正が容易なうえ、暴走しにくいなど使いやすい言語であるが、広〈 -74-指摘されているように大きな問題点を抱えている。今回もそれらに災いされてい る。 まずプログラム作成に関して、行番号に縛られ、局所変数が使えないため、部 分的な挿入や移動がむずかしく、機能のブロック化も徹底できず、したがって既 成routineの部品化(別プログラムでの活用)も他のコンパイラなどより困難で
ある。本例でも、行数が増えろと急速に行番号やラベルの管理が面倒になり、誤
謬も多くなっている。さらに、機種による個別化が進んでいるため、他機種への
移植性が極めて悪い点も問題である。つぎに実行上の問題では、やはり実行速度が低いことに集約されよう。低速の
外部機器に出力する分析の段階では必ずしも遅いとはいえないが、原データの読
み込み、集計(合計算出を含め)では、RAMDiskを使用し単純な項目ばかり
を対象にしても20秒近くを要し、これが複数回答の時には急増して、複数の条
件をつけろと2分を越えた例もあり、かなり待たされることになる。高速化が望
まれろ。 ところで、これらの欠点はBASIC言語そのものに由来しているのではないこ とに注意しておく必要がある。速度の点では、ここで用いたインタプリタとコン パチブルなコンパイラがセットで販売されており、これを使えば一応解決する。また、行番号も不可欠なものではなく、これを使わない構造化プログラミングに
適した製品もあるのである。㈱L3しかしこれらは、日本の現状ではポピュラーでなく、他方に普及した高性能な
言語が複数あるので、固執すべき理由はない。曲13米国では最近、機能を大幅に向上させたBASICコンパイラが発売さ
れていろ。MicroSoft社のQuickBASICと、Borlandlnternational社の
TurboBASICがそれで、行番号は不川で、優れたデバッグ・ツール等を備え、「MS-DOS上で単独に尾行可能なプログラムやデータ」(文献4,218頁)を
作成する本格的なコンパイラに成長しているようである。 2対策 そこで、次のように対応することにした。 -75-2.1対象項目 自動化対象外の項目のうち、出現率が3回以上と高く、分析担当者から要請の 多く出た①の複数(回答)項目と②の多重(回答)項目を対象に加えることにした。 ③の過大項目以下、実数項目や複合項目は、個別的に処理するのが妥当であろ
う。多用される年齢階層別や地域区分は、すでに別プログラムで再分類し新たに
設けた項目に書きこんでしまっており、分析にはこれで十分対応できている。
ところで、①の複数(回答)項目は、単純項目がその桁数分並んでいるにすぎないから、対象位置を1桁(byte)ずつずらしながら単純項目用の集計を繰り
返せばよく、処理は簡単である。②の多重(回答)項目は、4桁ごとに2進数化
されているのを効率的に解読する工夫が必要である。 2.2使用言語言語は、最高速を実現できるが使用がむずかしいといわれるAssembly言語を
使うことにした。先のBASICインタプリタとの、作成上および実行上の差異を
見いだすことができようし、Assembly言語の社会科学分野への応用におけるそ の可能性と問題点を考える素材もえられよう。 具体的な使用言語は、わが国の16ビット機用ではもっとも普及しているMS-DOS上のマクロ機能つきのAssembler、MASM(MicroSoft社製、Version
l27)とした。これは、MS-DOSのSystemDiskに付属していたもので、古
いve「sionだがこれしか手元にないためやむをえなかった(その後機能拡充して 独立のソフトウェアとして販売されていろ)。 さてこのMASMは、「一般に大型コンピュータのアセンブラにしかみられなか った多くの特徴を備えています。……他のマイクロコンピュータのアセンブラに 比べて多少複雑ですが、使い易くなっています。..…・リロケータブルなオブジェクトコードを作成します。……したがって、……最も効率のよい場所で実行で…
時間を節約することができます。……マクロ機能によって、頻用される一連の命
令に)Hいるコードブロックの書き込みを行うことができます。したがって..…・新
たにコーディングする時間が節約できます」〔文献5,1-2頁〕。
このほか「マクロはwネスト”できます。つまり、マクロは他のマクロ内部か
ら呼びだすことができるのです。……また……その名前をマクロ名として使うと
-76-とによって任意の命令、あるいはディレクティブの働きを、変更するためにも使 用できます]〔同、3-4頁〕。さらに、条件ディレクティブの拡張セットもサ ポートしており、間違ったオペランドのタイプ選択をある程度訂正する能力もあ るなど、かなり高機能のAssemblerである。 プログラムの作成手順は、まずAssemblerの書式、文法にしたがってsource プログラムを作成し油L4、これをAssemblerにかけ、errorが出れば書きな おし、無事通過すればObjectfileをうろ。これを、必要ならLibraryを参照・ 引用しながら、Linkerに通して、実行可能なEXE型fileをうろ。コンパクトな COM型fileにするには、さらにEXE2BINプログラムを通さなければならな い。こうした煩さな手続きを要するが、これは高機能なコンパイラに共通のもの であり、これによりSoftware資産の蓄積と活H1、他言語との連結が可能になる ので、甘受しなければならないであろう。 なお、Sourcefileの作成などに、Editorと呼ばれる編集プログラムが使わ れるが、MS-DOSに付属しているEDLINEXEは、1行ずつ編集していく 古いタイプのいわゆるLineeditorで、複数行の一括転送などはできず、文字 の挿入訂正なども面倒であるなど、非常に使いにくい。そこでカーソルの移動が '二1由で、記述や訂正が容易かつ高速であり、複数行の一括処剛やWindow機能に よる複数Fileの参照複写などの高度な機能を侍ったFullscreeneditorが多 用されている。その多くはChild磯能をもち、上記のコンパイル全過程の実行や 実行fileの試行を向らを終了させることなく行えろなど、Software開発の要 (かなめ)の役割を果たすものになっている。ここでは、その中で機能は少な目 だがコンパクトでI高i速なEZEditorを使月]した。樹L5 油L4MASMでのEXE、COMそれぞれの書式については、文献6の28 「・COMモデル(8080モデル)のコーディング書式」ほかにわかりやすい解説 がある。 油15パソコンでは、Fullscreenedit()rとして、当初はWordstarとか WordMasterといった英語wordprocessorが使われた。その後、それら入力 編集部分を独立させ、機能強化を図ったものが続々製品化され、本文で述べたよ うに、その役割は非常に大きくなっていろ。それだけにEditorには、速度、使 一77-
い勝手、機能の質量、メモリ占有量などできびしい条件がつけられている。わが 国では日本語表記の問題が加わり困難さが増すが、メーカー間のはげしい競争も あって、今日では実用性の高い製品が登場していろ。 MIFES-98(メガソフト社)とFinal(エー・エス・ピー社)がその代表格と されていろ〔文献7,145頁参照〕。しかし両者とも廉価ではなく、メモリを
80kbytes以上も占有する。筆者は、必要な機能を一とおり揃え最高速を誇りな
がら、安価でメモリをわずか20kbytesしか占めないEZeditor(パソコン・
ワールドJAPAN社)を専ら使用していろ。「EZは……数々の新機能を有し、
かつ……モニター・ユーザーの意見を取り入れ、改良を重ねて……そのプログラム・サイズからは想像もつかない高機能・高操作性」(文献8,3頁)を実現し
ている。Sourcelist付で改造も可能という極めてユーザ・フレンドリなSoftwareである。文献7でも取り上げられている(150-152頁)が、西田雅昭氏が詳し
く紹介しておられろ〔文献9,126-129頁参照〕。さらにEditorは、その高速性と高い編集機能をかわれて日本語入力プロセッ
サ(FEP)と組み合せて専用の日本語wordprocessorよりはるかに高速で便利
な文書作成Softwareとしても使われていろ(本稿もこの方法で書かれている)。
Ⅱプログラムの詳細 1AssembIerSourcefiIeの基本構成とのプログラムの目的は、、FAMFL・DAT,という名前のRandomfileに収
まっているアンケート調査データ(170項目、253bytes/record)約1200件
を対象に、特殊なものを除く任意の3項目を軸とする合計欄つきの3次元配列を
設定し、これに全Recordを分類・計数し、各軸の合計も算出して配列を完成さ
せ、表や図に利用できるようにすることである。なお配列は、全要素が2bytesの整数を表示する形式とし、先頭の軸から添了:
数を順次増加する'1頂で並べることにする。これは、各要素がサイズの面で、アン
ケート集計の一般的な形として該当する件数とその合計を入れるだけでいわゆる
INTEGERで十分(65,000余まで表示可能)なため、またBASICプログラ
ムとの連係にもその整数配列としてそのまま使えるためである。
-78-プログラムの名称は、3DimenSionsCountingの意味で、3D_COUNTと した。 そして構成は、リスト1の6-12行燭2.1にも略記されているが、以下のよ うになっていろ。 冒頭には、Assemblerの書式にしたがって、定数定義とマクロ定義の領域があ る〔文献5,6参照〕o 続いて、progO(0段階とでもいうべきか)と名付けた準備段階がある。そこで は項目番号を入力させ、それに応じたさまざまな定数等をfileの中のテーブル (Table)に書きこみ、3次元の配列用領域を確保する。 次のproglがこのプログラムの中枢といえる部分で、原データのはいったfile
をopenし、lRecordずつ読みこんでは、3項目の回答を調べ上記配列内の対応
欄を特定し、そこの数値を1つ増加させる計数作業を行う。なお、複数(回答) 項目と多重(回答)項目の場合は、それぞれ解読のroutineへの自動的に導かれ 処理されろ。 prog2では、3つの次元の合計を計算し、上記配列の全欄を埋める。prog3は、BASICと連結する場合に、この配列をBASICの配列領域に機
械語で最高速で転送し、直ちに利用できるようにするroutineである。 以下、内容を見ていこう。 曲21リストに行番号がついているが、これは本来ないもので、説明の便のために印刷時に印刷用のUtilityPU・COMに行番号付けのoption指定をし
ただけのものである〔文献10参照〕・一般のBASICでは行番号は不可欠である が、AssemblerやCompilerはそれから自由であり、むしろコンパイルのさい に1よ取り外さなければならない。 Ⅲ一 a一 r- 9一 。l rl PnU’ 11’ 9ロー n句フ一 一.ml- nQU- u0ゴー sq1一 一0.l e一 一、IOD一 一T△a八A’ -48・厄ol -nUanK一 一。■。一 一、しy- -RB0d0D一 一H叩e一 一八As一 一【脳s- e一 一rr一 一九m一鉢一 ol c一s刃 一rr一叩一 一eo一勺L -0df一一屯1 -。 -0 -cr一千一 一ee一 一【UBd一s ola -0nC一 一十Ue一s -.10.-0K 一U 一r 一0,M胆一o 一tS一日 一MM.1A八一 一【、9.-Ⅲ lAAJ1守1一a 一otNm-r lmlnMU’9 -NmunvlO lwUor〕一r lnvC一一P |〔しn】一 10--0.勺。ls lnU -.1 日卜一つ。tel0n rV一$1スー
0a一 ss一* Ⅲシ一 一* ●p●9●?●9●、●P ●●●●●●●●●■●● 。■■■▲〈F〃ぬ】(、くり)△nm一二戸.【D二一口』⑪〉■●●●●●●●■●ロ●●●●●●●●●●●●●●■●●●●●■●●●●●● 【〃JUnHm》〈皿訂聿《nmm〉●■■0-(】〃尻】(・く、)二m加『」一・【ロニニグ(叩〉[UUn0(叩■、)(叩四訂》〈、u〉①□Ⅱ(〈■〃必】へ、(Ⅱ)二m扣些△芦阯【Ⅱ三 つⅡ■△|■■□へ△Ⅱ■』ロロ■■△QD0二・一■■一・、ロ。△d00△ニヨロロユ。。Ⅱ△(、/】(四〃巫】、〃〃】n〃丘】《叩〃必】ハグヱ】 ;pro90...inputltemno.&makeconstantstable ;pro91...readdatafromdisk,sortthemto3dimension, &countarrayscell(arry-offs~)up (multiplexitemsareautomaticallydecoded) ;pro92...sumupeachdimensionofabovearray ;pro93...optionallytransferabovearraytoBASICarrayarea ;-.‐----------------=----一一一一==--‐‐-=一 ;ConstantsDefinitionS ;-.---‐-~=--~へ--------=-------=--=- item-no-buf-szequ 6 100h rec-sユze equ ll92 1ast-rec-noequ;4A8h 犯 records、bufferequ;8clst/trk・4rec/clst=1track arry-offSequ3000h;<-mOOh CSEGSEGMENT ASSUNECS:CSEG,DS:CSEG 2定数定義およびマクロ定義 2.1定数定義(リスト1,14-21行) 参照や修正を容易にするために、プログラム中で使用する定数を冒頭に一括し で定義しておく。《equ,文で定数名と数値をリストlのように並べていく。大 規模なプログラムでは、この定義だけでfileを作り、ブロック化された各部分 プログラムでは、これを《include,命令で読みこんで、他部分と統一を保っ ていろ。そのさいには、あるブロックで使うが他ブロックで定義されている定数 は、,extrn,(external)指定しておく必要があり、この定義邪分が長大になる ことも珍しくない。 本件では、sourcefileを分割しなかったため定数を厳格に管理しなくてよい
ので、少なくなっていろ。内容はつぎのとおりである。〔〕内は行番号である。
〔17〕item-no-buf-szは、Keyboardからの項目番号入力のさいに使 うbufferのサイズを6に指定する。これはマクロ3で指示するためである。 〔18〕rec-siZeは、recordのサイズの』意で、16進数で100,10進数で 256である。〔19〕last-rec-noは、最終record番号の意である。通常はfileの終端
-80-,EOF,をチェックするが、事前にわかっているときには番号を直接指定した方
がチェックが簡単で早くなる。 〔20〕records@.bufferは、Diskからの原データを受け入れる入力buffer の容量をrecord数で表示している。このBUFFER(他と区別するためこの bufferのみ大文字で表記する)は、8インチDiskのltrack分を一度に収容するサイズ(16進数で2000,8kbytes)としているので、record数として
は32となる。油2.2 〔21〕arry-offsは、集計用配列の頭の位置(offset)を示す。ここでは、 16進数で3000番地からである。その後、segmentの指示(ディレクティブ)がなされて〔23,24〕、つぎに移
っていく。 油2.2bufferのサイズをltrack分と大きくしたのは、これ以下では、Ram Diskを使った処理時間がかかるためである。lrecord分でも、読みだし単位 であるlkbytes(4records分)でも$ほとんど変わらず、ltrack分一括転送すると急に速くなった。時間のかかるrecord位置の確認や転送の操作が、1周
分の場合は連続してできるためではないかと推測されろ。 2.2マクロ定義(リスト2,26-196行)Assemblerは、CPUに直接指令を与える言語であるため、高速性と講密性
を期待できる反面、非常に細かな記述が必要で、勘違いや書き違いにより微細な誤りが発生しやすい。記述の上では微小な誤りでもプログラムとしてはしばしば
致命的となる。しかも言語の性質上、その誤謬の検出と対策はむずかしい。そこ で誤謬のなくなった基本的ないし部分的な機能ブロックをマクロとして切りだし、再利用に備えておくことが有効かつ必要となる。Libraryに加えて蓄積していけ
ば、より利用しやすくなり、生産性も確実に高まる。 「マクロディレクティブを用いることにより、ユーザーは、何度も繰り返して 現れるコードブロックをマクロで書き換えることができ」(文献5,91頁)ること を利用して、「あるまとまった機能を持ったマクロをいくつか定義しておくこと によってあたかも高級言語でプログラムをしているように効率的にプログラムす -81-ることができろ」(文献11,128頁)のである。 マクロはユーザー間でも共通化するのが望ましいので、ここでは、マクロ Assemblerのマニュアルに掲載されているのは、できるだけそのまま利用する ことにした。MS-DOSのシステム・コール(INT21H)の利用に関するもの で、簡単に列記しておこう。 号1235678 番 名称 display beep flash-get-string set-disk-buf open rnd-block-read close 機能〔文献5での頁〕 文字列(string)の表示に関するcall〔44〕 音出力。文字のScreen出力の1種〔32〕 keyboardからの文字列入力〔50〕 Diskとの入出力bufferの番地設定〔74〕 fileのoepn 〔54〕 ランダムなblock読みだし 〔90〕 fileのclose 〔56〕 なお、システム・コールによるfileの管理には、初期型のFunction(OFH から28Hに存在)と新型のもの(3DHから)とがあり、「古いファンクションに
は、ファイルの階層構造がサポートされていないなど、いろいろな支障がありま
すので、特別の目的以外には使用しない万がよいI(文献12,189頁)とされて
いる。しかし前者は、Filecontrolblockを直接操作できる利点があるため、
このプログラムでは、こちらを使用していろ。つぎに、独自に作成したマクロ定義の名称と機能を簡単に列記しておこう。そ
れを呼びだす箇所で詳細に説明されるものもある。 号49012 111 番 名称 decimal-inp-chk block-storew hasc2bin ltem-contents rest-rec-num 機能 入力した文字の10進数チェック。非該当は再入力へ。 word埴位のblock転送16進Ascii表示を内部処理の2進数(binary)に変換。
指定する項目の内容を取り出す。 bufferblock中の残りのrecord数 -82-l3base-adr-@aray 11番と組み合せて、Y、Zの値を解読しそれに対 する3次元配列の基準(X=Oの)番地を算定 Directionflagのsetをチェックする。 13番の番地にXの偏値を加え、番地を特定する。 Y、Zの値に対する3次元配列の基準(Z=0の) 番地算定 456 111 chk-dir-Hag adr-X-countup ser-base-adr@ary 4 t 4 u P p n 1 1 一一m d t l一n r u lla a P l一田 加 、 一一■. ・1t 一一f y u 「一一e e rP 一lr K an 一一く 1.ユ ー一 d u一 一一 e ge 一一 r er 一-91 e r l一、1 f rn 一-.1a f .Ⅱe 一一rc u h -一t B ft 一一s・ k ・1 .-一 c c ●、●9 -一yn e t 一一au h ・1 一’1f c Ⅲ e l|P ・1 r l一ss r lr u l-.10 。 Od R -一.D f ra ・工 一一●9■p●、 ●9 .l f ll g agt ll n ln・ュ r l一 ・工 9.1田 d J ll r nr・1 a X l一 t ・工t1 b l一 s rs9 Pに ’一 tr ntr ll t std ・1.1ed l一 e ea Xra -一 s 0sl eu一 一一gf Rfghh 0,9Ph -s一nf CfnAc Rt・工n0t 一n一・1o9 27 A。・100 C1f・131 》Clr,,h ,0h Nor00h Au,,,u 一位一二帥血小皿 二h11 きxt1h1 二ⅡaX11a 二ad2 二dsaa2 二fbaaf -・工一宝 一一 三g 一一 一nl n k -.1- ・工 h 一f一10 20 3r 4c1 -肥-0肌vVt0OCvvtDOsvVVVt0OPcVVb H R H t H la l一肌肌函、.m剛肌朋、、.m剛肌t-mmmm。m剛肌・mmmm則北 一0-A A Ae A’ 2一R一Ny H Hg H1 トー肌一m a h Ⅲ スーⅡ一幸卵 二p 二s 二・工 二e 二u 二c リ」,。,」,E,血 二e 二1 二e ・,b .,f 。,d ■●●●●●●●■●●●●●●●●●●●●●●●●●●●●●、●●●●●●●●●■●●●●●●●●●■●●●●●●●●●●●●●●● 678901234567890123456789012345678 222233333333334444444444555555555 -83-
cmp
a1,9.
jbe
exit
,
MACRO
5
---set_disk_buf
MACRO
buffer
;set Disk Transfer Address
(p74
mov
dx,offset buffer
mov
ah, lAh
int
21h
DOS func. call
ENDM
;===
MACRO
7
===
rnd_block_read
MACRO
fcb,eount,rec_size ;random block read (p90
mov
dx,offset fcb
.
mav
cX,count
mov
word ptr fcb(OEh),rec_size
mov
ah,27h
;Block Read
int
21h
ENDM
,
---
MACRO
8
---close
MACRO
fcb
:file close
(i>56
mav
dx,offset feb
mav
ah.lOh
int
21h
DOS fune. call
ENDH
. 3eh
;g~neral
case; moy al,OFFh
MACRO
offs,nums,wordl
di,offs
eX,nums
ax,wordl
ENDM
beep
display re_inp
jmp'
no_inp
,---MACRO
6
---open
MACRO
fcb
;open file
(p54
mov
dx,offset fcb
moy
ah,OFh
;open file
int
21h
,DOS func. call
ENDM
,
MACRO
9
block_storew
moy
mov
mov
cld
exit:
fault:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69·:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
-84-104:
rep stosw
105:
ENDM
106:
107:
;===
MACRO 10
---108: hasc2bin
MACRO
;(a1) ascii -) binary
FEh=no
go~d109:
local
a2b_2,a2b_3,a2b_ng,a2b_o
110:
cmp
al,30h
;if
{o
111:
jb
a2b_ng
;then
NG112:
cmp
al,39h
;i£
}9
113:
ja
a2b_ 2
;then nex·t chk
114:
sub
al,30h
;0'9 -)al
115:
jmp short a2b_o
116: a2b_2:
cmp
al,41h
;if
<A
117:
jb
a2b_ng ,
;then
NG118:
cmp
al,45h
;i£
)F119:
ja
a2b_3
;then next chk
120:
sub
al,37h
;yes -)Oah'Ofh
121:
jmp short a2b_o
122: a2b_3:
cap
a1,61h
;if
<a
123:
jb
a2b_ng
;then
NG124:
cap
al,65h
;if)f
.
125:
ja
a2b_ng
;then
NG126:
sub'
a1,57h
;a'f-)ah"'fh
127:
jmp short a2b_o
128: a2b_ng: mov
al,OFEh
;no good data=FEh
129: a2b_o:
xor
ah,ah
130:
ENDM131:
132: ;===
MACRO 11
---133: item_contents
MACRO Address,Size
. 134:
local
it_ct_o
135:
mav
si,Address
136:
DQVdX,Size
137:
mav
al,BUFFER(si)
138:
hasc2bin
139:
cmp
a1,dl
140:
jb
it_ct_o
141:
!1OVal,dl
142:
dec
a1
143: it_ct_o: xor
ah,ah
144:
ENDM145:
146: ;===
MACRO 12
---147: rest_rec_num
MACRO
records@buffer
-)cx
148:
xor
ax ,ax
149:
mov
al,FCB(20h)
;current rec. offset
-85-
-86-dec
ax
;last
rec~offset no.
BOV
cl,records@buffer
;
I
block read size
div
cl
;residual -)ah
ItOV
cl,ah
;residual rec. no. ah _·)cx
END"
,
MACRO
16
---ser_base_adr@ary
MACRO Y?,Z?
Y?
Ibx,Z Icx II
=)di
moy
di,arry_offs
mov
ax,YT
;Y;
mul
Y?
;bl
;YT*Y?
-)ax
add
di,ax
moy
aX,ZT;Z
mul
Z?
;Z1.Z?
-}ax
add
di,ax
ENDH
MACRO
base_adr,X_ans_no
;=es,dx
Idi
di,base_adr
:di (-base adr. in array
di,X_ans_no
,
di,X_ans_no
; ..
+X.2
(= true adr.)
word ptr(di)
cout up above
;test for
OF
;check direction flag(ah) on=)ZFon
;Z1.Z
-)ax
;di(- arry_offs+YT.Y+ZT*Z
;Y
-)ax
;YT.Y
-}ax
;di(- ax
;di(- YT.Y+arry_offs
;Z
-)ax
; base address of
'3
dimensions array
MACRO
ax
ah,4
,
MACRO 14
chk_dir_flag
pushf
pop
test
ENDM
,--- MACRO 15
adr_X_countup
mov
add
add
inc
ENDM,
MACRO
13
---base_adr_@array
MACRO
local
y_offs,z_offs
y_offs: item_contents
YA,YS
IJOV
bx,YT
lIul
bxmov
di,ax
add
di,arry~offsz_offs: item_contents ZA,ZS
mov
bx,ZT
lIuI
bx
add
di,ax
aov
es,di
ENDM150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
3諸元テーブル等(リスト3,199-237行) COM形式のプログラムは、fileloadのsegmentのoffsetlOOHから展開 されろ。これを119行で指示し、次いでラベルSTARTを書いてプログラム開始 の印とする。なお、項目番号134,10,170を選択したときのこの部分の作 動前のdumplistが図表lに、終了後のそれが同2に示されているので、これ を参照しながら見ていこう6曲2.3 まずJumpテーブルがある(dumplistl行目)。各部分プログラムへの移動を 指示しているだけであるが、これによって、各部分プログラムの変更があっても 呼びだし口は固定でき、点検や利用が便利になる。同時に、プログラム外から も参照や書きこみの行われる諸元テーブルの各元(変数・定数)の番地も固定さ れ、非常に扱いやすくなる。完成した段階では、ここにはプログラム本体の頭の progOへのエントリとBASICへ引き継ぐためのprog3へのエントリしか残っ
ていない〔204-206行〕・残りは行末まで?jmp-tbl,という実際には使
ないdummyラベル名で0を埋めて、後方が移動しないようにしている。 図表1では以下3行は0で埋められているだけだが、起動後は図表2のように そこに諸元テーブルが書きこまれることになる。まず入力した3つの項目の諸元、 番号(XN等)、Record上の位置(XA等)、回答肢全数(XS等)、配列上の 位置要素(その項目のoffset分、XT等)を16進数としてきりがよくdumplist では1行で見やすい10Hごとに(それぞれ110,120,130Hから順に)配置 し、それぞれ後ろにRecord番号(REC-NO)、項目番号入力のbuffer(ITEM- IN)、BASIC配列のSegment(B-ARRY)、配列サイズ(ARRY-SZ)と いった定数等をおき参照しやすいようになっていろ。 さらに、テスト川の10H分のあき(FFで埋めろ)をおいて、150H番地から 37byteのFileControlBlocMFCBと略称)が配置されている。外部装置 にある(ileを入出力するのに使われるこのブロックは、図表3にみるように11 のフィールドからなっていろ。1byte目は、RAMDisk上に原データfileをおいているので4(=D:)とし、ついでfjle名を,、FAMFLDAT,,と全体が
8+3bytesになるように記入してある(前図表右側のASCII表示を参照のこ と)。第4,5,10,11のフイールドは本プログラムでは、頻繁に書きこみ参照 が行われる。 -87-幽23これらのdumplistは、MS-DOS付属の機械語レベルの点検修正 用UtilityDEBUG・COMのDump機能で表示したものである。その手続きは、 図表1では、入力待ち状態で,debugb:3d-count、com,と打ちこみ、つい でプロンプト’-,が出てからdumpを指示する、。,とそのaddressのoffset 値(16進)’100,(default値が100Hなのでここでは指定しなくてもよい) を打ちこむだけである。図表2は図表4の操作をした結果である。 リスト3 ●--- ̄---------- -------------- , ●●●●●●●●●●●●●●●■●■●●●●●●●●●●●●●●■●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● 【J0Unx叩》(叩司虫〈、叩》二勺0口(〈叩クヱ】(・くⅡ》△几]△P.n口》(□nm〉【TpD0(叩再皿》〈Ⅷ部》《一mm》ロロ日ロー《叩〃』へ。こ■)△扣夘]△F【、》{〃■叩)【〃〃,、■、〉(血uロシ《、叩》■■Ⅱ△〈囮〃】ヘロニコユムハ『今P【、》〆』血〉[〃Ⅱ,(叩伺)(叩■》《、皿v 〈叩】|シ(m切望《、〕々》《nW》(、叩U《nuu《、叩》〈、u》へⅢu》〈仰山》へ一m叩〉(、叩》《、叩》幻ⅡⅡ(①ⅡⅡ△勺ⅡⅡ(。□日日(|勺ⅡⅡ▲。Ⅱ0」。|ⅡⅡ一心ⅡⅡ▲幻0Ⅱ(己0Ⅱ△n℃〃】(T〃】、ロ〃unU〃】、〃〃】〈叩〃■n〃正】|、刀尻】n〃妃](切〆】(・くⅡ] 勺一日■(|屯Ⅱ■一口■■▲|【で〃】くむ〃】、刀庇】一m/】一m刀庇】(Ⅵ〃】、〃庇】一(刃〃】(T〃■〈うめ】、〃必】(叩久]《》〃】《西/】、夕狂】、クニ】〈亜〃尻】、〃庇】《U〃】バグ歴】〈T”】。(咀〆】(ツェ】n〃狂】(T〃】、クヱ】(宅〃】、〃妃】(刃巫】くむ〃】へ■〃】 ActualStartingPoint 一一 一一 一一 一一 一一 一一 一一 一一 一一 一一 一一 一一 一一 一一 」一 一一 一一 a e r a C I l一s 一 一A l lB 一 一 一-0 0’一 一t 一 一四 ・一 一ay - -ra --9rd l一。re l』rav - -Pr llre 一一fes l lofe 一 一sR -一.n 一 一aa7 - -erh - -htF -.’ 0 一 一,,1 一一 一hh{ ’ ’025 - -000 - -111 一 一●9●9●0 - - -一 一 一 一 一 一 一 一 一 一 一 、1 - - 0 - - く 一-03 一’9gP l -COu Ⅱ一一rrd 0一lPP 0-- 1 1一一t1 一lr l lC llh le一s 一1- 6|b一PP R|a|凪mb 0一t一・J・Jd l一 一p一 1 ..一n- b T一ul t R一J一 一 Al - P T一一 m S;;., 。』 ;---=一二~=------一=----一一二--=== ̄ ̄ ̄三一一一一 ;MainVariablestableonltems&FileControleB1ock ;--エーーーーーー一=----------=--=---=--- XNdwldup(O);110h,X-itemNo, XAdwldup(O);112h,X-itemAdr、 XSdvl ldup(O);114h,X-Ans.、。./offsetofsumcoL
XTdui1dup(0);116h,0ffsetofXSinarray(XS*2)
REC-NOdwldup(0);118h,recordnumbercount
dumlyldb4dup(O);11A~11Dh
XKdwldup(O);11Eh,FiguresofX
YN YA YS YT dummy2 1TElllN 1dup(0) 1dup(O) 1dup(O) ldup(0) 2dup〈O) 6dup(?) ⅣⅣUU0D0D ud0q0qud0d0d ;120h,Y-itemNo. ;122h,Y-itemAdr. ;124h,Y-Ans・no./offsetofsumcol. ;126h,Y-Intervalinarray(XS+1)*2 ;128~129h ;12A~12Fh,itemNo、inputbuffer ldup(0) 1dup(O) ldup(0) ldup(0) ldup(0) 酬酬四 Hq0d0d日dhd ⅣⅣUUP ;130h, ;132h, ;l34h, ;136h, ;138h, Z-itemNo、 Z-itemAdr、 Z-Ans.、。./offsetofsumcoL Z-IntervalinarrayYT(YS+1) Segmentofbasicarray ZT B-ARRY 88231: dUDUDy3
db
4
dup
(0)
;13A"'13Dh
232: ARRY_SZ dw
,1dup
(0);13Eh,
array s
,
size +1
233:
234:
tst
db
16
dup
(OFFH)
;140h,
write-in area for test
235:
FeBdb
4,"
FAMFLOAT"
;150"'174h, File Control Block (37d)
236:
db
25
dup
(?)
header=drive .no.{3=C: ,4=D:}
237: dummy4
db
3
dup(OFFh)
;175"'177h, fill,FF as end mark
238:
rgJ.l
~O~7k%~~~U*~$~~/~A>debu~ b: 3d_count. com
-d100 4755:0100 EB 76 E9 04 07 00 00 00-00 00 00 00 00 00 00 00 kvi . . . . 4755:0110 00 00 00 00 00 00 00 00-00 00 00 00 O{) 00 00 00
...
4755:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:0140 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF...
4755:0150 04 46 41 40 46 4C 20 20-20 44 41 54 00 00 00 00 · FAMFL OAT.... 4755:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:0170 00 00 00 00 00 FF FF FF-56 I.E 8C C8 8E 08 8E CO ... V.•H~.X•• -d7eO4755:07EO 03 F8 03 FB 03 FB 8B 05-01 04 41 EB DC 46 46 43 · x.
t.
i....Ak¥FFC 4755:0 7F9
EB CF EB 38 90 2A 70 67-33 2C 54 72 61 6£ 73 20 tOk8. tpg3, Trans 4755:0800 74 6F 20 62 61 73 69 63-2A 56 IE 8C C8 8E 08 8E to basictV..H. X. 4755:0810 06 38 01 33 FF BE 00 30-Al 36 01 88 16 34 01 42 · 8. 3.>.
0I6... 4. B 4755:0820 F7 E2 01 E8 8B C8 FC F3-A5 IF 5E CF IF 5E B4 4C wbQh.HIs%. "0. "4 L 4755:0830 CO 21 2A 42 55 46 46 45-52 2A 00 00 00 00 00 00 IltBUFFERt ... 4755:0840 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:0850 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
-d 28'00 4755:2800 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:2810 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:2820 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4755:2830 00 00 00 00 00 00 00 00-00 00 2A 54 61 69 6C 20 · ... traiI 4755:2840 6F 66 20 46 69 6C 65 2A-24 00 00 00 00 00 00 00 of FiIet$ ... 4155:2850 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4,155: 2860 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
4155:2870 0'0 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00...
-g181.2
~7~~~~~~U*~$~¥/~OO -d 3220 0100 EB 16 E9 04 01 00 00 00-00 00 00 00 00 00 00 00 kv i ... 3220 0110 86 00 C1 00 00 00 1A 00-00 00 00 00 00 00 00 03 .. A... 3220 0120 OA 00 11 00 OC 00 lC 00-00 00 06 03 31 37 30 00 · ... 110. 3220 0130 AA 00 FC 00 OA 00 6C 01-00 00 00 00 00 00 ,A4 OF t. I ...I ...$. 3220 0140 FF FF 01 00 FF FF FF FF-FF FF FF FF FF FF FF FF...
3220 0150 04 46 41 40 46 4C 20 20-20 44 41 54 09 00 00 01 · FAMFL OAT.... 3220 0160 00 A8 04 00 5A 11 CO A3-43 02 00 29 01 2B 01 00 • t••z.
'#C .. ).t .. 3220 0110 28 A8 04 00 00 FF FF FF-56 IE 8C C8 8E 08 8E CO (( .•.... V..H. X., -d8'3 , 94f 3220 0830 CD 21 2A 42 55 46 46 45-52 2A 30 39 35 31 35 31 HltBUFFERt095151 3220 0840 35 32 43 30 30 31 4F 39-35 32 31 31 30 38 33 32 52C0010952110832 3220 0850 30 31 32 4E 34 30 37 31-31 44 35 33 30 30 30 30 012N401110530000 322D 0860 30 30 30 30 30 30 30 30-30 30 30 30 30 30 30 30 0000000000000000 322D 0810 30 30 30 30 30 30 30 30-30 30 30 30 30 30 30 30 0000000000000000-89-322,:088030303030303030〕O-3O3O3O3030303030 322D:08903030303030303030-3030303030303030 322,:O8AO30303030303O3030-303O303030303030 322D:O8BO3030303030303030-3030303030303030 〕22,:O8CO303O303O3O303030-3O30303030303030 322D:08,03031303733303338-3033353432303031 322,:O8EO3430303030323430-303O303234303030 322D:O8FO3032433030303030-3430303030323430 322,:09003030303243303030-303043〕O30303030 322D:09103531313332303O30-3O30303131313030 322D:09203030303030303030=3030303130323242 322,:09303132323634303800-00003O3935313531 322D:09403532433030314F39-35323131303833.32 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0107303803542001 4000024000024000 02COOOOO40000240 0002COOOOOCOOOOO 5113200000011100 000000000001O22B 1226408...095151 52COO10052110832 ルド群 図表3 FCBのブイ 名前 く 大きさオフセットパ イ-8322422814 ト j 16進 O0H Ol~O8H O9~OBH OCH,ODH OEH,OFH lO~13H 14H,15H l6H,l7H 18~lFH 20H 21~24H
進08135913126
111122333 0--,,- -- 1192460243 1112223 ドライバ番号 ファイル名 拡張子 カレント(現在の)プロック レコードサイズ ファイルの大きさ 最後に書き込みが行われた日付 最後に書き込みが行われた時刻 予約域 カレント(現在の)レコード 相対レコード 出所文献13,3頁 デバッガ起動の実行画面 図表4A>copyb:famfLdatd:/v
1個のファイルをコピーしました A>debugb3d-count・com -glnputDriveNo,ofFAMFL・DATIC,D,E}
lnputtheObjectltemNo.(PIuralor
ltembeappoiutedtoX) X=134 V=10 Z=170 ProgramterminatednormaI1y d MultipulAns。 904progO(その1)対象項目番号の入力(リスト4,239三359行)
〔243-247〕まず、registerの退避とsegmentの統一を行う。
〔248-263〕つぎに、原データFAMFL・DATの入っているDiskDrive の番号(C、D、E)を入力させる。もしCR(CarriageReturn)キーが押され たときにはdefault値として4(D)を、FCBの頭に書きこむ。 〔264-278〕そして、図表4の実行画面に示されているように、下記の Sudroutine,item-no,を呼びだしながら、分析する3つの項目の番号をX、 Y、Z軸の順に入力させ、諸元テーブルの欄に書きこむ。そして、、chk-X,へ とんで、チェックした後作業にはいる。 〔280-290〕progOまでに使用する表示用の文字列をまとめてある。変数名の次の,db’はdefinebyteの略でbyte単位で割り付けることを意味する。
続く画13,10”はカーソルの復帰と改行のcodeである。そして表示は。$,
マークが来るまで一度になされる(284-286行も)。その他詳しくは文献5の
58-60頁ほかを参照されたい。〔292-324〕Keyboardから項目番号を入力させるSubroutine,item-
no’である。項目番号は3桁までの10進数で入力される(マクロ3,flash-get-string)から、内部処理の形式である2進数に変換しなければならない。それは 位ごとに処理しなければならないので、マクロ4の10進数チェックをへて、3回 積算しているのである。 〔326-359〕《chk-XA特殊項目をチェックするroutineである。前述 のように、複数項目と多重項目を処理対象に加えているので、それらのチェック をここで行う。なお処理の都合上、特殊項目は最初に(X軸に)指定することに している。 複数項目には、148番(回答回数あるいは桁数3)以下、152,156,158 番(同すべて2)があり、該当すればその回答回数を変数XKに書きこむ〔343 行まで〕・ 多重項目には、117番(記録桁数2)、125番~140番(同3)、161番(同 4)がある。この場合には、各桁数を16進で2桁左にずらし200Hのようにし て、変数XKに書きこむ〔344行以下〕。こうして後で区別できるようにしてい るのである。 -91-I)~ ~
4
;
strings for instructions above
;---~---=======================================================
J-=======================================================
J;-} YN
;-} ZN
;display macro (displ)
;input item number
;-) XN
;then a1=4=0 {default}
;assign drv. no. to FCB
;if CR
;hex ascii code -)binary numeric
;if
<C
;then retry
;if
}F;then retry
;hexascii(COE) -)binary(345)
;display macro
;OF. Read Keyboard
&
Echo
Object Item No. Input
display disp2
call
item_no
mov
YN,cx
displa.y crlfjmp
chk_X
display
disp3
call
item_no
mov
ZN,cx
;---~---progO:
push
si
push
ds
mov
ax,cs
mov
ds,ax
110 VeS,ax
;---
input source Drive no.
pOi:
xor
cX,CXdisplay drv_no
mov
ah,1
int
21h
cmp
a1,ODh
je
pOi_l
hasc2bin
CIBpa1,OCh
jb
pOi
cmp
a1,OEh
ja
pOi
sub
a1,9
jllPshort
pOi_2
pOi_l:
mov
a1,4
pOi_2:
mov
FCB(O),al
:---
input Item No.
display displ
call
item_no
mov
XN,cx
;
programO
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:'
268:
269:
270:
. 271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
-92-
---xO=multi ans.
---_
...---;2nd-keta*10 -}ax(al)
;+-}cl
.
;3rd-keta*100 -}ax(al)
;+-}cl
;real figures -}bx
;tail numeric
;tail or last figure
item_in,bx
;-} cl
13,10,'Input Drive No. of FAMFL.DAT tC,D,E} $'
13,10,'Input the Object Item No. '
'(Plural or Multipul Ans. Item be appointed to X )'
13,10,'
X=
$'
13,10,'
y=$'
13,10,'
Z=
$'
13,10,'$'
;=Carriage Return
&
Line Feed
, re-input!
$'
drv_no
db
disp1
db
db
db
db
db
db
db
ret
disp2
disp3
crlf
re_inp
;=======
Sub rout.0_1 : Item No. Input
item_no proc
;-- buffered keyboard input of item number
no_inp:
flush_get_string
item_in,item_no_buf_sz
;-- decimal -} binary
xor
bx,bx
moy
cx,bx
moy
bl,item_in(l)
inc
bx
;--
fig
1
decimal_inp_chk
moy
cl,al
dec
bx
cmp
bx,1
;if item's figure(keta)=l
je
pOi_r
;then exit
;--
fig
2
;
last 2 figure
decimal_inp_chk
item_in,bx
mov
ah,
10
mul
ah
add
cl,al
dec
bx
cmp
bx,l
;if item's figute=2
je
pOi_r
;then exit
;--
fig
3
;last
3 figure
decimal_inp_chk
item_in,bx
mov
ah,
100
mul
ah
add
cl,al
;============
Check Ans. Form of
X; (XK) 01=single ans.
Ox=plural ans.
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
-93-1 b t 1 h h h』 8 o268田。70o410.1Oe N41-525252--.120-23430’60k 1IlP301P1P1P020s1■201囚1国301o4a ,97-,P・一・’9一PDP、DlDP9|,】,P0-0皿
肌励団伽加川t伽W伽Ⅶ肱汕t肌ta伽加川t駆加伽加川t伽加川t
n r rrX r r r a o ooe o o o h hh1 h h h l s ssP s s s a ・工 vvr・PevPPPPpvPtPevpPaPbvPPevPmm皿國・卯函・狐函・罪四・覗函・肥・狐函・狐乢叩・加印・狐函・加國・加印・狐函・加配・狐
P 凪 ●●一 ●●|●D X’ 1 2-1 2 3 一・9 P P。,凪 n 国 o k h 0 0 0 0 0 0 c・ P p P P P P ■●●●■●●●●●●●●●●●●●●■●●●●■●●●●●●●●●●●●●●●●●●■●●●●●●●●●●●●●●●●●●●●●●別四列弧犯兜測箔犯羽犯羽仙虹咄岨仏岨妬靭蛆岨別別兜兜別弱究引別別Ⅲ
〔|こ□](。(口}へ]兵、》(|竺口]《・くり)へワニ■]へ.こり]つく口》へ宮ご口)へ一矼口》〔ロベロ)(刀こり》へ口昼ロニヘロこり}へ.くり》へ臣こ□)(・くり)(●垈曰二へロベロ》へこく、)(ワニ、)へ□冬Ⅱ》へ●二口)へロニロ}(・■ロゴへ]こ■》《・矼口》へ.■■)ヘロニロニヘロ已口》(・垈已}(]冬ロ)へ皀笙□) ;Q12-2,3mg. ;Q15,2fig. ;Q18,,. ;Q19,“ ;Q2/IFXN=l17THENXK=2 ;Q7/IFXN>l24ANDXM141THENXK=3 ;Q21/IFXN=l61THENXK=4 5progO(その2)対象項目諸元テーブルの作成(リスト5,361-459行) progOの後半で、各項目の諸元を作成記入する《make-tbl,routineである。〔363〕冒頭の文字列のラベル,M0,は、修正(debug)のため、機械語
に変換後も見分けられる部分プログラムの頭(HeaD)の標識としていれてある (以後区切りごとに同様のものが出てくる)。 〔365-378〕XYZ項目それぞれのRecord上の位置(Address)と回答肢数(Width)を、下記のOadr-width,Subroutineを呼んで定め、テープ
-9k1-ルに書きこむ。 〔406-439〕Subroutine,adr-width,項目番号から数値テーブル (441-459行、,size’は回答肢数、《adr’はその項目の各群内でのoffset 値)を参照しながら、そのRecord上の位置と回答肢数(注)24を求めてaxおよ