CASL
2025.03.18
CASLというのは、情報処理技術者試験用のアセンブラ

特定のCPUに偏ると平等ではない為、みんな同じ条件になるように、試験専用に考えられたという認識です。

今は無いかも?
そして、CASLの前身はCAP-Xじゃなかったっけ。

ポケコンにCASLシミュレータが付いていて、それで実際にプログラムを動かしたり、トレース(変数の動きを出力させたり)していた。

専門学校の授業でもアセンブラはCASLで、目的が情報処理技術者試験だったからそうなったわけだが・・・

勉強していくと面白くなってきて、色々なプログラムを作って遊んでいたような記憶がある。当時のノートは最近まで保管していて、さすがにカビがはえたような感じで汚くなったのでPDF化してから捨てました。

再帰的なプログラムってのがあってだな・・・(詳細、もう忘れた)
FORTRAN
2025.03.17
FORTRANも、いまでは一部しか知らない言語になりました。
自分は高校時代に習いました。(それっきりです)

中3の時、学校見学会だったか文化祭だったかで志望校を訪問する機会があり、そこで円周率の計算プログラム(FORTRAN)の展示を見かけて興味を持ちました。

数学が苦手なくせに、円周率には妙に興味を持っていて、あれこれ調べたりしていました。しかし、どうやって計算するのか当時まったく想像もつきませんでした。

要は、円周の長さを求めるにはどうするかという事で、多角形をどんどん細かくしていくわけです。

プログラムで多桁の数字を扱うにはどうすればよいかも当時は知らなくて、そのFORTRANプログラムを見て学びました。
当たり前といえばそうなんですが、桁を区切って扱うわけです。あとはRAMの許す限り、できるだけ大きな配列を確保します。
その配列ごとに桁上げ・借りを求めていくことで、多桁の計算を実現します。

たとえばZ80のアセンブラで、2バイトや4バイトの数を扱う時に1バイトずつ計算して、桁上げや借りを上位桁に反映していきますけど、同じようなことです。

RAM容量を超える部分をディスク等に書き出したり読み込んだりすれば、そういった外部記憶装置の容量しだいでもっと大きい桁も扱えるようになるけれど、その転送速度が課題となってきます。できるだけオンメモリで処理したいものです。

BASICの原型はFORTRANと聞いたことがあります。

いまでもFORTRANは科学計算などの分野では活躍しているようです。大学とか気象庁?

比較で <= > などの記号はFORTRAN77では使えなくて、.GT. .LE. .LT. .EQ. といった記号を使っていました。Greater Thanとか、Less Than、EQualの略でした。

円周率の計算式は色々あって(詳しくは専門の文献などを参照)、その中でもライプニッツの公式は最も簡単そうに見えたので最初にプログラムを組んでみたのですが、
これは収束がとても遅く、実用性がありません。かなり下の桁から相当な時間をかけて、じわじわ足し上がってくるイメージです。

これ以外に収束の早い式があります。但し、∑だの何だの書いてあって全く意味がわかりません。高校で習ったっけ。忘れた。なんとか展開だのなんとか級数だのサッパリです。

まあ、そのあたりで円周率に興味がなくなったのでした。

FORTRANはCP/M上のコンパイラが有り、過去に試した事がありました。F80というやつです。
F80でコンパイルして、M80でアセンブル、L80でリンクして実行形式(COM)にしました。
COBOL
2025.03.17
COBOLなんて誰も興味ないと思う。自分も。(笑)

学校で習って、それ以来何十年も経過。もう忘れた。

あの頃は鉛筆とテンプレートでフローチャートを描き、それからコーディングシートという原稿用紙にプログラムを手書き、それを見ながら不便な端末から打ち込んでいた。

事務処理系の方でも理解しやすいように、英文のような記述になっていて、少々長ったらしい感じがする。
いまはフリーフォーマットだろうけど、昔はFORTRANと同じように書式が厳密で、何文字目から書き始めるとか、色々決まっていた。

COBOLの歴史は、レトロマイコンよりさらに古い世界。確かFORTRANの次ぐらいか?

だけど、世の中で未だに広く使われているのはCOBOLらしい。銀行や役所のシステムなど、膨大なCOBOL資産があるという。
動かなくなると困るのである。

いま学校などでプログラミング言語でCOBOLを教えているところは有るのだろうか? 無さそうな感じ。

COBOLって何に使うのか? ゲームを作ったりは、無い。

リアルタイムよりもバッチ処理向けで、データを揃えて実行すると結果が出てくるような使い方。
詳しくないがリアルタイム処理もたぶん有るのだろう。あいにく自分はCOBOLでのリアルタイム処理をやったことがない。

ゲームを作ろうと思えば、アイデア次第で何らかの形では実現できるかもしれないけど。

本来の目的は、さっきも書いたようにバッチ処理向け。給料の計算とか税金の計算とか、そんなところです。

動作環境は、いわゆるメインフレーム。昔のコンピュータのイメージ通り。いまの機種はスマートだろうけど、昔のはテープがぐるぐる回ってプリンタがジャージャー鳴りながら用紙を吐き出していた。
小学生の頃、県庁のコンピュータ室を外から見学したけど、まさにそれ。

そのメインフレーム(汎用機)も絶滅危惧種になりつつあるみたいです。
完全な乱数
2025.03.16
完全な乱数なんて有るのでしょうか?

たとえばMSX-BASICなどには乱数があります。これで簡単に乱数が得られると思うでしょう。

ところが、これは疑似乱数、算術乱数と呼ばれるものです。規則性を持っている、予想できるという意味で、完全な乱数ではありません。

