~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
|