(since 2006/12)(更新 2009/07/12)

TNO:メール・マガジン[CASLII]サンプル4

©Copyright 2006,2009 小野智章(小野情報設計)
無断転載を禁止します。
情報系/IT系の広告を掲載しています。(広告一覧)
まぐまぐ版の、 CASLII有料メール・マガジンの、サンプル誌。
各月5回配信の内、第4回相当分。

メール・マガジンの説明

各月第4回分の主な内容。
「プログラムの機能の変更」を含むことがあります。

サンプル誌

配信メールのサンプルです。
図表などは、等角フォントを前提としています。
個々のメールやテーマを区別するための識別情報は、 変更になる可能性があります。

各月第4回相当分
(各回の内容は、サンプル内の記述を参照して下さい。)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      TNO2 CASLII試験対策

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
著作権は、小野智章(小野情報設計)が保有します。
お客様ご本人の利用のため以外の複写・複製や
第三者への公開、配布、譲渡は禁止します。

小野智章(小野情報設計)
  試験情報 http://ww3.tiki.ne.jp/~tno2/shikaku.htm
  登録解除 http://ww3.tiki.ne.jp/~tno2/mag/mag.htm
  連絡先   http://ww3.tiki.ne.jp/~tno2/profile/mail.htm
  マイページ(解除、メール・アドレスの変更等)
           https://mypage.mag2.com/Welcome.do
-------------------------------------------
テーマ記号;B9
テーマ;BCDマスク(RTC,real time clock)
テーマ分類;bit演算-マスク-4

テーマ発行番号;4
発行;2005年6月
メール番号;4-4
-------------------------------------------
[発生する問題]-答え
「年月日時分秒を別々に読取るため、
各データに時間差が出て、矛盾が発生する場合がある。」
例えば、
2005年12月31日23時59分59秒に実行開始して年を読み取り、
2006年1月1日0時0分0秒にそれ以降を読取った場合、
中略
-------------------------------------------
[穴埋め問題]-1
「プログラムの説明」を読んで、プログラム中の空欄を埋めよ。
プログラムの各行の先頭には、各行を区別するため、行番号を加えてある。

[プログラムの説明]
リアルタイム・クロック(RTC)を読み出して、
日時を表示する副プログラムPRINTRTCである。

1.リアルタイム・クロックの読み出しは、
仕様を後述する副プログラムRTCREADを呼出すことによって行う。
副プログラムRTCREAD自体は、ソース・リストには含まない。
2.表示は次の1行の形式で行う。
YYYY-MM-DD(www) HH:mm:SS

ここで、YYYY、MM、DD、www、HH、mm、SSはそれぞれ、
4桁の西暦年、2桁の月、2桁の日、英字3文字の曜日、
2桁の時、2桁の分、2桁の秒を表す。
数字の上位桁が0の場合は、その位置に0を表記する。
曜日は、Sun,Mon,Tue,Wed,Thr,Fri,Satと表記する。
時は24時制とする。
3.全ての汎用レジスタは、内容を保存する。

[副プログラムRTCREADの仕様]
リアルタイム・クロックの指定されたデータを読み出す
副プログラムRTCREADである。

1.データの指定はGR1に格納して与えられる。
その値とデータの関係は、次の通り。
 GR1  │ 0  1  2  3  4  5   6
───┼────────────
データ│年 月 日 時 分 秒 曜日

2.データは、GR0に次の形式で格納して戻される。
データ│ 年  月 日 時 分 秒 曜日
───┼────────────
 形式 │YYYY MM DD HH mm SS  w

ここで、形式の英字1文字は、
BCD(Binary Coded Decimal,2進化10進数)1桁分を表す。
又、16ビットに満たない場合は、上位桁を0で埋める。
曜日は、日曜日を0とする、0〜6で与えられる。
時は24時制で与えられる。
3.結果以外の汎用レジスタは、内容を保存する。

[プログラム]
 1:PRNTRTC START
 2:        [ a ]                   ;レジスタ保存
 3:        RPUSH
 4:        LAD     GR1,0
 5:        CALL    RTCREAD         ;年読込み
 6:        [ b ]
 7:        SRL     GR0,8
 8:        [ c ]
 9:        CALL    BCD2DEC         ;年上位2桁設定
10:        LD      GR0,GR7
11:        [ d ]
12:        LAD     GR2,YEAR1
中略
75:        [ g ]
76:        ST      GR0,0,GR2       ;上位1桁設定
77:        LD      GR0,GR6
78:        AND     GR0,=#000F
79:        [ g ]
80:        [ h ]                   ;下位1桁設定
81:        RET
82:        END
-------------------------------------------
[穴埋め問題の解法・解答]-1
先に、BCD2DECの仕様を確認しておこう。
!!使用サブルーチンの仕様を早目に確認するのは、プログラム分析の常套手段。
BCD2DECをコールしている7個所のコメントから、
2桁分の設定であると判る。
!!サブルーチン仕様の確認には、
!!サブルーチン自体を見る方法と、呼出し方から推測する方法がある。
!!ここでは、穴埋めのあるサブルーチン自体よりも、
!!繰返し呼出している側の共通部分から推測する方が楽である。
(確認出来ない[ c ]の1個所を除き、)
それぞれのコールの直前で、GR2にアドレスを設定している。
設定されているアドレスは52行目以降のデータ領域で、
ラベルと途中の文字列から、出力する文字列中の各数字の入る位置と判る。
!!ラベルの言葉の意味から役割等を予測するのは、プログラム分析の常套手段。
更に、5個所ではGR2設定の前にRTCREADをコールしているので、
GR0に各BCDデータを格納していることも判る。
即ちBCD2DECは、GR0に格納された2桁のBCDデータを、
GR2が指すアドレスに文字として格納すると、推測出来る。

