<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" version="2.0">
  <channel>
    <title>アナクロなコンピューターエンジニアのつぶやき</title>
    <link>https://kida.asablo.jp/blog/</link>
    <description/>
    <language>ja</language>
    <generator>mc 0.0</generator>
    <pubDate>Thu, 23 Apr 2026 21:41:27 +0900</pubDate>
    <item>
      <title>IBM JX -- POST ERROR</title>
      <link>https://kida.asablo.jp/blog/2026/04/23/9850315</link>
      <guid>https://kida.asablo.jp/blog/2026/04/23/9850315</guid>
      <pubDate>Thu, 23 Apr 2026 21:45:00 +0900</pubDate>
      <dcterms:modified>2026-04-23T21:41:27+09:00</dcterms:modified>
      <dcterms:created>2026-04-23T10:06:21+09:00</dcterms:created>
      <description>&lt;p&gt;せんだて、入手したIBM JXにアップスキャンコンバーターを経由してVGAディスプレイを&#13;
接続したのですが、あの、本体起動直後のカラーの画面が表示されません。&#13;
&lt;p&gt;BEEP音が2回しますので、POST(Power On Self Test)でハードウェア・エラーを検出しています。検出したエラーは、画面に表示されるのですが。&#13;
そもそも、ディスプレーには何も映らないので、どうして良いのやら。&#13;
&lt;br&gt;&#13;
&lt;p&gt;まず、アップスキャンコンバーターのロゴやメニューが表示されるので、コンバーターは生きています。&#13;
更に、コンバーターは、"NO SIGNAL"と言ってきます。JXのディスプレーポートとコンバーター間の&#13;
接続を再確認。間違いなし。&#13;
&lt;br&gt;&#13;
&lt;p&gt;念の為、JXのディスプレーポート J15 の信号を確認したところ、以下のようでした。&#13;
&lt;br&gt;&#13;
&lt;table&gt;&#13;
&lt;tr&gt;&lt;th&gt;PIN#&lt;/ht&gt;&lt;th&gt;NAME&lt;/ht&gt;&lt;th&gt;SIGNAL&lt;/ht&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;NO SIGNAL&lt;/td&gt;&lt;tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;-HSYNC&lt;/td&gt;&lt;td&gt;NO SIGNAL&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;-VSYNC&lt;/td&gt;&lt;td&gt;NO SIGNAL&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;H/-LSW&lt;/td&gt;&lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;NO SIGNAL&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;NO SIGNAL&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;COLOR CLOCK&lt;/td&gt;&lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;+12V&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;DOT CLOCK&lt;/td&gt;&lt;td&gt;OK&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;AUDIO&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&#13;
&lt;/table&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;J15に出てくる信号は、このようになってます。&#13;
&lt;br&gt;&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/JX/POSTError/DisplayJ15.jpg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/JX/POSTError/Small/DisplayJ15.jpg" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;"I"や"H/-L SW"が出てきているので、IC69 74LS240は、生きてるでしょう。"I"はカスタムICのIC32 SX001から来る信号なのです。IC32も生きてるように感じます。&#13;
&lt;p&gt;ということは、Display関連のテストとそれ以前のテストで、POSTが障害を検出したのは間違いないのですが、このままでは、&#13;
場所を特定できません。&#13;
&lt;p&gt;というわけで、POSTを読んでます。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2026/04/23/732dfd.jpg" length="9377" type="image/jpeg"/>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>IBM JX</dc:subject>
    </item>
    <item>
      <title>ユーザーに優しくないシステム</title>
      <link>https://kida.asablo.jp/blog/2026/04/22/9850255</link>
      <guid>https://kida.asablo.jp/blog/2026/04/22/9850255</guid>
      <pubDate>Thu, 23 Apr 2026 09:00:00 +0900</pubDate>
      <dcterms:modified>2026-04-23T09:01:12+09:00</dcterms:modified>
      <dcterms:created>2026-04-22T22:57:10+09:00</dcterms:created>
      <description>&lt;p&gt;私達は、日々、コンピューターを利用したシステムを使っています。パソコンや携帯電話、スマートフォンを&#13;
