日寺言十 (土日に作成編)

Home PC-6001mkII Program etc

動作モード MODE:1(N60-BASIC) PAGES:1

画面 更新日:2005/07/03
作成日:2005/06/26

 P6月間記念 行き当たりばったり企画「土日中にプログラムを完成させよう」です。

 前に作った「でか文字PUT」と TIME命令を使って時計もどきを作ろうと思います。さて、どうなることやら...。

現在、初代機で実行すると表示の文字列がおかしくなってます。直せる目処がつき次第直そうと思いますので、しばしお待ちを...。

このページの内容は、
 2005/06/25〜26に作成したときの内容のバックアップです。

 この時点では、mkIIのROMでしか試していないので、肝心の初代機では正しく表示されません。

予定機能
時計
  • 時分秒を、でか文字で表示する。
  • 現在時刻の修正も行えるようにする。
  • 余裕が出来れば、表示形式をいくつか用意する。
 まずはこんな所で。

でか文字PUTのプログラムを流用
 でか文字PUT のプログラムをコピーして、デモの部分を削除。

 ちょっと手抜きだけど、これで でか文字を出すお膳立てが完了!

時刻の表示
 とりあえず時刻の入力は置いておき、時刻を表示する部分を作成。

 プログラム開始時を基準(00:00:00)にして、表示時点の TIMEとの差分から時分秒を割出してみる。
TIME命令は、2/975秒置きに+2されるので... こんな感じか。
  • T = (TIME差分) / 975
  • 時:H = T / 3600
  • 分:M = (T - H * 60 3600) / 60
  • 秒:S = T - H * 3600 - M * 60
 次に、これを「hh:mm:ss」形式の文字列に変換。
デジタル時計と同様に、1桁の場合は10の位に「0」を入れる。STR$()で正の数を変換すると1文字目は空白になるので、これを除いて前に0をつけて2桁にして...
S$ = RIGHT$("0" + MID$(STR$(S) , 2), 2)
 あとは、時,分も同様に変換して表示のテスト。

画面

 おぉ出た出た。始める前から後悔してたけど、ようやくやる気が出てきました。

時刻の修正 その1
 時刻の修正方法はどうしよう。

 INPUT$で入力してチェックする方法もあるけど、ここは敢えてゲーム機のようにカーソルキーで変更することに(仮)決定。カーソルキーの左右で時分秒の選択,上下で値の変更 と言ったところか。

 時は 00-23,分と秒は 00-59の範囲で設定するとして...できた。まだ見かけだけだけど。
あとは、これを TIMEとの差分用の変数に格納しなきゃ。

 えーと。現在の TIMEから、設定した時分秒分を減らせば良いから...
T0 = TIME - (H * 3600 + M * 60 + S) * 975
 ここでもう一度テスト。現在時刻(19:45)を入れて、

画面

 どうだ!

画面

 あれれれれ。しかも秒がカウントダウンしてるし。

 ...晩飯作ろ。

時刻の修正 その2
 秒がカウントダウンした時点で薄々感づいていたけど、案の定 時刻表示の計算式が間違えてた。
という事でさくっと修正。

 あとは、日付またがりの処理。このままだと、23時の次が24時になってしまうので、時の数値を24の余りにする処理を追加する。MOD 命令なんてものはないのでこんな感じ。
H = H - INT(H / 24) * 24
 この処理を加えて完成!と思いきや、23:59:59の次が 00:40:00になってる...。
そうか、分を求めるまでは時の値は変えちゃダメか。ここは処理の順番を変えてあっさり解決。

画面


ここらで一旦高速化 その1
 最低限の機能が出来たところで、プログラムの高速化を試みる。

この時点でメイン部分のソースはこんな感じ。
30 T=INT((TIME-T0)/975)
34 H=INT(T/3600)
35 M=INT((T-H*3600)/60)
36 S=T-H*3600-M*60
37 H=H-INT(H/24)*24
38 S$=RIGHT$("0"+MID$(STR$(S),2),2)
39 M$=RIGHT$("0"+MID$(STR$(M),2),2)
40 H$=RIGHT$("0"+MID$(STR$(H),2),2)
45 COLOR 5:LOCATE 0,6:PRINT! H$+":"+M$+":"+S$
 試しに100回ループすると、約33秒かかっている。(Win98でIP6 for Win 0.6.3 Rel.6にて)
1秒に3回しか更新されてない...。

 まず遅そうな処理といえば、38〜40行の文字列に変換する処理だろう。
ここで発想の転換をする。時分秒にそれぞれ「100」を足して文字列にして下2桁を取ったらどうだろうか。試してみよう。こんな感じかな?
S$ = RIGHT$(STR$(S + 100), 2)
M$ = RIGHT$(STR$(M + 100), 2)
H$ = RIGHT$(STR$(H + 100), 2)
 試してみると、100回で37秒。遅くなってるよ...却下。

 次は、配列変数にあらかじめ「00」〜「59」の文字列を格納してみる。
