ZX81の回想禄

PR

×

プロフィール

ZX81

ZX81

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2024.01.16
XML
カテゴリ: ZX81 BASIC Manual

Chapter 19 - Time & motion」時間と動作

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
第19章 - 時間と動作

プログラムに指定した時間を費やしたいことがよくありますが、そのためには PAUSE ステートメントが便利です (特に高速モードの場合)。
 PAUSE n

 計算を停止し、テレビの n フレーム分の画像を表示します (

 ブレークは、キーを押すことでいつでも短縮できます (スペースを使用してもブレークが発生することに注意してください)。

 一時停止が始まったらキーを押す必要があります。

 一時停止が終了すると、画面が点滅します。

 FAST モードまたは新しい 8K ROM を搭載した古い ZX80 で実行されるプログラムで PAUSE ステートメントを使用する場合、PAUSE ステートメントの後に POKE 16437,355 を続ける必要があります。 これを行わなくても PAUSE は機能するように見えますが、プログラムが消去されてしまう可能性があります。

 このプログラムは、時計の秒針 (ここでは端にある 1 つの点だけ) を動かします。
  5 REM FIRST WE DRAW THE CLOCK FACE
  10 FOR N=1 TO 12
  20 PRINT AT 10-10* COS (N/6* PI ),10+10* SIN (N/6* PI );N
  30 NEXT N
  35 REM NOW WE START THE CLOCK
  40 FOR T=0 TO 10000
  45 REM T IS THE TIME IN SECONDS
  50 LET A=T/30* PI
  60 LET SX=21+18* SIN A
  70 LET SY=22+18* COS A
  200 PLOT SX,SY
  300 PAUSE 42
  310 POKE 16437,255
  320 UNPLOT SX,SY
  400 NEXT T
 (メモリ拡張ボードがない場合は、REM ステートメントを見逃してください。)

 40 行目のため、このクロックは約 2 時間半で終了しますが、簡単にさらに長く実行することができます。 300 行目でタイミングがどのように制御されているかに注目してください。 PAUSE 50 を指定すると 1 秒に 1 回動作することを期待するかもしれませんが、他の処理に少し時間がかかるため、これは考慮する必要があります。 それには、実際のクロックにコンピュータのタイミングを合わせ、一致するまでライン 300 を調整するという試行錯誤によって行うのが最も効果的です。 (これを非常に正確に行うことはできません。1 秒間に 1 フレームの調整は 2%、つまり 1 日あたり 30 分になります。)

 関数 INKEY$ (引数なし) はキーボードを読み取ります。 ちょうど 1 つのキー (または Shift キーと他の 1 つのキー) を押している場合、結果はそのキーがモードで与える文字になります。 制御文字には通常の効果はありませんが、改行の場合は CHR$ 118 のような結果が得られ、「?」として出力されます。

 タイプライターのように動作するこのプログラムを試してください。
  10 IF INKEY$ <>"" THEN GOTO 10
  20 IF INKEY$ = "" THEN GOTO 20
  30 PRINT INKEY$ ;
  40 GOTO 10

 ここで、行 10 はキーボードから指が離れるのを待ち、行 20 は新しいキーが押されるのを待ちます。 INPUT とは異なり、 INKEY$ は待機しないことに注意してください。 したがって、改行は入力しませんが、逆に何も入力しない場合はチャンスを逃したことになります。

演習
1. タイプライター プログラムの 10 行目を抜いたらどうなりますか?

2. タイプライター プログラムでスペースや £ を入力できないのはなぜですか?
 これは、カーソルを右 (シフト 8)に入力するとスペースが表示されるように変更されたプログラムです 。
 10 IF INKEY$ <>"" THEN GOTO 10
 20 IF INKEY$ ="" THEN GOTO 20
 30 LET A$= INKEY$
 40 IF A$= CHR$ 115 THEN GOTO 110
 90 PRINT A$;
 100 GOTO 10
 110 PRINT " ";
 120 GOTO 10

 30 行目で INKEY$ を A$ に読み込む方法に注目してください。これを抜いて、40 行目と 0 行目で A$ を INKEY$ に置き換えることも可能ですが、行間で INKEY$ が変わる可能性があります。

 さらにプログラムをいくつか追加して 、NEWLINE (CHR$ 118) と入力すると新しい行が表示されるようにしましょう。

3. INKEY$ を使用するもう 1 つの方法は、この代替タイプライター プログラムのように PAUSE と組み合わせることです。
 10 PAUSE 40000
 20 POKE 16437,255
 30 PRINT INKEY$
 40 GOTO 10

 これを機能させるには、PAUSEの開始時にすでにキーを押していることが判明した場合にPAUSEが終了しないことが不可欠となります。

 この方法には画面が点滅するという欠点がありますが、高速モードではこれが唯一の方法です。

 プログラムを高速モードで実行すると、コンピュータが一時停止の機会を利用してテレビ画像を表示することがわかります。

4. これはあなたを怒らせます。 コンピュータに番号が表示されるので、あなた (または無実の被害者) はその番号を再度入力する必要があります。 最初は 1 秒以内に行う必要がありますが、間違えると次の番号にかかる時間が長くなり、正解すると次の番号にかかる時間が短くなります。 1つのアイデアとして、できるだけ早くそれを進めてから、Q を押してスコアを確認することです。高ければ高いほど良いです。
 10 LET T=60
 15 REM T=NUMBER OF FRAMES PER GO-INITIALLY 50 FOR 1 SECOND
 20 SCROLL
 30 LET A$=C HR$ INT ( RND *10+CODE "0")
 35 REM A$ IS A RANDOM DIGIT
 40 PRINT A$
 45 PAUSE T
 50 POKE 16437,255
 60 LET B$= INKEY$
 70 IF B$="Q" THEN GOTO 200
 80 IF A$=B$ THEN GOTO 150
 90 PRINT "NO GOOD"
 100 LET T=T*1.1
 110 GOTO 20
 150 PRINT "OK"
 160 LET T=T*0.9
 170 GOTO 20
 200 SCROLL
 210 PRINT "YOUR SCORE IS "; INT (600/T)

5. (RAM に余裕がある人のみ) 第 15 章の直線ルーチンを使用して、分針と時針も表示されるように秒針プログラムを変更し、毎分描画します。 (時針を短くしてください。) さらに望むなら、15 分ごとに何らかのショーを表示するようにしてください。

6. (おもしろ) これを試してください:
 10 IF INKEY$ = "" THEN GOTO 10
 20 PRINT AT 11,14; "OUCH"
 30 IF INKEY$ <>"" THEN GOTO 30
 40 PRINT AT 11,14; "   "
 50 GOTO 10
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

​ZX81におけるPAUSEとキー入力に関して記述しています。

PAUSEステートメントにパラメータを渡すのは知っていましたが、フレーム単位なんですね。今更知りました。

また、PAUSE中にキーを押すと次に進むのも知らなかったですね。

この機能はZX80から継承されたようで、FASTモードとの関わりが興味深いところです。






お気に入りの記事を「いいね!」で応援しよう

最終更新日  2024.01.16 15:38:59
コメント(0) | コメントを書く
[ZX81 BASIC Manual] カテゴリの最新記事


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: