全29件 (29件中 1-29件目)
1

「Chapter 26 - Using machine code」機械語の使用について。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 26 章 - 機械語の使用この章は、Z80 プロセッサ チップが使用する命令セットである Z80 機械語を理解している人を対象に書かれています。そうではないがそうしたい場合は、それに関する本があります。 2 つの入門書は、Sybex から出版されている Rodnay Zaks 著の「Programming the Z80」で、価格は約 10 ポンドです。もう 1 つは、Rathe Spracklen 著で、価格が 5.25 ポンドの「Z80 および 8080 Assembly language programming」です。 究極の権威ある本は「Z80 アセンブリ言語プログラミング マニュアル」と「Z80-CPU、Z80A-CPU テクニカル マニュアル」でZilog から出版されており、価格はペアで約 6 ポンドですが、これらは初心者にはお勧めできません。 マシンコードルーチンは、関数 USR を使用して BASIC プログラム内から実行できます。USR の引数はルーチンの開始アドレスで、その結果は 2 バイトの符号なし整数で、戻り時の bc レジスタ ペアの内容になります。BASIC への戻りアドレスは通常の方法で追加されるため、Z80 ret 命令によって戻ります。 USR ルーチンには特定の制限があります。 (i) 戻ったとき、iy と i レジスタの値は 4000h および 1Eh でなければなりません。 (ii) 表示ルーチンは a'、f'、ix、iy & r レジスタを使用するため、計算と表示が動作している場合、USR ルーチンはこれらを使用すべきではありません。 (af のペアを読むことは悲しいことでさえありません。) コントロール、データ、アドレス バスはすべて ZX81 の背面に露出しているため、Z80 でできることのほとんどすべてを ZX81 で行うことができます。ただし、ZX81 ハードウェアは、特にコンピューティングとディスプレイにおいて邪魔になる場合があります。 これは、背面の露出した接続の図です。 メモリの中央にあるマシンコードの一部は、BASIC システムによって上書きされる危険性があります。より安全な場所としては (i) REM ステートメント内: マシンのコードを保持するのに十分な文字数を含む REM ステートメントを入力し、それを挿入します。これをプログラムの最初の行にします。そうでないと、プログラムが移動する可能性があります。alt 命令は REM ステートメントの終わりとして認識されるため、使用しないでください。 (ii) 文字列内: 十分な長さの文字列を設定し、各文字にマシン コード バイトを割り当てます。しかし、文字列は常にメモリ内を移動してしまいます。 付録 A の文字セットには、文字と Z80 命令が順番に並んで書かれているので、コードを入力するときに便利です。 (iii) メモリの先頭。 ZX81 の電源がオンになると、メモリの量をテストしてUSR ルーチン用のスペースが存在しないようにマシン スタックを最上位に配置します。これは、RAMTOP として知られるシステム変数内の最初の存在しないバイト (たとえば、17K、または 1K のメモリがある場合は 17408) のアドレスを、アドレス 16388 と 16389 の 2 バイトに書き込みます。 メモリ全体のテストは行わず、RAMTOP のアドレスの直前までのチェックのみを行います。したがって、既存のバイトのアドレスを RAMTOP に挿入してNEW を行うと、そのバイト以降のすべてのメモリは BASIC システムの外部にあり、そのまま残されます。たとえば、1K のメモリがあり、コンピュータの電源を入れたばかりだとします。 PRINT PEEK 16388+256*PEEK 16389 最初の存在しないバイトのアドレス (17408) がわかります。 ここで、長さが 20 バイトの USR ルーチンがあるとします。 RAMTOP を 17388 = 236 + 256*67 に変更したいので (コンピューターではどうやって計算しますか?)、次のように入力します。 POKE 16388,236 POKE 16389,67 そしてNEW。アドレス 17388 から 17407 までの 20 バイトのメモリを自由に使用できるようになりました。その後、再度 NEW と入力しても、これらの 20 バイトには影響しません。メモリの先頭は USR ルーチューンに適しており、安全で (新規からでも) 移動できません。 その主な欠点は、SAVE によって保存されないことです。まとめ ファンクション: USR ステートメント: NEW演習1. RAMTOP を 16700 に設定し、NEW を実行します。 メモリがいっぱいになると何が起こるかがわかります。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81で機械語の使用について記述しています。BASICからはUSRファンクションで機械語を呼び出す事は知っていましたが、BASICに戻るための制限がある事は知りませんでした。あと、他のプログラムでREMコメント欄に機械語を記述する方式を知りましたが、BASICマニュアルにも書いていたんですね。完全に読込不足でした。【月初月末恒例・11%OFFセール】ミニPC AMD Ryzen 7 3750H 4コア8スレッド 最大4.0GHz Windows 11 Pro DDR4 16GB+512GB PCIe SSD 4K@60Hz 3画面出力対応 高速Wi-Fi BT4.2 Type-C USB3.1 ミニパソコン minipc 小型パソコン 小型pc価格:59,800円(税込、送料別) (2024/1/31時点)
2024.01.31
コメント(0)

「30 Programs for the ZX81」から第20弾「Break In」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Break In」これは、似た名前の人気ゲームの貧弱版です (プレイできるのが 1K しかないという意味でとても貧弱です)。不安定に配置されたレンガの壁を、ボールを跳ね返して破壊する必要があります。各レンガが叩かれるとレンガが壁の外に消え、ボールが跳ね返されます。ボールには 10 ライフがあり、コートの下端に当たるたびに 1 つ失われます。 これを防ぐ方法は、パドルを画面上で左から右に動かしてボールを跳ね返す事です。 カーソル移動キー 5 と 8 を使用して制御します。テクニカルノート 10 ~ 50行目 ボードを描画 60 ~ 100行目 変数を初期化 A と B はボールの座標、X はパドルの位置です。 A1 と B1 はボールの動きの方向を表します。 110 行目と 120 行目は、次のボールの位置を PEEK して、何かに当たるかどうかを確認します。当たる場合は、垂直方向が逆転(160行目)します。※このプログラムは16K増設RAM用です。 本体のみ(1K)で動作させる場合は、120秒目の33を18に変更してください。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーRUNすると、上部にブロックと下部にパドルが描画され、数字が反転したボール?が表示されます。最初、ボールが右上方向に進み、ブロックや端っこにあたると跳ね返ります。パドルの下までくると数が減っていき、0になるとゲームオーバーです。スコア表示もなく、パドル位置に関係なくへ跳ね返りも一定ですが、1Kサイズにまとめたのは評価できるのではないでしょうか。[新品]アクリルスタンド/ヴァイスアッシュ〈TVアニメ『シャングリラ・フロンティア』〉価格:1,650円(税込、送料別) (2024/1/30時点)
2024.01.30
コメント(0)

「Chapter 25 - How the computer works」コンピュータの仕組みについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 25 章 - コンピュータの仕組みイラストは ZX81 の内部を示しています (ただし、再度組み立てるのは難しいため、自分で分解しないでください)。ご覧のとおり、すべてに 3 文字の略語が付いています。 金属製の脚がたくさん付いたプラスチックの部分は、デジタル時計だけでなく、シンクレア ZX81 も生み出した素晴らしいシリコン チップです。それぞれのプラスチック片の中に、 K カーソルと同じくらいの大きさのシリコン片があり、ワイヤで金属製の脚に接続されています。 動作の背後にある頭脳は、CPU (中央プロセッサ ユニット) と呼ばれることが多いプロセッサ チップです。これは Z80 プロセッサ (実際には Z80A で、より高速です) です。 プロセッサはコンピュータ全体を制御し、演算を行い、どのキーが押されたかを考慮し、その結果として何を行うかを決定し、テレビの画像を調整します。 しかし、その賢さにもかかわらず、これをすべて単独で行うことはできません。 そのままでは、BASIC、浮動小数点演算、テレビについては何も知らず、すべての命令を別のチップである ROM (読み取り専用メモリ) から取得する必要があります。ROM は、予測可能なすべての状況下で何をすべきかをプロセッサに指示する完全なコンピューター プログラムを作成する命令の長いリストにすぎません。 このプログラムは BASIC ではなく、いわゆる Z80 マシンコードで書かれており、長いバイト列の形式をとります。(バイトは 0 から 255 までの単なる数字であることに注意してください。) 各バイトには、ROM 内の場所を示すアドレスがあります。 最初のアドレスは 0、2 番目のアドレスは 1、というように 8191 まで続きます。つまり、合計 8192 = 8*1024 バイトとなるため、この ZX81 BASIC は 8K BASIC と呼ばれることもあります。 1K は 1024です。 多くの異なるマシンに同様のチップがありますが、この特定の命令シーケンスは ZX81 に固有であり、ケンブリッジの数学者の小さな会社によって ZX81 のために特別に書かれました。 関数 PEEK を使用すると、特定のアドレスにどのバイトがあるかを確認できます。 たとえば、このプログラムは ROM の最初の 21 バイト (およびそのアドレス) を出力します。 10 PRINT "ADDRESS";TAB 8;"BYTE" 20 FOR A = 0 TO 20 30 PRINT A;TAB 8;PEEK A 40 NEXT A 次に考慮すべきチップはメモリ、つまり RAM (ランダム アクセス メモリ) チップです。ここには、プロセッサが保持したい情報、つまり BASIC プログラム、変数、テレビの画像、およびコンピュータがどのような状態にあるかに関するさまざまなメモ (システム変数) が保存されます。 ROM と同様に、メモリはバイト単位で構成されており、それぞれにアドレスがあります。アドレスの範囲は 16384 から 17407 (または、16K RAM パックの場合は最大 32767) です。ここでも ROM と同様に、値を見つけることができます。これらのバイトは PEEK を使用して変更できますが、ROM との大きな違いは、変更もできることです。 (もちろんROMは固定されており変更できません。) 以下を入力します。 POKE 17300,57 これにより、アドレス 17300 のバイトの値は 57 になります。 PRINT PEEK 17300 番号「57」が返ります。 (不正行為がないことを証明するために、他の値を入力してみてください。) アドレスは 0 ~ 65535 でなければならないことに注意してください。 そして、これらのほとんどは ROM 内のバイトを参照するか、まったくどこにも参照しないので、効果はありません。値は -255 ~ +255 である必要があり、負の場合は 256 が加算されます。 使い方を知っていれば、POKEはコンピュータに対して計り知れない力を与えてくれます。 ただし、必要な知識は、このような入門書では伝えられるものではありません 最後の大きなチップはロジック チップ、または SCL (Sinclair Computer Logic) チップです。 繰り返しになりますが、これは ZX81 用に特別に設計され、作られており、他のチップを賢い方法で接続して、通常よりも多くのことを実行できるようにします。 変調器はコンピュータのテレビ出力をテレビに適した形式に変換し、レギュレータは平滑化された未調整の 9 ボルトの電源を安定化された 5 ボルトに変換します。まとめ チップス ステートメント: POKE ファンクション: PEEKーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81の基板とメモリアクセスについて記述しています。ZX81の基板は4つのチップから構成されており、とてもシンプルな事がわかります。まあ、その分機能が少なく、音が出なかったりしますが。。。さて、次の章からいよいよ機械語の話となります。孫の手 孫 グッズ プレゼント 名入れ 【 木製 まごの手 】 名前入り ギフト まごのて 健康グッズ おじいちゃん おばあちゃん 誕生日プレゼント 70代 80代 祖父 祖母 背中かき 雑貨 名入り 還暦 古希 喜寿 傘寿 米寿 卒寿 長寿 祝い 父 母 60代 子ども 孫から 男性 女性価格:2,840円(税込、送料別) (2024/1/29時点)
2024.01.29
コメント(0)

【エミュレータについて】まずもって、エミュレータとはなんぞや?というお話からです。Wikipedia(エミュレータ - Wikipedia)によると「ある機械部品やソフトウェアを動作させるのに、オリジナルのシステムを用意するのが難しい場合に、オリジナルと全く同じ動作をするより簡便なシステムを用意することがある。…」とあります。1980年代に発売された本機を、新品や中古を購入する事はやはり難しく、またアナログTVやテープレコーダーを準備するのも厳しいかと思います。そして、すぐに拡張16Kラムも必要となり、こちらの入手は本体より難易度が高いため、必要な機器を全て揃えるのは非現実的と言わざるを得ません。(コレクター様は別ですが。)ありがたい事に、他の同世代の機器と同様、ZX81にもエミュレータが出ていて、恥ずかしながら、最近になってやっとその存在を知った次第です。【ZX81エミュレータについて】ZX81のエミュレータは数多く存在します。※こちらの「Sinclair ZX81 emulators」が参考になるかと思います。Sinclair ZX81 emulators - Emulation General Wiki (gametechwiki.com)ここで紹介されたもの以外も含めて、色々とネット情報を調べました。・ZX81 エミュレータでのヒット率・各エミュレータにウィルス等の危険がないか・各エミュレータの再限度その結果、Windows上で動作する「EightyOne」を使ってみる事にしました。【ZX81エミュレータ EightOne】最新版は、こちらでダウンロードできるかと思いますEightyOne Sinclair Emulator download | SourceForge.netこの記事の時点での最新バージョンはV1.39でした。EightyOne V1.39.zipをダウンロードして、適当なフォルダ内に展開後展開先のEightOne.exeを起動すると…こんな感じの表示となります。ホームページでの紹介記事の大半は、このエミュレータで検証したりリストを打ち込んでコピペしたりしています。私は実際にZX81を数年に渡って使っていましたが、実際の挙動との違いを感じられませんでした。素晴らしい出来です。-----------------------------※このエミュレータのおかげで、ZX81に改めて触れる機会をいただきました。作者の「Michael D Wynne」氏、及び携わった方々には、深い敬意と感謝を申し上げます。(このエミュレータは、GPLライセンスに基づくフリーソフトウェアです。)-----------------------------
2024.01.28
コメント(0)

「30 Programs for the ZX81」から第19弾「Snap(スナップ)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Snap(スナップ)」このゲームでは、一連の文字を素早く認識するスキルをテストします。まずは5 ~ 15 文字の長さの単語を入力する必要があります。よく知られている単語やすぐに認識できる単語を入力するのが良いですが、文字が繰り返し含まれる単語を入力するのは不正行為になります。この単語の文字が 1 秒未満の間、画面上に乱雑に表示されます。これはランダムな間隔で 20 回発生します。各表示中に、画面上の単語と最初に入力された単語を照合し、対応する文字の数を推定する必要があります。多いと思われる場合は、単語が再び消える前にすばやく「0」キーを押してください。「0」を押すとそれ以上単語は表示されませんが、選択した単語が元の単語と比較され、該当する文字数がスコアとして与えられます。50% 以上の文字が正解した場合、勝者とみなされます。もう一度NEWLINEを押すと、再度実行する事ができます。テクニカルノート 70 ~ 230行目 メインプログラムループ ・100 ~ 170 行目の内部ループは、入力された単語をごちゃ混ぜにしたバージョンを一度に 1 文字ずつ生成して出力します。A$ には元の単語が含まれており、そこから文字がランダムに取得され、文字列 B$ に入れられます。同じ文字を二度受け取らないように、各手紙が受け取られるたびに、A$ の反転文字に置き換えられます。次に単語が形成されると、それらは反転文字から通常の文字に戻されます。このプロセスが交互に行われます。 ・220 行目 C を +1 から -1 に交互に切り替えます。 240 ~ 310 行目 結果分析ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーRUNした後、入力した5~15文字の文字(数字はNG)を入力します。試しに、某N山Kに君の「POWER」としてみます。すると、20回ほどランダムに文字を入れ替えながら表示されます。(これは、4回目の例。奇数回は反転文字になる様子)入力文字と並びがある程度揃っている!と思った時に「0」キーを押します。並びがあっている文字が半数を超えていると「WINNER」です。寝袋用発熱パッド 電熱マット シュラフ用 電気毛布 6つ日本製ヒーター内蔵 速暖 USB ホットマット キャンプ 3段階温度調整 電熱パッド 抗菌防臭 防寒保温 寝袋 秋冬用 暖房 過熱保護 軽量 登山 防災 アウトドア 自宅 停電 寒さ対策 洗える (ブラック, 198*63CM)価格:4,880円(税込、送料無料) (2024/1/26時点)
2024.01.27
コメント(0)
![]()
「Chapter24 - Counting on your fingers」指折り数えてについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 24 章 - 指折り数えて次の章では、コンピュータの内部を少し掘り下げますが、その前に、コンピュータがどのように数えるかについて説明しておきます。コンピュータは 2 進法を使用して計算を行っています。つまり、コンピュータには指がなく、すべて親指です。 ほとんどのヨーロッパ言語は、多かれ少なかれ規則的な 10 のパターンで数えます。たとえば、英語では、最初は少し不規則に始まりますが、すぐに規則的なグループに落ち着きます。 20、21、22、...、29 30、31、32、...、39 40、41、42、...、49 など、アラビア数字を使用することでさらに体系化されています。 ただし、10 を使用する唯一の理由は、たまたま指と親指が 10 本あるからです。 ここで、火星人がそれぞれの手に 更に3本の指 (指と呼べる範囲で) を持っていると仮定します。そのため、10 を基底とする 10 進数を使用する代わりに、16 を基にした 16 進数 (または略して Hex) が使用されます。 私たちが使用する 10 桁に加えて、さらに 6 桁の 16 進数が必要で、たまたまそれらを A、B、C、D、E、F と書きます。F の後には何が来るのでしょうか? 私たちが 10 本の指で 10 に対して 10 と書くのと同じように、彼らも 16 本の指で 16 に対して 10 と書きます。彼らの番号体系は次のように始まります。 Hex 英語 0 なし 1 1 2 2 : : : : 9 9 私たちの場合と同じように、しかしその後もそれは続きます A 10 B 11 C 12 D 13 E 14 F 15 10 16 11 17 : : : : 19 25 1A 26 1B 27 : : : : 1F 31 20 32 21 33 : : : : 9E 158 9F 159 A0 160 A1 161 : : : : FE 254 FF 255 100 256 16 進表記を使用していて、事実を非常にわかりやすくしたい場合は、数値の最後に「h」を書いて、「hex」と言います。 たとえば、158 の場合は、「9Eh」と書いて「9 E hex」と言います。 これがコンピュータと何の関係があるのかと疑問に思われるでしょう。 実際、コンピューターは、低電圧またはオフ (0) と高電圧またはオン (1) で表される 2 桁だけがあるかのように動作します。これは 2 進法と呼ばれ、2 つの 2 進数はビットと呼ばれます。したがって、ビットは 0 または 1 のいずれかになります。 さまざまなシステムでカウントが始まります 英語 10進数 16進数 2進数 なし 0 0 0 or 0000 1 1 1 1 or 0001 2 2 2 10 or 0010 3 3 3 11 or 0011 4 4 4 100 or 0100 5 5 5 101 or 0101 6 6 6 110 or 0110 7 7 7 111 or 0111 8 8 8 1000 9 9 9 1001 10 10 A 1010 11 11 B 1011 12 12 C 1100 13 13 D 1101 14 14 E 1110 15 15 F 1111 16 16 10 10000 重要な点は、16 は 2 の 4 乗に等しいということです。これにより、16 進数と 2 進数間の変換が非常に簡単になります。 16 進数を 2 進数に変換するには、上記の表を使用して、16 進数の各桁を 4 ビットに変更します。 2 進数を 16 進数に変換するには、2 進数を右側から始まる 4 ビットのグループに分割し、各グループを対応する 16 進数に変更します。 このため、厳密に言えば、コンピュータは純粋な 2 進法を使用しますが、人間はコンピュータ内に格納されている数値を 16 進数を使用して書くことがよくあります。 コンピューター内のビットは、ほとんどが 8 つのセット、つまりバイトにグループ化されています。 1 バイトは、0 から 255 までの任意の数値 (11111111 の 2 進数または FF 16 進数)、または ZX81 文字セット内の任意の文字を表すことができます。その値は 2 つの 16 進数で記述できます。 2 バイトをグループ化して、専門的にはワードと呼ばれるものを作成できます。 ワードは 16 ビットの 16 進数を使用して書くことができ、0 から (10 進数で) 216-1 = 65535 までの数値を表します。 1 バイトは常に 8 ビットですが、ワードはコンピュータによって異なります。まとめ 10 進数、16 進数、および 2進数システム。 ビットとバイト (混同しないように) とワード。演習1. 火星の通貨単位はポンドで、16 オンスに分けられます。 ポンドとオンスをオンスに変換し、再びオンスに変換するにはどうすればよいですか (i) すべての数字が 10 進数で書かれている場合? (ii) すべての数字が 16 進数で書かれている場合?2. 10 進数と 16 進数の間で変換するにはどうすればよいですか? (ヒント: 演習 1.) ZX81 で数値を 16 進表現を与える文字列に変換するプログラムを実行する場合、またはその逆の場合。(これは、STR$ と VAL が 10 進表現で行うことです。)3. 金星の人々が親指を持たずに合計 8 本の指を持っていると仮定すると、彼らの 8 進数 (8 進数) の数え方はコンピューターでどのように役立ちますか?ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーコンピュータにおける数の数え方について記述しています。以降の章で、いよいよ機械語の解説が始まるので、てはじめというところでしょうか。ところで、これはBASICマニュアルですよね?寝袋用発熱パッド 電熱マット シュラフ用 電気毛布 6つ日本製ヒーター内蔵 速暖 USB ホットマット キャンプ 3段階温度調整 電熱パッド 抗菌防臭 防寒保温 寝袋 秋冬用 暖房 過熱保護 軽量 登山 防災 アウトドア 自宅 停電 寒さ対策 洗える (ブラック, 198*63CM)価格:4,880円(税込、送料無料) (2024/1/26時点)
2024.01.26
コメント(0)

「30 Programs for the ZX81」から第18弾「Passengers(乗客)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Passengers(乗客)」このゲームでは、あなたは電車の運転士として、早朝の通勤電車に乗り、主要都市に向かい、途中の 5 つの駅に停車します。朝のこの時間帯は電車が多いので、ホームの乗客は座る場所が見つからないと次の電車を待つことになります。 この動作の累積的な効果は、各駅で乗車する乗客の数が、プラットフォームに並べることができる車両の数に正比例することです。したがって、短く停止したりオーバーシュートしたりすると、乗客を失い、後続の通勤者のためにさらなる渋滞が発生します。市内に到着するまでに合計 400 人の乗客を乗せることができれば、その後の渋滞の増大を防ぐことに成功したことになります。キー 5 ~ 9 を押すと加速を、キー 1 ~ 4 でブレーキを制御できます。1 は最大制動、9 は最大加速です。ディスプレイには、向かっている駅の番号、乗車人数、加速度(ブレーキは負の加速度)、速度、次の駅までの距離が表示されます。駅から 100 メートル以上離れた場所で停止すると誰も乗せられませんが、正確な場所で停止すれば 100 人の乗客を乗せることができます。テクニカルノート10 ~ 40 行目 変数と表示を初期化 P = 乗客数、N = 次のステーション数、A = 加速度、V = 速度、D = 次のステーションからの距離各駅ごとに、電車が停止するまでループ 80 ~ 160 を走り続けます。170行目 駅からの距離に応じて乗車人員を加算ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー乗客をいかに多く乗せるか競うゲームです。RUNすると、以下のような画面になります。駅数(1から4まで)、乗せた人の合計、アクセル(減速<0:停止<加速)、速度(0:停止)、距離(ランダムで1000~5000m)となります。停止位置が0mに近づくほど、多く乗せることができます。【FINEBOYS+plus SUIT掲載】ビジネスリュック 撥水 出張 軽量 大容量 a4 PC メンズ カジュアル ビジネス レザー 高級 グッシオ ウォーモ イタリア レザー ビジネスバッグ mag グッシオメンズ価格:7,980円(税込、送料無料) (2024/1/25時点)
2024.01.25
コメント(0)
![]()
「Chapter23 - When the computer gets full」コンピューターがいっぱいになったときついて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 23 章 - コンピューターがいっぱいになったときZX81 の内部ストレージの量は限られており、いっぱいにするのは難しくありません。これが起こっていることを示す最も良い兆候は、通常、エラー レポート 4 ですが、他のことが起こる可能性もあり、その中にはかなり奇妙なものもあります。正確な動作は、メモリ拡張ボードが接続されているかどうかによって異なります。まず、メモリ拡張ボードが接続されていないと仮定します。持っている場合は、(最初にコンピューターの電源をオフにした後) 取り外してください。 ディスプレイ ファイル、つまりテレビの画像を保存するコンピュータ内の領域は、これまでに表示されたものだけが空間を占めるように巧妙に設計されています。ディスプレイの 1 行は最大 32 文字とNEWLINEで構成されます。これは、何かを表示するとメモリ不足が発生する可能性があることを意味します。最も明らかな場所はリストの作成中です。 以下を入力します。 NEW DIM A(150) 10 FOR N=1 TO 15 20 PRINT N ここで最初の驚きが起こります。10 行目がリストから消えています。リストには現在の 20 行目が含まれるようにバインドされており、両方の行を入れる余地はありません。 続いて入力してください 30 NEXT N 繰り返しますが、リストには 30 行目しかスペースがありません。 更に入力してください 40 REM X (NEWLINEなし) 30 行目が消え、40 行目が画面の一番上にジャンプするのがわかります。プログラムには入力されていません。 L カーソルはまだ存在しており、移動することができます。 ここまで見てきたのは、画面の下半分に 24 行を与えて上半分よりも優先させる、不明瞭なメカニズムだけです。 更に入力してください。 XXXXXX (まだ NEWLINE はありません) カーソルが消えます - カーソルを表示する余地がありません。NEWLINE を入れずに別の X を入力すると、X の 1 つが消えます。ここでNEWLINEを入力します。 すべてが消えますが、10 行目を削除して ↓ と ↑ を使用すると証明できるように、プログラムはまだコンピューター内に残っています。 更に入力してください。 10 FOR N=1 TO 15 もう一度 40 行目と同様に、画面の一番上に移動します。 しかし、NEWLINE を押しても、何か問題があることを示すエラー メッセージや S マーカーは表示されませんが、NEWLINEは入力されません。これは、行の構文をチェックする余地がないことによるもので、通常、(先頭の行番号を除く) 数字を含む行でのみ発生します。 何とかスペースを空けるしか方法はありませんが、まず入らない10行目を削除します。EDITを押します。ラインを切断する余地がないため、画面は空白になります。 EDIT が機能しない場合は、カーソルが画面の上に移動するまでスペースをいくつか入力することでスペースを空けることができる場合があります。 NEWLINE を押すとリストの一部が表示されます。 ここで、以下をタイプする事によってい 40 行目(実際には必要のない行) を削除します。 40 (とNEWLINE) ここでもう一度 10 行目を入力してみますが、それでも入力できません。もう一度削りましょう。 まだどこかに余分なスペースを見つける必要があります。10 行目が拒否された理由は、おそらく 2 つの数値 1 と 15 の構文をチェックする余地がなかったためであることに注意してください。したがって、プログラム内の 20 行目を削除すると、10 行目を入力する余地ができる可能性があります。その後、20 行目(数字が含まれていません) を再入力する余地がまだ残っています。 以下を入力します。 20 10 FOR N=1 TO 15 20 PRINT N プログラムは正しく入力されます。 続いて次のように入力します。 GOTO 10 そして再び、この行は構文をチェックできないため拒否されることがわかります。 それを取り消すよう次のように入力してください。 RUN 今度は動作します。 (RUN は配列をクリアし、十分なスペースを確保します。) 先ほどと同じように NEW から 30 行目までと下記を入力します。 40 REM XXXXXXXXXXXX (X 12 個)、最終的には 40 RE のようになります。 NEWLINE を押すと、リストは 30 行目だけで構成され、実際には 40 行目は完全に失われています。 これは単に長すぎてプログラムに収まらなかったためです。その行がプログラム内にすでに存在する行の編集結果である場合、その影響は少し悪くなります。プログラムからの古い行と、それを置き換える新しい行の両方が失われるからです。 この問題の究極の治療法は、コンピューターの背面に収まる RAM パックを購入することです。 Sinclair 16K RAM パックは、拡張されていない状態の 16 倍のメモリをコンピュータに提供します。古い ZX80 3K RAM パックをお持ちの場合、ZX81 では動作しません。RAM パックの動作はかなり異なります。表示ファイルは各行を 32 文字長にするためにスペースで埋められるからです (SCROLL がこれを混乱させることに注意してください - 第 27 章を参照してください)。これで、表示しながらリストを作成してもコンピューターのメモリが不足することはなくなり、短縮されたリストが表示されたり、飛び回ったりすることもなくなりました。 しかし、各行がくっついたり消えたりすることがわかります。やはり唯一の治療法は、空きスペースを見つけることです。 メモリ拡張ボードをお持ちの場合は、それを装着し、次のコマンドを使用してこの章の入力を行ってください。 DIM A(3069) DIM A(150) との置き換えです。 要約すると、これは複雑な話であり、できる限り、ぎっしり詰まったコンピュータを手に入れるのは避けるべきだということです。 しかし、2 番目の教訓は、物事は見た目ほど悪くないことが多いということです。1. リストが短くなり始めたり、項目が飛び交ったりし始めたら、スペースが狭くなってきています。2. NEWLINE が行末に何の効果も持たないように見える場合は、おそらく数字を扱う余地がありません。EDIT-NEWLINE または RUBOUT を使用して行を消去します。3. NEWLINE は行を完全に失う可能性があります。 こうした奇妙なことすべてに対して、治療法は同じです。 パニックにならずに、空きスペースを探してください。 まず最初に考慮すべきことは CLEAR です。 いくつかの変数があり、どれを失っても構わない場合は、これを行うべきです。 これに失敗した場合は、プログラム内で REM ステートメントなどの不要なステートメントを探し、それらの一部を削除します。まとめ メモリがいっぱいになると、奇妙なことが起こる可能性があります。 しかし、通常は致命的ではありません。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81におけるメモリ不足について記述しています。驚く事に、ZX81ではプログラムや変数によりメモリが少なくなった場合に、表示エリアを少なくしようとします。具体的にはリスト表示が短く、編集行が上に上がっていき、最後にはカーソル表示も削られます。別に紹介している1Kプログラムは、きっとこの現象と闘った末、どこかで折り合いをつけて動作させていると思われます。1Kチェスや1Kインベーダーの完成までの道のりを考えると、ほとほと関心します。15時まで 当日発送 usbメモリ 8gb USBメモリ グリーン 光る KEY 鍵 カギ フラッシュメモリー USBドライブ かわいい 写真 画像 動画 音楽 テキスト データ保存 面白い ユニーク 雑貨 pc周辺機器 景品 プレゼント 北海道 沖縄 離島 送料無料 ポイント消化 買い回り あす楽対応価格:1,798円(税込、送料別) (2024/1/24時点)
2024.01.24
コメント(0)

「30 Programs for the ZX81」から第17弾「Temp(温度)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Temp(温度)」このプログラムは、現在使用されている 3 つの温度スケール、摂氏 (または摂氏)、華氏、ケルビンの間で変換を行います。 摂氏 0 度または華氏 32 度は氷の融点ですが、ゼロ ケルビンは絶対零度であり、あらゆる物質が到達できる最低温度です。 私たちが温度として理解している特性として巨視的スケールで現れるものは、極微視的スケールでは分子の運動(振動)または励起として現れます。絶対零度はそれらがすべて静止する温度です。これで、なぜそれが「絶対」なのかがわかりました。テクニカルノートこのプログラムの鍵となるのは 50 行目で、入力データから温度 (華氏) が評価されます。次に、これは他の 2 つのスケールに変換され (60 行目と 70 行目)、表示されます (80 行目と 90 行目)。このプログラムは、temp T に続いて単位 As を入力し、50 行目から 90 行目を 1 つの巨大な print ステートメントに結合することで、おそらく 3 行で作成できます。練習として試してみると良いかもしれません。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー温度変換プログラムですね。(プログラム解説の英→和訳をgoogle先生にお任せしたのですが、後半が難しくて理解できなかったので、そのまま掲載しています。。。)摂氏2度を変換するには。2とNEWLINE、CとNEWLINEの順に入力します。結果、こんな感じです。枕 男の夢枕 (専用 枕カバー 付き) 有名寝具ブランド王様シリーズから消臭機能が付いた 男性向け 枕 【枕 男 男性 旦那 夫 王様の夢枕 彼氏 父 お父さん 誕生日 ギフト プレゼント 低め 低い 日本製 ビーズ 安眠枕 洗える 加齢臭 汗 臭い まくら】【N】価格:7,700円(税込、送料無料) (2024/1/23時点)
2024.01.23
コメント(0)
![]()
「Chapter 22 - Arrays」配列ついて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 22 章 - 配列たとえば、現在の会計年度に毎月死亡した所得税徴収人の数などの数字のリストがあるとします。これらをコンピュータに保存するには、月ごとに 1 つの変数を設定することもできますが、これは非常に面倒だと感じるでしょう。変数を ALAS NO MORE 1、ALAS NO MORE 2 などと呼び、ALAS NO MORE 12 まで呼び出すこともできますが、これら 12 個の数値を出力するプログラムはかなり長く、入力するのが退屈になります。 次のように入力できればどんなに便利でしょう。 5 REM THIS PROGRAM WILL NOT WORK 10 FOR N=1 TO 12 20 PRINT ALAS NO MORE N 30 NEXT N まあ、それはできません。 ただし、このアイデアを適用できるメカニズムがあり、配列を使用します。 配列は変数または要素のセットであり、すべて同じ名前があり、名前の後ろに括弧内に書かれた数字 (添え字) によってのみ区別されます。この例では、名前は A (FOR-NEXT ループの制御変数と同様、配列の名前は 1 文字である必要があります) となり、12 個の変数は A(1)、A(2) …A(12)までとなります。 配列の要素は、すでによく知られている単純な変数とは対照的に、添字付き変数と呼ばれます。 配列を使用する前に、コンピューター内に配列用のスペースを確保する必要があります。これは、DIM (ディメンション用) ステートメントを使用して行います。 DIM A(12) 次元 12 の A という配列を設定し (つまり、12 個の添え字付き変数 A(1),...,A(12) があります)、12 個の値を 0 に初期化します。また、以前に存在していた A という配列も削除されます。(ただし、単純な変数ではありません。同じ名前の配列と単純な変数は共存できます。配列変数には常に添え字があるため、これらを混同しないでください。) 添え字には任意の数値表現を使用できるため、次のように書くことができます。 10 FOR N=1 TO 12 20 PRINT A(N) 30 NEXT N 複数の次元の配列を設定することもできます。 2 次元配列では、要素の 1 つを指定するために 2 つの数値が必要です。テレビ画面上の文字の位置を指定する行番号と列番号のようなものです。そのため、テーブルの形式になります。あるいは、行番号と列番号 (2 次元) を表示するページを参照していると想像すると、ページ番号に追加の次元を持たせることもできます。 もちろん、私たちは数値配列について話しています。 したがって、要素は本のように印刷された文字ではなく、数字になります。3 次元配列 C の要素は C で指定されるものと考えてください (ページ番号、行番号、列番号)。 たとえば、次元 3 と 6 の 2 次元配列 B を設定するには、DIM ステートメントを使用します。 DIM B(3,6) これにより、3*6 = 18 個の配列変数が得られます。 B(1,1)、B(1,2)、...、B(1,6) B(2,1)、B(2,2)、...、B(2,6) B(3,1)、B(3,2)、...、B(3,6) 同じ原理が任意の数の次元に適用されます。 数値と配列に同じ名前を付けることはできますが、次元数が異なる場合でも、2 つの配列を同じ名前にすることはできません。 文字列配列もあります。配列内の文字列は固定長であり、それらへの代入は常に無理に基準にあわせるという点で単純な文字列とは異なります。配列の別の考え方は、単一文字の配列 (1 つの追加次元を含む) として考えることです。 文字列配列の名前は 1 文字の後に $ が続き、文字列配列と単純な文字列変数は同じ名前を持つことはできません (数値の場合とは異なります)。 次に、5 つの文字列の配列 A$ が必要だとします。 これらの文字列の長さを決定する必要があります。それぞれ 10 文字で十分な長さであると仮定します。 次に、DIM A$(5,10) と宣言します。 (これを入力します) これにより、文字の 5*10 配列が設定されますが、各行を文字列と考えることもできます。 A$(1)=A$(1,1) A$(1,2) ... A$(1,10) A$(2)=A$(2,1) A$(2,2) ... A$(2,10) : : : : : : A$(5)=A$(5,1) A$(5,2) ... A$(5,10) DIM ステートメントのディメンションと同じ数の添字 (この場合は 2 つ) を指定すると、1 つの文字が得られます。 ただし、最後の文字列を見逃した場合は、固定長の文字列が得られます。したがって、たとえば、A$(2,7) は文字列 A$(2) の 7 番目の文字です。 スライス表記では、A$(2)(7) と書くこともできます。 次のように入力します。 LET A$(2)="1234567890" PRINT A$(2),A$(2,7) 結果はこの通りです。 1234567890 7 最後の添え字 (見逃してしまう可能性があるもの) については、スライス表示を使用することもできます。 A$(2,4 TO 8) = A$(2)(4 TO 8) = "45678"覚書 文字列配列では、すべての文字列が同じ固定長になります。 DIM ステートメントには、この長さを指定するための追加の番号 (最後の番号) があります。 文字列配列の添字付き変数を書き留めるときは、DIM ステートメント内の追加の数値に対応する追加の数値またはスライサーを挿入できます。まとめ 配列 (ZX81 が文字列配列を処理する方法は少し標準的ではありません。) ステートメント: DIM演習 1. 12 個の文字列からなる配列 M$ を設定します。M$(N) は N 番目の月の名前です。 (ヒント: DIM ステートメントは DIM M$(12,9) になります。) すべての M$(N) を出力(ループ使用)してテストします 。次のように入力します。 PRINT "NOW IS THE MONTH OF ";M$(5);"ING";"WHEN MERRY LADS ARE PLAYING" これらすべてのスペースに対して何ができるでしょうか?2. 次元のない文字列配列を使用できます。 次のように入力します。 DIM A$(10) A$ は、長さが常に 10 であり、代入が常に 固定長である点を除いて、文字列変数と同じように動作することがわかります。3. 読み取り、データ、復元。 誰がそれらを必要としていますか? ほとんどの BASIC (ZX81 BASIC を除く) には、READ、DATA、RESTORE と呼ばれる 3 つのステートメントがあります。 DATA ステートメントは式のリストであり、プログラム内のすべての DATA ステートメントを取得すると、式の 1 つの長いリストである DATA リストが得られます。 READ ステートメントは、これらの式を 1 つずつ変数に割り当てるために使用されます。 READ X たとえば、DATA リスト内の現在の式を変数 X に割り当て、次の READ ステートメントの次の式に進みます。[RESTORE は DATA リストの先頭に戻ります。] 理論的には、いつでも READ & DATA ステートメントを LET ステートメントに置き換えることができます。 ただし、その主な用途の 1 つは、次のプログラムのように配列の初期化にあります。 5 REM THIS PROGRAM WILL NOT WORK IN ZX81 BASIC 10 DIM M$(12,3) 20 FOR N=1 TO 12 30 READ M$(N) 40 NEXT N 50 DATA "JAN","FEB","MAR","APR" 60 DATA "MAY","JUN","JUL","AUG" 70 DATA "SEP","OCT","NOV","DEC" このプログラムを 1 回だけ実行したい場合は、30 行目を INPUT に置き換えてもよいでしょう。このようにステートメントは次のようになります。 10 DIM M$(12,3) 20 FOR N=1 TO 12 30 INPUT M$(N) 40 NEXT N 余分に入力する必要はありません。 ただし、プログラムを保存したい場合は、プログラムを実行するたびに月を入力する必要はありません。この方法を使用することをお勧めします。 (i) 上記のようなプログラムを使用して配列を初期化します。 (ii) 初期化プログラムを編集します。 (配列を保持したいため、NEW は使用しないでください。) (iii) プログラムの残りの部分を入力して保存します。 これにより、配列を含む変数も保存されます。 (iv) プログラムを再度ロードすると、配列もロードされます。 (v) プログラムを実行するときは、変数をクリアする RUN を使用しないでください。 代わりに行番号を指定して GOTO を使用してください。 代わりに、第 16 章とその演習 3 の LOAD および実行テクニックを使用できる場合もあります。 次に、上記の段階 (iii) でプログラム内で SAVE ステートメントを使用し、段階 (v) は完全に省略されます。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81における配列に関して記述しています。文字配列の場合、最後の添え字が文字の長さとなるのが最大の特徴でしょうか。あと、DATA、READ、RESTOREが無いの、全て代入文で行う必要があります。【ポイント10倍】【1/25以降の発送となります】首肩快適枕 プレミアム 横向き枕 仰向け 横向き寝 枕 首 肩 首に優しい 肩が楽 頸椎 支える フィット ストレートネック いびき 高さ調整 洗える まくら ホテル枕 ギフト マイまくら マイ枕 mymakura価格:11,000円(税込、送料無料) (2024/1/22時点)
2024.01.23
コメント(0)