MSX-BASICの内部は知りませんが、一般的な乱数ルーチンでは(簡単な例で)もとの数を5倍して+1する、といった具合に乱数を得ていますから、次の乱数が予想できるわけです。
シミュレーションの再現性という意味では、かえってそのほうが都合の良い場合もあるかもしれません。

インターバルタイマー(例えば1/60)で内部的にカウンタを回しておき、RND関数を呼び出した瞬間の値を拾ってそれを利用するとか。

中学生の頃、BASICでサイコロの確率のシミュレーションを行いました。サイコロを転がす回数が増えれば増えるほど1/6に近づいていきました。

学生の頃に友人がMSX上でSEGAのアーケード機のTETRISを再現しました。その時に、乱数について議論したのでした。

テトリミノは7種類あって、一方で我々が使っている乱数は2進数をベースにしているから、3bitだと0~7の値をとるから8種類、ひとつ余る。
0~6を(NEXTの)テトリミノに割り当てたとして、7が出た時は0~6が出るまで乱数の発生をやり直すか?
その場合の確率的には偏りがあるのか?
7が続けて何度も出るのではないか?
・・・などと議論しました。

そもそもSEGAのTETRISは乱数でNEXTを決めているのかどうかは知りません。我々は、おそらく乱数だろうと考えて作りました。根本的な部分です。

実際、棒ばかり続けて出る事もあったと思います。(あえてデバッグの為に、棒だけ出るようにして試した事もありました。全消しをするとボーナス点になるか確認するなど)

脱線しましたが、乱数を発生するサブルーチンは「Z80マシン語秘伝の書」に載っていたものを利用しました。結局、計算によって次の乱数を求めているので、完全にランダムとは言えないと思います。

その上で、さらに別の乱数を組み合わせて・・・などと考えたりもしましたが、結局どこかで規則性をもってしまいます。

もうひとつ別の乱数ルーチンがあって、その数字と足したり掛けたりして真ん中の1桁を取り出して・・・などと複雑にやっても、やはり規則性があるのです。

円周率をそのまま乱数列として使う、という案も聞いたことがあります。それはメモリ容量を食います。今の時代では問題にならないかも。

理想を求めれば物理乱数になりますが、さすがにCPUだけでは発生できません(発生機能を持っているCPUもあるかも。ここではZ80での話なので発生機能なし)。
古典的な手法では、ノイズ発生機を用いて作ります。そのノイズも、外乱の影響を受けないようにしたものでなければなりません。

Arduinoでは空きピンのアナログポートを読んで、その不定値を乱数あるいは乱数の種にするというのがありました。

パチンコやパチスロの乱数というか抽選は、高速で回るカウンタが有り、たとえばスタートレバーを叩いた瞬間にその値を取ることで得ています。たとえば7だったら当たりとか、いくつからいくつまでの範囲ならベルとか、リプレイとか決まっていました。

昔はその速度が体感器で対応できる程度の遅さだったので、当たりのタイミングを狙う事ができました。その対策として現在ではさらに高速で回しているようです。

そのカウンタだって昔は独立したIC(74HC590等)でしたから、不正に細工をして当たる仕組みなんかもありました。
見た目は普通だけれど、プレイしてみるとおかしいというのでICをはずしてみたら、その裏側をほじくって、8ピンPICマイコンが貼り付いていたりとか。こいつがカウンタを操作して当たらせていたわけです。


昔、ある装置の電源を入れるたびにランダムな値を得たいという要望がありました。

これもずいぶん悩みました。たとえば、電解コンデンサの充放電時間のばらつきを利用しようとしました。誤差が大きいだろうと予想したものの、それほど大きくはありませんでした。

他社製品ではバックアップRAMによって前回の値を覚えていて、それを乱数の種にしていたようです。(やはり計算で乱数を求めていたのでしょう。そのためには乱数の種が必要)

前回値無しで毎回ランダムというのは、簡単そうに思えるけど実際は難しいです。

じつはこれも体感器対策のひとつでした。遊技機の電源は開店前、同時に入れられるので全台同期します。従って、隣の台に移動しても体感器が使えてしまいます。

そこで、タイマーを使って電源ONのタイミングを秒単位でずらしていました。ブレーカーをONにしても、それぞれバラバラに入ります。
だけど毎回のずらし時間は固定されているし、1台ごとにタイマーを入れるにはコストがかかりますから数台まとめて同時にONしていました。(トランスは遊技機4台に1台といった割当なのでトランス1台ごとのタイマー)
そこで1台ずつランダムにずらして電源ONできないか、という話になりました。その後に抽選方式が変わったので、こういったものは不要になりました。
PC-8001
2025.02.27
とっくの昔になくなって現存しないが、FMR-50やFACOMが置かれていたコンピュータ室の建物は2Fが有り、
その2Fには、PC-8001が数台置かれていた。もう全部捨てられただろうな。

当時は昭和の末期で、PC-8001はその当時でも骨董品になりかけていた。

そこは主にメカトロ実習をする部屋だったらしく、モーターを制御する為の基板などが有った。

Z80マシン語実習が有り、一部マニアを除いてはみんな初めてのマシン語。

PC-8001を触ったのは、自分はその時が初めて。意外と打ちやすいキーで良かった。

当然ハンドアセンブルで、マシン語モニタから打ち込んでいったと思う。

意外とその時のプログラムが当時のファイルに挟まっていて、まだ持ってるかも。

覚えているのはI/Oポートからリレーを制御する基板で、それにモーターをつないで停止、正転、逆転をやってみなさいという課題。

それから、ステッピングモーターにパルスを与えて回しなさいという課題だった。
いきなり最高速で回そうとしてもうまくいかない事を実際に経験。加速・減速の処理が必要。

- CafeLog -