使用しない日は、ないでしょう。それで使用する機能は何でしょうか？&#13;
&lt;br&gt;&#13;
&lt;ul&gt;&#13;
&lt;li&gt;ネットサーフィン。&#13;
&lt;li&gt;インターネット・メールのやり取り。&#13;
&lt;li&gt;youTubeで動画を視聴。&#13;
&lt;li&gt;Xでつぶやく。&#13;
&lt;li&gt;Amazon Prime Videoで名探偵コナンを視聴。&#13;
&lt;li&gt;etc. ...&#13;
&lt;/ul&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;両手の指では数えられないほどあるでしょう。みなさん、それぞれの利用の仕方・楽しみ方があるでしょう。&#13;
そして、大多数の方はインターネット・メールを利用していることと思います。&#13;
私もこのAsahi-netのメール・アドレスだけでなく、auや他のメール・アドレスを持っています。実際に使っているのは一部だけですがね。&#13;
&lt;br&gt;&#13;
&lt;p&gt;せんだて、auメールで痛い目にあいました。調べてみると、「ユーザーに優しくないシステム」が露わに。&#13;
&lt;p&gt;ことの発端は、今年の1月下旬、なんの前触れもなく、多数の古いメールが削除されてしまったことです。&#13;
調べてみると、&#13;
auメールにはサーバー側に保管してあるメールの件数と総データ量に制限があり、この制限を超えると、&#13;
古いメールから必要数を メールサーバーが(強制的かつ)自動的に削除する仕様になっていることがわかりました。&#13;
「容量の上限に近づいた」とか「メールを削除しますよ」と言ったお知らせはないのです。&#13;
ユーザーは削除されてしまってから、この制限に達したことを知ることになります。&#13;
せめて、「ゴミ箱」フォルダーのメール優先でやってくれれば、悲劇は減るでしょうに。&#13;
&lt;p&gt;メールの管理は、ユーザーが行うことになってますが、自分のメールの総量を知る手段はありません。&#13;
メールアプリは、そもそも、そのような機能が、iMAPにありませんので、知る由もなしです。&#13;
&lt;p&gt;auが提供している「My au」アプリがあります。これで、データ通信量はわかりますが、メールの総量はわかりません。&#13;
&lt;p&gt;この状況で、ユーザーは、いったい、いつ、不要なメールを削除すればよいのでしょうか？自分のメールの総量を知るすべがないので、&#13;
わかりません。&#13;
&lt;p&gt;iMAPによるメールの配信サービスですから、ユーザーが受信したメールは全てメールサーバー側にあります。&#13;
「auメールのサーバーの管理業務は大変だろうなぁ」と感じてましたが、こんな仕様になっているとは。&#13;
&lt;p&gt;更に調べてみると、同じauがサービスしている他のメールサービス「au-Oneメール」では、&#13;
容量の上限に近づくとユーザーにお知らせが出ることになってます。&#13;
「同じauなのに、同じようにお金払ってるのに、なんで違うの？」、理由を想像できません。メールサーバーの中身はほぼ同じと思いますが。&#13;
&lt;p&gt;各ユーザーごとのメールの総量を定期的に調べる機能は、どちらのメールサーバにも備わっています。&#13;
この機能がなければ、古いメールを削除する機能を動かすタイミングを知ることができません。ですので、&#13;
あるユーザーのメール総量が限界に近づいていることをメールサーバーは確実に知ることができます。&#13;
あとは、該当ユーザーにお知らせを出すだけです。これは、自動的にできます。このぐらいの気配りはできるでしょう。しかし、やらなかった。&#13;
システム設計の基本構想の不備、「ユーザー視点の欠落」。致命的なミスです。ユーザーに知らせずに勝手に削除したら、何が起こるか、&#13;
ユーザーはどんな反応をするかを　想像できなかったんでしょうね。「ユーザーに優しくないシステム」を&#13;
作ってしまったね。&#13;
&lt;p&gt;さて、このauメールサービスの容量制限は、緩和策があります。オプションの「Pontaパス」に入会すると、&#13;
容量がほぼ倍増します。倍増するタイミングは、「Pontaパス」に加入したタイミングでは「なく」、&#13;
Webブラウザーで「Webメール」サイトにアクセスした時点です。このようにしている理由を想像できません。&#13;
&lt;p&gt;いや、一つだけ想像できます。それは、メールサーバーの運用管理を楽したいからです。「Pontaパス」に入会した時点で&#13;
制限を緩和する仕組みにすると、メールサーバーの物理的容量を頻繁に増量する必要が出てきそうです。これを&#13;
逃げるために、「Webメール」をアクセスした時点で、初めて、容量制限を緩和することにしたのでしょう。&#13;
「Pontaパス」に加入したユーザー全員が、容量緩和を目的で加入するわけではないでしょうからね。&#13;
&lt;p&gt;ここにも、「ユーザーに優しくないシステム」の一面が見えます。&#13;
&lt;br&gt;&#13;
&lt;p&gt;auメールのトラブルに見舞われてから3ヶ月、先日、添付のメールが、auから来ました。&#13;
ほんの少し、auメールのメールサーバーでメールを削除するロジックを変更するようです。今頃か。&#13;
これでも、まだまだ、不十分です。「ゴミ箱」フォルダーのメールを　優先して定期的に削除しても、&#13;
メール総量に達することが、予想されます。やはり、ユーザーにメールの削除・整理を&#13;
依頼する必要があるでしょう。付け焼き刃というか、焼け石に水、それとも、モグラ叩き。最小の費用でと&#13;
考えたのでしょうが、これではねぇ。問題の解決には、至らないでしょう。無駄な費用を　費やしただけですね。&#13;
「ユーザーに優しいシステム」という視点がない、「自分たちの都合最優先のシステム作り」をやめてください。&#13;
&lt;br&gt;&#13;
&lt;p&gt;私事ですが、現役のとき、このような視点に基づいた基本計画・設計のシステム提案書をお客様に持っていったら、&#13;
良くてゴミ箱に捨てられる、悪くすれば出入り禁止になってたね。実際に使用するお客様の視点で、&#13;
システム基本計画・設計することを常に求められていたし、それは暗黙の了解事項だった。&#13;
&lt;p&gt;クレームがあったら、ちょこっと修正してお茶を濁し、ほとぼりが冷めるのを待つ。無責任時代になったのか？&#13;
&lt;p&gt;この前、若いauの社員と話す機会があったのだが、KDDIの前身、「国際電電」を&#13;
知らなかった。昭和は遠くに成りにけりか。今が良ければ過去なんてかな。&#13;
&lt;br&gt;&#13;
&lt;p&gt;ご参考のため、auからのメール(必要な部分のみ)掲載します。公式なメールだから、公開してもいいよね、auさん。&#13;
&lt;p&gt;いま、読みなおして気づいたのだが、「自動削除される場合があります。」とあるが、これは、「自動削除されます。」&#13;
の間違いなのでは？それより、「ゴミ箱」フォルダー内のメールを自動削除する機能は、以前からあったっけ？&#13;
「#90日以前の受信メール」フォルダーにあるメールを自動削除する機能は、あったと思うが。ユーザーを煙に巻く、&#13;
いやな感じ。&#13;
&lt;br&gt;&#13;
&lt;pre&gt;&#13;
========================= auからのメール 関連部分のみ (ここから) =============================&#13;
差出人: auからの重要なお知らせ &lt;info@au-cs.ezweb.ne.jp&gt;&#13;
日時: 2026年4月21日 10:18:06 JST&#13;
宛先: ########@ezweb.ne.jp&#13;
件名: auメールご利用のお客さまへの重要なお知らせ&#13;
&#13;
﻿いつもauメールをご利用いただきありがとうございます。&#13;
&#13;
このたび、auメールをより安心・快適にご利用いただくため、以下2点をご案内いたします。&#13;
&#13;
１．「迷惑メールおまかせ規制」の判定精度向上&#13;
２．auメールサーバのゴミ箱内メールの自動削除仕様改善&#13;
&#13;
１．「迷惑メールおまかせ規制」の判定精度向上について&#13;
&#13;
((((( 省略 By Kida ))))&#13;
&#13;
２．auメールサーバのゴミ箱内メールの自動削除仕様の改善&#13;
「ゴミ箱」に移動したメールがたまり続けると、容量不足が影響し、受信ボックス内のメールが先に自動削除される場合があります。&#13;
このたびメールサービスを、より快適にご利用いただけるよう、2026年6月より順次、auメールサーバのゴミ箱内メールの自動削除仕様を改善します。&#13;
&#13;
■ 変更内容&#13;
「ゴミ箱」フォルダにあるメールのうち、受信日から45日を経過したメールを、サーバから自動的に削除します。&#13;
本仕様変更の対象のお客さまや開始時期などの詳細・最新情報については、以下のURLよりご確認ください。&#13;
&gt; https://www.au.com/mobile/service/email/&#13;
&#13;
--------------------------------&#13;
■ お問い合わせ&#13;
チャット&#13;
受付時間　AI：24時間/年中無休&#13;
（コミュニケーター：9:00-20:00）&#13;
au：https://kddi-l.jp/Ika&#13;
========================= auからのメール 関連部分のみ (ここまで) =============================&#13;
&lt;/pre&gt;
</description>
      <dc:subject>雑</dc:subject>
    </item>
    <item>
      <title>とうとう、武器商人国になってしまった。</title>
      <link>https://kida.asablo.jp/blog/2026/04/22/9850210</link>
      <guid>https://kida.asablo.jp/blog/2026/04/22/9850210</guid>
      <pubDate>Wed, 22 Apr 2026 21:10:00 +0900</pubDate>
      <dcterms:modified>2026-04-22T21:09:56+09:00</dcterms:modified>
      <dcterms:created>2026-04-22T20:04:29+09:00</dcterms:created>
      <description>&lt;p&gt;この場に、このようなことを書き込むことに、非常に強い悲しみを感じる。&#13;
&lt;br&gt;&#13;
&lt;p&gt;あらゆる兵器、殺傷能力のありなしに関わらず、よその国に輸出出来ることになったと言う。 国会の承認不要、つまり、最低限の歯止めが無くなった。&#13;
&lt;br&gt;&#13;
&lt;p&gt;私たちは、好むと好まざるに関わらず、殺人の片棒を担ぐ事になる。&#13;
&lt;p&gt;私たちは、これを 容認して良いのか？ &#13;
&lt;br&gt;&#13;
&lt;p&gt;防衛産業の保護育成は、国の安全保障に必要なのだと言う。防衛産業の基礎になる多くの基礎技術は、民間転用できると言われてきた。&#13;
&lt;p&gt;これは事実だったか？&#13;
&lt;br&gt;&#13;
&lt;p&gt;その技術開発に注ぎ込まれる費用、労力は、莫大である。防衛予算を見れば判る。民間での技術開発におけるそれは、足元にも及ばない。&#13;
&lt;p&gt;この産業は、一部の上級民だけに必要で、ほとんどの国民には不要な産業じゃないか？&#13;
&lt;br&gt;&#13;
&lt;p&gt;なぜ、高市早苗は、私たちに、こんなにも不安を与えるのだ？ 止めてくれ。政治の世界から、退場してくれ。&#13;
&lt;br&gt;&#13;
&lt;p&gt;今年も、クリスマスにはこの曲を 楽しく聴きたい。&lt;a href="https://youtu.be/yN4Uu0OlmTg?si=xy26pZ5CKjq6pUS7"&gt;HAPPY XMAS(War Is Over) JOHN &amp; YOKO/THE PLASTIC ONO BAND&lt;/a&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;書いてたら、何故か、涙が出てきた。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2026/04/22/732c01.jpg" length="19913" type="image/jpeg"/>
      <dc:subject>Misc</dc:subject>
    </item>
    <item>
      <title>IBM JX</title>
      <link>https://kida.asablo.jp/blog/2026/03/19/9843062</link>
      <guid>https://kida.asablo.jp/blog/2026/03/19/9843062</guid>
      <pubDate>Fri, 20 Mar 2026 17:00:00 +0900</pubDate>
      <dcterms:modified>2026-03-20T16:33:11+09:00</dcterms:modified>
      <dcterms:created>2026-03-19T19:48:11+09:00</dcterms:created>
      <description>&lt;p&gt;IBM JX 本体を比較的安価に、入手できました。&#13;
&lt;br&gt;&#13;
&lt;p&gt;内容は、&#13;
&lt;ol&gt;&#13;
&lt;li&gt;メモリー 128KB (本体 64KB、64KB メモリーカード)&#13;
&lt;li&gt;2 Diskette Drive &#13;
&lt;li&gt;拡張表示カード&#13;
&lt;/ol&gt;&#13;
です。&#13;
&lt;br&gt;&#13;
&lt;p&gt;JX 本体の上にある本は、&#13;
&lt;ul&gt;&#13;
&lt;li&gt;「DOSの内部構造とプログラムインターフェイス N:SC18-2016-0」&#13;
&lt;li&gt;「テクニカル・リファレンス N:SY18-2104-1」&#13;
&lt;/ul&gt;&#13;
です。貴重な資料です。&#13;
&lt;br&gt;&#13;
&lt;p&gt;電源は、入りました。BEEP音が2回鳴ったので、ハードウェアーエラーを検出したみたいです。&#13;
&lt;br&gt;&#13;
&lt;p&gt;まずは、ディスプレーとキーボードの接続からでしょうか。&#13;
&#13;
&lt;p&gt;デジタル RGB ディスプレーを入手は、大変でしょうから、今時のVGAディスプレーの接続を検討します。&#13;
&lt;p&gt;JX用純正キーボードを望む事も無理ですから、今時のPS/2接続のキーボードを流用を検討します。&#13;
&lt;br&gt;&#13;
&lt;p&gt;これ以外にも、やってみたいことが。&#13;
&lt;ul&gt;&#13;
&lt;li&gt;XT-IDE を移植したい&#13;
&lt;li&gt;384KB 拡張メモリーアダプターを追加したい&#13;
&lt;li&gt;拡張ボックスを追加したい&#13;
&lt;/ul&gt;&#13;
などなど。&#13;
&lt;br&gt;&#13;
&lt;p&gt;どこまで、できるかな？　当分、楽しめそうです。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2026/03/20/72e274.jpg" length="9377" type="image/jpeg"/>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>PC-DOS</dc:subject>
    </item>
    <item>
      <title>GAL Writerの制作</title>
      <link>https://kida.asablo.jp/blog/2025/04/10/9767530</link>
      <guid>https://kida.asablo.jp/blog/2025/04/10/9767530</guid>
      <pubDate>Mon, 14 Apr 2025 17:30:46 +0900</pubDate>
      <dcterms:modified>2025-04-14T21:35:44+09:00</dcterms:modified>
      <dcterms:created>2025-04-10T20:14:39+09:00</dcterms:created>
      <description>&lt;p&gt;ハードウェアの制作にGALを使用できると、とても便利です。特にアドレスデコーダーの&#13;
類などは、とてもすっきりしますし、後からの変更も簡単にできますので、重宝します。&#13;
これまで、いくつかの機器の制作で使用してきました。&#13;
&lt;p&gt;GALを作成するには、PALASMでヒューズデータを作成し、XGecuのTL866 II Plus&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/OteGAL/Small/TL866IIPlus.jpg" align=center&gt;&#13;
で書き込みをしていました。&#13;
&lt;p&gt;これはこれで、いいのですが、PALASMはDOSのプログラムで、&#13;
TL866II PlusはWindosのコントルールプログラムでした。そうです。ヒューズデータのやりとりが&#13;
めんどうだったのです。できれば、DOS環境だけで完結したく思ってました。&#13;
&lt;p&gt;調べてみると、GAL Writerの制作例をいくつか発見できました。その中でも、&#13;
ELM氏の発表なされた「お手GAL」は、以前より気にかけていたのですが、とてもシンプルで、&#13;
DOSの環境で使うことができ、私の悩みを解決するものです。思い切って制作することにしました。&#13;
ELM氏の「お手GAL」は&#13;
&lt;a href=http://elm-chan.org/works/pgal/report_e.html&gt;ここ&lt;/a&gt; にありますのでご参照ください。&#13;
&lt;p&gt;実際の制作にあったって、手持ちの部品を優先して使用したので、&#13;
古い大型の部品やオーバースッペクの部品が見受けられます。&#13;
また、抵抗内蔵のディジタルトランジスタは、抵抗と手持ちのトランジスタで構成しました。&#13;
デバッグをしていて、プリンタポートの出力電圧が低かったのでバッファーを追加する必要が&#13;
でてしまいましたが、大きめのボードだったのでいれることができました。&#13;
&lt;p&gt;これが、完成した私の「お手GAL GAL Writer」です。&#13;
&lt;br&gt;&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/OteGAL/OteGAL.jpg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/OteGAL/Small/OteGAL.jpg" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;p&gt;これで、16V8,20V8,22V10をプログラムできます。今後とも、重宝しそうです。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2025/04/14/6fc219.jpg" length="21687" type="image/jpeg"/>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>PC-DOS</dc:subject>
    </item>
    <item>
      <title>高速キャリージェネレター付き8ビット加算・減算器の製作</title>
      <link>https://kida.asablo.jp/blog/2025/02/06/9752815</link>
      <guid>https://kida.asablo.jp/blog/2025/02/06/9752815</guid>
      <pubDate>Thu, 06 Feb 2025 21:36:40 +0900</pubDate>
      <dcterms:modified>2025-02-08T21:58:26+09:00</dcterms:modified>
      <dcterms:created>2025-02-06T21:37:23+09:00</dcterms:created>
      <description>&lt;p&gt;高速キャリージェネレター付き8ビット加算・減算器の製作&#13;
&lt;p&gt;デジタル回路の学び直しをしています。テキストは、大川喜邦著「デジタル回路」です。組合せ回路の部分が終わりました。組合せ回路のまとめとして、高速キャリージェネレーター付きの8ビット加算・減算器を基本的なTTLだけで設計、製作しました。最終的には、TTLが30個でできました。&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Front.jpeg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Small/Front.jpeg" align=center&gt;&#13;
&lt;/a&gt;。&#13;
&lt;p&gt;ウラ面はこんな感じです。&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Back.jpeg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Small/Back.jpeg" align=center&gt;&#13;
&lt;/a&gt;手ハンダなので、スパゲティボールです。&#13;
&lt;p&gt;基板上の"Value A"と"Value B"のスイッチに-128から127までの数値を設定し、加算・減算した結果を"Result"LEDに表示します。負の数は2の補数表現です。&#13;
&lt;p&gt;例えば、63＋1は、このようになります。&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Add63p1.jpeg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Small/Add63p1.jpeg" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;p&gt;また、1+(-1)は、&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Add1m1.jpeg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Small/Add1m1.jpeg" align=center&gt;&#13;
&lt;/a&gt;。&#13;
&lt;p&gt;さらに、3-1は、&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Sub3p1.jpeg" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/Addsub8/Small/Sub3p1.jpeg" align=center&gt;&#13;
&lt;/a&gt;。&#13;
&lt;p&gt;回路図は、&lt;a href="http://www.asahi-net.or.jp/~lb7h-kd/blog/binary/AddSub8.pdf"&gt;ここ&lt;/a&gt;&#13;
にあります。&#13;
&lt;p&gt;CPUの中のALUの一部を解析するとこんな感じになるのでしょうね。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2025/02/06/6f15a6.jpg" length="16857" type="image/jpeg"/>
      <dc:subject>コンピューター</dc:subject>
    </item>
    <item>
      <title>Modula-2 でプログラミング -- 文字列探索プログラム find の製作 (その３) --</title>
      <link>https://kida.asablo.jp/blog/2025/01/05/9744991</link>
      <guid>https://kida.asablo.jp/blog/2025/01/05/9744991</guid>
      <pubDate>Sun, 05 Jan 2025 21:19:30 +0900</pubDate>
      <dcterms:modified>2025-01-05T21:23:27+09:00</dcterms:modified>
      <dcterms:created>2025-01-05T21:21:07+09:00</dcterms:created>
      <description>&lt;p&gt;前回紹介したfindプログラムは、FileSearchモジュールの不備で、ファイル一覧の構造が&#13;
丸見えになっていました。FileSearchモジュールに２つ手続きを追加して不具合を解消しました。&#13;
&lt;p&gt;新しいFileSearchモジュールの定義モジュールは以下の通り。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE FileSearch;&#13;
&#13;
FROM OpSys IMPORT FCB,FCBFileName;&#13;
&#13;
EXPORT QUALIFIED pFileList,FileNameNode,&#13;
	GetNextFile,GetFileName,LoginDisk,MakeFileList,DumpFileList;&#13;
&#13;
CONST&#13;
	DMABufferSize = 128;&#13;
	FileNameSize = 14;&#13;
&#13;
TYPE&#13;
	pFileList = POINTER TO FileNameNode;&#13;
	FileNameNode = RECORD&#13;
		FileName: ARRAY [0..FileNameSize] OF CHAR;&#13;
		Next: pFileList&#13;
	END;&#13;
        DMA = ARRAY [0..DMABufferSize-1] OF CHAR;&#13;
&#13;
PROCEDURE GetNextFile(FileLIst: pFileList): pFileList;&#13;
PROCEDURE GetFileName(FileList: pFileList;VAR FileName: ARRAY OF CHAR);&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
PROCEDURE MakeFileList(FIleMatch: ARRAY OF CHAR): pFileList;&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
手続き、次のファイルを取り出すGetNextFileとファイル名を取り出すGetFileNameを追加しました。&#13;
実現モジュールは以下の通り。&#13;
&lt;pre&gt;&#13;
IMPLEMENTATION MODULE FileSearch;&#13;
FROM InOut IMPORT WriteHex,Write,WriteString,WriteLn;&#13;
FROM OpSys IMPORT FCB,FCBFileName,BdosFunctions,Bdos;&#13;
FROM SYSTEM IMPORT ALLOCATE,TSIZE,ADR,WORD;&#13;
FROM FileNames IMPORT StrToFCB,FCBToStr,NameState;&#13;
&#13;
CONST&#13;
	EOS = 0C;&#13;
&#13;
PROCEDURE GetNextFile(FileList: pFileList): pFileList;&#13;
BEGIN&#13;
	RETURN FileList^.Next&#13;
END GetNextFile;&#13;
&#13;
PROCEDURE GetFileName(FileList: pFileList; VAR FileName: ARRAY OF CHAR);&#13;
VAR&#13;
	i: CARDINAL; &#13;
BEGIN&#13;
	i := 0;&#13;
	WHILE ( FileList^.FileName[i] # EOS ) DO&#13;
		FileName[i] := FileList^.FileName[i];&#13;
		INC(i)&#13;
	END;&#13;
	FileName[i] := EOS&#13;
END GetFileName;&#13;
&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
VAR&#13;
	DiskCode: CARDINAL;&#13;
	Junk: WORD;&#13;
&#13;
BEGIN&#13;
	IF FCBBuf.name.disk = 0C THEN&#13;
		Bdos(retCDsk,Junk,DiskCode);&#13;
		RETURN (CHR(ORD(DiskCode)+ORD('A')));&#13;
	ELSE&#13;
		RETURN (CHR(ORD(FCBBuf.name.disk)+ORD('A')-1));&#13;
	END;&#13;
END LoginDisk;&#13;
&#13;
PROCEDURE MakeFileList(FileMatch: ARRAY OF CHAR): pFileList;&#13;
VAR&#13;
	Disk: CHAR;&#13;
	FCBBuffer: FCB;&#13;
	BdosRc: CARDINAL;&#13;
	DMABuffer: DMA;&#13;
	CPos: CARDINAL;&#13;
	NameStatus: NameState;&#13;
	pList: pFileList;&#13;
	pNewFileName: pFileList;&#13;
	FCBFile: FCBFileName;&#13;
	Formatted: BOOLEAN;&#13;
	Junk: WORD;&#13;
&#13;
BEGIN&#13;
	pList := NIL;&#13;
&#13;
	(* Clear FCB Buffer and set file name *)&#13;
	FCBBuffer.name.text := '';&#13;
	FCBBuffer.rest := '';&#13;
	NameStatus := StrToFCB(FileMatch,FCBBuffer.name);&#13;
&#13;
	Disk := LoginDisk(FCBBuffer);&#13;
&#13;
	(* set DMA Bufer *)&#13;
	Bdos(setDMA,ADR(DMABuffer),Junk);&#13;
&#13;
	(* find first much file *)&#13;
	Bdos(searchFst,ADR(FCBBuffer),BdosRc);&#13;
	WHILE BdosRc # 255 DO&#13;
		ALLOCATE(pNewFileName,TSIZE(FileNameNode));&#13;
		FOR CPos := 0 TO 11 DO&#13;
			FCBFile.text[CPos]&#13;
				:= DMABuffer[CPos+BdosRc*32]&#13;
		END;&#13;
		FCBFile.disk := CHR(ORD(Disk) - ORD('A') + 1);&#13;
		FCBToStr(FCBFile,pNewFileName^.FileName,FALSE);&#13;
		pNewFileName^.Next := pList;&#13;
		pList := pNewFileName;&#13;
&#13;
		(* find next file *)&#13;
		Bdos(searchNxt,Junk,BdosRc);&#13;
	END;	&#13;
	RETURN pList&#13;
END MakeFileList;&#13;
&#13;
PROCEDURE WriteFileName(FileName: ARRAY OF CHAR);&#13;
BEGIN&#13;
	WriteString(FileName);&#13;
	WriteLn&#13;
END WriteFileName;&#13;
&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
BEGIN&#13;
	WHILE pList # NIL DO&#13;
		WriteFileName(pList^.FileName);&#13;
		pList := pList^.Next;&#13;
	END;&#13;
END DumpFileList;&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;これらの変更を反映したfindは、以下のとおり。&#13;
&lt;pre&gt;&#13;
MODULE Find;&#13;
FROM InOut IMPORT Write,WriteCard,WriteString,WriteLn;&#13;
FROM Files IMPORT FILE,FileState,Open,Close,Read;&#13;
FROM CmdArgs IMPORT Argc,Argv;&#13;
FROM FileSearch IMPORT GetFileName,GetNextFile,&#13;
	FileNameNode,MakeFileList,pFileList;&#13;
FROM BasicFileIO IMPORT FileIOStruct,pFileIOStruct,&#13;
	OpenFile,CloseFile,EOFFile,FileIOStatus;&#13;
FROM StdFileIO IMPORT GetLine;&#13;
&#13;
CONST&#13;
	EOS = 0C;&#13;
	MAXLINE = 128;&#13;
	FILENAMESIZE = 14;&#13;
	EOFMARK = 32C;&#13;
&#13;
VAR&#13;
	FileName: ARRAY [0..FILENAMESIZE] OF CHAR;&#13;
	FileMatch: ARRAY [0..FILENAMESIZE] OF CHAR;&#13;
	Target: ARRAY [0..MAXLINE] OF CHAR;&#13;
	CPos,FileNumber,LineNumber,nArgc: CARDINAL;&#13;
	pList: pFileList;&#13;
&#13;
PROCEDURE putLine(FileName:ARRAY OF CHAR;Line:CARDINAL;&#13;
		Buffer: ARRAY OF CHAR);&#13;
BEGIN&#13;
	WriteString(FileName);&#13;
	Write(' ');WriteCard(Line,1);Write(':');&#13;
	WriteString(Buffer);&#13;
	WriteLn&#13;
END putLine;&#13;
&#13;
PROCEDURE findTarget(Target,Line:ARRAY OF CHAR): BOOLEAN;&#13;
VAR&#13;
	t,l: CARDINAL;&#13;
	found: BOOLEAN;&#13;
BEGIN&#13;
	found := FALSE;&#13;
	t := 0; l := 0;&#13;
	WHILE (Line[l] # EOS) AND (NOT found) DO&#13;
		IF Line[l] = Target[0] THEN&#13;
			t := 1;&#13;
			WHILE Line[l+t] = Target[t] DO&#13;
				INC(t);&#13;
			END;&#13;
			IF Target[t] = EOS THEN&#13;
				found := TRUE;&#13;
			END;&#13;
		END;&#13;
		INC(l);&#13;
	END;&#13;
	RETURN found&#13;
END findTarget;&#13;
&#13;
PROCEDURE Usage();&#13;
BEGIN&#13;
	WriteString('find');WriteLn;&#13;
	WriteString('      TargetString File1 File2 FIle3,,,,');WriteLn &#13;
END Usage;&#13;
&#13;
PROCEDURE MatchLines(FileName,TargetString: ARRAY OF CHAR);&#13;
VAR&#13;
	pFileIO: pFileIOStruct;&#13;
	Line: ARRAY [0..MAXLINE-1] OF CHAR;&#13;
	Chars: CARDINAL;&#13;
	NLines: CARDINAL;&#13;
	Junk: FileIOStatus;&#13;
&#13;
BEGIN&#13;
	IF OpenFile(FileName,pFileIO) = Success THEN&#13;
		NLines := 1;&#13;
		WHILE NOT EOFFile(pFileIO) DO&#13;
			Chars := GetLine(pFileIO,Line);&#13;
			IF findTarget(TargetString,Line) THEN&#13;
				putLine(FileName,NLines,Line);&#13;
			END;&#13;
			INC(NLines);&#13;
		END;&#13;
		Junk := CloseFile(pFileIO)&#13;
	END&#13;
END MatchLines;&#13;
&#13;
BEGIN&#13;
	nArgc := Argc();&#13;
	IF nArgc &lt; 1 THEN&#13;
		Usage();&#13;
		HALT&#13;
	END;&#13;
	Argv(0,Target);&#13;
	FileNumber := 1;&#13;
	WHILE FileNumber &lt; nArgc DO&#13;
		Argv(FileNumber,FileMatch);&#13;
		pList := MakeFileList(FileMatch);&#13;
		WHILE pList # NIL DO&#13;
			GetFileName(pList,FileName);&#13;
			MatchLines(FileName,Target);&#13;
			pList := GetNextFile(pList)&#13;
		END;&#13;
		INC(FileNumber)&#13;
	END&#13;
END Find.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;これで、FileSearchモジュール内部のデータ構造をFindが知る必要がなくなりました。
</description>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>CP/M</dc:subject>
      <dc:subject>Modula-2</dc:subject>
    </item>
    <item>
      <title>Modula-2 でプログラミング -- 文字列探索プログラム find の製作 (その２)</title>
      <link>https://kida.asablo.jp/blog/2024/12/28/9742791</link>
      <guid>https://kida.asablo.jp/blog/2024/12/28/9742791</guid>
      <pubDate>Sat, 28 Dec 2024 21:13:31 +0900</pubDate>
      <dcterms:modified>2024-12-28T21:14:43+09:00</dcterms:modified>
      <dcterms:created>2024-12-28T21:14:43+09:00</dcterms:created>
      <description>&lt;p&gt;BasicFileIO モジュール、StdFileIO モジュールをつかった find プログラムは、以下のとおりです。&#13;
&lt;pre&gt;&#13;
MODULE Find;&#13;
FROM InOut IMPORT Write,WriteCard,WriteString,WriteLn;&#13;
FROM Files IMPORT FILE,FileState,Open,Close,Read;&#13;
FROM CmdArgs IMPORT Argc,Argv;&#13;
FROM FileSearch IMPORT pFileList,FileNameNode,MakeFileList;&#13;
FROM BasicFileIO IMPORT FileIOStruct,pFileIOStruct,&#13;
	OpenFile,CloseFile,EOFFile,FileIOStatus;&#13;
FROM StdFileIO IMPORT GetLine;&#13;
&#13;
CONST&#13;
	EOS = 0C;&#13;
	MAXLINE = 128;&#13;
	FILENAMESIZE = 14;&#13;
	EOFMARK = 32C;&#13;
&#13;
VAR&#13;
	FileMatch: ARRAY [0..FILENAMESIZE] OF CHAR;&#13;
	Target: ARRAY [0..MAXLINE] OF CHAR;&#13;
	CPos,FileNumber,LineNumber,nArgc: CARDINAL;&#13;
	pList: pFileList;&#13;
&#13;
PROCEDURE putLine(FileName:ARRAY OF CHAR;Line:CARDINAL;&#13;
		Buffer: ARRAY OF CHAR);&#13;
BEGIN&#13;
	WriteString(FileName);&#13;
	Write(' ');WriteCard(Line,1);Write(':');&#13;
	WriteString(Buffer);&#13;
	WriteLn&#13;
END putLine;&#13;
&#13;
PROCEDURE findTarget(Target,Line:ARRAY OF CHAR): BOOLEAN;&#13;
VAR&#13;
	t,l: CARDINAL;&#13;
	found: BOOLEAN;&#13;
BEGIN&#13;
	found := FALSE;&#13;
	t := 0; l := 0;&#13;
	WHILE (Line[l] # EOS) AND (NOT found) DO&#13;
		IF Line[l] = Target[0] THEN&#13;
			t := 1;&#13;
			WHILE Line[l+t] = Target[t] DO&#13;
				INC(t);&#13;
			END;&#13;
			IF Target[t] = EOS THEN&#13;
				found := TRUE;&#13;
			END;&#13;
		END;&#13;
		INC(l);&#13;
	END;&#13;
	RETURN found&#13;
END findTarget;&#13;
&#13;
PROCEDURE Usage();&#13;
BEGIN&#13;
	WriteString('find');WriteLn;&#13;
	WriteString('      TargetString File1 File2 FIle3,,,,');WriteLn &#13;
END Usage;&#13;
&#13;
PROCEDURE MatchLines(FileName,TargetString: ARRAY OF CHAR);&#13;
VAR&#13;
	pFileIO: pFileIOStruct;&#13;
	Line: ARRAY [0..MAXLINE-1] OF CHAR;&#13;
	Chars: CARDINAL;&#13;
	NLines: CARDINAL;&#13;
	Junk: FileIOStatus;&#13;
&#13;
BEGIN&#13;
	IF OpenFile(FileName,pFileIO) = Success THEN&#13;
		NLines := 1;&#13;
		WHILE NOT EOFFile(pFileIO) DO&#13;
			Chars := GetLine(pFileIO,Line);&#13;
			IF findTarget(TargetString,Line) THEN&#13;
				putLine(FileName,NLines,Line);&#13;
			END;&#13;
			INC(NLines);&#13;
		END;&#13;
		Junk := CloseFile(pFileIO)&#13;
	END&#13;
END MatchLines;&#13;
&#13;
BEGIN&#13;
	nArgc := Argc();&#13;
	IF nArgc &lt; 1 THEN&#13;
		Usage();&#13;
		HALT&#13;
	END;&#13;
	Argv(0,Target);&#13;
	FileNumber := 1;&#13;
	WHILE FileNumber &lt; nArgc DO&#13;
		Argv(FileNumber,FileMatch);&#13;
		pList := MakeFileList(FileMatch);&#13;
		WHILE pList # NIL DO&#13;
			MatchLines(pList^.FileName,Target);&#13;
			pList := pList^.Next&#13;
		END;&#13;
		INC(FileNumber)&#13;
	END&#13;
END Find.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;MachLine で、指定された文字列が読み込んだ行に存在するかを検査し、存在したら書き出します。&#13;
&lt;p&gt;ファイル名のリスト構造が丸見えなのでひと工夫する必要がありますが、今回は見送りました。
</description>
    </item>
    <item>
      <title>Modula-2でプログラミング -- 文字列探索プログラム find の制作(その１)</title>
      <link>https://kida.asablo.jp/blog/2024/12/28/9742771</link>
      <guid>https://kida.asablo.jp/blog/2024/12/28/9742771</guid>
      <pubDate>Sat, 28 Dec 2024 21:00:39 +0900</pubDate>
      <dcterms:modified>2024-12-28T21:03:00+09:00</dcterms:modified>
      <dcterms:created>2024-12-28T21:03:00+09:00</dcterms:created>
      <description>&lt;p&gt;指定された文字列を　指定されたファイルの中から探し出すプログラム find を紹介します。&#13;
このように使います。&#13;
&lt;pre&gt;&#13;
C0#find&#13;
&#13;
arguments&gt;GetLine *.def *.mod&#13;
&#13;
C:STDFILEI.DEF 6:       GetLine;&#13;
C:STDFILEI.DEF 8:PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;&#13;
C:STDFILEI.MOD 10:PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;&#13;
C:STDFILEI.MOD 36:END GetLine;&#13;
C:FIND.MOD 8:FROM StdFileIO IMPORT GetLine;&#13;
C:FIND.MOD 71:                  Chars := GetLine(pFileIO,Line);&#13;
&#13;
&#13;
63K QP/M VER 2.7   (BIOS VER 1.0)&#13;
&#13;
                   (C) 1988.12.1.  K.YOSHIDA&#13;
&#13;
             2018.10.28.  MODEFIED BY H.KIDA&#13;
C0#find&#13;
&#13;
arguments&gt;GetChar *.def *.mod&#13;
&#13;
C:BASICFIL.DEF 7:       ReadFile,GetChar;&#13;
C:BASICFIL.DEF 28:PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;&#13;
C:STDFILEI.MOD 3:       pFileIOStruct,GetChar;&#13;
C:STDFILEI.MOD 20:              C := GetChar(pFileIO);&#13;
C:BASICFIL.MOD 65:PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;&#13;
C:BASICFIL.MOD 89:END GetChar;&#13;
&#13;
&#13;
63K QP/M VER 2.7   (BIOS VER 1.0)&#13;
&#13;
                   (C) 1988.12.1.  K.YOSHIDA&#13;
&#13;
             2018.10.28.  MODEFIED BY H.KIDA&#13;
C0#&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;find は、ファイルを読みますので、ファイルアクセスのルーチンが必要になります。&#13;
Bdosを直接使うことができるので、かんたんなファイル読み込みモジュール BasicFileIO を作成しました。&#13;
更に、行単位のファイル読み出しが必要なので、上位のモジュール StdFileIO を作成しました。StdFileIOは、&#13;
Bdosとは、独立しています。&#13;
&lt;p&gt;まず、 BasicFileIO です。基本的なファイルアクセスルーチンの集まりです。&#13;
今回は、読み出せれば良いので、書き込み関係のルーチンは作成していません。基本的なファイルのアクセスは、&#13;
一文字単位です、&#13;
定義モジュールは、以下のとおりです。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE BasicFileIO;&#13;
FROM OpSys IMPORT FCB,FCBFileName;&#13;
&#13;
EXPORT QUALIFIED &#13;
	FileIOStatus,FileIOStruct,pFileIOStruct,&#13;
	OpenFile,CloseFile,EOFFile,&#13;
	ReadFile,GetChar;&#13;
&#13;
CONST&#13;
	DMASize = 128;&#13;
TYPE&#13;
	FileIOStatus = (Success,InvalidFileName,&#13;
		OpenError,CloseError,IOError);&#13;
	DMA = ARRAY [0..DMASize-1] OF CHAR;&#13;
	pFileIOStruct = POINTER TO FileIOStruct;&#13;
	FileIOStruct = RECORD&#13;
		FCBBuf: FCB;&#13;
		DMABuf: DMA;&#13;
		ReadPos: CARDINAL;&#13;
		WritePos: CARDINAL;&#13;
		EOFFlag: BOOLEAN;&#13;
	END;&#13;
&#13;
PROCEDURE OpenFile(FileName: ARRAY OF CHAR;&#13;
	VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
PROCEDURE CloseFile(VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
PROCEDURE ReadFile(VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;&#13;
PROCEDURE EOFFile(pFileIO: pFileIOStruct): BOOLEAN;&#13;
END BasicFileIO.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;実装モジュールは、以下のとおりです。手続き GetChar では、CR LF と連続した場合、 LF を読み飛ばします。&#13;
&lt;pre&gt;&#13;
IMPLEMENTATION MODULE BasicFileIO;&#13;
FROM InOut IMPORT Write,WriteString,WriteLn;&#13;
FROM OpSys IMPORT BdosFunctions,FCBFileName,Bdos,FCB;&#13;
FROM FileNames IMPORT StrToFCB,NameState;&#13;
FROM SYSTEM IMPORT ALLOCATE,ADR,TSIZE,WORD;&#13;
&#13;
CONST&#13;
	CR = 15C;&#13;
	LF = 12C;&#13;
	EOFMARK = 32C;&#13;
&#13;
PROCEDURE OpenFile(FileName: ARRAY OF CHAR;&#13;
	VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
VAR&#13;
	BdosRc: CARDINAL;&#13;
	Junk: WORD;&#13;
&#13;
BEGIN&#13;
	(* Allocate FCB and DMA / pre-Set *)&#13;
	ALLOCATE(pFileIO,TSIZE(FileIOStruct));&#13;
	pFileIO^.FCBBuf.name.text := '';&#13;
	pFileIO^.FCBBuf.rest := '';&#13;
	pFileIO^.DMABuf := '';&#13;
	IF StrToFCB(FileName,pFileIO^.FCBBuf.name) # NameOK THEN&#13;
		RETURN InvalidFileName&#13;
	END;&#13;
	Bdos(setDMA,ADR(pFileIO^.DMABuf),Junk);&#13;
	Bdos(openF,ADR(pFileIO^.FCBBuf),BdosRc);&#13;
	IF BdosRc # 255 THEN&#13;
		pFileIO^.ReadPos := DMASize;&#13;
		pFileIO^.WritePos := 0;&#13;
		pFileIO^.EOFFlag := FALSE;&#13;
		RETURN Success&#13;
	ELSE&#13;
		RETURN OpenError&#13;
	END&#13;
END OpenFile;&#13;
&#13;
PROCEDURE CloseFile(VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
VAR&#13;
	BdosRc: CARDINAL;&#13;
&#13;
BEGIN&#13;
	Bdos(closeF,ADR(pFileIO^.FCBBuf),BdosRc);&#13;
	IF BdosRc = 0 THEN&#13;
		RETURN Success&#13;
	ELSE&#13;
		RETURN CloseError&#13;
	END&#13;
END CloseFile;&#13;
&#13;
PROCEDURE ReadFile(VAR pFileIO: pFileIOStruct): FileIOStatus;&#13;
VAR&#13;
	BdosRc: CARDINAL;&#13;
&#13;
BEGIN&#13;
	Bdos(readSeq,ADR(pFileIO^.FCBBuf),BdosRc);&#13;
	IF BdosRc = 0 THEN&#13;
		RETURN Success&#13;
	ELSE&#13;
		RETURN IOError&#13;
	END&#13;
END ReadFile;&#13;
&#13;
PROCEDURE GetChar(VAR pFileIO: pFileIOStruct): CHAR;&#13;
VAR&#13;
	C: CHAR;&#13;
&#13;
BEGIN&#13;
	IF DMASize = pFileIO^.ReadPos THEN&#13;
		IF ReadFile(pFileIO) = Success THEN&#13;
			pFileIO^.ReadPos := 0&#13;
		ELSE&#13;
			pFileIO^.ReadPos := 0;&#13;
			pFileIO^.DMABuf[pFileIO^.ReadPos] := EOFMARK&#13;
		END&#13;
	END;&#13;
	C := pFileIO^.DMABuf[pFileIO^.ReadPos];&#13;
	IF C = CR THEN&#13;
		IF pFileIO^.DMABuf[pFileIO^.ReadPos+1] = LF THEN&#13;
			INC(pFileIO^.ReadPos)&#13;
		END&#13;
	END;&#13;
	INC(pFileIO^.ReadPos);&#13;
	IF C = EOFMARK THEN&#13;
		pFileIO^.EOFFlag := TRUE&#13;
	END;&#13;
	RETURN C&#13;
END GetChar;&#13;
&#13;
PROCEDURE EOFFile(pFileIO: pFileIOStruct): BOOLEAN;&#13;
BEGIN&#13;
	RETURN pFileIO^.EOFFlag&#13;
END EOFFile;&#13;
END BasicFileIO.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;GetChar で、 LF を読み飛ばす以外は、面倒くさいところは、ないでしょう。&#13;
&lt;p&gt;この、 BasicFileIO モジュールをつかって、行単位の読み出しルーチンを作ってます。 StdFileIO モジュールです。&#13;
このモジュールは、 CP/M のファイル構造と独立です。必要最低限の行単位の読み出ししか作成していません。&#13;
&lt;p&gt;定義モジュールは、以下の通り。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE StdFileIO;&#13;
FROM BasicFileIO IMPORT&#13;
	pFileIOStruct;&#13;
&#13;
EXPORT QUALIFIED &#13;
	GetLine;&#13;
&#13;
PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;&#13;
		VAR LineBuffer: ARRAY OF CHAR): CARDINAL;&#13;
END StdFileIO.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;実装モジュールは、以下の通りです。&#13;
&lt;pre&gt;&#13;
IMPLEMENTATION MODULE StdFileIO;&#13;
FROM BasicFileIO IMPORT&#13;
	pFileIOStruct,GetChar;&#13;
&#13;
CONST&#13;
	EOS = 0C;&#13;
	EOFMARK = 32C;&#13;
	CR = 15C;&#13;
&#13;
PROCEDURE GetLine(VAR pFileIO: pFileIOStruct;&#13;
		VAR LineBuffer: ARRAY OF CHAR): CARDINAL;&#13;
&#13;
VAR&#13;
	C: CHAR;&#13;
	CPos: CARDINAL;&#13;
&#13;
BEGIN&#13;
	CPos := 0;&#13;
	LOOP&#13;
		C := GetChar(pFileIO);&#13;
		CASE C OF&#13;
			EOFMARK:&#13;
				LineBuffer[CPos] := EOS;&#13;
				RETURN CPos&#13;
		|	CR:&#13;
				LineBuffer[CPos] := EOS;&#13;
				RETURN CPos&#13;
		END;&#13;
		LineBuffer[CPos] := C;&#13;
		INC(CPos);&#13;
		IF CPos = HIGH(LineBuffer) THEN&#13;
			LineBuffer[CPos] := EOS;&#13;
			RETURN CPos&#13;
		END&#13;
	END&#13;
END GetLine;&#13;
END StdFileIO.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;GetLine は、一文字読み出しを繰り返し、 CR または EOF が来たら、その一文字前の文字までを一行とします。&#13;
また、バッファーのサイズ以上に読み取ろうとした場合は、強制的に一行にしてしまいます。溢れてしまうと困りますので。&#13;
&lt;p&gt;find 本体の紹介は次回にします。
</description>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>CP/M</dc:subject>
      <dc:subject>Modula-2</dc:subject>
    </item>
    <item>
      <title>Modula-2でプログラミング -- FileFindの制作</title>
      <link>https://kida.asablo.jp/blog/2024/11/02/9728491</link>
      <guid>https://kida.asablo.jp/blog/2024/11/02/9728491</guid>
      <pubDate>Sat, 02 Nov 2024 11:36:11 +0900</pubDate>
      <dcterms:modified>2024-11-02T11:37:33+09:00</dcterms:modified>
      <dcterms:created>2024-11-02T11:37:33+09:00</dcterms:created>
      <description>&lt;p&gt;FIleSearche"モジュールを利用した、ファイマッチで指定されたファイル一覧を書き出すプログラム&#13;
"FileFind"を作ってみました。&#13;
&lt;p&gt;使い方は、このようにします。&#13;
&lt;pre&gt;&#13;
C0#filefind&#13;
arguments&gt;f*.mod *.def&#13;
C:FIND.MOD&#13;
C:FILEFIND.MOD&#13;
C:FILESEAR.MOD&#13;
C:CONIO.DEF&#13;
C:ADD16.DEF&#13;
C:SILLY.DEF&#13;
C:FILESEAR.DEF&#13;
C:STDFILEI.DEF&#13;
C:BDOSSTRU.DEF&#13;
C:BASICFIL.DEF&#13;
C:CMDARGS.DEF&#13;
C:SCREEN.DEF     &#13;
&lt;/pre&gt;&#13;
&lt;p&gt;探すファイル名は、ファイルマッチを指定できます。複数指定できます。&#13;
この引数を受け取るには、以前紹介した自作の"CmdArgs"モジュール&#13;
を使用しています。&#13;
&lt;p&gt;プログラムは、このようになりました。&#13;
&lt;pre&gt;&#13;
MODULE FileFind;&#13;
FROM InOut IMPORT WriteString,WriteLn;&#13;
FROM CmdArgs IMPORT Argc,Argv;&#13;
FROM FileSearch IMPORT MakeFileList,DumpFileList;&#13;
&#13;
CONST&#13;
	MAXLINE = 128;&#13;
&#13;
VAR&#13;
	FileMatch: ARRAY [0..MAXLINE-1] OF CHAR;&#13;
	nArgc: CARDINAL;&#13;
	NthFile: CARDINAL;&#13;
&#13;
PROCEDURE Usage();&#13;
BEGIN&#13;
	WriteString('Usage: filefind filematch');WriteLn;&#13;
END Usage;&#13;
&#13;
BEGIN&#13;
	nArgc := Argc();&#13;
	IF nArgc &lt; 1 THEN&#13;
		Usage();&#13;
		HALT;&#13;
	END;&#13;
&#13;
	NthFile := 0;&#13;
	WHILE NthFile &lt; nArgc DO &#13;
		Argv(NthFile,FileMatch);&#13;
		DumpFileList(MakeFileList(FileMatch));&#13;
		INC(NthFile);&#13;
	END;&#13;
END FileFind.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;次々にファイルマッチを取り出し、該当するファイル名のリストを"MakeFileList"で作成し、&#13;
そのリストを"DumpFileLIst"で書き出します。"DumpFileList"は、"FileSearch"モジュールに実装しました。&#13;
こうすることで、ファイル名の保持のしかたをメインルーチンが知る必要がありません。
</description>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>CP/M</dc:subject>
      <dc:subject>Modula-2</dc:subject>
    </item>
    <item>
      <title>Modula-2でプログラミング -- FileSearch ファイルを探すモジュールの修正</title>
      <link>https://kida.asablo.jp/blog/2024/11/02/9728487</link>
      <guid>https://kida.asablo.jp/blog/2024/11/02/9728487</guid>
      <pubDate>Sat, 02 Nov 2024 10:29:22 +0900</pubDate>
      <dcterms:modified>2024-11-02T10:30:34+09:00</dcterms:modified>
      <dcterms:created>2024-11-02T10:30:34+09:00</dcterms:created>
      <description>&lt;p&gt;前回、ファイルを探すモジュール"FileSearch"を制作しました。これを利用したプログラムを&#13;
いくつか作成して見た所、ファイル名リストのデータ構造の使い勝手が良くないことがわかりました&#13;
ので"FileSearch"モジュールを修正しました。&#13;
&lt;br&gt;&#13;
&lt;p&gt;修正した"FileSearch"モジュールのDefinition Moduleです。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE FileSearch;&#13;
&#13;
FROM OpSys IMPORT FCB,FCBFileName;&#13;
&#13;
EXPORT QUALIFIED pFileList,FileNameNode,DMA,&#13;
	LoginDisk,MakeFileList,DumpFileList;&#13;
&#13;
CONST&#13;
	DMABufferSize = 128;&#13;
	FileNameSize = 14;&#13;
&#13;
TYPE&#13;
	pFileList = POINTER TO FileNameNode;&#13;
	FileNameNode = RECORD&#13;
		FileName: ARRAY [0..FileNameSize] OF CHAR;&#13;
		Next: pFileList&#13;
	END;&#13;
        DMA = ARRAY [0..DMABufferSize-1] OF CHAR;&#13;
&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
PROCEDURE MakeFileList(FIleMatch: ARRAY OF CHAR): pFileList;&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;大きな変更点は、ファイル名の持ち方をべたな文字列にした点です。&#13;
&lt;br&gt;&#13;
&lt;p&gt;修正したImprementation Moduleは、このとおり。&#13;
&lt;pre&gt;&#13;
IMPLEMENTATION MODULE FileSearch;&#13;
FROM InOut IMPORT WriteHex,Write,WriteString,WriteLn;&#13;
FROM OpSys IMPORT FCB,FCBFileName,BdosFunctions,Bdos;&#13;
FROM SYSTEM IMPORT ALLOCATE,TSIZE,ADR,WORD;&#13;
FROM FileNames IMPORT StrToFCB,FCBToStr,NameState;&#13;
&#13;
CONST&#13;
	EOS = 0C;&#13;
&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
VAR&#13;
	DiskCode: CARDINAL;&#13;
	Junk: WORD;&#13;
&#13;
BEGIN&#13;
	IF FCBBuf.name.disk = 0C THEN&#13;
		Bdos(retCDsk,Junk,DiskCode);&#13;
		RETURN (CHR(ORD(DiskCode)+ORD('A')));&#13;
	ELSE&#13;
		RETURN (CHR(ORD(FCBBuf.name.disk)+ORD('A')-1));&#13;
	END;&#13;
END LoginDisk;&#13;
&#13;
PROCEDURE MakeFileList(FileMatch: ARRAY OF CHAR): pFileList;&#13;
VAR&#13;
	Disk: CHAR;&#13;
	FCBBuffer: FCB;&#13;
	BdosRc: CARDINAL;&#13;
	DMABuffer: DMA;&#13;
	CPos: CARDINAL;&#13;
	NameStatus: NameState;&#13;
	pList: pFileList;&#13;
	pNewFileName: pFileList;&#13;
	FCBFile: FCBFileName;&#13;
	Formatted: BOOLEAN;&#13;
	Junk: WORD;&#13;
&#13;
BEGIN&#13;
	pList := NIL;&#13;
&#13;
	(* Clear FCB Buffer and set file name *)&#13;
	FCBBuffer.name.text := '';&#13;
	FCBBuffer.rest := '';&#13;
	NameStatus := StrToFCB(FileMatch,FCBBuffer.name);&#13;
&#13;
	Disk := LoginDisk(FCBBuffer);&#13;
&#13;
	(* set DMA Bufer *)&#13;
	Bdos(setDMA,ADR(DMABuffer),Junk);&#13;
&#13;
	(* find first much file *)&#13;
	Bdos(searchFst,ADR(FCBBuffer),BdosRc);&#13;
	WHILE BdosRc # 255 DO&#13;
		ALLOCATE(pNewFileName,TSIZE(FileNameNode));&#13;
		FOR CPos := 0 TO 11 DO&#13;
			FCBFile.text[CPos]&#13;
				:= DMABuffer[CPos+BdosRc*32]&#13;
		END;&#13;
		FCBFile.disk := CHR(ORD(Disk) - ORD('A') + 1);&#13;
		FCBToStr(FCBFile,pNewFileName^.FileName,FALSE);&#13;
		pNewFileName^.Next := pList;&#13;
		pList := pNewFileName;&#13;
&#13;
		(* find next file *)&#13;
		Bdos(searchNxt,Junk,BdosRc);&#13;
	END;	&#13;
	RETURN pList&#13;
END MakeFileList;&#13;
&#13;
PROCEDURE WriteFileName(FileName: ARRAY OF CHAR);&#13;
BEGIN&#13;
	WriteString(FileName);&#13;
	WriteLn&#13;
END WriteFileName;&#13;
&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
BEGIN&#13;
	WHILE pList # NIL DO&#13;
		WriteFileName(pList^.FileName);&#13;
		pList := pList^.Next;&#13;
	END;&#13;
END DumpFileList;&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;大きな修正点は、見つかったファイルの名前をFCB形式からべたな文字列のファイル名に変換し、&#13;
それを保存している点です。&#13;
ファイル名の持ち方をべたな文字列にしたので、ファイル名を書き出すPROCEDURE "WriteFileName"を&#13;
修正しています。&#13;
&lt;p&gt;他には、"BdosStruct"モジュールの使用をやめました。処理系が提供する&#13;
Bdos関連機能の"OpSys"モジュールを一部修正し、"BdosStruct"モジュールが無くてもコンパイル&#13;
できるようにしました。
</description>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>CP/M</dc:subject>
      <dc:subject>Modula-2</dc:subject>
    </item>
    <item>
      <title>Modula-2でプログラミング -- FileSearch ファイルを探すモジュールの制作</title>
      <link>https://kida.asablo.jp/blog/2024/10/19/9725124</link>
      <guid>https://kida.asablo.jp/blog/2024/10/19/9725124</guid>
      <pubDate>Sat, 19 Oct 2024 09:49:50 +0900</pubDate>
      <dcterms:modified>2024-10-22T20:22:49+09:00</dcterms:modified>
      <dcterms:created>2024-10-19T09:51:02+09:00</dcterms:created>
      <description>&lt;p&gt;ファイルを探すことは、結構よくあることです。CP/Mでプログラムを作る場合でも同じこと。&#13;
今回は、Modula-2からBDOSの機能を呼び出し、ファイルを探す"FileSearch"モジュールを紹介します。&#13;
&lt;p&gt;"FileSearch"モジュールは、処理系が提供するモジュールをいくつか使用しています。&#13;
&lt;ul&gt;&#13;
&lt;li&gt;"OpSys"モジュールは、BDOSやBIOSを呼び出すためのBdos手続きやFCBなどのレコード型などを提供しています。&#13;
&lt;li&gt;"FileNames"モジュールは、FCBのファイル名領域にファイル名を設定する手続きや、その手続きの戻り値の型を提供しています。&#13;
&lt;li&gt;"SYSTEM"モジュールは、メモリーの動的確保や変数のサイズなどを調べる手続きを提供しています。&#13;
&lt;/ul&gt;&#13;
&lt;p&gt;このほかに自作モジュール"BdosStruct"があります。これは、BDOSを呼び出すBdos手続きがちょっと使いにくかったので、&#13;
処理系を騙す仕組みを作り込みました。&#13;
&lt;br&gt;&#13;
&lt;p&gt;"FileSearch"モジュールのDefinition Moduleです。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE FileSearch;&#13;
&#13;
FROM InOut IMPORT Write,WriteString,WriteLn;&#13;
FROM OpSys IMPORT FCB,CPMStringBuffer,BdosFunctions,Bdos;&#13;
FROM SYSTEM IMPORT ALLOCATE,SIZE,ADR,WORD;&#13;
FROM FileNames IMPORT StrToFCB,NameState;&#13;
FROM BdosStruct IMPORT BdosCommand,BdosReturn;&#13;
&#13;
EXPORT QUALIFIED pFileList,FileList,FileStruct,DMA,&#13;
        LoginDisk,MakeFileList,DumpFileList;&#13;
&#13;
CONST&#13;
        DMABufferSize = 128;&#13;
&#13;
TYPE&#13;
        FileStruct = RECORD&#13;
                CASE BOOLEAN OF&#13;
                        TRUE:   Disk: CHAR;&#13;
                                Fill1: CHAR;&#13;
                                Name: ARRAY [0..7] OF CHAR;&#13;
                                Fill2: CHAR;&#13;
                                Extention: ARRAY [0..2] OF CHAR;&#13;
                |       FALSE:  Text: ARRAY [0..13] OF CHAR;&#13;
                END;&#13;
        END;&#13;
        pFileList = POINTER TO FileList;&#13;
        FileList = RECORD&#13;
                File: FileStruct;&#13;
                Next: pFileList;&#13;
        END;&#13;
        DMA = ARRAY [0..DMABufferSize-1] OF CHAR;&#13;
&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
PROCEDURE MakeFileList(FileMatch: ARRAY OF CHAR): pFileList;&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;Imprementation Moduleは、このとおり。&#13;
&lt;pre&gt;&#13;
IMPLEMENTATION MODULE FileSearch;&#13;
&#13;
FROM InOut IMPORT Write,WriteString,WriteLn;&#13;
FROM OpSys IMPORT FCB,BdosFunctions,Bdos;&#13;
FROM SYSTEM IMPORT ALLOCATE,SIZE,ADR,WORD;&#13;
FROM FileNames IMPORT StrToFCB,NameState;&#13;
FROM BdosStruct IMPORT BdosCommand,BdosReturn,FileStruct,DMA;&#13;
&#13;
PROCEDURE LoginDisk(FCBBuf: FCB): CHAR;&#13;
VAR&#13;
        BdosCmd: BdosCommand;&#13;
        Junk: WORD;&#13;
        DiskCode: BdosReturn;&#13;
&#13;
BEGIN&#13;
        IF FCBBuf.name.disk = 0C THEN&#13;
                BdosCmd.Func := retCDsk;&#13;
                Bdos(BdosCmd.Cmd,Junk,DiskCode.Rc);&#13;
                RETURN (CHR(ORD(DiskCode.Cc)+ORD('A')));&#13;
        ELSE&#13;
                RETURN (CHR(ORD(FCBBuf.name.disk)+ORD('A')-1));&#13;
        END;&#13;
END LoginDisk;&#13;
&#13;
PROCEDURE MakeFileList(FileMatch: ARRAY OF CHAR): pFileList;&#13;
VAR&#13;
        Disk: CHAR;&#13;
        FCBBuffer: FCB;&#13;
        BdosFunc: BdosCommand;&#13;
        BdosRc: BdosReturn;&#13;
        DMABuffer: DMA;&#13;
        ToPos, FromPos: CARDINAL;&#13;
        NameStatus: NameState;&#13;
        pList: pFileList;&#13;
        pNewFile: pFileList;&#13;
        NewFile: FileList;&#13;
        Junk: WORD;&#13;
&#13;
BEGIN&#13;
        (* Clear FCB Buffer and set file name *)&#13;
        FCBBuffer.name.text := '';&#13;
        FCBBuffer.rest := '';&#13;
        NameStatus := StrToFCB(FileMatch,FCBBuffer.name);&#13;
&#13;
        (* get target disk *)&#13;
        Disk := LoginDisk(FCBBuffer);&#13;
&#13;
        (* set DMA Bufer *)&#13;
        BdosFunc.Func := setDMA;&#13;
        Bdos(BdosFunc.Cmd,ADR(DMABuffer),Junk);&#13;
&#13;
        (* initialize File Name List pointer *)&#13;
        pList := NIL;&#13;
&#13;
        (* find first much file *)&#13;
        BdosFunc.Func := searchFst;&#13;
        Bdos(BdosFunc.Cmd,ADR(FCBBuffer),BdosRc.Rc);&#13;
        WHILE BdosRc.Cc # 255 DO&#13;
                (* copy from FCB buffer to file struct *)&#13;
                ALLOCATE(pNewFile,SIZE(NewFile));&#13;
                pNewFile^.File.Disk := Disk;&#13;
                pNewFile^.File.Fill1 := ':';&#13;
                ToPos := 0;&#13;
                FOR FromPos := 1 TO 8 DO&#13;
                        pNewFile^.File.Name[ToPos] &#13;
                                := DMABuffer[FromPos+BdosRc.Cc*32];&#13;
                        INC(ToPos);&#13;
                END;&#13;
&#13;
                pNewFile^.File.Fill2 := '.';&#13;
                ToPos := 0;&#13;
                FOR FromPos := 9 TO 11 DO&#13;
                        pNewFile^.File.Extention[ToPos]&#13;
                                := DMABuffer[FromPos+BdosRc.Cc*32];&#13;
                        INC(ToPos);&#13;
                END;&#13;
                (* insert new one *)&#13;
                pNewFile^.Next := pList;&#13;
                pList := pNewFile;&#13;
&#13;
                (* find next file *)&#13;
                BdosFunc.Func := searchNxt;&#13;
                Bdos(BdosFunc.Cmd,Junk,BdosRc.Rc);&#13;
        END;    &#13;
        RETURN pList&#13;
END MakeFileList;&#13;
&#13;
PROCEDURE WriteFileStruc(FileStruc: FileStruct);&#13;
BEGIN&#13;
        Write(FileStruc.Disk);&#13;
        Write(FileStruc.Fill1);&#13;
        WriteString(FileStruc.Name);&#13;
&#13;
        Write(FileStruc.Fill2);&#13;
        WriteString(FileStruc.Extention);&#13;
        WriteLn;&#13;
END WriteFileStruc;&#13;
&#13;
PROCEDURE DumpFileList(pList: pFileList);&#13;
BEGIN&#13;
        WHILE pList # NIL DO&#13;
                WriteFileStruc(pList^.File);&#13;
                pList := pList^.Next;&#13;
        END;&#13;
END DumpFileList;&#13;
&#13;
END FileSearch.&#13;
&lt;/pre&gt;&#13;
&lt;p&gt;MakeFileList手続きが処理の中心です。ファイルを探すにはBDOSの機能番号１６ 最初のデータを探す(SearchFirst)、&#13;
機能番号１７ 次にデータを探す(SearchNext)を使います。&#13;
はじめに、FCBとDMAを準備します。そして、FCB領域を初期化します。&#13;
&lt;pre&gt;&#13;
        (* Clear FCB Buffer and set file name *)&#13;
        FCBBuffer.name.text := '';&#13;
        FCBBuffer.rest := '';&#13;
        NameStatus := StrToFCB(FileMatch,FCBBuffer.name);&#13;
&lt;/pre&gt;&#13;
ここで躓きました。"FCBBuffer.rest"を初期化をしなかったために、&#13;
最初のデータを取得できたりできなかったりと、動作が不安定でした。&#13;
アセンブラでテストルーチンを書くとうまく動作します。悩みました。&#13;
使用したアセンブラでは、確保したデータ領域を自動的に0を埋め込んでいました。&#13;
しかし、Modula-2処理系では領域内の値は不定になるため、動作がおかしくなった様です。&#13;
&lt;p&gt;最初のデータを見つけてしまえば、後は順に見つけることができました。&#13;
&lt;p&gt;見つけたファイル名をリスト構造にして、返します。&#13;
&lt;p&gt;DumpFileList手続きは、ファイル名リストを表示します。下受けルーチンとして、WriteFileStruc手続きを&#13;
使っています。&lt;p&gt;特に難しいロジックはありません。&#13;
&lt;p&gt;BdosStructは、Definition Moduleだけです。以下のようになっています。&#13;
&lt;pre&gt;&#13;
DEFINITION MODULE BdosStruct;&#13;
&#13;
FROM OpSys IMPORT BdosFunctions;&#13;
FROM SYSTEM IMPORT WORD;&#13;
&#13;
EXPORT QUALIFIED&#13;
        BdosCommand,BdosReturn;2&#13;
&#13;
TYPE&#13;
        BdosCommand = RECORD&#13;
                CASE BOOLEAN OF&#13;
                        TRUE:   Func: BdosFunctions;&#13;
                |       FALSE:  Cmd: WORD;&#13;
                END;&#13;
        END;&#13;
        BdosReturn = RECORD&#13;
                CASE BOOLEAN OF&#13;
                        TRUE:   Rc: WORD;&#13;
                |       FALSE:  Cc: CARDINAL;&#13;
                END;&#13;
        END;&#13;
END BdosStruct.                     &#13;
&lt;/pre&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;次回は、これを応用したファイルマッチで指定されたファイルをリストするコマンド"FileFind"紹介します。
</description>
      <dc:subject>コンピューター</dc:subject>
      <dc:subject>CP/M</dc:subject>
      <dc:subject>Modula-2</dc:subject>
    </item>
    <item>
      <title>TIのTL497を使ったStep-Down コンバーターの制作</title>
      <link>https://kida.asablo.jp/blog/2024/04/20/9677329</link>
      <guid>https://kida.asablo.jp/blog/2024/04/20/9677329</guid>
      <pubDate>Sun, 21 Apr 2024 09:10:23 +0900</pubDate>
      <dcterms:modified>2024-04-21T09:14:43+09:00</dcterms:modified>
      <dcterms:created>2024-04-20T09:20:06+09:00</dcterms:created>
      <description>&lt;p&gt;自作のボードコンピュター用に、出力16VのACアダプターをTA7805で5Vに落とした電源器を使っていました。&#13;
とても発熱がとてもひどいので、対策を考えていました。今回は、TIのスイッチングレギュレータ用IC TL497を使ったStep-Downコンバーターを&#13;
使って、発熱の少ない電源を作ってみました。&#13;
&lt;p&gt;TL497をStep-Downコンバータとして使うのは、初めてなので３タイプを制作してみました。&#13;
&lt;ol&gt;&#13;
&lt;li&gt;TL497単体で制作した、12V入力で5V/0.5A出力の電源&#13;
&lt;li&gt;上の回路に外付けトランジスタを追加して出力電流を多くした電源&#13;
&lt;li&gt;更に、入力電源電圧を16V用にした電源。TL497の最大電源電圧は15Vなのでひと工夫が必要です。&#13;
&lt;/ol&gt;&#13;
&lt;p&gt;まずは、TL497単体で制作した電源です。回路図と外観はこのとおり。&#13;
(手持ちのパーツを使用したため、一部に大げさな規格のパーツを使用しています。)&#13;
&lt;br&gt;&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/CONV12to5.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/CONV12to5.png" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/pConv12to5.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/pConv12to5.png" align=center&gt;&#13;
&lt;/a&gt;&lt;br&gt;&#13;
&lt;p&gt;回路はデータシートどおりです。&#13;
&lt;p&gt;外付けトランジスタを追加して出力電流を増やしました。これで、1Aまで取れます。&#13;
&lt;br&gt;&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/CONV12to5.1A.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/CONV12to5.1A.png" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/pConv12to5.1A.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/pConv12to5.1A.png" align=center&gt;&#13;
&lt;/a&gt;&lt;br&gt;&#13;
&lt;p&gt;15V以上の入力電圧に対応できるようにしたのが、これです。入力電圧を78L12で受けてTL497の電源にしています。&#13;
実際に長時間連続で使用しても発熱は少なくなり、当初の目的を達成できました。&#13;
&lt;br&gt;&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/CONV16to5.1A.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/CONV16to5.1A.png" align=center&gt;&#13;
&lt;/a&gt;&#13;
&lt;a href="//www.asahi-net.or.jp/~lb7h-kd/blog/img/pConv16to5.1A.png" download&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/SMALL/pConv16to5.1A.png" align=center&gt;&#13;
&lt;/a&gt;&lt;br&gt;
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2024/04/20/6bc343.png" length="90416" type="image/png"/>
      <dc:subject>アナログ</dc:subject>
      <dc:subject>雑</dc:subject>
    </item>
    <item>
      <title>ヴィルト先生</title>
      <link>https://kida.asablo.jp/blog/2024/01/06/9648683</link>
      <guid>https://kida.asablo.jp/blog/2024/01/06/9648683</guid>
      <pubDate>Sat, 06 Jan 2024 13:10:54 +0900</pubDate>
      <dcterms:modified>2024-01-06T13:35:03+09:00</dcterms:modified>
      <dcterms:created>2024-01-06T13:31:26+09:00</dcterms:created>
      <description>&lt;p&gt;チューリッヒ連邦工科大学のOberonチームから、悲しい知らせが届きました。Pascal, Modulaといった&#13;
プログラミング言語を世に送り出し、更にOberonという言語で記述したテキスト指向のオペレーティングシステムの開発者でもある&#13;
ニクラウス　ヴィルト先生が、なくなりました。&#13;
&lt;p&gt;私が、ヴィルト先生のことを知ったのは、学生時代に参加したPascalの勉強会ででした。使用したテキストが、&#13;
ヴィルト先生らが書いた「Pascal(原題 Pascal User Manual and Report)」でした。この勉強会を通じて、Fortranとは違う&#13;
プログラミング・パラダイムを知り、構造化されたプログラミングスタイルを身につけることができました。&#13;
このことは、仕事についてから、Cでのプログラム開発に、大いに役立ちました。&#13;
また、その後の、仕事においても、趣味においてでも、Pascalは重要な位置を締めてきました。&#13;
&lt;p&gt;ヴィルト先生の著作を　もう２冊持っています。「アルゴリズム＋データ構造＝プログラム(原題 ALGORITHMS+DATA STRUCTURES=PROGRAM)」と「アルゴリズムとデータ構造(原題 ALGORITHMS &amp; DATA STRUCTURES)」です。この２冊は&#13;
兄弟になる著作でしょう。前者は、Pascalで、後者はModula-2でアルゴリズムの選択やそれに適したデータ構造の構築について&#13;
議論がなされています。これら３冊は、私にとってバイブル的存在であり、すぐに手に取れるところにおいています。&#13;
&lt;p&gt;私がプログラマーとして成長するのに、大きな影響を受けたヴィルト先生のご冥福をお祈りましす。
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2024/01/06/6a8722.jpg" length="13814" type="image/jpeg"/>
      <dc:subject>コンピューター</dc:subject>
    </item>
    <item>
      <title>ASSIT09で、8-Queens</title>
      <link>https://kida.asablo.jp/blog/2023/12/21/9644506</link>
      <guid>https://kida.asablo.jp/blog/2023/12/21/9644506</guid>
      <pubDate>Thu, 21 Dec 2023 17:18:28 +0900</pubDate>
      <dcterms:modified>2023-12-21T17:36:35+09:00</dcterms:modified>
      <dcterms:created>2023-12-21T17:20:54+09:00</dcterms:created>
      <description>&lt;p&gt;8-Queensを解くプログラムです。これは、8x8のマスにお互いが鑑賞しないようにQueenのコマの配置を求めるプログラムです。オリジナルで作成しようと頑張ったのですが、行き詰まってしまいました。いつものように、先人の方々のお知恵を拝借しました。調べてみると、ヴィルトの「アルゴリズム＋データ構造＝プログラム」にPascalで書かれたスマートな解がありました。暑中参照している「マイクロコンピュータのプログラミング」にもMicroPlanでの解が掲載されています。このMicroPlanの解を参照して、プログラムを作成しました。&#13;
&lt;p&gt;さて、下敷きにしたプログラムは、Queenの配置を求めるルーチンが再帰的に書かれています。これをMC6809のアセンブラで書き下すのがキーポイントでしょう。想像しているより簡単に実現できました。MC6809にはスタックが、システムスタック Sとユーザースタック Uの2つがあります。このユーザースタックに、再帰的関数内部のローカル変数を退避させることでうまく行きました。&#13;
プログラム、アセンブルリスト、実行結果などは、こちらです。&#13;
&lt;a href="http://www.asahi-net.or.jp/~lb7h-kd/blog/binary/8Queen.zip"&gt;8Queen.zip&lt;/a&gt;&#13;
&lt;p&gt;いつものように、Lコマンドでロード・モジュールをダウンロードし、Cコマンドで、C000から実行させます。&#13;
&lt;br&gt;&#13;
&lt;img src="//www.asahi-net.or.jp/~lb7h-kd/blog/img/6809/8Queen/8Queen.jpg"&gt;&#13;
&lt;br&gt;&#13;
&lt;p&gt;Queenの配置が、次々と出てきます。&#13;
&lt;pre&gt;&#13;
         === 8 Queens ===&#13;
           0 4 7 5 2 6 1 3&#13;
           0 5 7 2 6 3 1 4&#13;
           0 6 3 5 7 1 4 2&#13;
           0 6 4 7 1 3 5 2&#13;
           1 3 5 7 2 0 6 4&#13;
           1 4 6 0 2 7 5 3&#13;
           1 4 6 3 0 7 5 2&#13;
                  :&#13;
                  :&#13;
                  :&#13;
&lt;/pre&gt;&#13;
例えば、"0 4 7 5 2 6 1 3"は、&#13;
&lt;pre&gt;&#13;
          カラム 0のQueenは、ロウ 0に&#13;
          カラム 1のQueenは、ロウ 4に&#13;
          カラム 2のQueenは、ロウ 7に&#13;
          カラム 3のQueenは、ロウ 5に&#13;
          カラム 4のQueenは、ロウ 2に&#13;
          カラム 5のQueenは、ロウ 6に&#13;
          カラム 6のQueenは、ロウ 1に&#13;
          カラム 7のQueenは、ロウ 3に&#13;
&lt;/pre&gt;&#13;
にあることを示しています。こんな配置です。&#13;
&lt;pre&gt;&#13;
            0 1 2 3 4 5 6 7&#13;
          0 Q . . . . . . .&#13;
          1 . . . . . . Q .&#13;
          2 . . . . Q . . .&#13;
          3 . . . . . . . Q&#13;
          4 . Q . . . . . .&#13;
          5 . . . Q . . . .&#13;
          6 . . . . . Q . .&#13;
          7 . . Q . . . . .&#13;
&lt;/pre&gt;
</description>
      <enclosure url="https://kida.asablo.jp/blog/img/2023/12/21/6a59dd.jpg" length="69488" type="image/jpeg"/>
      <dc:subject>6809</dc:subject>
      <dc:subject>コンピューター</dc:subject>
    </item>
  </channel>
</rss>