「30 Programs for the ZX81」から第16弾「Vols(容量)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Vols(容量)」このプログラムは、ビールをリットル単位で何杯飲めるかを教えてくれる便利な換算プログラムです。帝国単位、ガロン、パイント、液量オンスからリットル単位に変換します。まず IMP(帝国単位) または MET(リットル単位) を入力し、次に変換するボリュームを入力すると、変換結果が表示されます。NEWLINEを押すと再度実行する事ができます。テクニカルノート帝国単位からリットル単位への変換は 200 行目の 1 行で実行できますが、その逆は 4 行 (90 ~ 120 行目) かかります。計算が完了すると、220 行目で結果が出力されます。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー起動して”IMP”を入力すると、英単位のガロンとパイントと液量オンスの入力となります。”IMP”以外を入力すると、値と ”LTR”(リッター)か ”MIL”(ミリリッター)かの入力となります。入力後、変換結果が表示されます。(画面は、100リッターの変換結果です。)HKW. タイプライター風メカニカルキーボード キーボード 有線 Keyboard タイプライターキーボード メカニカルキーボード 有線キーボード テンキー 角度調節 テレワーク キーボード 青軸 JIS規格 109キー USB有線 日本語キーボード 日本語配列価格:14,643円(税込、送料無料) (2024/1/22時点)楽天で購入
2024.01.22
コメント(0)
![]()
「Chapter 21 - Substrings」部分文字列について。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 21 章 - 部分文字列文字列を指定すると、その部分文字列は、その文字列から順に取得されたいくつかの連続した文字で構成されます。したがって、「STRING」は「BIGGER STRING」の部分文字列ですが、「B STRING」と「BIG REG」はそうではありません。 部分文字列を記述するためのスライスと呼ばれる表記法があり、これは任意の文字列式に適用できます。一般的な形式は文字列式 (開始 TO 終了) であるため、たとえば次のようになります。 ”ABCDEF”(2~5) = ”BCDE” 開始を省略した場合は 1 とみなされます。 終了を省略した場合は、文字列の長さが仮定されます。 ”ABCDEF”( TO 5) = ”ABCDEF”(1 TO 5) = ”ABCDE” ”ABCDEF”(2 TO 6) =”ABCDEF”(2 TO 6) = ”BCDEF” "ABCDEF"( TO ) = "ABCDEF"(1 TO 6) = "ABCDEF" (最後は”ABCDEF”() と書くこともできます。) TO が欠落しており、番号が 1 つだけの場合は少し異なります。 ”ABCDEF”(3) = ”ABCDEF”(3 TO 3) = ”C” 通常、開始と終了の両方が文字列の既存の部分を参照する必要がありますが、このルールは一方によってオーバーライドされます。開始が終了よりも大きい場合、結果は空の文字列になります。 ”ABCDEF”(5 TO 7) 文字列には 6 文字しか含まれておらず 7 は多すぎるため、エラー 3 (添字エラー) が発生します。 "ABCDEF" (8 TO 7) = "" "ABCDEF" (1 TO 0) = "" 開始と終了を負の値にすることはできません。負の値を指定しないと、エラー B が発生します。 次のプログラムでは、B$ を A$ と等しくしますが、末尾のスペースは省略されます。 10 INPUT A$ 20 FOR N=LEN A$ TO 1 STEP -1 30 IF A$(N)<>"" THEN GOTO 50 40 NEXT N 50 LET B$=A$( TO N) 60 PRINT """";A$;"""","""";B$;"""" 70 GOTO 10 A$ が完全にスペースの場合、50 行目では N = 0 & A$( TO N) = A$(1 TO 0) = "" となることに注意してください。文字列変数の場合、部分文字列を抽出するだけでなく、部分文字列に割り当てることもできます。 タイプ例 LET A$="LOR LOVE A DUCK" LET A$(5 TO 8)="******" PRINT A$ 部分文字列 A$(5 TO 8) は 4 文字しかないため、最初の 4 つの星だけが使用されていることに注目してください。これは部分文字列への代入の特徴です。部分文字列は、その後も以前とまったく同じ長さでなければなりません。これを確実に行うために、割り当てられている文字列が長すぎる場合は右側が切り取られ、短すぎる場合はスペースで埋められます。これは、宿屋の主人プロクラステスにちなんでプロクラステアン割り当てと呼ばれます。ゲストがベッドをラックに伸ばすか、足を切り落として、ベッドにフィットするようにしました。試してみましょう。 LET A$()="COR BLIMEY" PRINT A$;"." A$() は部分文字列としてカウントされるため、同じことが再び発生していることがわかります (今回はスペースが挿入されています)。 LET A$="COR BLIMEY" きちんとやってみましょう。 スライスは優先度 12 とみなされるため、 LEN "ABCDEF"(2 TO 5) = LEN("ABCDEF"(2 TO 5)) = 4 となります。 複雑な文字列式は、スライスする前に括弧で囲む必要があります。 "ABC"+"DEF"(1 TO 2) = "ABCDE" ("ABC"+"DEF")(1 TO 2) = "AB" となります。まとめ TOを使用したスライス。 この表記は標準ではないことに注意してください。演習1. 一部の BASIC (ZX81 BASIC ではない) には、LEFT$、RIGHT$、MID$、TL$ と呼ばれる関数があります。 LEFT$(A$,N) …最初の N 文字で構成される A$ を返す。 RIGHT$(A$,N) …N 番目以降の文字で構成される A$ を返す。 MID$(A$,N1,N2) …N1 番目から N2 文字で構成される A$ を返す。 TL$(A$) …最初の文字を除くすべての文字で構成される A$ を返す。 これをZX81 BASICではどうやって書くのでしょうか? 長さ 0 または 1 の文字列でも機能しますか?2. 次の一連のコマンドを試してください。 LET A$="X*+*Y" LET A$(2)=CHR$ 11 ←(11=” ダブルクォーテーション) LET A$(4)=CHR$ 11 PRINT A$ A$ はダブルクォーテーションを含む文字列になりました。 等号の右側の部分は式として扱われ、この式のように A$ に値 "XY" が与えられます。 LET A$="X"+"Y" 続けて入力してください LET B$="X""+""Y" A$ と B$ は一見同じように見えますが、実は異なります。試してみてください。 PRINT A$=B$ B$ には引用イメージ文字 (コード 192) が含まれていますが、A$ には本物のダブルクォーテーション (コード 11) が含まれています。3. 次のプログラムを実行します。 10 LET A$="LEN ""ABDC""" 100 PRINT A$;" = ";VAL A$ VAL は引用イメージ文字 "" を文字列引用として扱わないため、これは失敗します。 10 と 100 の間に追加の行を挿入して、A$ の引用イメージ文字をダブルクォーテーション (CHR$ 11) に置き換えて、再試行してください。 第 9 章の演習 3 のプログラムに同じ変更を加えて実験してください。4. このサブルーチンは、A$ から文字列「CARTHAGO」が出現するたびに削除します。 1000 FOR N=1 TO LEN A$-7 1020 IF A$(N TO N+7)="CARTHAGO" THEN LET A$(N TO N+7)="********" 1030 NEXT N 1040 RETURN A$ にさまざまな値 (例: "DELENDA EST CARTHAGO.") を与え、サブルーチンを適用するプログラムを作成します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81における部分文字列に関して記述しています。LEFT$、RIGHT$、MID$が無いのは知っていましたが、代わりに(TO)が使えるとは知りませんでした。【予約受付開始 2024年3月お届け予定】【EV-eCo】 電気自動車 小型 電動自動車 電動自動車 公道走行可能 超小型 エコカー ミニカー EV車 一人乗り 小型 四輪 ミニサイズ 乗車定員 1名 電動ミニカー エコ EntreVehiclek【送料は別途お見積り】価格:649,000円(税込、送料別) (2024/1/19時点)楽天で購入
2024.01.20
コメント(0)

「30 Programs for the ZX81」から第15弾「Chase(追跡)」を紹介します。 いよいよ半分まできました。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Chase(追跡)」これは、危険な放射線を放出するエイリアンを捕まえるための狂気のパニック追跡です。すでに多くの人が亡くなっており、彼の暴走を止められるかどうかはあなた次第です。幸いなことに、あなたは放射線レベル(ガイガーミュラー)検出器を持っているので、いつ近づいているかを確認できます。左上隅から開始し、反転文字 (0 ~ 9、その後に A ~ Z) が距離を示し、Z は遠く離れていることを意味します。カーソル移動キーを押すと上下左右に移動できます。彼を捕まえると、何手取ったかが告げられ、改行を押してもう一度挑戦するよう促されます。テクニカルノート 10 行目から 70 行目は変数を初期化し、画面をクリアします。 70 行目から 150 行目はメイン プログラム ループを形成します。 X、Yはあなたの座標、A、Bはエイリアンの座標です。 110 行目から 140 行目で、(INKEYs ="8") などの論理式を使用してこれらの座標がどのように変更されているかに注目してください。 50 行目の PRINT AT ステートメントには、画面から出力されないようにするための安全装置が組み込まれています。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲームがはじまると、このような画面となります。反転文字は、敵からどのくらい距離が離れているかを示します。 近い←1,2…9、A…Z→遠い5、6、7、8キーを押して、見えない敵との距離を縮めていきましょう。反転文字が0になると捕まえた事となり、それまでの移動回数が表示されます。アクセル付き フル電動自転車 電動自転車 おしゃれ スノーバイク 電動バイク 電動クロスバイク モペット 電動自転車 ファットバイク フル電動自転車 20インチ モペット 自転車 ペダル付き電動自転車 1000Wモーター 48V30AHバッテリー 20*4.0極太タイヤ 大人気 公道走行不可価格:310,000円(税込、送料無料) (2024/1/19時点)楽天で購入
2024.01.19
コメント(0)
![]()
「Chapter 20 - The ZX81 Printer」ZX81 プリンターについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 20 章 - ZX81 プリンターZX81 プリンタをお持ちの場合は、いくつかの操作説明書が付属しています。この章では、それを機能させるために必要な BASIC ステートメントを説明します。 最初に 2 つ LPRINT と LLIST は、テレビの代わりにプリンターを使用する点を除けば、PRINT と LIST と同様です。 (L は歴史的な偶然です。BASIC が発明されたとき、通常はテレビの代わりに電子タイプライターを使用していたので、PRINT は実際の印刷を意味しました。 あなたがメッセージの出力を望むなら、コンピュータに接続された非常に高速なライン プリンタと LPRINT 「Line printer PRINT」を使用します。) たとえば、このプログラムを試してみてください。 10 LPRINT "THIS PROGRAM:",,,, 20 LLIST 30 LPRINT ,,"PRINTS OUT THE CHARACTER SET.",,, 40 FOR N=0 TO 255 50 LPRINT CHR$ N; 60 NEXT N 3つ目のステートメント COPY は、テレビ画面のコピーを印刷します。 たとえば、次のリストを取得します。上のプログラムの画面で、次のようにタイプします。 COPY プリンタの実行中に BREAK キー (スペース) を押すことで、いつでもプリンタを停止できます。 プリンターを接続せずにこれらのステートメントを実行すると、すべての出力は無効となり、次のステートメントに進みます。 ただし、場合によってはスタックする可能性があり、ブレーク キーにより抜け出すことができます。まとめ ステートメント: LPRINT、LLIST、COPY 注: これらのステートメントはどれも標準の BASIC ではありませんが、LPRINT は他の一部のコンピュータで使用されています。演習 1.これを試してください。 10 FOR N=31 TO 0 STEP -1 20 PRINT AT 31-N,N;CHR$ (CODE "0" +N); 30 NEXT N 文字のパターンが右上隅から画面の下部に達するまで斜めに下降し、プログラムがエラー レポート 5 で停止するのがわかります。 次に、20 行目の「AT 31-N,N」を「TAB N」に変更します。 このプログラムは以前とまったく同じ効果をもたらします。 次に、20 行目の PRINT を LPRINT に変更します。 今回は、プリンタでは発生しないはずのエラー 5 は発生せず、パターンには数字が含まれる追加の 10 行が続きます。 次に、LPRINT を使用したまま「TAB N」を「AT 21-N,N」に変更します。 今回は、シンボルが 1 行だけ表示されます。 違いの理由は、LPRINT からの出力はすぐには印刷されず、コンピューターが印刷するときに印刷されるものの 1 行の長さの画像がバッファーに保管されるためです。 印刷は次の時に行われます。 (i) バッファーがいっぱいになったとき (ii) コンマまたはセミコロンで終わらない LPRINT ステートメントの後 (iii) カンマまたはタブ項目で改行が必要な場合 または (iv) プログラムの最後に印刷されていないものが残っている場合 (iii) TAB を使用したプログラムがそのように動作する理由を説明します。 AT に関しては、行番号は無視され、LPRINT 位置 (PRINT 位置と同様ですが、テレビではなくプリンターの場合) は列番号に変更されます。AT 項目によって行がプリンターに送信されることはありません。 (実際には、AT 以降の行番号は完全に無視されるわけではありません。-21 ~ +21 の間でなければなりません。そうしないとエラーが発生します。このため、常に行 0 を指定するのが最も安全です。項目 'AT 21-N,Nプログラムの最終バージョンの ' は、'AT 0,N' に置き換えると、説明が少なくなりますが、はるかに良くなります)。 2. 第 18 章のプログラムを実行し、COPY を使用して、SIN の印刷グラフを作成しましょう。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81におけるプリンターに関して記述しています。放電破壊プリンターと呼ばれるもので、カシオのFP10用プリンターが同じ仕組みとの事。放電破壊プリンター - Wikipedia実物を見たことはありませんが、広告で見た黒のプリンターに銀色の印刷用紙が印象的でした。【10%オフクーポン+P5倍】赤ちゃん 腹巻き 冬 2枚組 キッズ ベビー 子供 子ども 男の子 女の子 薄手 下着 冷え取り かわいい ナチュラル おしゃれ 秋 冬 暖かい 防寒 防寒対策 寝冷え対策 冷え防止 寝巻 出産祝い 送料無料価格:1,000円(税込、送料無料) (2024/1/17時点)楽天で購入
2024.01.18
コメント(0)

「30 Programs for the ZX81」から第14弾「Monitor(機械語モニター)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Monitor(機械語モニター)」このプログラムを使用すると、メモリの一部を調べてメモリにバイトを挿入できます。これは、ROM ルーチンを確認したい場合、または独自のマシン コード プログラムを作成して RAM に挿入したい場合に非常に役立ちます。プログラムを実行すると、まずアドレスを 10 進数で入力するように求められます。次に、コンピュータはこのアドレスを 16 進数で出力し、続いてその内容 (これも 16 進数) とその内容の文字表現を出力します。画面は上にスクロールし始め、メモリ内の連続する各バイトが表示されます。改行キーを押し続けると、このプロセスを停止できます。 「X」キーを押すと、別の 10 進アドレスを入力して、メモリの別の領域を調べることができます。「I」キーを押すと、16 進数で新しい値を入力して最後のバイトを変更できます。 「R」を押してから「R-U-N」という文字を入力すると、画面に表示された最後のアドレスから始まるマシンコードサブルーチンが実行されます。テクニカルノート 30 ~ 100 行目 A の 16 進値 (行 40 ~ 80)、その内容の 16 進値 (行 90 ~ 100)、およびそれらの内容の文字表現を表示するルーチンを形成します。 50 ~ 80 行目 の FOR NEXT ループは、10 進数を 4 桁の 16 進数にデコードする最も適切な方法ではありませんが、累乗などの時間のかかる演算を回避できる最も迅速な方法の 1 つであることは確かです。 220 ~ 280 行目 キーが押されたかどうか確認 300 ~ 320 行目 メモリにバイトを入力 400 ~ 420 行目 USR サブルーチンを実行ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー昔よくあった機械語を入力するための簡易モニターで、10進数でアドレスを指定すると、こんな感じで指定したアドレスの値をスクロールしながら表示してくれます。例えば、32768 NEWLINEを入力すると…8000Hからその内容を16進と文字で表示してくれます。放っておくとずっとスクロールするので、一時停止させたいときはNEWLINEを押し続けましょう。さて、このプログラムのキモは10行目のREM文内に機械語を入れるスペースがある事ではないでしょうか。(ちなみに、10行目のREM以降はXを64文字入力します。)試しにやってみましょう。プログラム開始エリア(※)は407DH(16,509)からなので、16509を指定します。※以前紹介したこちらのページが参考になるかと思います。ZX81 Memory Map and System Area(ビデオメモリ補足) | ZX81の回想禄 - 楽天ブログ (rakuten.co.jp)すると、メモリ状況はこのように表示されます。REMの次の3DH(X)をC9H(RET)に変更しましょう。Xキーを押すとアドレス入力となり、アドレス4082H(16514)のため 16514 を指定してNEWLINEを押します。速攻でIキーを押すとデータ入力となるので、16進数で C9 としてNEWLINEを押します。4082H が C9H となります。(引き続き上にスクロールします)16514 を指定してNEWLINEを押し、速攻でRキーを押すと実行準備モードとなります。ここで RUN を指定してENTERを押すと、機械語を実行します。4082Hを実行した結果が表示されます。今回はC9H(RET命令)を実行したので、そのアドレスが表示されるようです。REM文に機械語を格納する発想、思いつきもしないですね。。。
2024.01.17
コメント(0)
![]()
「Chapter 19 - Time & motion」時間と動作について。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第19章 - 時間と動作プログラムに指定した時間を費やしたいことがよくありますが、そのためには PAUSE ステートメントが便利です (特に高速モードの場合)。 PAUSE n 計算を停止し、テレビの n フレーム分の画像を表示します (日本やアメリカでは 1 秒あたり 60、ヨーロッパでは 50 フレーム、)。n は最大 32767 まで指定でき、かかる時間は 約 9 分になります。 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$=CHR$ 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モードとの関わりが興味深いところです。【18日 当店限定!全品ポイント5倍+合計最大P34倍】 電動自転車 シマノ製内装3段変速 26インチ |電動アシスト自転車 子ども乗せ 子供乗せ 折りたたみ 折り畳み チャイルドシート装着可能 シマノ 型式認定 ギフト 送料無料 【DA263】価格:68,800円(税込、送料別) (2024/1/16時点)楽天で購入
2024.01.16
コメント(0)

「30 Programs for the ZX81」から第13弾「Sphere(球体)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Spheres(球体)」Momentum(運動量) プログラムと同様に、このプログラムでも計算力がテストされます。コンピューターは球を描画し、その直径から体積を計算します。あなたの答えがコンピュータの答えの 0.5 以内であれば、正解としてマークされます。最初に難易度を選択し、最後にNEWLINEを押して別の問題を設定できます。テクニカルノート 10 ~ 105 行目 球を描き、その直径を表示 80 行目 PLOT ステートメントの座標で SIN と COS が使用されていることに注目してください。 150 ~ 210 行目 結果を分析ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲーム画面はこんな感じです。今回は1を入力してNEWLINEを押すと円が描画されて、直径が3と表示されました。直径を元に体積を計算して入力します。円の体積は4÷3×パイ×半径3乗なので、14.137…を四捨五入して14と入力してみました。正解だったようです。
2024.01.15
コメント(0)

「Chapter 18 - graphics」グラフィックスについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 18 章 - グラフィックスここでは、ZX81 の最もエレガントな機能をいくつか紹介します。 いわゆるピクセル(画素)を使用します。表示できる画面には 22 行と 32 列があり、22*23 = 704 個の文字位置があり、各文字位置には 4 つのピクセルが含まれており、バッテンブルク ケーキのスライスのように分割されています。 ピクセルは 2 つの数値、つまりその座標によって指定されます。1 つ目の x 座標は、左端からの位置で、2 つ目の y 座標は下からどれだけ上にあるかを示します。これらの座標は、通常括弧のペアとして記述されるため、(0,0)、(63,0)、(0,43)、(63,43) は左下、右下、左上、右上になります。 ステートメント PLOT x 座標、y 座標 これらの座標のピクセル内の黒は、下記ステートメントで空白にします。 UNPLOT x 座標、y 座標 このサンプルプログラムを試してください。 10 PLOT INT (RND*64),INT (RND*44) 20 INPUT A$ 30 GOTO 10 これにより、NEWLINE を押すたびにランダムな点がプロットされます。 ここでは、もっと便利なプログラムを紹介します。 0 ~ 2パイ の値に対する関数 SIN (正弦波) のグラフをプロットします。 10 FOR N=0 TO 63 20 PLOT N, 22+20*SIN (N/32*PI) 30 NEXT N 次の例では、0 と 4 の間の SQR (放物線の一部) のグラフをプロットします。 10 FOR N=0 TO 63 20 PLOT N,20*SQR (N/16) 30 NEXT N ピクセル座標は AT アイテムの行と列とはかなり異なることに注意してください。 この章の最後には、ピクセル座標、ライン、カラムを計算するのに役立つ図があります。演習 1. AT アイテムの数値とピクセル座標には 3 つの違いがあります。 何でしょう? PRINT 位置が AT L,C (行と列の場合) に対応するとします。 その位置にある 4 つのピクセルの x 座標は 2*C または 2*C+1、y 座標は 2*(21-L) または 2*(21-L)+1 であることを証明してください。 (図を参照) 2. お試しプログラムを変更します。最初に画面を黒で塗りつぶし (黒い四角形)、次にランダムな点のプロットにより解除します。 追加のメモリのない標準マシンでは、ストアが足りなくなってしまうため、画面の一部のみを使用するようにプログラムを修正する必要があります。 3. SIN グラフ プログラムを変更して、グラフ自体をプロットする前に、X 軸に「-」の水平線、Y 軸に「/」の垂直線を表示おするようにします。 4. より多くの関数のグラフをプロットするプログラムを作成します。 COS、EXP、LN、ATN、INTなど。それぞれについて、グラフが画面に適合することを確認する必要があるため、次のことを考慮する必要があります。 (i) どの範囲で関数を取得するか (SIN グラフの範囲 0 ~ 2パイ に対応)。 (ii) X軸を画面上のどこに置くか(SINグラフプログラムの20行目の22に相当)。 (iii) グラフの y 軸のスケール方法 (SIN グラフ プログラムの 20 行目の 20 に対応) COS が最も簡単であることがわかります。これは SIN と同じです。 5. これを実行します。 10 PLOT 21,21 20 PRINT "HEAVY QUOTES" 30 PLOT 46,21 PLOT は PRINT 位置に移動します。 (UNPLOT も同様です。) 6. このサブルーチンは、ピクセル (A、B) からピクセル (C、D) まで (正しく) 直線を描きます。A、B、C、D の値を提供するメイン プログラムの一部として使用します。(メモリ拡張ボードを持っていない場合は、おそらく REM ステートメントを省略する必要があります。) 1000 LET U=C-A 1005 REM U SHOWS HOW MANY STEPS ALONG WE NEED TO GO 1010 LET V=D-B 1015 REM V SHOWS HOW MANY STEPS UP 1020 LET D1X=SGN U 1030 LET D1Y=SGN V 1035 REM (D1X,D1Y) IS A SINGLE STEP IN A DIAGONAL DIRECTION 1040 LET D2X=SGN U 1050 LET D2Y=0 1055 REM (D2X,D2Y) IS A SINGLE STEP LEFT OR RIGHT 1060 LET M=ABS U 1070 LET N=ABS V 1080 IF M>N THEN GOTO 1130 1090 LET D2X=0 1100 LET D2Y=SGN V 1105 REM NOW (D2X,D2Y) IS A SINGLE STEP UP OR DOWN 1110 LET M=ABS V 1120 LET N=ABS U 1130 REM M IS THE LARGER OF ABS U & ABS V, N IS THE SMALLER 1140 LET S=INT (M/2) 1145 REM WE WANT TO MOVE FROM (A,B) TO (C,D) IN M STEPS USING N UP- DOWN OR RIGHT-LEFT STEPS D2, & M-N DIAGONAL STEPS D1, DISTRIBUTED AS EVENLY AS POSSIBLE 1150 FOR I=0 TO M 1160 PLOT A,B 1170 LET S=S+N 1180 IF S<M THEN GOTO 1230 1190 LET S=S-M 1200 LET A=A+D1X 1210 LET B=B+D1Y 1215 REM A DIAGONAL STEP 1220 GOTO 1250 1230 LET A=A+D2X 1240 LET B=B+D2Y 1245 REM AN UP-DOWN OR RIGHT-LEFT STEP 1250 NEXT I 1260 RETURN 最後の部分 (行 1150 以降) は、M-N ステップ D1 と N ステップ D2 を均等に混合します。縁の周りに 0 から M-1 までの番号が付けられた M 個の正方形があるモノポリー ボードを想像してください。あなたがいつでもいるマス目は S 番で、G0 の反対側の角から始まります。 それぞれの動きでボードの周囲を N マス移動し、画面上の直線で左右/上下のステップ (ボード上で GO をパスした場合)、またはそうでない場合は斜めのステップを実行します。ボード上の合計移動距離は M*N ステップ、つまり右ラウンド N 回であるため、GO を N 回通過し、M ステップの均等な間隔は N 左右/上下のステップになります。 別のパラメータ E が 1 の場合は線が黒で描画され (ここのように)、0 の場合は線が白で描画されるようにプログラムを調整します (UNPLOT を使用)。描画したばかりの線を元に戻すことで、その線を消すことができます。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81におけるグラフィックスに関して記述しています。22×44ピクセルありますが、内部的には2×2のブロック文字を描画して実現しています。当時はMZ-80シリーズやPC-8001でも同様の技術が使われており、割と一般的だったかと思います。1K RAMしかないZX81で、しかも8K ROM BASICで簡易とはいえグラフィックも実現しているというのは驚愕です。ただし、PLOTとUNPLOTは非常に時間がかかるため、リアルタイムゲームには向かなかったと記憶します。【ポイント10倍】マーキュリー ソーラー カリキュレーター【電卓 カラフル】価格:1,980円(税込、送料別) (2024/1/12時点)楽天で購入
2024.01.14
コメント(0)

「30 Programs for the ZX81」から第12弾「Letters(手紙)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Letters(手紙)」 誰かに何かを伝えたいのに、どう言えばいいのか分からなかったことはありませんか?そう、ここは文字で伝えるチャンスです。これほど大きな文字で言えば、彼らは必ず要点を理解できるでしょう。 このプログラムを使用すると、文章または任意の文字列を入力することで、それを通常の 4 倍または 8 倍の高さの文字で表示できます。まずL(大)またはS(小)の文字を入力してサイズを選択します。次に、0 ~ 63 の範囲のコードを含む最大 50 文字を使用してメッセージを入力します。不明な点がある場合は、マニュアルのページ 181 / 182 を参照してください。(この範囲にはすべての文字、数字、句読点が含まれますが、キーワード、反転文字は含まれません)メッセージは画面の左側を上にスクロールします。 このプログラムには悪ふざけの可能性がたくさんあるに違いありません。誰かが家に帰ってきて、テレビのスイッチを入れ(このプログラムを実行している ZX81 がどこかに隠されている事に気づかずに)、画面いっぱいの文字で個人的なメッセージが表示されるのを想像してみてください。テクニカルノート このプログラムは、ROM の 7,680 以降に格納されている ZX81 文字セットに依存しています。 文字を表すために 8 バイトが使用されるため、たとえば文字「P」にはこのようなものが格納されます。 00000000 01111100 01000010 01000010 01111100 01000000 01000000 00000000 これを遠ざけてみると、文字がわかるはずです。 20 ~ 120 行目 文字の拡大表示を行うサブルーチン 40 行目 大きな文字の場合は行ごとに上にスクロールし、 小さな文字の場合は1 行おきにスクロールします。 50 ~ 100 行目 1列分の拡大表示。バイトの左からビットを順に分析します。 90 行目 PLOT ステートメント。 2 番目の座標指定に注目してください。 これは論理式であるため、C が奇数か偶数であるかに応じて、 値 1 または 0 を交互に取ります。 130 ~ 220 行目 メッセージを受け取るメイン プログラムーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲームというより、お遊びプログラムでしょう。ROM内にある文字のBITイメージを読み出して、拡大表示を行います。・L(大)「HELP 」・S(小)「HELP 」ずっとスクロールしながら表示を続けますので、スペースキーでBREAKしてください。【ポイント5倍】Intel インテル / 670p SSDPEKNU010TZX1 / M.2 2280NVMe 1TB / [670pSSDPEKNU010TZX1] / 5032037193559 / SSD価格:6,880円(税込、送料無料) (2024/1/12時点)楽天で購入
2024.01.13
コメント(0)
![]()
「Chapter 17 - Printing widh frills」飾り付き表示について。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 17 章 - 飾り付き表示PRINT ステートメントには項目のリストがあり、それぞれが式 (または何もない場合もあります) であり、それらはカンマまたはセミコロンで区切られています。 さらに 2 種類の PRINT 項目があり、何を表示するかではなく、どこに表示するかをコンピュータに指示するために使用されます。たとえば、PRINT AT 11,16 "*" は画面の中央にアスタリスクを表示します。 AT line,column PRINT 位置 (次の項目が表示される場所) を指定されたline(行)とcolumn(列)に移動します。行には 0 (上部) から 21 までの番号が付けられ、列には 0 (左側) から 31 までの番号が付けられます。 TAB column PRINT 位置を指定されたcolumn(列)に移動します。 同じ行に留まるか、バックスペースが必要な場合は次の行に進みます。コンピュータは列番号を modulo 32として減算することに注意してください (32 で割って余りを計算します)。 したがって、TAB 33 は TAB 1 と同じ意味になります。 サンプルを示します。 PRINT AT 30,1;TAB 12;"CONTENTS";AT 3,1;"CHAPTER";TAB 24;"PAGE" (これは、ページ番号として 1 を使用して、目次ページの見出しを印刷する方法です。)いくつかの小さなポイント (i) これらの新しい項目は、上で行ったようにセミコロンで区切るのが最適です。 セミコロンは表示位置を継続します。または、カンマで区切ることもできます。カンマは表示位置を16列単位で移動することを意味しますが、通常はあまり役に立ちません。 (ii) AT と TAB は関数ではありませんが、それらを取得するにはファンクション キー (シフト NEWLINE) を入力する必要があります。 (iii) 画面の下の 2 行 (22 と 23) はコマンド、入力データ、レポートなどのために予約されているため、表示できません。 最終行は通常21 行目を意味します。 (iv) AT を使用すると、すでに何かが表示されている場所でも PRINT 位置を移動できます。 古いものは上書きされます。 PRINT に関連するステートメントがさらに 2 つあります。CLS と SCROLL です。 CLS は画面をクリアします (それ以外は何もクリアしません)。 SCROLL は、表示全体を 1 行上に移動し (最上行を失います)、PRINT 位置を最下行の先頭に移動します。 これがどのように機能するかを確認するには、次のプログラムを実行します。 10 SCROLL 20 INPUT A$ 30 PRINT A$ 40 GOTO 10まとめ PRINT 項目:AT、TAB ステートメント: CLS、SCROLL演習1. これを実行してみます。 10 FOR I=0 TO 20 20 PRINT TAB 8*I;I; 30 NEXT I これは、TAB 番号が modulo 32 として削減されることの意味を示しています。より洗練された例として、20 行目の 8 を 6 に変更します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81における表示に関して記述しています。PRINT自体はよくありますが、AT、TAB、CLS、SCROLLは注意が必要です。マルチステートメントが使えないZX81ですが、ATやTABにて1行で多くの表示が可能となり、貴重な項目だと思います。CLSは画面クリアで、CLEARなどスペルの違いがあれどよく他のBASICでも見かけます。SCROLLは他のBASICではあまり見かけないと思います。一般的に最終行を超えると自動的にスクロールしますが、ZX81ではエラーとなるため、SCROLLでこれを回避する必要があります。SCROLLコマンド自体は割と処理が早いため、スクロールするゲームによく使われていた気がします。M.2 SSD用ヒートシンク ≪サンワサプライ≫ TK-HM5S 【離島 発送不可】価格:740円(税込、送料無料) (2024/1/12時点)楽天で購入
2024.01.12
コメント(0)

「30 Programs for the ZX81」から第11弾「Momentum(運動量)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Momentum(運動量)」このプログラム (および 「SPHERES(球体)」プログラム※今後紹介予定) は、暗算スキルをテストします。プロンプトが表示されたら、1 から 3 までの難易度を選択しましょう。コンピュータによって1つ目の列車の速度と質量、2つ目の列車の質量が表示されます。NEWLINEを押すと1つ目の列車が左から近づいてきます。2つが衝突すると、その勢いは2つ目の静止していた列車に損失無く完全に伝達されます。 1つ目の列車の速度と質量、および静止していた2つ目の列車の質量を考慮して、列車の合成速度を計算して入力しましょう。コンピュータにより回答の分析結果が表示されます。NEWLINEを押すと再度挑戦する事ができます。このプログラムを使用して暗算スキルを向上させましょう。テクニカルノート 50 ~ 100 行目 ランダムな質量と速度を生成 (難易度 が 50、60、70 行目の式にどのように含まれているかに注目してください。) 130 ~ 200 行目 走行する列車を表示 220 ~ 240 行目 回答の分析 (正しい値の 0.01 以内であれば正解とします。)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲーム画面はこんな感じです。今回は1を入力してNEWLINEを押すと…左の列車?が右に移動して、2つの列車が衝突。その勢いで右の列車が移動します。その合成速度(1つ目の列車の重量×速度÷2つ目の列車の重量)を計算して入力します。1.4と入力してみました。1.5が正解だったようです。0.01以内の誤差までが正解となります。カンタン ゴミ ほこり 消しカス 吸引 キレイ 清潔単三電池2本 定形外郵便発送【△】/卓上コンパクトクリーナー価格:980円(税込、送料無料) (2024/1/11時点)楽天で購入
2024.01.11
コメント(0)
1981年「1K SuperInvation」こちらも前回紹介した「1K Space Intruders」と同じく、1Kインベーダーです。どちらの発売が早いかは解らなかったのですが、同時期のインベーダーとして紹介します。youtubeに動画がアップされていました。Super ZX80 Invasion (ZX80.UK.1981..Dev. Krome Studios Melbourne. Pub. The Essential Software) (youtube.com)(ZX80バージョンですがゲーム内容は同じです)詳しい解説はこちらがお勧めです。ZX80 - Super Invasion (plus.com)なお、ロードの後に起動させるには「RUN」ではなく「GOTO 100」を使用します。「ZX81 BASIC MANUAL」に書かれていましたが変数エリアもテープに保存されており、機械語はこのエリアを活用しているようです。このため、RUNでは初期化されてしまうのでこの点を注意する必要があります。
2024.01.10
コメント(0)
1981年「1K Space Intruders」ZX81発売当初から、1Kインベーダーがあるとの情報がありましたが、実物を見たことはありませんでした。ネット検索しても出てこないので、半ばあきらめていましたが、ZX81関連の海外向けの雑誌を見させていただいたところ、「Space Intruders」とのタイトルで発売されていたので、ここで紹介しましす。youtubeに動画がアップされていました。1K SpaceInvaders (ZX80.UK.1981..Dev. Macronics Systems. Pub. Macronics Systems) (youtube.com)詳しい解説はこちらがお勧めです。ZX80 - 1K Space Intruders (plus.com)ZX80バージョンもあります。ZX80はキー入力待ち以外は画面表示処理を行わないため、特殊な処理にて実現しています。フリッカーフリー技術 ZX80 - Flicker-Free Display Technique (plus.com)
2024.01.10
コメント(0)
「Chapter 16 - Tape storage」テープ保管について。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 16 章 - テープ保管第 1 章で述べたように、いずれにしても、ZX81 の電源をオフにすると、内部に保存されていたすべてのプログラムと変数が失われます。これらを保存する唯一の方法は、コンピュータにカセットテープに録音させることです。 後でそれらをロードし直すと、コンピュータは記録を行ったときとほぼ同じ状態に復元されます。 ZX81 では、ZX81 をカセットレコーダーに接続する一対のリード (第 1 章の (v)) が必要であることがわかります。テープ レコーダーは自分で用意する必要がありますが、テープ レコーダーによっては他のものよりもうまく機能するものもあります。 はじめに、ZX81 にとって、安価でポータブルなモノラル カセット レコーダーは少なくとも高価なステレオ カセット レコーダーと同じくらい使えるもので、トラブルも少ないです。また、テープカウンターはとても便利です。 次に、テープレコーダーにはマイクで使用するための入力端子と、イヤホンで使用するための出力端子が必要です。(無い場合、外部スピーカー端子を試してください。)それらは、ジャックに適合するように、3.5 mm ジャック端子であることが望ましいです。 他の種類では ZX81 に十分な信号が得られないことが多いです。 どのカセット テープでも使用できますが、ノイズの少ないテープが望ましいです。 さて、適切なカセットレコーダーを入手したら、それをコンピューターに接続します。一方のリードはレコーダーのマイク入力端子をZX81の側面にある「MIC」とマークされた端子に接続し、もう一方のリードはレコーダーのイヤホン出力端子に接続します。 レコーダーを ZX81 の「EAR」端子に接続します。 リード線が交差していないことを確認してください (ただし、交差していても ZX81 が損傷することはありません)。コンピュータに何らかのプログラム、たとえば第 11 章の文字セット プログラムを入力します。プログラムに名前を付ける必要があります。 保存するときに、この名前をプログラムに入れて、リストに表示されるようにすることをお勧めします。最も簡単な方法は、REM ステートメントを使用することです。 それでは 5 REM "CHARACTERS" と入力してください。 さて、予行演習です。何が起こるかを確認するために、次のように入力します。 SAVE "CHARACTERS" そしてテレビを見ます。 5 秒間は灰色がかった色になり、約 6 秒間は白と黒の細い縞模様の独特のパターンが表示され、その後画面が白くなり、レポート 0/0 が表示されます。 コンピュータは「MIC」端子に信号を送信していました。 しかし、それは同じ信号をテレビにも送信し、あなたが見たような映像を作り出していました。 灰色の部分は無音の導入部分、白黒部分はプログラムです。 もちろん、あなたがやりたいことは、その信号をテープでキャッチすることなので、今回はそれをきちんとやってみましょう。プログラムの保存 1. ブランクまたは上書きする準備ができたテープを配置します。 2. マイクを使用して、自分で「文字」と言っているのを録音します。 これは必須ではありませんが、後でプログラムを見つけやすくなります。 コンピュータをテープレコーダーに再接続します。 3. 次のようにタイプします。 SAVE "CHARACTERS"(NEWLINEはまだです) 4. テープレコーダーの録音を開始します。 5. NEWLINE を押します。 6. 前と同じようにテレビを見ます。 終了したら (レポート 0/0)、テープ レコーダーを停止します。 これが機能していることを確認するには、テープ レコーダーのスピーカーからテープを聞いてください。 (テープレコーダーのイヤホンソケットからリード線を抜く必要があるかもしれません。) テープを前の開始位置まで巻き戻して、再生します。 まず、「文字」という自分の声が聞こえます。 その後、静かなハミング音が聞こえます。 これは実際には録音の一部ではありませんが、(NEWLINEを押す前)テレビへの信号の終わりであり、偶然にもテープレコーダーにも送信されています。 次に 5 秒間の沈黙があり、適切なテープ信号が始まります。 これは、テレビ画面が灰色になった期間に相当します。 次に、非常に耳障りな高音の雑音が約 6 秒間続きます。最大音量では、これは非常に不快なほど大きいはずです。 これはプログラムの録画であり、テレビ画面の白黒パターンに対応します。 最後に、柔らかなハミング音が戻ってきます。 これらのさまざまな音が聞こえない場合は、コンピュータとテープ レコーダーが正しく接続されているかどうかを確認してください。 一部のテープ レコーダーでは、ジャック プラグ をまっすぐ押し込むと接触しないことがあります。ジャック プラグを 10 分の 1 ほど引き出してみると、より自然な感じになることがあります。 さて、録音した内容が人間の耳には問題なく聞こえた場合、それをコンピューターに再度ロードしてみましょう。 名前を付けてプログラムの読込 1. テープを開始位置まで巻き戻します。 2. コンピュータの「EAR」端子がテープ レコーダーのイヤホン ソケットに接続されていることを確認します。 3. テープレコーダーの音量コントロールを最大音量の約 4 分の 3 まで回します。 トーンコントロールがある場合は、高音が高く、低音が低くなるように調整します(ヒスノイズになるように)。 4. 次のようにタイプします。 LOAD "CHARACTER" (これも NEWLINE なし) 5. テープレコーダーを起動します。 6. NEWLINEを押します。 もう一度、テレビで録画の画像を見ることができますが、今回は異なって見え、すべてが白黒のパターンになります。 無音部分とプログラム部分の 2 つの部分は区別しにくいですが、プログラム部分の方がより幅広く、より明確な境界線を持っていることがわかるはずです。 (演習 1 を一度試してください。) 15 秒後にロードされ、レポート 0/0 で停止するはずです。 それ以外の場合は、BREAK キー (スペース) を押すと、悲惨な状態から抜け出すことができます。 間違っている可能性が最も高いのは音量レベルです。これは次のとおりです。 (i) プログラム部分がコンピュータに拾われるのに十分な音量、 (ii) プログラム部分が歪むほど大きな音ではありません (これは実際にはかなりまれです)。 (iii) 無音部分がコンピュータによって無音として認識されるのに十分な静音性。 最良の調整は、無音部分がまったくうるさくならない範囲で、音量をできるだけ大きくすることです。 これは、スピーカーで録音を聞きながら行うことができます。 沈黙が耐えられないほどうるさい場合は、他の問題が発生している可能性があります。 一部のテープ レコーダーは、ZX81 とフィードバック ループを形成します。 これは、EAR とMIC リード線が両方同時に入っているため、解決策は EAR リード線を外した状態で保存することです。 一部のテープレコーダーは主電源のハム音を録音してしまいます。 これは電池で動作させることで解決します。 テープレコーダーの中には、特に古くて使い古されたものなど、本質的にノイズが多いものがあります。 これは、より高品質のテープを使用することで改善される可能性がありますが、これは必須ではありません。 カセットレコーダーのテープヘッドが汚れている場合は、クリーニングしてみてください。 最後に、マイク端子について述べたように、イヤホン端子にプラグを直接押し込むことに関しても同じ問題が発生する可能性があります。 テープにプログラムがあり、その名前を思い出せない場合でも読み込む事ができます。 (以前使用していたプログラム「CHARACTERS」で試してみてください。)名前のないプログラムの読込 1. テープを無音位置に配置します。 2. すべてを確認し、前と同じようにコントロールを調整します。 名前を知っていたときよりも音量レベルに注意する必要があることに気づくかもしれません。 3. 次のようにタイプします。 LOAD "" (NEWLINEなし) 4. テープレコーダーの再生を開始します。 5. NEWLINEを押します。 6.残りは以前と同じです。 その考え方は、ロードを要求したプログラムの名前が空の文字列の場合、コンピューターは最初に見つかったプログラムを読み込むというものです。 プログラムを保存するときは、その名前を空の文字列にすることはできないことに注意してください。それを試みると、エラー F が発生します。 LOAD & SAVE はプログラムでも使用できます。 SAVE を使用すると、プログラムはそのような状態で自身を保存し、読み込まれるとすぐに SAVE ステートメントの後の行から実行を続行します。 たとえば、次のように入力します。 5 REM "USELESS" 10 PRINT "THIS IS ALL IT DOES" 20 STOP 100 SAVE "USELESS" 110 GOTO 10 テープレコーダーを接続し、次のように入力します RUN 100 (NEWLINEなし) テープレコーダーの録音を開始し、NEWLINEを押します。 プログラム自体が保存されると、プログラムは実行を継続します。 100 行目の USELESS の最後の S が反転文字に変わっていることが後でわかりますが、これは心配する必要はありません。 読み込むには、テープをプログラムの開始前のどこかに巻き戻して LOAD "USELESS" (NEWLINE なし) と入力し、コンピュータでテープの再生を開始し、NEWLINE を押します。 ロードされると、110 行目から続行され、何もしなくても自動的に実行されます。 SAVE ステートメントをプログラムの最後に置くということは、SAVE なしでプログラムを実行するには RUN と入力するだけで済み、SAVE ステートメントを迂回する必要がないことを意味することに注意してください。 GOSUB ルーチン内から SAVE を行わないでください。正しく動作しません。 プログラム名に反転文字を入れないでください。 反転文字以降の名前の部分は失われます。 名前には 127 文字を超えてはいけません。 LOAD または SAVE の名前は文字列定数である必要はなく、A$ や CHR$ 100 などの任意の文字列値の式にすることができます。まとめ プログラムをテープに保存する 名前付きプログラムをテープから読み込む 利用可能な最初のプログラムをテープから読み込む プログラムを保存して読み込んで自動的に実行するようにする ステートメント: SAVE、LOADノート 他の種類のコンピュータや、独自の整数 BASIC を備えた ZX80 から保存されたプログラムをロードすることはできません。 保存したプログラムを他の種類のコンピュータや整数 BASIC を搭載した ZX80 にロードすることはできません。 一方、ZX81 BASIC を搭載した ZX80 は ZX81 と互換性があります。 どちらかに保存されたプログラムは、もう一方にロードできます。 ZX80 プログラムをロードすると、ZX81 は高速モードになります。演習 1. 短いプログラムがたくさん入ったテープを作成した後、再生を開始してコンピュータに次のように入力します。 LOAD "NOT THE NAME OF A PROGURAM" テレビで見ると、テープ上の空の部分 (かなり構造化されていない白黒パターン) とプログラム (より明確な線) の違いが簡単にわかるはずです。 どちらのパターンも、保存時に表示されるものとは異なります。 プログラムが流れている間に音量を下げると、信号が小さすぎてプログラムのように見えなくなる一方で、映像が空きスペースのパターンに切り替わるのがわかります。2. 最初のプログラムが読み込まれると、メニュー (テープ上の他のプログラムのリスト) が出力され、プログラムの選択を求められ、それが読み込まれます。3. プログラム「CHARACTERS」を再度入力し、次のように入力します。 LET X=7 プログラムには現れませんが、コンピュータには 変数 X 値 7 が含まれます。 次にプログラムを保存し、コンピューターの電源をオフにしてからオンにし (不正行為がないことの確認)、プログラムを読み込みます。 PRINT X と入力します。7と答えが得られます。 SAVE ステートメントは、プログラムだけでなく、X を含むすべての変数も保存しました。 プログラムの実行時にこれらの変数を保持したい場合は、(第 9 章で説明したように) RUN ではなく GOTO を使用することを忘れないでください。 (プログラム行として SAVE を使用して) プログラム自体を実行させることで、これを覚えておく必要がなくなります。4. 非常に長いプログラムを入力すると、電源が一時的に切断されます。 この種のことは時々自然発生的に起こります。 それはバグではなく、不具合です。 それに対しては泣く以外に何もできることはありません。 耐えられないほど頻繁に発生する場合は、何か問題がある可能性がありますが、不完全なプログラムを途中でテープに保存する価値はあります。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81におけるカセットテープへの保存と読込について記述しています。カセットテープ、今はなかなか見ることができませんが、当時は必須なデバイスでした。カセットテープを知る人でも、それをコンピュータのプログラムの保存と読込に使っていた事を知る人は数少ないかと思います。さらにZX81で使用した人となると、ほんの一握りの人だっただろうと想像に難しくないでしょう。この章は、ZX81の実機とカセットレコーダーが無いとなかなか理解が難しいと思いますが、参考になればと思います。
2024.01.09
コメント(0)

「30 Programs for the ZX81」から第10弾「Truth Table(真理値表)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Truth Table(真理値表)」これは論理的分析力をテストする本当の頭の体操パズルです。コンピューターは、Z を P、Q、R の関数と同等にする論理式を生成します。その関数の真理値表を計算する必要があります。典型的な方程式は次のようになります。 Z=P AND ( Q AND R OR P AND Q ) OR Qこの場合、真理値表は次のようになります。 P Q R Z 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 1 上記のようなブール代数式は、多くの場合、次の表記法を使用して記述されます。このような式を分析するには、次の定理が役に立ちます。 上記の式の例を考慮すると、定理 2 を使用すると P・(Q・R+P・Q) + Q が P・Q・(R + P) + Q に還元され、定理 3 を使用すると再び単純な Q に還元できることがわかります。真理値表の推測を紙に書き留めてNEWLINEを押すと、コンピューターが正解を表示します。テクニカルノート 10 ~ 80 行目 B$ にランダムな論理式の文字列を生成 90 ~ 190 行目 VAL 関数を使用して B$ を評価する真理値表を出力 200 ~ 370 行目 B$に括弧で囲まれた式の文字列を追加ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲーム画面はこんな感じです。式が表示されるので、RQPの値から導かれるZの値を予測します。このあとNEWLINEを押すと回答が表示されます。今回はZ=Pのようです。B$に式をランダムに生成して、VAL B$にてZ値を計算させています。私はVAL関数が文字列内から数字を抜き出すものだと勘違いしていて、このプログラムをしばらく理解できませんでした。VAL関数で、文字列に含まれたP、Q、R、OR、NOT、ANDを計算しているんですね。これって、他のBASICでも同じなのかな。。。
2024.01.07
コメント(0)

「Chapter 15 - Making your programs work」プログラムを動作させるについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 15 章 - プログラムを動作させるコンピューターのプログラミング技術には、どのステートメントが何を行うのかを知るだけではありません。おそらく、ほとんどのプログラムには、最初にプログラムを入力したときに、技術的にバグと呼ばれるものがあることにすでに気づいているでしょう。おそらく単なる入力ミス、またはプログラムが何をすべきかについてのあなた自身の考えの間違いかもしれません。これを経験の浅さのせいにするかもしれませんが、それは自分自身を欺いていることになります。すべてのプログラムはバグから始まります。 多くのプログラムはバグを抱えたままです。これには 2つの結論があります。まずは、すべてのプログラムをすぐにテストする必要があります。次に、うまくいかないたびにイライラしない事です。一般的な計画をフローチャートで説明しましょう。 アイデアは、矢印に従ってボックスからボックスへ進み、それぞれの矢印に記載されていることを実行することです。さまざまな種類の指示にさまざまな種類のボックスを使用しました。 (これらの形状はかなり広く使用されていますが、これに依存するものではありません。) もちろん、これらのフローチャートは人間の活動を説明するのには適していません。 このように固定された直線に沿って考えることは、創造性や柔軟性には適していないからです。 しかし、コンピュータの場合は単純な作業が向いています。それぞれのボックスに記述されたプログラム構造を記述するのが最も得意で、次のフローチャートの例が参考になるかもしれません。 概念的には、長方形のボックスが GOSUB に対応します。 ただし、実際にはいくつかのボックス (L、S、D を入力する上記のボックスなど) は、サブルーチンなしで BASIC ステートメントに直接変換されます。 フローチャート、サブルーチン、REM ステートメントなど、プログラムを明確にするものはすべて、プログラムの理解を深めます。 そうすれば、バグを書くことは確実に減ります。 ただし、サブルーチンは、プログラムのテストを容易にすることで、作成したバグを取り除くのにも役立ちます。構造化されていないプログラム全体をテストするよりも、サブルーチンを個別にテストして、それらが適切に組み合わされていることを確認する方がはるかに簡単であることがわかります。 サブルーチンは、「バグを見つける」ボックスを支援します。これは、得られるすべての助けが必要なボックスです。これは、多くの場合、最も腹立たしい作業であるためです。バグを見つけるためのその他のヒントは次のとおりです。 (i) 入力ミスがないか確認してください。 常にこれを実行してください。 (ii) 各段階ですべての変数が何であるべきかを考え出すようにしてください。可能であれば、これを REM ステートメントで説明してください。PRINT ステートメントをそこに挿入すると、プログラム内の特定の位置で変数を確認できます。 (iii) プログラムの影響により、プログラムがエラー報告とともに停止する場合は、この情報をできる限り徹底的に活用してください。レポート コードを調べて、停止した行で停止した理由を調べます。 必要に応じて変数の値を出力します。 (iv) プログラムの行をコマンドとして入力すると、プログラムを 1 行ずつ実行できる場合があります。 (v) コンピューターのふりをします。鉛筆と紙を使用して自分自身でプログラムを実行し、変数の値を書き留めます。 バグを見つけたら、それらを修正するのは元のプログラムを作成するのとほぼ同じですが、プログラムを再度テストする必要があります。1 つのバグを修正したとしても、別のバグは驚くほど簡単に発生します。演習1. LSD 計算機のフローチャートには「フィニッシュ」ボックスがありません。 これは重要ですか? 置きたい場合はどこに置きますか?2. 第 12 章でループするプログラムのフローチャートを作成しましょう。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーープログラムを動作させるために、フロチャートを使って解説しています。ここまで解説したBASICのマニュアルは、私は見たことがありません。ZX81BASICマニュアルが評価される理由の1つがこの辺りなのかもしれません。
2024.01.06
コメント(0)

「30 Programs for the ZX81」から第9弾「Spell(つづり)」を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー「Spell(つづり)」 このシンプルなミニゲームは、対戦相手との競争だけではなく、人の記憶についての興味深い洞察を提供します。 プログラムはランダムに選択された最大 15 文字の文字列を生成します。文字列の長さもランダムです。文字列は数分間表示され、長い場合はさらに長く表示されるので、その間に文字列を記憶しましょう。 文字列が消去されたら、記憶した文字列を入力して最後にNEWLINEを押すとコンピュータにてチェックされ、その結果が表示されます。その後もう一度NEWLINEを押すと次のランダムな文字列が表示されます。さて、どのくらいの長さまで覚えられるでしょうか。 80行目 の式は、文字列を表示する時間の長さを決定します。変数 A は文字列の長さで、語長に関係なく一定の合格/不合格率が得られるまで、この式を調整してみてください。テクニカルノート 変数 A、文字列の長さ A$、文字列。 B$、あなたの推測 N、ダミーの FOR NEXT 変数 10 ~50 行目、文字列を生成 70 ~90 行目、計算された時間だけ出力します。 110~160行目、結果分析ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーゲーム画面はこんな感じです。ランダムな文字列が、ランダムな文字数分表示されます。頑張って記憶しましょう。この後画面が消去されたら、記憶した文字列を入力してNEWLINEを押します。試しに別の文字列「TEST」を入力したところ、下記の画面となりました。なお、このゲームを停止させる場合はSPACEキーによりBREAKしてください。
2024.01.05
コメント(0)
「Chapter 14 - Subroutines」サブルーチンについて。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー第 14 章 - サブルーチン場合によってはプログラムの異なる部分で同じような処理が行われ、同じ行を 2 回以上入力することになることがあります。 しかし、これは必要ありません。 サブルーチンと呼ばれる形式で行を一度入力すると、再度入力することなく、プログラム内の他の場所で使用したり呼び出したりすることができます。 これを行うには、ステートメント GOSUB (GO to SUBroutine) と RETURN を使用します。 GOSUB n ここで、 n はサブルーチンの最初の行の行番号であり、GOTO n と同様ですが、コンピュータが GOSUB ステートメントの行番号を記憶しているため、サブルーチンの実行後にGOSUB の直後に戻って実行する点が異なります。この行番号 (戻りアドレス) は行列(GOSUB スタック) の先頭に置くことで記憶されます。 RETURNGOSUB スタックから先頭の行番号を取得し、その後の行に進みます。 最初の例です。 10 PRINT "THIS IS THE MAIN PROGRAM", 20 GOSUB 1000 30 PRINT "AND AGAIN"; 40 GOSUB 1000 50 PRINT "AND THAT IS ALL." 60 STOP 1000 REM SUBROUTINE STARTS HERE 1010 PRINT "THIS IS THE SUBROUTINE," 1020 RETURN 60 行目の STOP ステートメントは非常に重要です。そうしないと、プログラムがサブルーチンに進み、RETURN ステートメントに到達したときにエラー 7 が発生するからです。 それほど簡単ではない例として、ポンド、シリング、ペンスを処理するコンピューター プログラムを作成したいとします。(昔の記憶のある方は、1971 年以前は 1 ポンドが 20 シリングに分割され、つまり 1 シリングは 5 ペンスであり、1 シリングは 12 旧ペンスに細分化されたことを覚えているでしょう。 d は古いペニーの略語でした。) 3 つの変数 L、S、D (おそらく他にも - L1、S1、D1 など) があり、演算は非常に簡単です。 まず、ポンド、シリング、ペンスで別々に計算します。たとえば、2 つの金額を追加するには、ペンスを追加し、シリングを追加し、ポンドを追加します。 お金を2倍にするには、ペンスを2倍、シリングを2倍、ポンドを2倍にします。 などなど。すべての作業が完了したら、ペンスが 0 ~ 11 の間、シリングが 0 ~ 19 の間に収まるように正しい形式に調整します。この最後の段階はすべての操作に共通なので、サブルーチンにすることができます。 サブルーチンの概念を少し脇に置いて、自分でプログラムを書いてみる価値はあります。任意の数値 L、S、D を与えると、それらを適切なポンド、シリング、ペンスに変換するにはどうすればよいですか? 問題の一部は、稀なケースを考慮する事です。 最初に思いつくのは、おそらく 1..25s..17dのようなもので、これを 2..6s..5dに変換したいと考えます。 それほど難しくありません。しかし、負の数があるとどうしますか?1..25s..17d または -1..-25s..- 17d は、-3..13s..7d になる可能性がありますが、これはかなり奇妙な表現方法です (まるで人間が お互いに丸ごと貸し合うことしかありません)。では、分数はどうでしょうか? 1..25s..17d を 2 で割ると、5..12.5s..8.5d になりますが、これには 0 ~ 11 の間の 8.5 ペンスが含まれています。 シリング、12.5、0 と 19 の間、それは確かに 1..3s..2.5dほど良くありません。これ以上読む前に、これらすべてに対する自分なりの答えを試してみて、コンピューター プログラムで使用してください。 これが 1 つの解決策です。 1000 REM SUBROUTINE TO ADJUST L.S.D. TO THE NORMAL FORM FOR POUNDS, SHILLINGS AND PENCE 1010 LET D=240*L+12*S+D 1020 REM NOW EVERYTHING IS IN PENCE 1030 LET E=SGN D 1040 LET D=ABS D 1050 REM WE WORK WITH D POSITIVE, HOLDING ITS SIGN IN E 1060 LET S=INT (D/12) 1070 LET D=(D-12*S)*E 1080 LET L=INT (S/20)*E 1090 LET S=S*E-20*L 1100 RETURN L、S、d を事前に設定したり、後でそれらを使用して何もするプログラムがないため、これ自体はあまり役に立ちません。 メインプログラムを入力し、L、S、D を出力する別のサブルーチンも入力します。 10 INPUT L 20 INPUT S 30 INPUT D 40 GOSUB 2000 45 REM PRINT THE VALUES 50 PRINT 60 PRINT " = "; 70 GOSUB 1000 75 REM THE ADJUSTMENT 80 GOSUB 2000 85 REM PRINT THE VALUES 90 PRINT 100 GOTO 10 2000 REM SUBROUTINE TO PRINT L,S AND D 2010 PRINT "£";L;"..";S;"S..";D;"D"; 2020 RETURN (第 9 章で、50 行目の空の PRINT ステートメントが黒い行を出力することを思い出してください。) 明らかに、2000行目 で PRINT サブルーチンを使用することでプログラムを節約できました。これ自体は、プログラムを短縮するためのサブルーチンの非常に一般的な用途です。しかし、調整サブルーチンは実際には、GOSUB と RETURN; によってプログラムを長くします。 したがって、プログラムの長さだけが考慮すべき点ではありません。サブルーチンを上手に使えば、重要な人間にとってプログラムを理解しやすくなります。 メイン プログラムは、より強力なステートメントを使用することで簡素化されています。各 GOSUB は複雑な BASIC を表しますが、それは忘れても構いません。最終的な結果のみが重要です。このため、プログラムの主な構造を把握するのがはるかに簡単になります。 一方、サブルーチンはまったく異なる理由で簡略化されています。つまり、サブルーチンが短いということです。これらは依然として同じ古いゆっくりとした LET および PRINT ステートメントを使用しますが、ジョブ全体の一部を実行するだけでよいため、記述が簡単になります。 スキルは、サブルーチンを作成するレベルを選択することにあります。 これらは、メイン プログラムに重大な影響を与えるのに十分な大きさであると同時に、サブルーチンのない完全なプログラムよりもはるかに簡単に作成できるほど十分に小さい必要があります。これらの例 (推奨されません) はこれを示しています。 最初のプログラム 10 GOSUB 1000 20 GOTO 10 1000 INPUT L 1010 INPUT S 1020 INPUT D 1030 PRINT " ";L;"..";S;"S..";D;"D";TAB 8;"="; 1040 LET D=240*L+12*S+D : : : : 2000 RETURN 次のプログラム 10 GOSUB 1010 20 GOSUB 1020 30 GOSUB 1030 40 GOSUB 1040 50 GOSUB 1050 : : : : 30 GOTO 10 1010 INPUT L 1015 RETURN 1020 INPUT S 1025 RETURN 1030 INPUT D 1035 RETURN 1040 PRINT " ";L;"..";S;"S..";D;"D";TAB 8; "="; 1045 RETURN 1050 LET D=240*L+12*S+D 1055 RETURN : : : : 最初は単一の強力なサブルーチンを備え、次は多くの些細なサブルーチンを備えており、まったく反対の極端さを示していますが、同じくらい無駄です。サブルーチンは別のサブルーチンを呼び出すことも、サブルーチン自体を呼び出すこともできます (サブルーチン自体を呼び出すサブルーチンは再帰的です)。そのため、重複する事を恐れないでください。まとめ ステートメント: GOSUB、RETURN 演習 1. サンプル プログラムは事実上、ユニバーサル LSD 計算機です。 どのように使用しますか。 (i) ポンドと新ペンスをポンド、シリング、ペンスに換算するには? (ii) ギニーをポンドとシリングに変換するには? (1 ギニー = 1..1 秒) (iii) ポンドの端数を見つけるには? (例: 1 ポンドまたは 1 マルクの 3 分の 1 は 6s..8dです。 ペンスを最も近いファージング (1/4d) に四捨五入するように行を入力します。2. プログラムに 2 つのステートメントを追加します。 4 LET ADJUST=1000 7 LET LSDPRINT=2000 そして、以下も変更します。 GOSUB 1000 to GOSUB ADJUST GOSUB 2000 to GOSUB LSDPRINT これは期待どおりに機能します。 実際、GOSUB (または GOTO または RUN) ステートメントの行番号には、任意の数値式を使用できます。(これは標準の BASIC ではないため、ZX81 以外のコンピュータでは動作しないと考えてください。) この種の機能は、プログラムを明確にするために驚くほど効果的です。3. メイン プログラムを書き換えましょう まったく異なる処理を実行しますが、同じサブルーチンを使用します。4. ... GOSUB n ... RETURN この記述は、次のように置き換えることができます。 ...GOTO n それはなぜでしょう?5. サブルーチンには複数のエントリ ポイントを含めることができます。 たとえば、メイン プログラムで GOSUB 1000 の直後に GOSUB 2000 を使用する方法により、2 つのサブルーチンを置き換えることができます。L、S、Dを調整して印刷する大きなもので。 これには 2 つのエントリ ポイントがあります。1 つはサブルーチン全体の先頭にあり、もう 1 つは印刷部分のみです。必要な再調整を行います。6. 次のプログラムを実行します。 10 GOSUB 20 20 GOSUB 10 リターン アドレスは GOSUB スタックに大量にプッシュされますが、それらは再び削除されることはなく、最終的にはコンピューターにそれ以上の余地がなくなります。そして、プログラムはエラー 4 で停止します (付録 B を参照)。 すべてを失わずにそれらを再度クリアするのは難しいかもしれませんが、これはうまくいきます。 (i) 2 つの GOSUB ステートメントを削除 (ii) 新しい行を 2 行挿入 11 RETURN 21 RETURN (iii) 入力 RETURN 戻るアドレスは、エラー 7 が発生するまで削除されます。 (iv) 同じことが再び起こらないようにプログラムを変更します。 これはどのように作動しますか?ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーZX81上で、サブルーチンの扱いについて記述されています。言い訳ですが、通貨の単位、ポンド、シリング、ペンスに詳しくないので、翻訳部分をそのまま掲載している部分があります。
2024.01.02
コメント(0)
明けましておめでとうございます。2023年10月末にブログを開設し、はや二か月が過ぎました。当初、ブログの記事については3案ありました。・ZX81を手に入れるまでの時代背景と、手に入れた時の感想・BASICマガジン投稿までに何をしたか・出来がよいとされる「ZX81 BASICマニュアル」の紹介途中から欲がでて、市販ゲームとZX81プログラムの紹介を追加しました。さて、今年はというと…昨年からの記事の完結と、エミュレータの紹介などをしてみたいです。(本音はオリジナルゲーム開発なのですが。。。 ZX81のタイピングはとても時間がかかるので、今は断念しています。)実社会において、ZX81で得た知識がそのまま役に立つという事はほぼ無いのですが、ハードやソフトウェアの制限がある中でどこまでやれるのかを検討する時、たとえばラズベリーパイなどを使ったシステム構築などを行った時に、何か通じる事があるような気がしています。今更ZX81?と思われるでしょうが、何かの機会にZX81に触れ、共感いただく事があれば幸いです。
2024.01.01
コメント(0)
全29件 (29件中 1-29件目)
1
![]()

![]()