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ポートからリレーを制御する基板で、それにモーターをつないで停止、正転、逆転をやってみなさいという課題。

それから、ステッピングモーターにパルスを与えて回しなさいという課題だった。
いきなり最高速で回そうとしてもうまくいかない事を実際に経験。加速・減速の処理が必要。
MULTI16 IVとFMR-50
2025.02.27
'88年頃の話
学校にFMR-50(富士通)というパソコンが導入された。
その前に視聴覚室にはMULTI16 IV(三菱)が40台導入されていた。

なんでこんなマイナーな機種が・・・と、同級生のマニア同士で愚痴っていたものである。
どうせならPC98を入れてくれればいいのに、と。

PC98にしなかった理由は不明。
メーカーとのコネか、安かったのか。

PC98だったら、余計なソフトを持ち込んで遊ぶからダメなのか?(それは先生たちだろう。職員室はPC98ばかりで、麻雀などで遊んでいた)

一応、MULTI16 IVはCP/M86とMS-DOSが動作した。そのMS-DOS上からBASICを動かしていた。
ワープロソフトも有った。(A1M2、エースワンマークII)

FMR-50は、汎用コンピュータFACOM M730の付属品として導入されたようなもの。
良かったのは、これが置いてあるコンピュータ室だけ(当時)冷房があった。
夏場のパソコン実習は最高だった。

この汎用コンピュータは、いわゆるメインフレームと呼ばれるもの。
メモリ容量などは今の安物PCにも劣る。(それだけで比較したらいけないが)

ご参考
ttp://museum.ipsj.or.jp/computer/main/0073.html

これを使ったFORTRANプログラム実習も有ったが、コンパイルがとても遅くて嫌になっていた。
何百何千行というプログラムを作っているのではなく、10行前後の短いプログラムをコンパイルして実行するだけなのに。
コンパイル、実行、を押してから15分ぐらい経過して、ようやく終了。(長すぎ)

これだったら、PC98のMS-DOS上の開発環境のほうが良かったのでは。いや、PC-8001のCP/M上でも十分だったかも。

そのくらい遅かった。

確か10人か15人前後、FMR-50を端末として使っていたけど、みんな同時に操作するとさらに遅い。

先生が、ベンチマークだったのか知らないけど、合図したらみんな一斉に実行キーを押せよという。
うっかり私が(フライングして)押してしまい、お前のせいでみんなが迷惑するだのボロカス言われてしまった。

FMR-50自体は普通に使えるパソコンだった。MULTI16よりマシ。(でも本当はPC98がよかった)

まだ当時はHDDは一部しか付いておらず、フロッピーディスクを主に使っていた。

FMR-60も数台あったような。それにHDDが内蔵されていた。

このFMR-50だけど、いつだったか数年前に母校を訪れた時にまだ有って、いまだに動いているとは・・・

調べてみると、官公庁などで使われていた機種のようで、その流れで学校にも入ったのかもしれない。

----------追記
FMR-50エミュレータが有る?
ttp://takeda-toshiya.my.coocan.jp/fmr50/index.html
考え方を学ぶ
2025.02.21
プログラムの組み方も人それぞれの考え方が反映されます。

組織の中では、属人的ではない方が望ましいかもしれませんけど。(作った人がいなくなったら保守できない・・・では困る)

お手本や周囲の仲間からの学んだことが基本になっていると思います。

Z80を覚えたのは高校生の頃、同じクラスの友人に教わりながらマシン語でプログラムを作っていました。

結果がわかりやすいのは画面表示の操作です。見てわかります。

たとえば白黒反転(MZ-2000だから緑白か)してみるとか。逆さまにするとか。鏡像にするにはどんなふうにプログラムを作るか。
画面の一部を切り抜いて、指定した位置へ移動させるには。
スクロール(タテ、ヨコ)をするには。

最初はループの作り方も知らなかったのですが、試しながら徐々に覚えていきました。

自分なりに考えて、画像を裏返し(鏡像)にしてみようと思い付きました。
それには1バイトごとにビットをひっくり返す必要があります。

最初に考えたルーチンは恥ずかしくて見せられたもんじゃありません。
BIT命令、SET命令、RES命令を使って、ビット0が0だったら結果レジスタのビット7を0にする。1だったら1にする。こんなふうに8ビット分、くそまじめに記述しました。

でも・・・よく考えてみると、結果を入れるレジスタを最初にクリアしておけば、0は書かなくて良いのです。1だけ見て処理すれば良いことに気づき、プログラムは短くなりました。

もう、これ以上考えることはない。自分なりに考えても、これ以上シンプルにはできないはずだ。

ところが友人は、シフト命令を使ってキャリーフラグ経由で1ビットずつ移すプログラムを作りました。まさに目から鱗でした。
私は、そういう使い方を思いつかなかったからです。命令表でキャリーフラグを巻き込んでシフトする命令があるのはたぶん知っていたはずです。でも、使い方(応用)を思いつかなかった。

コピー元のレジスタを左にシフト、最上位のビットがキャリーに入る。これをコピー先のレジスタにキャリーから入れて右にシフトする。この処理を8回繰り返せば1バイトの処理が済む。

でも、世の中にはもっと他の考え方もありました。
あらかじめ、反転データのテーブルを作っておくのです。あるいは、初期化時にRAM上へ展開するのでも良いでしょう。
こうすればアドレスの計算だけで速く変換できます。その代わりメモリを食います。

さらに考えると(考えるまでもないが)そのテーブルを、きりの良いアドレスに配置すればアドレスの計算も簡単かつ速くなるわけです。

これ以上は有るかと言うと、プログラムでやれる方法は思いつきませんが、ハードウェアを使ってよいのなら特定のアドレスなりポートに書くと(配線がクロスしていて)別のアドレスかポートから反転データが得られる、というのは可能です。(あくまでも、CPUにそういう命令がない場合の話です)

- CafeLog -