次にBCD2DECの中を埋めよう。

先ず[ g ]を埋めよう。
BCD2DECの仕様は、GR0に格納された2桁のBCDデータを、
GR2が指すアドレスに文字として格納すると、推測されている。
[ g ]は2個所あるが、80行目は後が穴埋めになっていて判りにくいので、
75行目を見よう。
!!穴埋めが繰返している場合は、分かり易い箇所で判断する方が楽である。
74行目ではGR0はBCD2桁の内の上位桁のみになって、
76行目ではGR0をGR2が指すアドレスに格納している。
従って[ g ]では、GR0に格納されている1桁のBCDデータを、
数字に変換すれば良い。

g;ADDA    GR0,='0'
!!上位ビットは0になっているので、
!!ADDAの代わりにADDL,OR,XORでも良い。
!!「='0'」は文字コードのリテラルであれば良いので、
!!代わりに「=48」「=#0030」でも良いが、「=0」は間違い。

尚、[ g ]を埋めたことで、BCD2DECのパラメタのGR0はBCD2桁のみで、
上位8ビットは0になっていると判る。
!!上位8ビットに何か入っていると、75行目の[ g ]で数字コードにならない。
中略
-------------------------------------------
穴埋めの考え方が判ったでしょうか。
どんな処理を行う筈か予想出来ると、
フローチャートに直す際も、命令を穴埋めする際も、
やり易いことが判るでしょう。

実際には、処理のやり方には色々な方法があります。
見かけないやり方に戸惑わない様、
数多くのアルゴリズムに接しておくと良いでしょう。

尚、穴埋め問題は、暫く間を空けて、再度やって置くことをお薦めします。
予定日付をカレンダーに書込んでおくのが良いでしょう。

では、別の位置を空欄にした問題もやってみましょう。
-------------------------------------------
[穴埋め問題]-2
「プログラムの説明」を読んで、プログラム中の空欄を埋めよ。
プログラムの各行の先頭には、各行を区別するため、行番号を加えてある。

[プログラムの説明]
リアルタイム・クロック(RTC)を読み出して、
日時を表示する副プログラムPRINTRTCである。

1.リアルタイム・クロックの読み出しは、
仕様を後述する副プログラムRTCREADを呼出すことによって行う。
副プログラムRTCREAD自体は、ソース・リストには含まない。
2.表示は次の1行の形式で行う。
YYYY-MM-DD(www) HH:mm:SS

ここで、YYYY、MM、DD、www、HH、mm、SSはそれぞれ、
4桁の西暦年、2桁の月、2桁の日、英字3文字の曜日、
2桁の時、2桁の分、2桁の秒を表す。
数字の上位桁が0の場合は、その位置に0を表記する。
曜日は、Sun,Mon,Tue,Wed,Thr,Fri,Satと表記する。
時は24時制とする。
3.全ての汎用レジスタは、内容を保存する。

[副プログラムRTCREADの仕様]
リアルタイム・クロックの指定されたデータを読み出す
副プログラムRTCREADである。

1.データの指定はGR1に格納して与えられる。
その値とデータの関係は、次の通り。
 GR1  │ 0  1  2  3  4  5   6
───┼────────────
データ│年 月 日 時 分 秒 曜日

2.データは、GR0に次の形式で格納して戻される。
データ│ 年  月 日 時 分 秒 曜日
───┼────────────
 形式 │YYYY MM DD HH mm SS  w

ここで、形式の英字1文字は、
BCD(Binary Coded Decimal,2進化10進数)1桁分を表す。
又、16ビットに満たない場合は、上位桁を0で埋める。
曜日は、日曜日を0とする、0〜6で与えられる。
時は24時制で与えられる。
3.結果以外の汎用レジスタは、内容を保存する。

[プログラム]
 1:PRNTRTC START
 2:        ST      GR0,SAVEGR0     ;レジスタ保存
 3:        RPUSH
 4:        LAD     GR1,0
 5:        CALL    [ a ]           ;年読込み
 6:        LD      GR7,GR0
 7:        [ b ]
 8:        LAD     GR2,YEAR0
 9:        CALL    [ c ]           ;年上位2桁設定
10:        [ d ]
11:        AND     GR0,=#00FF
中略
75:        ADDA    GR0,='0'
76:        ST      GR0,0,GR2       ;上位1桁設定
77:        LD      GR0,GR6
78:        [ j ]
79:        ADDA    GR0,='0'
80:        ST      GR0,1,GR2       ;下位1桁設定
81:        RET
82:        END

次のバナーから申込ページへ移動して、申込んでください。
まぐまぐバナー

他の回のサンプル。
概要と第1回分
第2回分
第3回分
第5回分

学習室
トップ・ページへ

お問い合せ等、お待ちしております。
小野智章(小野情報設計) 
Mail連絡先