※ N$(0)〜N$(59)に「00」〜「59」を代入後
S$ = N$(S)
M$ = N$(M)
H$ = N$(H)
 100回で1分5秒?! メインはシンプルになったので速くなると思いきや、正反対の結果に...。文字変数が60個増えたようなものだから遅くなった??

 それなら、配列変数じゃなくて変数1つならどうだろう。
※ N$に「000102...5859」を代入後
S$ = MID$(N$, S + S + 1, 2)
M$ = MID$(N$, M + M + 1, 2)
H$ = MID$(N$, H + H + 1, 2)
 ビンゴ!100回で29秒に減った。もうちょっと縮まると思ったけどまずはこの辺りで。

ここらで一旦高速化 その2
 BASIC処理を高速化する際に私が使う常套手段の一つに「2桁以上の数値定数は16進表記に」というものがある。これを今回も試してみる。

 メインの処理で使われている2桁以上の数値定数は、975, 3600, 60, 24 の4種類。
これを、975 → &H3CF, 3600 → &HE10, 60 → &H3C, 24 → &H18 にそれぞれ置きかえる。

 結果は...100回で23秒!

 あとは何かないかな。多分割り算より掛け算が速いはずなので、割り算のところを逆数の掛け算にしてみるか。ここで小数点の定数だとかえって遅くなるので変数に入れて...
Z1 = 1/&H3CF: Z2 = 1/&HE10: Z3 = 1/&H3C: Z4 = 1/&H18

T = INT((TIME - T0) * Z1)
H = INT(T * Z2)
M = INT((T - H * &HE10) * Z3)
S = T - H * &HE10 - M * &H3C
H = H - INT(H * Z4) * &H18
 やった!20秒を切った!

 はじめが33秒だったので、速度もざっと65%増しだ。この辺りで満足しておこう。

操作まわり
 ここまで、暫定的に時刻合わせモードにはスペースキーで入っていたが、ちゃんとキーを割り当てる事にする。

 時刻合わせのキーは何にしよう。TIMEと言う事で「T」にするか。CAPSや かなになっている事も考えて、「t」「T」「か」「カ」の4種類に対応させる。

 あとは、修正モードと分かるようにタイトルを書き画面下に操作キーのメニューを出す。

画面

 まあこんなもんか。

表示形式の変更 その1
 表示形式をいくつか考える。

 すぐできそうなものといえばこんな所か。
  • 23:59:59
  • 23:59
  • 23時59分
  • PM 11:59
 まずは、表示部分のみ実装。4番目の12時間表示は「昼の0時」というのも個人的にすっきりしないので、時の表示部分を00〜11ではなく01〜12にすると...
  • [24h] 00:00-00:59 → [12h] PM 12:00-12:59
  • [24h] 01:00-12:59 → [12h] AM 01:00-12:59
  • [24h] 13:00-23:59 → [12h] PM 01:00-11:59
 ...らしい。なんか面倒な事になったが、とりあえず作ってみる。

画面

 できた。あとは設定画面を残すのみ。

表示形式の変更 その2
 今度は、表示形式の変更画面を作成する。

 この画面に入るキーは、Viewと言う事で「V」にしよう。と言う事で先ほどと同様に「V」「v」「ひ」「ヒ」をキーとして割り当てる。

 カーソルキーの上下で、選択した表示形式が分かるようにする。まてよカーソル左右が空いてるな。表示色変更でもつけてみるか。この辺りが、行き当たりばったりの醍醐味だ(多分)。

 表示形式のほかに表示色の変数も追加して...こんな感じかな?

画面


あとはこまごまと
 最後に、REM分の追加や行番号の整列を行う。

 行番号の整列は、一旦保存後にN60m-BASICからプログラムを読み込み、RENUMを実行。

 あとは、これを圧縮して ダウンロードと余談をつけて...あ、readme.txtも作らなきゃ。...完成!

ダウンロード

以下、余談
  • 今回は、構想は練っていたものの、本当に土曜日まで1行もプログラムを書いてなかったのでドキドキものでした。(文字表示は過去モノをそのまま流用しているので、プログラムの量的には7割方できてたという考え方もありますが)

  • 今回初めて、プログラムを書きながらWebを更新するという事に挑戦してみました。ちょっと文体は違いますが、後から見直すとライブ感(?)が出ていて良かったかも知れません。

  • 時刻の修正ができた辺り(25日の19:40位)で、プログラムの体裁を整えて完成にしようかと思った事は内緒です(^^;)。



日寺言十