<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
>

<channel rdf:about="https://piclabo.seesaa.net/">
<title>ＰＩＣマイコンは面白い</title>
<link>https://piclabo.seesaa.net/</link>
<description>I&#39;m enjoying PIC microcomputer, retro CPU, homebrew CPU, 3D printer and CNC.</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="https://blog.seesaa.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/Z80ClearMemory.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/picleZ80_002.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/picleZ80.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/FastShuffle.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/TMPZ84Compact06.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/XDangerList.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/PunchedTape007_Writer.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/PunchedTape006.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/PcbReversedpattern.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/SampleCode365Case.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/CrossTable.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/OptimizingFixedNumberMultiplication.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/Z80RandomGenMethod.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/TwitterLookBack2025.html.html" />
<rdf:li rdf:resource="https://piclabo.seesaa.net/article/PunchedTape005.html" />
</rdf:Seq>
</items>
</channel>

<item rdf:about="https://piclabo.seesaa.net/article/Z80ClearMemory.html">
<link>https://piclabo.seesaa.net/article/Z80ClearMemory.html</link>
<title>Z80での全メモリクリアプログラム</title>
<description>１．はじめに　X（旧Twitter）で&quot;Z80&quot;の検索結果を眺めていたところ、興味深いお題を発見しました。　このブログでも以前「Z80での全メモリ同一値設定処理」の記事で似たような問題をＸで出したことがありますが、今回発見したお題は「0000Hから始まる最短の全メモリクリアプログラムを考えよ」という条件が付いています。【歴史上最も素敵だったプログラミング問題】「0000H番地から始まるZ80の機械語プログラムで、それを実行するとその命令語領域を含め、全領域を00Hにするコード..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-07-01T22:49:35+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<div id="Item1">
<font size="+0"><b>１．はじめに</b></font><br/><!----------------------------------------->
</div>
　X（旧Twitter）で"Z80"の検索結果を眺めていたところ、興味深いお題を発見しました。<br>
　このブログでも以前「<a target="Z890MemClear" href="https://piclabo.seesaa.net/article/Z80_FillMemory.html">Z80での全メモリ同一値設定処理</a>」の記事で似たような問題をＸで出したことがありますが、今回発見したお題は「<font color="darkblue"><b>0000Hから始まる最短の全メモリクリアプログラムを考えよ</b></font>」という条件が付いています。<br>
<br>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【歴史上最も素敵だったプログラミング問題】<br><br>「0000H番地から始まるZ80の機械語プログラムで、それを実行するとその命令語領域を含め、全領域を00Hにするコードを作成せよ」<br><br>実際に書けた人は上級者。問題の難点が解るだけでも中級者。<br>最もバイト数が短い者が優勝。<br><br>＼^o^／</p>&mdash; がたろう TTLでCPUを作る爺（コンパイラやOSも手作りです） (@duo6750) <a href="https://x.com/duo6750/status/787061772393918465?ref_src=twsrc%5Etfw">October 14, 2016</a></blockquote> <script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<div id="Item2">
<font size="+0"><b>２．お題の解答例</b></font><br/><!----------------------------------------->
</div>
　このお題の最短の解答が下記の７バイトのものです。PUSH HL と JP （HL) を使ったループでうまくメモリをクリアしていますね。2バイトずつ消していきますが、最後に LD L,H が残らないように工夫されています。<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">0000 21 04 00 LD HL,4<br>0003 F9 LD SP,HL<br>0004 6C LD L,H<br>0005 E5 PUSH HL<br>0006 E9 JP (HL)<br><br>度々ですみません。1バイト減りました。<a href="https://x.com/duo6750?ref_src=twsrc%5Etfw">@duo6750</a></p>&mdash; fujita nozomu (@fujitanozomu) <a href="https://x.com/fujitanozomu/status/787203083117875200?ref_src=twsrc%5Etfw">October 15, 2016</a></blockquote> <script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></center>
<br>
<br>
<div id="Item3">
<font size="+0"><b>３．別な回答</b></font><br/><!----------------------------------------->
</div>
　このお題はプログラムが長くてもいいのであれば割合簡単なのですが、上記の例のように７バイト以下にしようと思うと中々難問です。散歩中に思い付いたのが下記のプログラムです。ネット上でも殆ど見かけない Z80 のマシン語コードの特徴を利用したかなりトリッキーなものです。もう一つの効果として PUSH 命令を AND 命令化することでキャリーがクリアされるので２バイトで HL レジスタをクリアしています。<font size="-2">※説明追記 2026/07/05</font><br>
　今のところ６バイト以下のものは思い付いていません。<br>
<br>
<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">Z80メモリクリアプログラム（アセンブラ）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>                        ;+++++++++++++++++++++++++++++++++
                        ; Fill all memory with zeros.
                        ;  Ver 0.01 20260701 skyriver
                        ;+++++++++++++++++++++++++++++++++
                        
[0000] :                	ORG	0000H
                        
[0000] : E6 E9          Start:	AND	0E9H
[0002] : ED 62          	SBC	HL,HL
[0004] : F9             	LD	SP,HL
[0005] : 35             	DEC	(HL)
[0006] : E9             	JP	(HL)
                        
                        	END
</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/picleZ80_002.html">
<link>https://piclabo.seesaa.net/article/picleZ80_002.html</link>
<title>Z80用picle言語コンパイラの開発（その２）</title>
<description>１．はじめに　前回の記事で書いたように、Z80用の独自言語であるpicle言語を今更ながら開発中で、それなりに動くようになってきました。　前回の記事で書いたように将来的にはpicleコンパイラ自体をpicle言語で記述するセルフホスティングを実現したいと考えています。　そのために従来の「PIC24用のpicleコンパイラ」に追加した機能等について記録しておきたいと思います。２．従来の言語仕様に追加した機能　セルフホスティングを実現する上で必要と思われる機能とコンパイラに追加し..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-06-25T21:37:14+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<div id="Item1">
<font size="+0"><b>１．はじめに</b></font><br/><!----------------------------------------->
</div>
　<a target="prev" href="https://piclabo.seesaa.net/article/picleZ80.html">前回の記事</a>で書いたように、Z80用の独自言語であるpicle言語を今更ながら開発中で、それなりに動くようになってきました。<br>
　前回の記事で書いたように将来的にはpicleコンパイラ自体をpicle言語で記述する<a target="SelfHosting" href="https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">セルフホスティング</a>を実現したいと考えています。<br>
　そのために従来の「<a target="Pic24Picle" href="https://piclabo.seesaa.net/article/2016-04-02.html">PIC24用のpicleコンパイラ</a>」に追加した機能等について記録しておきたいと思います。<br>
<br>
<br>
<div id="Item2">
<font size="+0"><b>２．従来の言語仕様に追加した機能</b></font><br/><!----------------------------------------->
</div>
　<a target="SelfHosting" href="https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">セルフホスティング</a>を実現する上で必要と思われる機能とコンパイラに追加した対処について以下に記載します。<br>
<br>
<div id="Item2-1">
<font size="+0"><b>２－１．必要な機能</b></font><br/><!----------------------------------------->
</div>
　picle言語ではfuncで関数宣言することでリターン値を返すことができますが、コンパイラを構築するためには２個の返却値が必要な場面がありました。Ｃ言語の場合であれば引数をポインタ渡しにして引数の値を変更して返したり、構造体のポインタをリターン値として返すことで実現できますが、現状のpicle言語ではこのような機能はありません。<br>
<br>
<div id="Item2-2">
<font size="+0"><b>２－２．対処</b></font><br/><!----------------------------------------->
</div>
<ol type="a">
<li><b>ポインタ渡し対応</b><br>
　Ｃ言語のように変数のポインタを求める & 演算子に対応することで、関数への引数をポインタ渡しすることを可能にしました。また、引数のポインタの中身をアクセスする際にオフセット無しの配列（例 arg[0]）の場合、オフセット演算をしないようにして高速化しました。<br>

<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">サンプル１（picle言語）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>:l

   1:# pointer argment sample
   2:# ver 0.01 2026/06/25 skyriver
   3:
   4:func hoge( a, b ) {
   5:   return = a[0] + b;
   6:   a[0] = a[0] + 1;
   7:}
   8:
   9:proc main() {
  10:   var arg;
  11:   arg = 123;
  12:   PrnStr_( "return value : " );
  13:   PrnDec_( hoge( &arg, 10 ) );
  14:   PrnStr_( "\narg : " );
  15:   PrnDec_( arg );
  16:}
:run

return value : 133
arg : 124
:
</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
</li>
<li><b>リターン後の引数値の参照可</b><br>
　上記の対策は引数をアクセスする際にZ80ではどうしてもオーバーヘッドが生じてしまうので、関数コール時にコール側が事前にPUSHする引数を関数リターン後に破棄する際、第一引数と第二引数のPOPをそれぞれDE,BCレジスタで行うようにしました。<br>
　こうすることで関数内での引数の参照時のオーバーヘッドは生じず、関数コール元に戻った後に関数内での引数の最終値をasm()による埋め込みのマシン語を使うことで参照することが可能になります。<br>
<font size="-2">※追記　2026/07/13　高速化のため、引数が5個以上の場合はPOPせずにSPを加算処理するように変更</font><br>
<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">サンプル２（picle言語）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>:l

   1:# pointer argment sample2
   2:# ver 0.01 2026/06/25 skyriver
   3:
   4:func hoge( a, b ) {
   5:   return = a + b;
   6:   a = a + 1;
   7:}
   8:
   9:proc main() {
  10:   var retval, arg;
  11:   arg = 123;
  12:   retval = hoge( arg, 10 );
  13:   asm_($dd,$73,$fc,$dd,$72,$fb);  # LD (IX-4),E; LD (IX-5),D
  14:   PrnStr_( "return value : " );
  15:   PrnDec_( retval );
  16:   PrnStr_( "\narg : " );
  17:   PrnDec_( arg );
  18:}
:run

return value : 133
arg : 124
:
</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
</li>
</ol>
<br>
<div id="Item3">
<font size="+0"><b>３．高速化の改善</b></font><br/><!----------------------------------------->
</div>
　今回、Z80用のpicle言語コンパイラを作成するにあたり、高速化した点をメモしておきます。現在開発中のコンパイラはメモリ上のソースをコンパイルし、即実行する運用を想定しているのでメモリ上にはコンパイラとコンパイルしたコードが共存します。このためコンパイラのサイズをなるべく小さくしたいので改善内容を精査し、下記の項目だけに留めています。<br>

<ol type="i">
<li><b>for ループのコンパイル</b><br>
　<a target="prev" href="https://piclabo.seesaa.net/article/picleZ80.html#Item4-2">前回の記事</a>にも書きましたが for 文のコンパイルではコードの生成順を入れ替えることでループ内のジャンプ命令が一つになるようにしています。<br>
<br>
</li>
<li><b>オフセット無しの配列のアクセス</b><br>
　上記で記載したようにオフセット無しの配列（例 arg[0]）のアクセス時はオフセット計算をしないようにしました。<br>
<br>
</li>
<li><b>変数のインクリメント／ディクリメント</b><br>
　for 文等で使用頻度の高い変数のインクリメント（例 i=i+1）とディクリメント（例 i=i-1）はマシン語の INC HL／DEC HL にコンパイルするようにしました。<br>
<br>
</li>
</ol>

<br>
<div id="Item4">
<font size="+0"><b>４．コンパイル時間</b></font><br/><!----------------------------------------->
</div>
　開発中のZ80用独自言語のpicleはrun一発で実行できるインタプリタのようなコンパイラを目指しています。下の動画はX（旧Twitter）のメッセージに貼ったもので、固定小数点の乗算を使った asciiart（マンデルブロ）を表示するプログラムの実行状況です。<br>
　runコマンド入力直後から表示が始まるまでの一瞬の待ち時間がコンパイルしている時間で、オンメモリでの１パスコンパイルなのでコンパイルは想定通りの速さです（この時の環境はZ80 12.5MHz）。
<br>
<br>
<center>
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">固定小数点乗算を使ったASCIIARTの実行画面を録画してみました<br>実行時間は6秒程度で、runコマンド後の若干の待ち時間がほぼコンパイル時間です<br>オンメモリでの１パスコンパイルなので想定どおりの速さですね <a href="https://t.co/RgAHOAjIff">pic.twitter.com/RgAHOAjIff</a></p>&mdash; skyriver (@wcinp) <a href="https://x.com/wcinp/status/2065711420176793614?ref_src=twsrc%5Etfw">June 13, 2026</a></blockquote> <script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<div id="Item5">
<font size="+0"><b>５．ベンチマーク</b></font><br/><!----------------------------------------->
</div>
　「<A target="ali80" href="https://piclabo.seesaa.net/article/GAIO-IDE_02.html">AKI-80用モニターROM&Cコンパイラーセットの購入（その２）</a>」の記事で書いたベンチマーク２を実行して比較してみました。動作環境は<font color="darkblue"><b>Z80がwait無しで20MHz</b></font>で動作するCP/M環境です。<br>
　今回のコンパイラはコンパイルがかなり高速ですがその反面、高速化対策はあまり注力していません。しかし、下表のベンチマーク結果表を見ると BDS C はもとより Z88DK よりも高速だったのは予想外な結果でした。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
整数処理ベンチマーク２実行結果
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('Bench2','https://piclabo.byte.jp/image/cpu/Z80/picle/02/BenchResult_002.png')"><image width="480" src="https://piclabo.byte.jp/image/cpu/Z80/picle/02/BenchResult_002.png"></a>
		</td>
	</tr>
	<tr><td>
<font size="-2">※変更　2026/07/13　若干高速化(80.6s → 78.2s)</font>
	</tr></td>
</table>
</center>
<br>
　picleでベンチマークプログラムを実行した画面のキャプチャも貼っておきます。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
picleでのベンチマーク２実行画面
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('Bench2Screen','https://piclabo.byte.jp/image/cpu/Z80/picle/02/PicleZ80Bench_002.png')"><image width="480" src="https://piclabo.byte.jp/image/cpu/Z80/picle/02/PicleZ80Bench_002.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<div id="Item6">
<font size="+0"><b>６．おわりに</b></font><br/><!----------------------------------------->
</div>
　今回開発中の Z80 用の picle 言語コンパイラはコンパイル速度を速くするために１パスコンパイル方式にし、上述のようにコンパイル速度は想定通り速くできました。更にコンパイルしたコードに関しても上述のベンチマークで確認したように想定以上の結果になりました。<br>
　今後は気が向いた時に<a target="SelfHosting" href="https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">セルフホスティング</a>化していきたいと思います。<br>
　また、コンパイル結果をファイル化して独立した実行ファイルを生成できるようにしたり、ポケコン等で使われている特殊なＣＰＵに対応する等、その気さえあれば色々な展開が可能だと思います。<br>
<br>
<br>
<br>
<a href="https://piclabo.seesaa.net/article/picleZ80.html">[TOP]</a> <a href="https://piclabo.seesaa.net/article/picleZ80.html">[ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogPicleZ80"><b>Z80用picle言語コンパイラの開発</b></a> [ 次へ ]<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/picleZ80.html">
<link>https://piclabo.seesaa.net/article/picleZ80.html</link>
<title>Z80用picle言語コンパイラの開発</title>
<description>１．はじめに　ソフトウェアを作ることが好きな人であれば誰しも一度はプログラミング言語を作ってみたいと思ったことがあるのではないでしょうか？　「TAKE IT EASY」のコラムに書かれているように「プログラミング言語の制作は&quot;全てを把握できる世界&quot;の創造主になる」ことかもしれません。　以前開発した PIC24 用の picle コンパイラの Z80 版を作ってみることにしました。　PIC 版ではフラッシュメモリへの書込み回数を減らすため２パス方式にしていましたが、Z80 版で..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-05-21T20:48:18+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<div id="Item1">
<font size="+0"><b>１．はじめに</b></font><br/><!----------------------------------------->
</div>
　ソフトウェアを作ることが好きな人であれば誰しも一度はプログラミング言語を作ってみたいと思ったことがあるのではないでしょうか？<br>
　「<a target="TAkeItEasy" href="https://easy.mri.co.jp/20070828.html">TAKE IT EASY</a>」のコラムに書かれているように「プログラミング言語の制作は"全てを把握できる世界"の創造主になる」ことかもしれません。<br>
　以前開発した<a target="piclePic24" href="https://piclabo.seesaa.net/article/2016-04-02.html"> PIC24 用の picle コンパイラ</a>の Z80 版を作ってみることにしました。<br>
　PIC 版ではフラッシュメモリへの書込み回数を減らすため２パス方式にしていましたが、Z80 版では生成したコードを直接メモリに書き込む１パス処理にしたいと思います。<br>
　"run" コマンド１発での「コンパイル＆Ｇｏ」を実現します。<br>
<br>
<br>
<div id="Item2">
<font size="+0"><b>２．構想</b></font><br/><!----------------------------------------->
</div>
　何故、古の Z80 用のコンパイラを作ろうと思ったかというと<br>
<ul>
<li>1パス処理の実現<br>
　コンパイル時の使用メモリを殆ど増やさずに１パス処理できそうなやり方を思いついたので実現性と効果を確認したいため</li>
<li>picle 言語の実用性の確認<br>
　今回のコンパイラはＣ言語で開発していますが、完成後に picle 言語自身で記述し直したい（<a target="WikiSelfHost" href="https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">セルフホスティングの実現</a>）と考えています。コンパイラを記述できればある程度は汎用的な処理を記述できると言えます。<br>
<font size="-2">※コンパクトに仕上げるには機能を絞る必要があるが低機能すぎるとセルフホスティング困難という悩ましさがある</font></li>
<li>他の CPU への移植性<br>
　特に<a target="Simple8Z" href="https://piclabo.seesaa.net/tag/articles/Simple8Z?page=2">自作の CPU</a> 等ではセルフコンパイラの開発はアセンブラレベルでの開発になり、手間がかかります。そこで、<a target="WikiSelfHost" href="https://ja.wikipedia.org/wiki/%E3%82%BB%E3%83%AB%E3%83%95%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">セルフホスティング</a>したコンパイラがあればクロスコンパイラ化することで容易にセルフコンパイラを構築でき、<a target="WikiBoot" href="https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E5%95%8F%E9%A1%8C">ブートストラップ</a>的な機能追加も可能になります。</li>
</ul>
<br>
<br>
<div id="Item3">
<font size="+0"><b>３．スタックフレーム管理</b></font><br/><!----------------------------------------->
</div>
　Z80はスタック関連の機能が貧弱で遅いのですが、言語として再帰呼出し機能がないとセルフホスティングの手間が膨大になってしまうので従来通り再帰呼出しに対応することにしました。<br>
　処理／関数呼出し時の処理の概要を次のようにします。<br>
<br>
<b>【関数呼出し時の処理】</b><br>
<ol>
<li>引数を左側から２バイト単位でスタックに PUSH<br>
<font size="-2">※<a target="Intel" href="https://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84#Intel_ABI">インテルの呼び出し規約(Intel ABI)</a>や<a target="AkiC" href="https://piclabo.seesaa.net/article/GAIO-IDE.html">秋月Cコンパイラ</a>では引数は右からPUSHされる</a></font></li>
<li>CALL 命令で関数呼び出し</li>
<li>呼び出し関数からリターン後、POP を使ってスタック上の引数領域を解放</li>
<li>関数呼び出しの場合、HL レジスタにリターン値が設定される</li>
</ol>
<br>
<b>【関数側の処理】</b><br>
<ol>
<li>フレームスタックレジスタ（ＩＸ）をスタックに PUSH</li>
<li>関数の場合はリターン値用に 0000h を PUSH </li>
<li>引数とオート変数アクセス用の IX に SP と同値を設定</li>
<li>オート変数分 SP 値を削減</li>
<li>関数の処理を実行</li>
<li>SP に IX の値を入れる</li>
<li>関数の場合は POP HL でリターン値を HL に設定</li>
<li>POP IX でIXの値を復帰</li>
<li>RET で呼び出し元に戻る</li>
</ol>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
処理（proc）のスタックフレーム
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('ProcFrame','https://piclabo.byte.jp/image/cpu/Z80/picle/01/StackFreme1.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/StackFreme1.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
関数（func）のスタックフレーム
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('FuncFrame','https://piclabo.byte.jp/image/cpu/Z80/picle/01/StackFreme2.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/StackFreme2.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<br>
<div id="Item4">
<font size="+0"><b>４．実装状況</b></font><br/><!----------------------------------------->
</div>
　それでは現状の実装状況について以降にメモしておきます。<br>
　尚、コーディング作業自体も楽しみたい、かつコードの隅々まで自分で把握しておきたいことからＡＩ未使用で作業しております。<br>
<br>
<br>
<div id="Item4-1">
<font size="+0"><b>４-１．"hello, world" の表示</b></font><br/><!----------------------------------------->
</div>
　Z80 用コンパイラのコーディングが一通り完了（ディバッグは未）し、はじめて"hello, world"が表示された時の画面のキャプチャが下図の左側になります。ソース中で名前の末尾がアンダースコアな関数は組み込み関数です。また、ニーモニックはディバッグのための表示で<br>
　　LD BC,705B<br>
　　CALL 0000<br>
等の部分は表示後にアドレスが設定されます。1パスなのでニーモニック表示時点では未確定なためです。<br>
　下図の右側はコンパイル直後にメモリ上にあるコードを ZSID で逆アセンブル表示したものです。参考として picle 言語のソースも貼り付けました。上記のスタックフレーム管理を踏まえて眺めると問題なくコンパイルされていることが判ります。<br>
<br>
<center><table border="0">
  <tr><td valign="top">

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
はじめての "Hello, world"
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('HeeloWorld','https://piclabo.byte.jp/image/cpu/Z80/picle/01/hello.png')"><image width="240" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/hello.png"></a>
		</td>
	</tr>
</table>

  </td><td valign="top">

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ZSID での逆アセンブル表示
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('HeeloWorldZsid','https://piclabo.byte.jp/image/cpu/Z80/picle/01/helloZsid.png')"><image width="240" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/helloZsid.png"></a>
		</td>
	</tr>
</table>

  </td></tr>
</table></center>
<br>
<br>
<div id="Item4-2">
<font size="+0"><b>４-２．fibonacci 数列の表示</b></font><br/><!----------------------------------------->
</div>
　"for"や"if"文等が動くようになったので再帰呼出しで fibonacci 数列を表示してみました。for 文のコンパイルではコードの生成順を入れ替えることでループ内のジャンプ命令が一つになるようにしました。<br>
　下図の左側がまだ最適化未対応の今回のコンパイラです。環境は no wait 12.5MHz の Z80（<a target="TMPZ84" href="https://piclabo.seesaa.net/tag/BlogTMPZ84Compact">TMPZ84Compact</a>）です。TeraTerm のマクロで時間を計測（コンパイル時間も含む）しています。<br>
　右側は GAME 言語で再起呼出しするソースをコンパイル後、起動した結果です。上記のフレームワーク管理と同様な処理を配列を使って実現しています。このソースを見ると再帰処理により、再帰呼出しが膨大に発生する状況をより実感できますね。<br>
　因みに GAME 言語インタープリタではサブルーチンスタックが直ぐにオーバーフローして実行できませんでした。<br>
★追記　2026/05/22　CP/M用のGAME言語は<a target="GameLang" href="https://piclabo.seesaa.net/article/CPM80GameCompiler.html#gamec">ここ</a>からダウンロードできます。<br>
<br>
<center><table border="0">
  <tr><td valign="top">

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Fibonacci 数列の表示（picle言語）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('FiboPicle','https://piclabo.byte.jp/image/cpu/Z80/picle/01/Fibonacci.png')"><image width="240" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/Fibonacci.png"></a>
		</td>
	</tr>
</table>

  </td><td valign="top">

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Fibonacci 数列の表示（GAME言語）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('FiboGame','https://piclabo.byte.jp/image/cpu/Z80/picle/01/FibonacciGame.png')"><image width="240" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/FibonacciGame.png"></a>
		</td>
	</tr>
</table>

  </td></tr>
</table></center>
<br>
<br>
<div id="Item4-3">
<font size="+0"><b>４-３．固定小数点での ASCIIART</b></font><br/><!----------------------------------------->
</div>
　複数あり得る "break" の箇所に前方参照のジャンプ命令を埋め込む（ループ処理が入れ子の場合も考慮）という１パス処理では悩ましい処理ですが、想定通り実装できました。"break" 機能が動作するようになったので asciiart を動かしてみました。コンパイラで扱う変数型は２バイト整数ですが２バイトの固定小数点乗算関数を用意すれば加減算処理は整数のものを利用できます。変数はアクセスが速いグローバル変数を使用してみました。<br>
<br>
<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">ASCIIART（picle言語）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre># ASCIIART in the picle compiler
#  ver 0.01 2026/05/20 skyriver
# <a href="https://piclabo.seesaa.net/article/GameAsciiart.html" target="_blank">https://piclabo.seesaa.net/article/GameAsciiart.html</a>

var X,Y,I;
var A,B,Ca,Cb,T;
var _Hex;

# Fixed-point multiplication
func fmul( X, Y ) {
    asm_($DD,$5E,$08,$DD,$56,$09,$DD,$6E);
    asm_($06,$DD,$66,$07,$01,$00,$0F,$CB);
    asm_($7C,$28,$07,$0C,$AF,$95,$6F,$9C);
    asm_($95,$67,$EB,$29,$30,$07,$0C,$AF);
    asm_($95,$6F,$9C,$95,$67,$CB,$19,$08);
    asm_($4C,$7D,$21,$00,$00,$29,$17,$CB);
    asm_($11,$30,$03,$19,$CE,$00,$10,$F5);
    asm_($6C,$67,$08,$30,$06,$AF,$95,$6F);
    asm_($9C,$95,$67,$DD,$F9,$D1,$DD,$E1);
    asm_($C9);
}


proc main() {
    _Hex = "0123456789ABCDEF ";
    for ( Y = -12; Y < 13; Y = Y + 1 ) {
        for ( X = -39; X < 40; X = X + 1 ) {
            Ca = fmul( $0bb9, X );  # 0.0458f * X
            Cb = fmul( $1555, Y );  # 0.08333f * Y
            A = Ca;
            B = Cb;
            for ( I = 0; I < 16; I=I+1 ) {
                T = fmul( A + B, A - B ) + Ca;
                B = fmul( A, B );
                B = B + B + Cb;
                A = T;
                if ( (fmul( A, A ) + fmul( B, B )) > (4 * 256) ) {
                    break;
                }
            }
            PrnChar_( _Hex[I] );
        }
        PrnChar_( 10 );
    }
}
</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
　下図は実行後の画面キャプチャです。TeraTerm のマクロで実行時間を計測しています。<br>

<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ASCIIART 実行画面
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('AsciiartPicle','https://piclabo.byte.jp/image/cpu/Z80/picle/01/Asciiart02.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/Asciiart02.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　今回の試験は CP/M 上で行っているので当然 <a target="MSXPen" href="https://msxpen.com/">MSXPen</a> でも動作しました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
MSXPen 上で実行中の ASCIIART
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('AsciiartMsxpen','https://piclabo.byte.jp/image/cpu/Z80/picle/01/AsciiMsx03.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/AsciiMsx03.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<div id="add20260627">★追記　2026/06/27　{
</div>
　プロトタイプ宣言と外部処理定義のテスト。1パスコンパイラなのでプロトタイプ処理の実体のコードに遭遇した時にアドレスが決定し、この時前方参照してコールしている箇所のアドレスも設定している。外部処理のGoCpm()を実行することでCP/Mに戻っている。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
プロトタイプ宣言と外部処理定義のテスト
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('ProtoDefTest','https://piclabo.byte.jp/image/cpu/Z80/picle/01/ProtoDefTest.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/picle/01/ProtoDefTest.png"></a>
		</td>
	</tr>
</table>
</center>
}<br>
<br>
<br>
<div id="Item5">
<font size="+0"><b>５．おわりに</b></font><br/><!----------------------------------------->
</div>
　まだ未完成ではありますが、Z80 用の picle 言語コンパイラが何とか動作するようになってきました。気が向いた時に作業を進め、冒頭に書いた構想の実現に向けて進めていきたいと思います。<br>
<br>
<br>
<br>
[TOP] [ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogPicleZ80"><b>Z80用picle言語コンパイラの開発</b></a> <a href="https://piclabo.seesaa.net/article/picleZ80_002.html">[ 次へ ]</a><br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/FastShuffle.html">
<link>https://piclabo.seesaa.net/article/FastShuffle.html</link>
<title>高速なシャッフル処理</title>
<description>１．はじめに　Ｘ（旧Twitter）でシャッフル処理の話題があり、高速にシャッフルする方法について考察した結果をメモしておきたいと思います。　今回は（も）ネットでググったり、ＡＩに聞いたりせずに自力で検討を進めました。　自力で検討した場合、「車輪の再発明」になってしまうかもしれませんが、思考過程を楽しみたいこと及び、ググった場合はその手法に捕らわれて思考の広がりが制限されてしまうことを避けたいためです。２．物理的なシャッフル操作　もともとのお題としてはトランプのシャッフル動作..</description>
<dc:subject>その他</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-05-13T19:22:06+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<div id="Item1">
<font size="+0"><b>１．はじめに</b></font><br/><!----------------------------------------->
</div>
　Ｘ（旧Twitter）で<a target="X_Shuffle" href="https://x.com/wcinp/status/2053023711796847057">シャッフル処理の話題</a>があり、高速にシャッフルする方法について考察した結果をメモしておきたいと思います。<br>
　今回は（も）ネットでググったり、ＡＩに聞いたりせずに自力で検討を進めました。<br>
　自力で検討した場合、「車輪の再発明」になってしまうかもしれませんが、思考過程を楽しみたいこと及び、ググった場合はその手法に捕らわれて思考の広がりが制限されてしまうことを避けたいためです。<br>
<br>
<br>
<div id="Item1">
<font size="+0"><b>２．物理的なシャッフル操作</b></font><br/><!----------------------------------------->
</div>
　もともとのお題としてはトランプのシャッフル動作をプログラム化することが話の発端です。<br>
　具体的には一山のトランプからランダムに一枚を選び、そのカードをトランプの山から取り除き、一列に並べていくという動作を繰り返すことでシャッフルされたカードの列を作り出すというものです。<br>
<br>
<br>
<div id="Item1">
<font size="+0"><b>３．トランプ操作とは異なるシャッフル方法</b></font><br/><!----------------------------------------->
</div>
　前項で書いたトランプの操作は直感的にも偏りなくランダムに並べ替えられることが直ぐに判りますが、下記の「シャッフル処理１」でシャッフルしても、確率計算してみると均等にシャッフルできることに気が付きました。尚、下記の処理では0から9までの10個の配列要素をシャッフルしています（以降の処理も同様）。<br>
<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">シャッフル処理１（BASIC）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>
10 DEFINT A-Z
20 N=10
30 FOR I=0 TO N-1:A(I)=I:NEXT
40 FOR I=0 TO N-1:SWAP A(RND(1)*N),A(I):NEXT
</pre></th></tr>
　</table>
</tr></td><tr><td>
</font><font size="-2">※RND(1)*N は自動的に整数変換された結果 0..N-1 の範囲の整数になる、SWAPは変数の値を交換する処理</font><font color="black" size="-2">
</td></tr>
</table>
</font>
</div></center>
<br>
　更に下記の「シャッフル処理２」の結果も確率計算してみると偏りなくランダムに並べ替えられるので、配列要素に連番を設定するループとシャッフルするためのループを同一にできました。<br>

<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">シャッフル処理２（BASIC）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>
10 DEFINT A-Z
20 N=10
30 FOR I=0 TO N-1:A(I)=I:SWAP A(RND(1)*(I+1)),A(I):NEXT

</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
<br>
<div id="Item1">
<font size="+0"><b>４．シャフル処理の改善</b></font><br/><!----------------------------------------->
</div>
　上記の「シャッフル処理２」ではループ処理の最初の I=0 の時に A(0) と A(0) を入れ替えているので無駄な乱数発生を行っていることになります。このことから<font color="darkblue"><b>Ｎ個の要素をシャッフルするには（Ｎ－１）回の乱数発生を行えばいい</b></font>ことが判ります（上記２項の「物理的なシャッフル操作」の場合も同数の乱数発生が必要ですね）。<br>
　変数の初期値が零であることを利用して乱数発生回数を最小限になるように「シャッフル処理２」を改善した処理が下記になります（Iの初期値を1に変更）。<br>

<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">シャッフル処理３（BASIC）</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>
10 DEFINT A-Z
20 N=10
30 FOR I=1 TO N-1:A(I)=I:SWAP A(RND(1)*(I+1)),A(I):NEXT
</pre></th></tr>
　</table>
</tr></td><tr><td>
</td></tr>
</table>
</font>
</div></center>
<br>
　しかし、上記の処理は A(0) が零であることを前提にしているので、そのままでは再度シャッフルできないという欠点があります。<br>
　そこでシャッフル処理だけに特化した下図の処理を考えました。これならば何度でもシャッフルすることが可能で、当然ですがシャッフル対象も連番である必要がないので汎用的なシャッフル処理として利用できます。<br>

<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">汎用化したシャッフル処理［（A(0)からA(N-1)の要素を高速にシャッフル］</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>
FOR I=1 TO N-1:SWAP A(RND(1)*(I+1)),A(I):NEXT
</pre></th></tr>
　</table>
</tr></td><tr><td>
</font><font size="-2">※Ｎはシャッフル対象要素の個数</font><font color="black" size="-2">
</td></tr>
</table>
</font>
</div></center>
<br>
<br>
<div id="Item1">
<font size="+0"><b>５．フィッシャー・イェーツのシャッフル</b></font><br/><!----------------------------------------->
</div>
　Ｘのコメントで教えて頂いたのですが「<a target="wiki" href="https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC%E2%80%93%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB">フィッシャー・イェーツのシャッフル</a>」というシャッフル処理があります。ネットで「高速なシャッフル処理」を検索すると最初に出てきました。<br>
　処理内容は上記２項に書いた「物理的なシャッフル操作」を効率よく行う処理になっています。計算量は上記の「汎用化したシャッフル処理」と同等で O(N) オーダーであり、高速です。<br>

<center><div class="LfNallow">
<font color="black" size="-1">
<table border="0"><tr><td>
　<table border="1" cellpadding="8" width="480">
　<tr><th bgcolor="lightcyan"><font color="black">
<font size="-1">フィッシャー・イェーツのシャッフル</font>
　</font></th></tr>
　<tr><th align="left" bgcolor="white"><pre>
要素数が n の配列 a をシャッフルする(添字は0からn-1):
  i を n - 1 から 1 まで減少させながら、以下を実行する
       j に 0 以上 i 以下のランダムな整数を代入する
       a[j] と a[i]を交換する
</pre></th></tr>
　</table>
</tr></td><tr><td>
</font><font size="-2">※<a target="wiki" href="https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC%E2%80%93%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB">ウィキペディア</a>より引用</font><font color="black" size="-2">
</td></tr>
</table>
</font>
</div></center>
<br>
<br>
<div id="Item1">
<font size="+0"><b>６．あとがき</b></font><br/><!----------------------------------------->
</div>
　ひょんなことからシャッフル処理の検討が始まり、現在最速と思われる<font color="darkblue"><b>フィッシャー・イェーツのシャッフル</b></font>と同程度の速度で処理内容の異なるシャッフル処理まで辿り着きました。<br>
　今回のような検討のトリガが得られるのもＸの醍醐味ではないかと思います。また、安易にネット検索やＡＩに聞かないことで思考の過程を楽しむことができました。<br>
　尚、今回辿り着いたシャッフル処理を<font color="darkblue"><b> skyriverのシャッフル </b></font>と命名しますｗ
<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/TMPZ84Compact06.html">
<link>https://piclabo.seesaa.net/article/TMPZ84Compact06.html</link>
<title> TMPZ84Compactの開発（その６）PICの乗算機能</title>
<description>１．はじめに　秋月さんが秋葉原店で安売りしていた Super AKI-80 から取り外したCPU（東芝製TMPZ84C015）を使って開発した TMPZ84Compact（下の写真）はハードを開発してからかなり時間が経ちましたが、ここで制御用に使用している20ピンの PIC（PIC18F14K50）には8bitの符号無し乗算を１サイクルで実行できる命令があることを思い出しました。今回、この乗算機能を Z80 から利用できるようにしてみたので記録しておきます。						開発し..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-04-01T22:42:33+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<div id="Item1">
<font size="+0"><b>１．はじめに</b></font><br/><!----------------------------------------->
</div>
　秋月さんが秋葉原店で安売りしていた<font color="darkblue"><b> Super AKI-80 </b></font>から取り外したCPU（東芝製TMPZ84C015）を使って開発した <a target="TMPZ84Compact01" href="https://piclabo.seesaa.net/article/TMPZ84Compact.html">TMPZ84Compact</a>（下の写真）はハードを開発してからかなり時間が経ちましたが、ここで制御用に使用している20ピンの PIC（<font color="darkblue"><b>PIC18F14K50</b></font>）には8bitの符号無し乗算を１サイクルで実行できる命令があることを思い出しました。今回、この乗算機能を Z80 から利用できるようにしてみたので記録しておきます。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
開発したTMPZ84Compact
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('TMPZ84CompactPhot','https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/TMPZ84Compact.jpg')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/TMPZ84Compact.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<div id="Item2">
<font size="+0"><b>２．PICの乗算命令</b></font><br/><!----------------------------------------->
</div>
　下図は PIC のデータシートから引用した命令表の一部です。黄色マーカー部に記載されているように１サイクルで8bitの乗算が完了します。<br>
　実は「<a target="XC9572" href="https://piclabo.seesaa.net/category/28166448-1.html">CPLD(XC9572)で遊ぶ</a>」の記事で書いた XC9572 を使って８ｘ８の乗算器を作って TMPZ84Compact に接続してみようかとも考えていたのですが、上述のように PIC に同様の機能があるのでPIC 側を使うことにしました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
PICの命令表（抜粋）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PicOrderTable','https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/PIC18OrderTbl.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/PIC18OrderTbl.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<div id="Item3">
<font size="+0"><b>３．Z80とのインターフェース</b></font><br/><!----------------------------------------->
</div>
　もともと PIC から Z80 にパソコンとの通信機能やSDアクセス機能を提供しているので、同様の手法で乗算機能を利用できるように対応するサービスIDを追加しました。<br>
　具体的には下記のようなコードでZ80が乗算機能を利用できるようにしました。<br>
<br>
<center><div class="LfNallow">
<font color="black" size="-2">
<table border="1" cellpadding="8" width="480">
<tr><th bgcolor="lightcyan"><font color="black">
乗算機能使用のサンプルソース（Z80アセンブラ）
</font></th></tr>
<tr><th align="left" bgcolor="white"><pre>
                                ;+++++++++++++++++++++++++++++++++++++++++++
                                ; PIC18 Mul service test
                                ;  ver 0.01 2026/04/01 skyriver
                                ;+++++++++++++++++++++++++++++++++++++++++++
                                
                                INCLUDE	TMPZ84C.INC

  0007                          MUL_SRV	EQU	7	; MUL service ID
                                
                                	ORG	0100H
                                
  0100    3E 07                 START:	LD	A,MUL_SRV
  0102    D3 01                 	OUT	(CMDPORT),A	; send mul service ID
  0104    2A 0200               	LD	HL,(MULVAL)
  0107    7D                    	LD	A,L
  0108    D3 00                 	OUT	(DATPORT),A	; send variable0
  010A    7C                    	LD	A,H
  010B    D3 00                 	OUT	(DATPORT),A	; send variable1
  010D    DB 00                 	IN	A,(DATPORT)	; get result(low)
  010F    6F                    	LD	L,A
  0110    DB 00                 	IN	A,(DATPORT)	; get result(high)
  0112    67                    	LD	H,A
  0113    22 0202               	LD	(RESULT),HL
  0116    C9                    	RET
                                
                                
                                	ORG	0200H
                                
  0200    04 05                 MULVAL:	DB	4,5
  0202                          RESULT:	DS	2
                                
                                	END
</pre></th></tr>
</table>
</font>
</div></center>
<br>
　ＣＰ／Ｍ環境でＧＡＭＥ言語を使って下記のソースで 0x00～0xff の全範囲での乗算結果の検証を行い、問題無いことを確認しました。<br>
　尚、下記のソースで 1000～1040行の部分は動作確認のためのもので最終的には非実行にしています。<br>
<br>
<center><div class="LfNallow">
<font color="black" size="-2">
<table border="1" cellpadding="8" width="480">
<tr><th bgcolor="lightcyan"><font color="black">
乗算機能の検証ソース（GAME言語）
</font></th></tr>
<tr><th align="left" bgcolor="white"><pre>
1'++++++++++++++++++++++++++++++++++++
2' PIC18 Mul service function test
3'  ver 0.01 2026/04/01 skyriver
4'++++++++++++++++++++++++++++++++++++
10 M=$2000
20 M(1)=$2100 M(3)=$073E M(4)=$01D3 M(5)=$D37D
30 M(6)=$7C00 M(7)=$00D3 M(8)=$00DB M(9)=$DB6F
40 M(10)=$6700 M(11)=$2200 M(12)=M M(13)=$C9
50 #=2000
1000 /"input val0" M:4)=?
1002 ;=M:4)=0 #=-1
1010 "      val1" M:5)=?
1020 >=$2002
1030 /"result:" ?=M(0)
1040 #=1000
2000 I=0,255
2002  "."
2010  M:4)=I
2020  J=0,255
2030   M:5)=J
2040   >=$2002
2050   ;=M(0)<>(I*J) /"error at " ?=I " x " ?=J " ans:" ?=M(0) #=-1
2060  @=J+1
2070 @=I+1
</pre></th></tr>
</table>
</font>
</div></center>
<br>
<br>
<div id="Item4">
<font size="+0"><b>４．乗算機能の評価</b></font><br/><!----------------------------------------->
</div>
　追加した乗算機能を評価するために ASCIIART のアセンブラソースに適用してみました。この ASCIIART の処理は２バイトの固定小数点を使って高速化しています。２バイトの乗算を行うために乗数をバイトに分割して処理する<a target="ByteDivideMethod" href="https://piclabo.seesaa.net/article/HD64180Compact006.html">バイト分割法</a>を使いました。<br>
　実行した際の画面キャプチャが下図になります。今回追加した乗算機能を使った場合、マンデルブロ描画は <font color="darkblue"><b>14.5秒</b></font>で完了しました（TMPZ84C015は<del>6MHz</del>12.5MHz、メモリウェイト無しで動作 ※修正 2026/04/02）。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ASCIIART実行画面
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('ExecASCIIART','https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/PicMulAsciiart.png')"><image width="440" src="https://piclabo.byte.jp/image/cpu/Z80/TMPZ84/TMPZ84Compact/006/PicMulAsciiart.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　ん～～、思った程には高速化していませんね・・<br>
　実は元々のソフト演算による２バイト固定小数点処理を使ったものでは、<font color="darkblue"><b>4.6秒</b></font>で描画が完了します。<br>
　8bitの乗算処理単体では PICから提供する乗算機能の方が速そうですが、2バイト乗算では<a target="ByteDivideMethod" href="https://piclabo.seesaa.net/article/HD64180Compact006.html">バイト分割法</a>によるオーバーヘッドがかなり大きいようです。<br>
<br>
　最後に、２バイトの固定小数点乗算処理のソースも貼っておきます（後半が元々あったソフト乗算処理）。<br>
<br>
<center><div class="LfNallow">
<font color="black" size="-2">
<table><tr><td>
	<table border="1" cellpadding="8" width="480">
	<tr><th bgcolor="lightcyan"><font color="black">
2バイト固定小数点演算処理（Z80アセンブラ）
	</font></th></tr>
	<tr><th align="left" bgcolor="white"><pre>
				if	01

                                ; use PIC's Mul Function
                                ; HL,DE <- value
                                ; HL -> result:HL*DE
                                ;    (256*x1 + x0)*(256*y1 + y0)
                                ;   = 2^16x1y1 + 2^8(x0*y1 + x1*y0) + x0*y0
                                ; 
                                ; |   .   |   .   |   .   |   .   |
                                ; <---  x1y1   --->
                                ;         <---  x0y1  --->
                                ;         <---  x1y0  --->
                                ;                 <---  x0y0  --->
                                
  01C8    0E 00                 MUL:	LD	C,0
  01CA    CB 7C                 	BIT	7,H
  01CC    28 07                 	JR	Z,Mul10
                                
  01CE    0C                    	INC	C
  01CF    AF                    	XOR	A
  01D0    95                    	SUB	L
  01D1    6F                    	LD	L,A
  01D2    9C                    	SBC	A,H
  01D3    95                    	SUB	L
  01D4    67                    	LD	H,A
  01D5    CB 7A                 Mul10:	BIT	7,D
  01D7    28 07                 	JR	Z,Mul20
                                
  01D9    0C                    	INC	C
  01DA    AF                    	XOR	A
  01DB    93                    	SUB	E
  01DC    5F                    	LD	E,A
  01DD    9A                    	SBC	A,D
  01DE    93                    	SUB	E
  01DF    57                    	LD	D,A
  01E0    CB 19                 Mul20:	RR	C		; Cy 1:negative
  01E2    08                    	EX	AF,AF'
                                
  01E3    3E 07                 	LD	A,MUL_SRV
  01E5    D3 01                 	OUT	(CMDPORT),A
  01E7    0E 00                 	LD	C,DATPORT
  01E9    ED 59                 	OUT	(C),E
  01EB    ED 69                 	OUT	(C),L
  01ED    ED 40                 	IN	B,(C)		; dummy read
  01EF    ED 40                 	IN	B,(C)
  01F1    D3 01                 	OUT	(CMDPORT),A
  01F3    ED 59                 	OUT	(C),E
  01F5    ED 61                 	OUT	(C),H
  01F7    ED 78                 	IN	A,(C)
  01F9    80                    	ADD	A,B
  01FA    5F                    	LD	E,A
  01FB    ED 78                 	IN	A,(C)
  01FD    CE 00                 	ADC	A,0
  01FF    47                    	LD	B,A		; B:E
  0200    3E 07                 	LD	A,MUL_SRV
  0202    D3 01                 	OUT	(CMDPORT),A
  0204    ED 51                 	OUT	(C),D
  0206    ED 69                 	OUT	(C),L
  0208    ED 78                 	IN	A,(C)
  020A    83                    	ADD	A,E
  020B    6F                    	LD	L,A
  020C    ED 78                 	IN	A,(C)
  020E    88                    	ADC	A,B
  020F    47                    	LD	B,A		; B:L
  0210    3E 07                 	LD	A,MUL_SRV
  0212    D3 01                 	OUT	(CMDPORT),A
  0214    ED 51                 	OUT	(C),D
  0216    ED 61                 	OUT	(C),H
  0218    ED 78                 	IN	A,(C)
  021A    80                    	ADD	A,B
  021B    67                    	LD	H,A
  021C    ED 78                 	IN	A,(C)		; dummy read
                                
  021E    08                    	EX	AF,AF'
  021F    D0                    	RET	NC
                                
  0220    AF                    	XOR	A
  0221    95                    	SUB	L
  0222    6F                    	LD	L,A
  0223    9C                    	SBC	A,H
  0224    95                    	SUB	L
  0225    67                    	LD	H,A
  0226    C9                    	RET
                                
                                
                                	else
                                
                                
                                MUL:	LD	BC,15*256
                                	BIT	7,H
                                	JR	Z,Mul10
                                
                                	INC	C
                                	XOR	A
                                	SUB	L
                                	LD	L,A
                                	SBC	A,H
                                	SUB	L
                                	LD	H,A
                                Mul10:	EX	DE,HL
                                	ADD	HL,HL
                                	JR	NC,Mul20
                                
                                	INC	C
                                	XOR	A
                                	SUB	L
                                	LD	L,A
                                	SBC	A,H
                                	SUB	L
                                	LD	H,A
                                Mul20:	RR	C		; Cy 1:negative
                                	EX	AF,AF'
                                	LD	C,H
                                	LD	A,L
                                	LD	HL,0
                                MulLoop:
                                	ADD	HL,HL
                                	RLA
                                	RL	C
                                	JR	NC,MulL10
                                
                                	ADD	HL,DE
                                	ADC	A,0
                                MulL10:	DJNZ	MulLoop
                                
                                	LD	L,H
                                	LD	H,A
                                
                                	EX	AF,AF'
                                	RET	NC
                                
                                	XOR	A
                                	SUB	L
                                	LD	L,A
                                	SBC	A,H
                                	SUB	L
                                	LD	H,A
                                	RET
                                
                                	endif
	</pre></th></tr>
	</table>
</td></tr>
<tr><td>
※2026/04/03　変更
</td></tr>
</table>

</font>
</div></center>
<br>

<br>
<br>
<a href="https://piclabo.seesaa.net/article/TMPZ84Compact.html">[TOP]</a> <a href="https://piclabo.seesaa.net/article/TMPZ84Compact05.html">[ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogTMPZ84Compact"><b>TMPZ84Compactの開発</b></a> [ 次へ ]<br>
<br>

<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/XDangerList.html">
<link>https://piclabo.seesaa.net/article/XDangerList.html</link>
<title>XがSeesaaドメインを危険視リストに追加？</title>
<description>１．はじめに　Ｘにポストされたメッセージ内にあるSeesaaドメインのURLをクリックすると警告が表示されることに2026年03月05日に気が付きました。　Grokさんに確認したところ、SeesaaドメインがＸの危険視リストに追加されていることが原因のようです。２．問題内容　ポスト内容に記載されたSeesaaドメインのURLをクリックしてURLページに飛ぼうとすると下図のような警告が表示されるようになりました。						URLクリックで表示される警告												..</description>
<dc:subject>日記</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-03-06T08:41:43+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　Ｘにポストされたメッセージ内にあるSeesaaドメインのURLをクリックすると警告が表示されることに2026年03月05日に気が付きました。<br>
　Grokさんに確認したところ、SeesaaドメインがＸの危険視リストに追加されていることが原因のようです。<br>
<br>
<br>
<font size="+0"><b>２．問題内容</b></font><!-------------------------------------><br>
　ポスト内容に記載されたSeesaaドメインのURLをクリックしてURLページに飛ぼうとすると下図のような警告が表示されるようになりました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
URLクリックで表示される警告
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('SeesaaWarning','https://piclabo.byte.jp/image/dialy/2026/20260306/SeesaaWarning.png')"><image width="440" src="https://piclabo.byte.jp/image/dialy/2026/20260306/SeesaaWarning.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　上記の警告は私が<a target="MyPost" href="https://x.com/wcinp/status/2027913712817082865">ポストしたメッセージ</a>内にあるURLをクリックした際に表示されたものです。警告の末尾に書いてある「続ける」をクリックすると対象のページが表示されますが、この状態で「続ける」をクリックする人は少ないのではないかと思います。<br>
　Ｘ内でSeesaaドメインを検索し、メッセージ内にあるSeesaaドメインのURLをクリックしても同様の警告が表示されました。<br>
<br>
<br>
<font size="+0"><b>３．原因</b></font><!-------------------------------------><br>
　ＸのＡＩであるGrokさんに聞いてみた結果が下記になります。クリックすると拡大表示されます。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Grokさんの回答
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('AnswerOfGrok','https://piclabo.byte.jp/image/dialy/2026/20260306/AnswerOfGrok.png')"><image width="440" src="https://piclabo.byte.jp/image/dialy/2026/20260306/AnswerOfGrok.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>４．対処</b></font><!-------------------------------------><br>
　上記の回答の最後に書いてある「まとめ」の直前に「<font color="darkblue"><b>Seesaa側がＸに「誤検出です」と申請しない限り、ドメイン単位のブロックは解除されにくい</b></font>」と書いてあるので、Seesaaさん側にＸに解除申請をするように依頼しておきました。<br>
　状況に変化がありましたら追記したいと思います。<br>
<br>
<br>
★追記　2026/03/07<br>
　本件に関して Seesaa さんから「<a target="SeesaaNotice	" href="https://info.seesaa.net/article/520135355.html">【重要】X（旧Twitter）への「seesaa.net」URL投稿について</a>」のお知らせが発出されました。<br>
<ul>
<li>X（旧Twitter）側に対して、弊社公式アカウント等から異議申し立ておよび調査依頼中</li>
<li>異議申し立てには、以下のフォーム等を通じて対応<br>
　<a href="https://help.x.com/ja/forms/authenticity/spam" target="_blank">https://help.x.com/ja/forms/authenticity/spam</a></li>
<li> 暫定対応について（リンク共有用ページのご案内）<br>
下記の「共有用リンクの作成」によりURLをseesaa.jpドメインに変換すればXへの投稿が可能<br>
　<a href="https://blog.seesaa.jp/pages/link" target="_blank">https://blog.seesaa.jp/pages/link</a>
</li>
</ul>
とのことです。<br>
　効果の程は？？ですが、上記の「異議申し立て」ページで本ブログのURL（<a href="https://piclabo.seesaa.net/" target="_blank">https://piclabo.seesaa.net/</a>）を誤ってブロックされたリンクとして報告しておきました。<br>
<br>
<br>
<div id="add20260311">★追記　2026/03/11<br>
　seesaa.net がＸの危険リスト（潜在的に有害なリンク判定）から中々削除されないようなのでGrokさんに削除される可能性について聞いてみた際の<a target="grok02" href="https://x.com/i/grok/share/92022021fa8344469d3d3a4d3f87a657">回答</a>が下記です。<br>
<ul>
<li>削除される可能性は<font color="darkblue"><b>60～70％程度</b></font></li>
<li>削除されるまでの期間は<font color="darkblue"><b>数週間から１ヶ月以上</b></font>かかる可能性がある</li>
</ul>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Grokさんの回答（その２）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('AnswerOfGrok02','https://piclabo.byte.jp/image/dialy/2026/20260306/AnswerOfGrok02.png')"><image width="440" src="https://piclabo.byte.jp/image/dialy/2026/20260306/AnswerOfGrok02.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
</div>
<br>
<div id="add20260311_1238">★追記　2026/03/11 12:38<br>
　Ｘでのクリックを今試したら、警告表示無しでブログが表示されました。<br>
　seesaa.netドメインが<font color="darkblue"><b>Ｘの危険視リストから削除</b></font>されたようです。^^<br>
<br>
</div>

<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/PunchedTape007_Writer.html">
<link>https://piclabo.seesaa.net/article/PunchedTape007_Writer.html</link>
<title>穿孔テープの再現実験（その７）パンチャーの制御基板</title>
<description>１．はじめに　「穿孔テープの再現実験（その４）紙テープリーダーの開発（実装機能）」の記事で自作した紙テープリーダーの実装機能について書きましたが、今回はいよいよ紙テープパンチャー（Puntawriterと命名、以降パンチャーと記す）について書いてみたいと思います。　制作してから時間が経ってしまいましたが、ブログに記載することでソフト制作作業時等に回路図やピンアサインを直ぐに参照できるようにしたいという目的もあります。２．制御方式　紙テープに穴を開けるに通常であれば９個のソレノ..</description>
<dc:subject>RetroDevice</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-03-05T19:08:30+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　「<a target="Puntareader" href="https://piclabo.seesaa.net/article/PunchedTape004.html">穿孔テープの再現実験（その４）紙テープリーダーの開発（実装機能）</a>」の記事で自作した紙テープリーダーの実装機能について書きましたが、今回はいよいよ紙テープパンチャー（<font color="darkblue"><b>Puntawriter</b></font>と命名、以降パンチャーと記す）について書いてみたいと思います。<br>
　制作してから時間が経ってしまいましたが、ブログに記載することでソフト制作作業時等に回路図やピンアサインを直ぐに参照できるようにしたいという目的もあります。<br>
<br>
<br>
<font size="+0"><b>２．制御方式</b></font><!-------------------------------------><br>
　紙テープに穴を開けるに通常であれば９個のソレノイドが必要になりますが、今回開発するパンチャーの条件として
<ul>
<li>パンチ速度はある程度遅くても許容できる</li>
<li>多数のソレノイドを同時に駆動するためにはそれなりの電源と制御回路が必要になる<br>
⇒ソレノイドは１個づつ駆動する方式でも許容</li>
</ul>
ということを考慮し、ソレノイドを１個づつ動かすよりも１個のソレノイドで制御できるのでは？と思い、その実現方法を思い付きました。具体的な制御方法については現在検証中です。<br>
<br>
<br>
<font size="+0"><b>３．制御基板</b></font><!-------------------------------------><br>
　冒頭で書いた紙テープリーダーと同様にUSB機能を有した20ピンのＰＩＣマイコン（PIC18F14K50）を使い制御します。ピンアサインは下表のようにしました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
制御基板のピンアサイン
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PinAsign','https://piclabo.byte.jp/image/etc/PunchedTape/007/PinAssign_Puntawriter.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PinAssign_Puntawriter.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　回路図を下図に示します。使用するソレノイドを１個にしたことで、Ｉ／Ｏピンに余裕ができました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
制御基板の回路
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a target="PuntawriterCircuit" href="https://piclabo.byte.jp/image/etc/PunchedTape/007/PaperPuncherCircuit.pdf"><img width="300" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PaperPuncherCircuit.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　回路CADでの３Ｄ表示も貼っておきます。変わった形状の基板ですが、出っ張っている部分は基板から切り離し、ギアの回転状態を検出するための赤外線LEDとフォトトランジスタを実装する予定です。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
制御基板のトップ面（CAD画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CadPcbTop','https://piclabo.byte.jp/image/etc/PunchedTape/007/PuntaWriter3DTop.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PuntaWriter3DTop.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　下図がボトム面です。今回の制御基板は部品数が少ないので部品は全てトップ面に実装したことでボトム面はすっきりしています。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
制御基板のボトム面（CAD画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CadPcbBottom','https://piclabo.byte.jp/image/etc/PunchedTape/007/PuntaWriter3DBottom.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PuntaWriter3DBottom.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　製造依頼したプリント基板に部品した状態の写真が下図になります。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
部品実装後のトップ面
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PcbTopWithParts','https://piclabo.byte.jp/image/etc/PunchedTape/007/PutaWriterPcb_01.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PutaWriterPcb_01.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
部品実装後のボトム面
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PcbBottomWithParts','https://piclabo.byte.jp/image/etc/PunchedTape/007/PutaWriterPcb_02.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/007/PutaWriterPcb_02.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>４．あとがき</b></font><!-------------------------------------><br>
　今回開発中の紙テープパンチャー用制御基板のハードはできましが、ソフトウェアはこれからです。気が向いた時にゆっくりと開発を進めていきたいと思います。<br>


<br>
<br>
<br>
<a href="https://piclabo.seesaa.net/article/PunchedTape.html">[TOP]</a> <a href="https://piclabo.seesaa.net/article/PunchedTape006.html">[ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogPanchedTape"><b>穿孔テープの再現実験</b></a> [ 次へ ]
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/PunchedTape006.html">
<link>https://piclabo.seesaa.net/article/PunchedTape006.html</link>
<title>穿孔テープの再現実験（その６）無地の紙テープの作成（その２）</title>
<description>１．はじめに　「穿孔テープの再現実験（その２）無地の紙テープの作成」の記事でデータ保存用に使われていた情報交換用紙テープ（穿孔テープまたは鑽孔テープ、以降、紙テープと記す）が入手困難なため幅が50mmのカラー紙テープを2分割することで幅が約１インチの紙テープを作成したことを記載しました。しかしこの時使用したテープの厚さをマイクロメーターで実測した結果、0.08mmで紙テープとしては薄すぎることが判りました。　今回はもう少し厚いものを探して無地の紙テープを作ることにしました。２..</description>
<dc:subject>RetroDevice</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-03-01T09:51:09+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　「<a target="PunchedTape002" href="https://piclabo.seesaa.net/article/PunchedTape002.html">穿孔テープの再現実験（その２）無地の紙テープの作成</a>」の記事でデータ保存用に使われていた情報交換用紙テープ（穿孔テープまたは鑽孔テープ、以降、紙テープと記す）が入手困難なため<a target="hayase" href="https://www.e-hayase.co.jp/products/ckamitp50?_pos=2&_sid=def4133f2&_ss=r">幅が50mmのカラー紙テープ</a>を2分割することで幅が約１インチの紙テープを作成したことを記載しました。しかしこの時使用したテープの厚さをマイクロメーターで実測した結果、0.08mmで紙テープとしては薄すぎることが判りました。<br>
　今回はもう少し厚いものを探して無地の紙テープを作ることにしました。<br>
<br>
<br>
<font size="+0"><b>２．紙テープの素材</b></font><!-------------------------------------><br>
　以前から小型の感熱式プリンタを使用しており、このプリンタ用のロール紙は入手性も良く、厚さが0.16mmで程良い厚さだったのでこれを素材にすることにしました。<br>

<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
感熱プリンタ用ロール紙（カラー）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PrinterRollPaper','https://piclabo.byte.jp/image/etc/PunchedTape/006/RollPaper.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/006/RollPaper.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>３．ロール紙ディバイダーの制作</b></font><!-------------------------------------><br>
　感熱紙の巾を実測してみると白色のロールが55mm、カラーのものが56mmで若干のバラツキがあるようです。<br>
　このロール紙から１インチ（25.4mm）巾の無地の紙テープを作るために三カ所でカットし、中央部分から２本切り出すことにしました。２カ所のカットでも２本切り出せますが３カ所カットした方が切り出したテープの巾の精度を高くできると思います。<br>
　切り出し方法が決まったので下図のようにディバイダーを設計してみました。デザインナイフのブレードを使用してカットします。ハンドルの部分は六角で結合し、ハンドルを電動ドライバに付け替えて回せるようにしました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ロール紙ディバイダーの設計（ＣＡＤ画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CadRollPaperDivider','https://piclabo.byte.jp/image/etc/PunchedTape/006/CadPaperDivider02.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/006/CadPaperDivider02.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　下の写真は造形したロール紙ディバイダーでロール紙をカットしている様子です。ロール紙の両端から余分な部分が切り取られています。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ロール紙ディバイダー
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('RollPaperDivider','https://piclabo.byte.jp/image/etc/PunchedTape/006/PaperDivider.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/006/PaperDivider.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
　上の写真のカット後の紙を巻き取る芯の部分は２分割できるようにしてあるので、カッティングが終了後、芯を取り出しサイドプレートを付けることで紙テープがリールに巻かれた状態になります。<br>
　下の写真は試験的に切り出した無地の紙テープです。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
作成した無地の穿孔テープ
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('MakedPunchedPaper','https://piclabo.byte.jp/image/etc/PunchedTape/006/DividedPaper.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/006/DividedPaper.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>４．あとがき</b></font><!-------------------------------------><br>
　デザインナイフの新品のブレードが２枚しか無かったので中央のブレードはデザインナイフから取り外したブレードを使いましたが切れ味が悪く、途中で引っかかる現象が発生しました。ブレードを買いに最寄りの DAISO に行ってみましたが以前あったデザインナイフは見当たらずブレードも販売していませんでした。orz<br>
　Aliexpressさんで１０枚のブレード付きデザインナイフを注文し、着荷待ちです。<br>
<br>
<br>
<br>
<a href="https://piclabo.seesaa.net/article/PunchedTape.html">[TOP]</a> <a href="https://piclabo.seesaa.net/article/PunchedTape005.html">[ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogPanchedTape"><b>穿孔テープの再現実験</b></a> <a href="https://piclabo.seesaa.net/article/PunchedTape007_Writer.html">[ 次へ ]</a>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/PcbReversedpattern.html">
<link>https://piclabo.seesaa.net/article/PcbReversedpattern.html</link>
<title>コネクタ信号順反転パターンの検討</title>
<description>１．はじめに　X（旧Twitter）のタイムラインで下記のメッセージ（以降、出題メッセージと記す）を見かけ、実現方法について検討しましたので記録しておきたいと思います。こうなった時の配線の取り回しが永遠の課題コネクタは動かしてはいけないものとする。 pic.twitter.com/pUAO396vDH&amp;mdash; dominoTECH (@dominodaosi106) February 16, 2026 ２．実現方式　出題メッセージにはコネクタのピン数、ピン間隔、信号条件..</description>
<dc:subject>その他</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-02-24T22:10:03+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　X（旧Twitter）のタイムラインで下記のメッセージ（以降、出題メッセージと記す）を見かけ、実現方法について検討しましたので記録しておきたいと思います。<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">こうなった時の配線の取り回しが永遠の課題<br>コネクタは動かしてはいけないものとする。 <a href="https://t.co/pUAO396vDH">pic.twitter.com/pUAO396vDH</a></p>&mdash; dominoTECH (@dominodaosi106) <a href="https://twitter.com/dominodaosi106/status/2023281554253054288?ref_src=twsrc%5Etfw">February 16, 2026</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<font size="+0"><b>２．実現方式</b></font><!-------------------------------------><br>
　出題メッセージにはコネクタのピン数、ピン間隔、信号条件等は明記されていませんが、これらの条件により最適なパターンは色々変化するものと思います。<br>
<br>
<font size="+0"><b>２－１．最初の案</b></font><!-------------------------------------><br>
　上記のように条件が判らないので最初は基本である直行パターンで考えてみました。<br>
<br>
<center>
<a target="FirstIdea" href="https://x.com/wcinp/status/2023595764862382173"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/FirstIdea.png"></a>
</center>
<br>
　このポストに対して思いもよらぬ反響（いいね：675、表示：19.9万、2025/02/24 時点）を頂きました。<br>
　また、次に様なコメントを頂きました。<br>
<ol>
<li><a target="comment1" href="https://x.com/T5911504941316/status/2023954615457222981">90°で曲げたらはダメとどこかで聞いたような</a>
<!--
<center>
<a target="FirstIdea" href="https://x.com/T5911504941316/status/2023954615457222981"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/comment1.png"></a>
</center>
-->
<br>
⇒インピーダンスの変化は直角パターンよりもビア接続による変化の方が圧倒的に大きいです(参考：<a target="gemini01" href="https://gemini.google.com/share/514d8e518034">Geminiの回答</a>)<br>
<br>

</li>
<li><b>水平レイヤーと垂直レイヤーが必要無いのであればはるかに良くなります。</b><br>
<br>
<center>
<a target="FirstIdea" href="https://x.com/blind_via/status/2023845455768236082"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/comment2.png"></a>
</center>
<br>
⇒確かにトラック長も短くなるし、各信号のトラック長の長さもほぼ同じになる＆ピア数も同じ（遅延などの条件が各信号で同様になる）というメリットがありますね。<br>
</li>
</ol>
<br>
<br>
<font size="+0"><b>２－２．省スペース化方式</b></font><!-------------------------------------><br>
　出題者が想定していたコネクタはピン数が多く、かつピン間隔が小さいコネクタのようで、このような場合に使用スペースを小さくできる「省スペース化方式」が提案されました。<br>
　この方式はトップ面とボトム面のトラックのクロスポイントが均一に広がることで、斜めのトラック間の距離を大きく確保できる方式で、対称性の高く、素晴らしい方式です。<br>
<br>
<center>
<a target="FirstIdea" href="https://x.com/unidentifiedexe/status/2024069496735211833"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/CompactIdea.png"></a>
</center>
<br>
<br>
<font size="+0"><b>２－３．バタフライ方式</b></font><!-------------------------------------><br>
　コネクタの結線状態から連想した<a target="FftButterfly" href="https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B#/media/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:FFT_Butterfly_radix8.svg">FFTのバタフライ演算</a>からヒントを得てバタフライ方式を提案しました。<br>
<br>
<center>
<a target="FirstIdea" href="https://x.com/wcinp/status/2024446051730743697"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/butterfly.png"></a>
</center>
<br>
<br>
<font size="+0"><b>２－４．片面での実装</b></font><!-------------------------------------><br>
　上述のようにトラックのインピーダンスの変化は直角パターンよりもビア接続部の方が圧倒的に大きい（＝反射が発生しやすい）ので片面のパターンでコネクタの結線を実現できれば、反射の少ない（もう一方の面をベタアースにすればノイズにも強い）パターンを実現できます。<br>
　片面のパターンとして下図の提案をしました。<br>
<br>
<center>
<a target="FirstIdea" href="https://x.com/blind_via/status/2024009183591530834"><img width="400" src="https://piclabo.byte.jp/image/etc/Twitter/PcbReversePattern/OneSidePattern.png"></a>
</center>
<br>
<br>
<font size="+0"><b>３．出題者のご意見</b></font><!-------------------------------------><br>
　出題者の環境にマッチした方式として下記のポストがあり、バタフライ方式が高い評価を頂きました。<br>
<br>
<center>
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">この配線方式は効率が悪いが、理想的ではある <a href="https://t.co/XzmKD379vl">https://t.co/XzmKD379vl</a> <a href="https://t.co/u4j3xeKXJI">pic.twitter.com/u4j3xeKXJI</a></p>&mdash; dominoTECH (@dominodaosi106) <a href="https://twitter.com/dominodaosi106/status/2025939424815837693?ref_src=twsrc%5Etfw">February 23, 2026</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<font size="+0"><b>４．あとがき</b></font><!-------------------------------------><br>
　久々にXで<del>バズった</del>沢山「いいね」を頂いたので覚書としてブログにも記載してみました<font size="-2">※2026/02/25 変更</font>。このように時間と距離の枠を超えて一つの問題に関して語り合えるというのもインターネットの醍醐味だと思います。<br>
　尚、Xのポストをブログに貼る場合、文字が大きくなったりしてバランスを取りにくいので今回は画像化して貼る手法を試みました。<br>
<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/SampleCode365Case.html">
<link>https://piclabo.seesaa.net/article/SampleCode365Case.html</link>
<title>「サンプルコード365+1」のケース作成</title>
<description>１．はじめに　翔泳社さんから「サンプルコード365+1」を頂き、ケースを作成してみましたので記録しておきたいと思います。２．サンプルソースの応募　翔泳社さんが４０周年記念の日めくりカレンダー企画「サンプルコード365+1」に掲載するサンプルコードを募集していました。			※CodeZineさんのサイトより引用	　そこでＧＡＭＥ言語と Verilog HDL の短いソースを応募してみたところ、２件とも採用され発売前に「サンプルコード365+1」の見本を２つ送付して頂きました。	..</description>
<dc:subject>3D_printer</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-02-20T23:50:09+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　翔泳社さんから「サンプルコード365+1」を頂き、ケースを作成してみましたので記録しておきたいと思います。<br>
<br>
<br>
<font size="+0"><b>２．サンプルソースの応募</b></font><!-------------------------------------><br>
　翔泳社さんが４０周年記念の日めくりカレンダー企画「サンプルコード365+1」に掲載するサンプルコードを募集していました。<br>
<br>
<center>
<table>
	<tr><td>
<a target="CodeZine" href="https://codezine.jp/news/detail/21708"><img width="440" src="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/21708_share_2.webp"></a>
	</td></tr>
	<tr><td align="left">
<font size="-2">※CodeZineさんのサイトより引用</font>
	</td></tr>
</table>
</center>
<br>
　そこで<a target="Twitter" href="https://x.com/wcinp/status/1996860728712876086">ＧＡＭＥ言語と Verilog HDL</a> の短いソースを応募してみたところ、２件とも採用され発売前に「サンプルコード365+1」の見本を２つ送付して頂きました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
受け取った日めくりカレンダー「サンプルコード365+1」の見本
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('SampleCode365','https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode365.jpg')"><image width="440" src="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode365.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>３．ケース作成</b></font><!-------------------------------------><br>
　日めくりカレンダーは思ったよりも重厚で厚さが３センチ程あります。<br>
　このままでは少々扱い辛いし、1日毎に1枚を捨ててしまうのも勿体無いのでケースを作ってみました。下図が設計したケースのＣＡＤ画面での表示です。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
日めくりカレンダーのケース（CAD画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CaseCad','https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Cad_SampleCode365Case.png')"><image width="440" src="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Cad_SampleCode365Case.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　図からは判り辛いですが背面から最下面に紙を入れられるようになっていて、使い終わった最上面のカレンダーを最下面に移動することで再利用できるようにしています。<br>
　また、なるべくシンプルなデザインになるように心がけ、強度を上げるために辺の部分を太くしてみました。<br>
<br>
<br>
<font size="+0"><b>４．ケースの造形</b></font><!-------------------------------------><br>
　３ＤプリンタでPETG フィラメント（メタル ライト グレー）を使って造形しました。下の写真は剥がした表紙を最下面に格納している時の様子です。このようにすればカレンダーを繰り返し使用できますね。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
最下面への格納
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('InsertBottom','https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode_MoveBottom.jpg')"><image width="440" src="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode_MoveBottom.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
　カレンダーを再利用可能にしたことで<font color="darkblue"><b>４／１から始まるこのカレンダーを今日から使うことができる</b></font>ようになります。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ケース入りの日めくりカレンダー
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CarenderInCase','https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode_Today02.jpg')"><image width="440" src="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/Phot_SampleCode_Today02.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>５．まとめ</b></font><!-------------------------------------><br>
　翔泳社さんの４０周年記念の日めくりカレンダー企画にサンプルソースを応募し、採用されたことで発売前に見本のカレンダーを頂きました。このカレンダーは吊るすこともできないのでケースを自作し、再利用できるようしました。<br>
<br>
　尚、今回作成したケースのＳＴＬファイルは下記からダウンロードできます。CC BY-NC-SAライセンスとします。<br>
<br>
<ul>
<li><a href="https://piclabo.byte.jp/3D_Printer/image/SampleCode365/SampleCodeCase_V002_20260221.zip">SampleCodeCase_V002_20260221.zip</a></li>
</ul>
<font size="-2">［履歴］
<ul>
<li>Ver 0.02 2026/02/21 背面に小型ロゴ追加</li>
<li>Ver 0.01 2026/02/20 公開</li>
</ul>
</font>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/CrossTable.html">
<link>https://piclabo.seesaa.net/article/CrossTable.html</link>
<title>卓上ボール盤とクロステーブルの購入</title>
<description>１．はじめに　穴あけ作業の環境を良くしようと思い、ボール盤とクロステーブルを購入したのでメモしておきたいと思います。２．購入品　広い工作スペースは無いのでいずれも卓上のミニサイズの機器で、使用頻度も多いわけではないので機能も低い低価格帯のものです。２－１．ボール盤　Aliexpressさんで7千円ちょっとで安売りしていた玩具のような卓上ボール盤を購入してみました。これで穴あけ作業が楽になるはずです。物価上昇傾向が続いているので背中を押されてしまいますねｗ。	ModelBG-5..</description>
<dc:subject>購入</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-02-13T19:09:38+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　穴あけ作業の環境を良くしようと思い、ボール盤とクロステーブルを購入したのでメモしておきたいと思います。<br>
<br>
<br>
<font size="+0"><b>２．購入品</b></font><!-------------------------------------><br>
　広い工作スペースは無いのでいずれも卓上のミニサイズの機器で、使用頻度も多いわけではないので機能も低い低価格帯のものです。<br>
<br>
<br>
<font size="+0"><b>２－１．ボール盤</b></font><!-------------------------------------><br>
　Aliexpressさんで7千円ちょっとで安売りしていた玩具のような卓上ボール盤を購入してみました。これで穴あけ作業が楽になるはずです。物価上昇傾向が続いているので背中を押されてしまいますねｗ。<br>
<br>
<center><font color="black"><table border="1">
<tr>
	<th align="left" bgcolor="white" width="150">Model</th><td align="left" bgcolor="white" width="250">BG-5178</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Power Adapter</th><td align="left" bgcolor="white" width="250">Input:110V-240V AC, 50/60Hz<br>Output:12-24V DC, 5A MAX</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">DC Socket</th><td align="left" bgcolor="white" width="250">5525</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Chuck Capacity</th><td align="left" bgcolor="white" width="250">0.6-6.5mm</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Speed</th><td align="left" bgcolor="white" width="250">1400-2800 RPM</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Rated Current</th><td align="left" bgcolor="white" width="250">3.5-5A</td>
</tr>
</table></font></center>
<br>
　下の写真が購入したボール盤です。リミットブラケットがまだ袋の中に入ってますね^^;<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
購入した卓上ボール盤
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('MiniDrillPress','https://piclabo.byte.jp/etc/image/Buy/CrossTable/DrillPress.jpg')"><image width="440" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/DrillPress.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>２－２．クロステーブル</b></font><!-------------------------------------><br>
　アルミ板に等間隔で穴開けしたかったので購入してみました。<a target="CNC" href="https://piclabo.seesaa.net/category/28042957-1.html">手持ちの小型ＣＮＣ</a>ではアルミ加工は強度的に難しいと思います。<br>
　こちらはAliExpressさんよりもAmazonさんの方が安い（3,799円）ものが見つかりました。<br>
<br>
<center><font color="black"><table border="1">
<tr>
	<th align="left" bgcolor="white" width="150">Model</th><td align="left" bgcolor="white" width="250">6300</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Travel distance</th><td align="left" bgcolor="white" width="250">50mm(Y) 200mm(X)</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Strike scale</th><td align="left" bgcolor="white" width="250">1.25mm/circle 0.05mm/grid</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Table size</th><td align="left" bgcolor="white" width="250">310*90mm</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Table hight</th><td align="left" bgcolor="white" width="250">76mm</td>
</tr>
<tr>
	<th align="left" bgcolor="white" width="150">Base pitch</th><td align="left" bgcolor="white" width="250">102mm</td>
</tr>
</table></font></center>
<br>
　下の写真が購入したクロステーブルで値段の割にはしっかりした作りです。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
購入したクロステーブル
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('CrossTable','https://piclabo.byte.jp/etc/image/Buy/CrossTable/CrossTable.jpg')"><image width="440" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/CrossTable.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>３．クロステーブルの精度</b></font><!-------------------------------------><br>
　今回購入したクロステーブルと同程度のサイズでバックラッシュが少ない高精度なブロクソン製のクロステーブルも市販されていますが、お値段が３倍程度します。<br>
　今回購入したものはツマミを回すとバックラッシュ分が抵抗が少なく回るので手の感触でもバックラッシュが大きいことが判ります。<br>
　そこで下図のようにダイヤルゲージを使用してツマミの操作による移動距離とバックラッシュを測定してみました。測定はX/Y軸共に移動範囲の中央部分で測定しました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ダイヤルゲージでの精度測定
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('DialGage','https://piclabo.byte.jp/etc/image/Buy/CrossTable/CrossTableAcuracy.jpg')"><image width="440" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/CrossTableAcuracy.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>３－１．テーブル移動精度</b></font><!-------------------------------------><br>
　Ｘ／Ｙ軸共にツマミを一回転する毎に1.25mm移動します。ツマミには0.00から1.00まで0.25mm毎に数字が刻印されていて刻印の間には5つの目盛りがあるので一つの目盛りは0.05mmに対応します。1.00から0.25mm先が0.00の刻印部になります。<br>
　測定はバックラッシュが発生しないように目盛りが増える方向（X軸 :左に移動、Y軸：手前に移動）に回転して行いました。尚、計測時の室温は２０℃です。<br>
　測定結果が下記の表でＸ／Ｙ軸共に最大誤差は <font color="darkblue"><b>0.1mm 以下</b></font>で累積していくような誤差は殆ど認められませんでした。<br>
<br>
<center>
<table><tr>
	<td>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Ｘ軸の移動精度
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('MoveAcuracyX','https://piclabo.byte.jp/etc/image/Buy/CrossTable/AccuracyX.png')"><image width="250" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/AccuracyX.png"></a>
		</td>
	</tr>
</table>

	</td>
	<td>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Ｙ軸の移動精度
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('MoveAcuracyY','https://piclabo.byte.jp/etc/image/Buy/CrossTable/AccuracyY.png')"><image width="250" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/AccuracyY.png"></a>
		</td>
	</tr>
</table>
	</td>
</tr></table>
</center>
<br>
<br>
<font size="+0"><b>３－２．バックラッシュ</b></font><!-------------------------------------><br>
　バックラッシュの測定はテーブルが動くまでツマミを逆回転しながらツマミの目盛りを0.00に合わせた状態でダイヤルゲージをゼロ調整し、その後、ツマミを正回転し、ダイヤルゲージの値が変化した時点の目盛りを読み取りました。<br>
　結果は下表の通りでＸ／Ｙ軸共に <font color="darkblue"><b>0.8mm</b></font> 程度のバックラッシュがあるという結果でした。<br>
　また、ツマミを逆方向に回した場合のバックラッシュも何回か測定してみましたが同程度でした。長いネジのシャフトを回すことでテーブルに固定されたフィードスクリューナットが動くという構造上、バックラッシュ巾は移動方向に依存しないものと考えられます。<br>
<br>
<center>
<table><tr>
	<td>

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Ｘ軸のバックラッシュ
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('BacklashX','https://piclabo.byte.jp/etc/image/Buy/CrossTable/BacklashX.png')"><image width="120" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/BacklashX.png"></a>
		</td>
	</tr>
</table>

	</td>
	<td>

<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
Ｙ軸のバックラッシュ
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('BacklashY','https://piclabo.byte.jp/etc/image/Buy/CrossTable/BacklashY.png')"><image width="120" src="https://piclabo.byte.jp/etc/image/Buy/CrossTable/BacklashY.png"></a>
		</td>
	</tr>
</table>

	</td>
</tr></table>
</center>
<br>
<br>
<font size="+0"><b>４．まとめ</b></font><!-------------------------------------><br>
　頻度はあまり多くない穴あけ作業用に安価なボール盤とクロステーブルを購入し、ダイヤルゲージを使ってクロステーブルの精度を評価してみました。<br>
　結果として、バックラッシュが生じないように注意すれば <font color="darkblue"><b>0.1㎜</b></font> 程度の精度でテーブルを移動できることが判りました。<br>
　また、バックラッシュは <font color="darkblue"><b>0.8㎜</b></font> 程度あり、テーブルを前後左右に動かしながら穴あけをした場合は、1ｍｍ程度の誤差が生じてしまうという結果でした。<br>
<br>
<br>
★追記　2026/02/15<br>
　バックラッシュ対策としては全くレベルの違う話ではありますが「<a target="millingmachine" href="https://www.youtube.com/watch?v=ffUOBtBIShI">【フライス盤】押し勝手、引き勝手という考え方</a>」の動画が大変参考になります。<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/OptimizingFixedNumberMultiplication.html">
<link>https://piclabo.seesaa.net/article/OptimizingFixedNumberMultiplication.html</link>
<title>Z80での固定値の乗算処理の最適化</title>
<description>１．はじめに　Z80 で固定値の乗算処理はシフト（２のべき乗）と加算を使って最適化できますが、複数のやり方があるので少し整理し、アセンブラのソースを自動生成してみようと思います。２．乗算処理の複数の展開方法　例えば A-reg の値を１０倍する処理であれば下記のように書けます。; A &amp;lt;- val; A -&amp;gt; val * 10Mul10:	LD	L,A	ADD	A,A		; x2	ADD	A,A		; x4	ADD	A,L		; x5	ADD	A,A		; x10..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-02-04T18:34:18+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　Z80 で固定値の乗算処理はシフト（２のべき乗）と加算を使って最適化できますが、複数のやり方があるので少し整理し、アセンブラのソースを自動生成してみようと思います。<br>
<br>
<br>
<font size="+0"><b>２．乗算処理の複数の展開方法</b></font><!-------------------------------------><br>
　例えば A-reg の値を１０倍する処理であれば下記のように書けます。<br>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; A &lt;- val
; A -&gt; val * 10
Mul10:	LD	L,A
	ADD	A,A		; x2
	ADD	A,A		; x4
	ADD	A,L		; x5
	ADD	A,A		; x10
</div></pre></font>
</td></tr></table></center>
<br>
　しかし同様な手法で次のように処理することも可能ですが、上記の処理と実行時間及び処理サイズが同様になります。<br>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; A &lt;- val
; A -&gt; val * 10
Mul10:	ADD	A,A		; x2
	LD	L,A
	ADD	A,A		; x4
	ADD	A,A		; x8
	ADD	A,L		; x10
</div></pre></font>
</td></tr></table></center>
<br>
　両者を比較してみると１０(0b1010)倍の筆算による処理を展開したものと同様で、両者は２進数表現で上位から２個目の１を加算するタイミングが異なるだけであることが判ります。<br>
　そこで前者のように１倍の値を加算する方式によりＣ言語で Z80 のアセンブラソースを自動生成するプログラムを作成してみました。<br>
　実行例が下記になります。<br>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 10
; A &lt;- val
; A -&gt; val * 10
        LD      A,5     ; can set any value
Mul10:  LD      L,A
        ADD     A,A     ; x2
        ADD     A,A
        ADD     A,L     ; x5
        ADD     A,A     ; x10
</div></pre></font>
</td></tr></table></center>
<br>
<br>
<font size="+0"><b>３．減算を使用した乗算処理の最適化</b></font><!-------------------------------------><br>
　減算処理も織り込むことで更に最適化が可能なので、例として１６倍から減算を一回使用する場合に最適化可能なパターンについて列挙すると下表のようになります。<br>
<br>
<center><font color="black"><table border="1">
<tr>
	<th align="center" bgcolor="lightcyan">No.</th>
	<th align="center" bgcolor="lightcyan">multiplier</th>
	<th align="center" bgcolor="lightcyan">binary value</th>
	<th align="center" bgcolor="lightcyan">Subtraction value</th>
</tr>
<tr>
	<td align="center" bgcolor="white">1</td>
	<td align="center" bgcolor="white">x15</td>
	<td align="center" bgcolor="white">1111</td>
	<td align="center" bgcolor="white">x16 - x1</td>
</tr>
<tr>
	<td align="center" bgcolor="white">2</td>
	<td align="center" bgcolor="white">x14</td>
	<td align="center" bgcolor="white">1110</td>
	<td align="center" bgcolor="white">x16 - x2</td>
</tr>
<tr>
	<td align="center" bgcolor="white">3</td>
	<td align="center" bgcolor="white">x12</td>
	<td align="center" bgcolor="white">1100</td>
	<td align="center" bgcolor="white">x16 - x4</td>
</tr>
</table></font></center>
<br>
　この表を眺めてみるとソースを自動生成する処理が浮かんできますね。と言うことで先程のＣ言語で作成したアセンブラソース自動生成プログラムに組み込み、１６倍～１１倍までの Z80 アセンブラソースを自動生成した結果を以下に示します。<br>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 16
; A <- val
; A -> val * 16
        LD      A,5     ; can set any value
Mul16:  ADD     A,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
</div></pre></font>
</td></tr></table></center>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 15
; A &lt;- val
; A -&gt; val * 15
        LD      A,5     ; can set any value
Mul15:  LD      L,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
        SUB     L
</div></pre></font>
</td></tr></table></center>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 14
; A &lt;- val
; A -&gt; val * 14
        LD      A,5     ; can set any value
Mul14:  LD      L,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
        SUB     L
        ADD     A,A
</div></pre></font>
</td></tr></table></center>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 13
; A &lt;- val
; A -&gt; val * 13
        LD      A,5     ; can set any value
Mul13:  LD      L,A
        ADD     A,A
        ADD     A,L     ; x3
        ADD     A,A     ; x6
        ADD     A,A
        ADD     A,L     ; x13
</div></pre></font>
</td></tr></table></center>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 12
; A &lt;- val
; A -&gt; val * 12
        LD      A,5     ; can set any value
Mul12:  LD      L,A
        ADD     A,A
        ADD     A,L     ; x3
        ADD     A,A     ; x6
        ADD     A,A     ; x12
</div></pre></font>
</td></tr></table></center>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 11
; A &lt;- val
; A -&gt; val * 11
        LD      A,5     ; can set any value
Mul11:  LD      L,A
        ADD     A,A     ; x2
        ADD     A,A
        ADD     A,L     ; x5
        ADD     A,A
        ADD     A,L     ; x11
</div></pre></font>
</td></tr></table></center>
<br>
★追記　2026/02/13　{<br>
　例えば、ｘ28の場合は自動生成されたアセンブラソース出力が次のようになります。<br>
<br>
<center><table border="1" width="300"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">; Z80 source of 5 * const 28
; A -> val * 28
        LD      A,5     ; can set any value
Mul28:  LD      L,A
        ADD     A,A
        ADD     A,A
        ADD     A,A
        SUB     L
        ADD     A,A
        ADD     A,A
</div></pre></font>
</td></tr></table></center>
}<br>
<br>
　今回作成したアセンブラソース生成処理のソースは下記でオーバーフロー処理は割愛しています。また、HLとDEレジスタペアを使用するようにすれば２バイト処理に拡張することが容易にできると思います。<br>
　尚、今回はｗｅｂ上でgcc環境（gdb環境含む）を提供している <a target="OnlineGDB" href="https://www.onlinegdb.com/">OnlineGDB</a> の環境で動かしてみました。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">Ｚ８０固定値乗算アセンブラソース生成処理（Ｃ言語）</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">/****************************************
  Simple Multiplication compiler
   Ver 0.02  2026/02/07
    reduce shift when Subtraction Method
   Ver 0.01a 2026/02/05
    more simple logic
     by skyriver
 ****************************************/

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;


void MulEx( int mul )
{
    if ( mul &lt;= 1 ) {
        return;
    }
    MulEx( mul / 2 );
    printf( "\tADD\tA,A" );
    if ( mul & 1 ) {
        printf( "\n\tADD\tA,L" );
    }
    printf( "\t; x%d\n", mul );
}


void CompMul( int x, int y )
{
    int onbit, subval, subflg, mask;

    onbit = 0;
    printf( "; Z80 source of %d * const %d\n", x, y );
    printf(
        "; A &lt;- val\n"
        "; A -&gt; val * %d\n"
        , y
    );
    subval = subflg = 1;
    for ( mask = 1; mask &lt;= y; mask &lt;&lt;= 1 ) {
        if ( y & mask ) {
            onbit++;
            subflg = 0;
        } else {
            if ( subflg ) {
                subval &lt;&lt;= 1;
            } else {
                subval = 0;
            }
        }
    }
    printf( "\tLD\tA,%d\t; can set any value\n", x );
    printf( "Mul%d:", y );
    if ( y == 0 ) {
        printf( "\tXOR\tA,A\n" );
    } else {
        if ( onbit == 1 ) {
            for ( y--; y; y &gt;&gt;= 1 ) {
                printf( "\tADD\tA,A\n" );
            }
        }
        else if ( (subval != 0) && (onbit &gt; 2) ) {
            printf( "\tLD\tL,A\n" );
            for ( int bit = mask &gt;&gt; 1; bit; bit &gt;&gt;= 1 ) {
                printf( "\tADD\tA,A\n" );
                if ( bit == subval ) {
                    printf( "\tSUB\tL\n" );
                }
            }
        } else {
            if ( onbit &gt; 1 ) {
                printf( "\tLD\tL,A\n" );
            }
            MulEx( y );
        }
    }
}


int main( int argc, char *argv[] )
{
    int x, y;

    if ( argc != 3 ) {
        printf( "input X and Y, then answer x*y Z80 assembler source" );
    } else {
        x = atoi( argv[ 1 ] );
        y = atoi( argv[ 2 ] );
        CompMul( x, y );
    }
    return 0;
}
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
・2026/02/07　減算手法でaddの回数を削減<br>
・2026/02/05　ロジックを若干簡略化
</div></font></td></tr>
</table></center>
<br>
<br>
<font size="+0"><b>４．まとめ</b></font><!-------------------------------------><br>
　固定値の乗算処理の最適化について検討し、シフトと加算を使って最適化するやり方は複数の実現方法がありますが、処理内容はシフト途中で適宜１倍値を加算する処理と同等であることが判り、これらの情報を元に Z80 のアセンブラソースを生成するプログラムを作ってみました。<br>
　更に被乗数の２のべき乗から減算する手法での最適化についても整理し自動生成プログラムに追加できました。<br>
　実は上記の自動生成プログラムでは最適解を選出するロジックを端折っていますが、加算と減算の両者を使用する場合も含めた真の最適解を求める問題はなかなか面白そうです。<br>
　このような自動生成処理はコンパイラへの実装やインタープリタでの処理内で固定値の乗算を複数回実行する際の高速化としてのJIT（Just-In-Time）コンパイル等で利用できるかもしれませんね。<br>
<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/Z80RandomGenMethod.html">
<link>https://piclabo.seesaa.net/article/Z80RandomGenMethod.html</link>
<title>Z80での高速な乱数発生方式</title>
<description>１．はじめに　X（旧Twitter）のタイムラインで「ゲームでは1%の確率で100回に一度は当たらないと暴れる人が結構おられる」のでテーブルを参照することで一定の回数で必ず当たるようなロジックにしていると言うメッセージを見かけ成程なぁと思いました。　Z80で乱数を実装する場合、従来は合同法を使っていましたが、テーブル引き（以降、テーブル方式と記す）にすれば合同法で必要な乗算処理も不要になり、高速化できると言うメリットもあります。　今回はタイムラインからの情報をもとにZ80での..</description>
<dc:subject>Z80</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2026-01-11T14:39:16+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　X（旧Twitter）の<a target="twitter" href="https://x.com/NAITOTokihiro/status/2009975576438944232">タイムライン</a>で「ゲームでは1%の確率で100回に一度は当たらないと暴れる人が結構おられる」のでテーブルを参照することで一定の回数で必ず当たるようなロジックにしていると言うメッセージを見かけ成程なぁと思いました。<br>
　Z80で乱数を実装する場合、従来は合同法を使っていましたが、テーブル引き（以降、テーブル方式と記す）にすれば合同法で必要な乗算処理も不要になり、高速化できると言うメリットもあります。<br>
　今回はタイムラインからの情報をもとにZ80でのテーブル方式の乱数発生の高速化について書いてみたいと思います。<br>
<br>
<br>
<font size="+0"><b>２．テーブル方式</b></font><!-------------------------------------><br>
　<a target="Tw2" href="https://x.com/NAITOTokihiro/status/2010138042447941913">タイムライン</a>で書かれているようにテーブル方式では要素数を256とし、テーブルを xx00h に配置することで高速化できます。<br>
　例えば下記のようにすれば 53 ステートで乱数発生処理を実装できます。<br>

<br>
<center><table border="1"><tr><td bgcolor="lightcyan">
<font color="black"><pre><div class="LfNallow">GetRnd:	LD	A,(TblIdx)	; 13
	INC	A		;  4
	LD	(TblIdx),A	; 13
	LD	A,(RndTbl)	; 13
TblIdx	EQU	$ - 2	
	RET			; 10

	ORG	($ + 255) and 0FF00H
RndTbl:	DB	02EH,082H,0C1H,011H,01FH,049H,02FH,058H
		・
		・
</div></pre></font>
</td></tr></table></center>
<br>
<br>
<br>
<font size="+0"><b>３．テーブル方式の高速化案</b></font><!-------------------------------------><br>
　テーブル内の値に重複が無い場合には、<font color="darkblue"><b>乱数テーブルをリスト方式</font></b>に変換することで次のように 36 ステートまで高速化できます。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">リストテーブルでの高速な乱数生成処理（Z80アセンブラ）</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">                        ;++++++++++++++++++++++++++
                        ; random list table test
                        ;  Ver 0.01 2026/01/11
                        ;   by skyriver
                        ;++++++++++++++++++++++++++
                        
[0100] :                	ORG	0100H
                        
[0100] : 3A 18 02       GetRnd:	LD	A,(RndLst+18H)	; 13 18H is a initial value
[0101] :                RndPnt	EQU	$ - 2
[0103] : 32 01 01       	LD	(RndPnt),A	; 13
[0106] : C9             	RET			; 10
                        				; total 36
                        
[0200] :                	ORG	($ + 255) and 0FF00H
                        
[0200] : 42 69 BB 20    RndLst:	DB	042H,069H,0bbH,020H,051H,0baH,040H,028H
         51 BA 40 28
[0208] : 02 43 A6 44    	DB	002H,043H,0a6H,044H,064H,080H,038H,003H
         64 80 38 03
[0210] : 1E 1F 39 73    	DB	01eH,01fH,039H,073H,075H,048H,02bH,016H
         75 48 2B 16
[0218] : 2E E4 86 57    	DB	02eH,0e4H,086H,057H,08fH,052H,0d4H,049H
         8F 52 D4 49
[0220] : 4E 94 96 EE    	DB	04eH,094H,096H,0eeH,09bH,0c8H,019H,03cH
         9B C8 19 3C
[0228] : 29 17 E9 62    	DB	029H,017H,0e9H,062H,09dH,047H,082H,058H
         9D 47 82 58
[0230] : 13 12 0E 6E    	DB	013H,012H,00eH,06eH,0e5H,0b2H,0fbH,070H
         E5 B2 FB 70
[0238] : 2D 5E 01 AC    	DB	02dH,05eH,001H,0acH,088H,0d1H,0ceH,065H
         88 D1 CE 65
[0240] : 56 F7 60 A8    	DB	056H,0f7H,060H,0a8H,0a4H,0f6H,030H,0cbH
         A4 F6 30 CB
[0248] : 72 2F 74 A7    	DB	072H,02fH,074H,0a7H,0beH,063H,037H,0cfH
         BE 63 37 CF
[0250] : 8E 5B 92 BF    	DB	08eH,05bH,092H,0bfH,078H,0b1H,01aH,07cH
         78 B1 1A 7C
[0258] : 7A B3 C7 3F    	DB	07aH,0b3H,0c7H,03fH,03eH,07eH,0abH,0f1H
         3E 7E AB F1
[0260] : 9A 6A 0C 6C    	DB	09aH,06aH,00cH,06cH,04dH,0bcH,010H,0c6H
         4D BC 10 C6
[0268] : 0A E3 C3 84    	DB	00aH,0e3H,0c3H,084H,06fH,071H,07fH,079H
         6F 71 7F 79
[0270] : 6D 14 54 5D    	DB	06dH,014H,054H,05dH,033H,089H,0ccH,009H
         33 89 CC 09
[0278] : 83 B5 D5 4C    	DB	083H,0b5H,0d5H,04cH,0daH,026H,087H,08aH
         DA 26 87 8A
[0280] : 22 DE C1 8B    	DB	022H,0deH,0c1H,08bH,095H,032H,06bH,090H
         95 32 6B 90
[0288] : 9E A9 F4 0D    	DB	09eH,0a9H,0f4H,00dH,08dH,0ddH,045H,035H
         8D DD 45 35
[0290] : 98 3A 93 ED    	DB	098H,03aH,093H,0edH,0b6H,0d6H,0a5H,0bdH
         B6 D6 A5 BD
[0298] : AE C0 68 A3    	DB	0aeH,0c0H,068H,0a3H,055H,005H,04bH,02aH
         55 05 4B 2A
[02A0] : 9F CD 46 A2    	DB	09fH,0cdH,046H,0a2H,0f3H,0b4H,0b0H,0adH
         F3 B4 B0 AD
[02A8] : B7 3B 2C 53    	DB	0b7H,03bH,02cH,053H,059H,0b9H,03dH,0c2H
         59 B9 3D C2
[02B0] : 9C B8 0F 4F    	DB	09cH,0b8H,00fH,04fH,024H,097H,007H,0ebH
         24 97 07 EB
[02B8] : 7D 15 67 D9    	DB	07dH,015H,067H,0d9H,00bH,0d0H,0afH,0dcH
         0B D0 AF DC
[02C0] : 91 11 EA FC    	DB	091H,011H,0eaH,0fcH,050H,036H,0caH,0d2H
         50 36 CA D2
[02C8] : 18 23 C5 A1    	DB	018H,023H,0c5H,0a1H,006H,0e2H,08cH,0d3H
         06 E2 8C D3
[02D0] : 81 5A 76 D7    	DB	081H,05aH,076H,0d7H,0d8H,0f2H,01bH,05cH
         D8 F2 1B 5C
[02D8] : 04 34 DB E1    	DB	004H,034H,0dbH,0e1H,0dfH,0e8H,0e0H,085H
         DF E8 E0 85
[02E0] : 99 21 7B 08    	DB	099H,021H,07bH,008H,0f0H,0e6H,0e7H,0ecH
         F0 E6 E7 EC
[02E8] : A0 FD EF 25    	DB	0a0H,0fdH,0efH,025H,0c9H,041H,000H,04aH
         C9 41 00 4A
[02F0] : 5F 77 66 F5    	DB	05fH,077H,066H,0f5H,0faH,0c4H,0f8H,027H
         FA C4 F8 27
[02F8] : F9 AA 1D 61    	DB	0f9H,0aaH,01dH,061H,01cH,0feH,0ffH,031H
         1C FE FF 31
                        
                        
                        	END
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br> 
<br>
<font size="+0"><b>■乱数テーブルのリスト化とは</b></font><!-------------------------------------><br>
　乱数の値自体をテーブルのインデックスとしてテーブルを順次辿って行った場合に、元データの乱数テーブルの順番通りに辿れる（元データの乱数列をリスト構造で連結する）ようにしたものをここではリスト化した乱数テーブルと表現しています。<br>
　乱数テーブルをリスト化する具体的なサンプルコードを以下に示します。GenRndLst()でリスト化の処理を行っています。<br>
<font size="-2">※より判り易いように表現を変更　2026/01/12</font><br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">乱数テーブルのリスト化処理の例（Ｃ言語）</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">/*
 * random list table test
 *  Ver 0.01 2026/01/11
 *    by skyriver
 */

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdint.h&gt;

uint8_t RndTbl[ 256 ];
uint8_t RndLst[ 256 ];

void GenRndTbl( void )
{
	int pos, zeropos;

	zeropos = rand() & 0xff;	// zero position
	for ( int i = 1; i&lt; 256; i++ ) {
		pos = (rand() & 0xff) - 1;
		do {
			pos = (pos + 1) & 0xff;
		} while ( (pos == zeropos) || (RndTbl[ pos ] != 0) );
		RndTbl[ pos ] = i;
	}
}


void GenRndLst( void )
{
	for ( int i = 0; i &lt; 256; i++ ) {
		RndLst[ RndTbl[ i ] ] = RndTbl[ (i + 1) & 0xff ];
	}
}


void DmpTbl( uint8_t *ValPnt )
{
	for ( int i = 0; i &lt; 256; i++ ) {
		if ( ( i % 16 ) == 0 ) {
			printf( "\n%04x :", i );
		}
		else if ( ( i % 8  ) == 0 ) {
			printf( " -" );
		}
		printf( " %02x", *( ValPnt + i ) );
	}
}


void GenAsmSrc( uint8_t *ValPnt )
{
	for ( int i = 0; i &lt; 256; i++ ) {
		if ( ( i % 8 ) == 0 ) {
			printf( "\n\tDB\t" );
		}
		printf( "0%02xH", *( ValPnt + i ) );
		if ( ( i % 8 ) != 7 ) {
			putchar( ',' );
		}
	}
}


int main( int argc, char *argv[] )
{
	srand( 1234 );
	GenRndTbl();
	printf( "\nRndTbl" );
	DmpTbl( RndTbl );
	GenRndLst();
	printf( "\n\nRndLst" );
	DmpTbl( RndLst );
	printf( "\n\nAsm source of RndLst\n" );
	GenAsmSrc( RndLst );
	return 0;
}
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
　上記のコードを実行した結果が下記になります。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">実行結果</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">$ ./rndlst

RndTbl
0000 : 2e 82 c1 11 1f 49 2f 58 - 7a d5 f2 66 10 1e d4 d8
0010 : 04 51 5b 3f 65 bc 0b 44 - a4 f3 f5 c4 50 8e 45 f6
0020 : f8 f9 aa 2c 9d 05 ba 67 - c6 ca c5 36 fb 61 6a c3
0030 : fc 1c 8f 35 b2 0f 03 20 - 4e 37 70 6d 71 14 75 89
0040 : a9 3b ac 59 b3 4f cf d3 - d7 5c 3e ce 8c 8d dd e8
0050 : a0 9f 2a e9 fd fe ff 31 - 12 39 5e ab 53 bf dc df
0060 : 85 32 0e 38 2d 47 cb a1 - cd e2 7b 4c be af c2 ea
0070 : ef 4a 74 33 6e 7f 8a f4 - fa 1d 52 92 93 ed 41 f7
0080 : 27 3c 88 9e 4b a7 ad b9 - 15 48 72 54 78 83 8b 0d
0090 : 80 22 96 a5 b4 24 9b a3 - a2 46 30 13 73 5d 7e 87
00a0 : 90 98 ae 3d d1 5a c7 d2 - 76 cc 06 40 56 1a 86 6b
00b0 : 84 95 d6 1b 57 7c da db - e1 21 94 b6 07 28 29 17
00c0 : 16 2b 62 0c 64 4d 63 6c - 6f 79 b5 97 bd d0 81 de
00d0 : e0 99 c0 91 3a 01 69 e3 - 08 02 bb d9 34 e5 e6 e7
00e0 : ec c9 23 ee 00 42 60 9a - 68 0a a6 b0 9c 55 b1 b8
00f0 : 7d 26 19 e4 f0 5f f1 77 - 09 43 a8 b7 eb 25 c8 18

RndLst
0000 : 42 69 bb 20 51 ba 40 28 - 02 43 a6 44 64 80 38 03
0010 : 1e 1f 39 73 75 48 2b 16 - 2e e4 86 57 8f 52 d4 49
0020 : 4e 94 96 ee 9b c8 19 3c - 29 17 e9 62 9d 47 82 58
0030 : 13 12 0e 6e e5 b2 fb 70 - 2d 5e 01 ac 88 d1 ce 65
0040 : 56 f7 60 a8 a4 f6 30 cb - 72 2f 74 a7 be 63 37 cf
0050 : 8e 5b 92 bf 78 b1 1a 7c - 7a b3 c7 3f 3e 7e ab f1
0060 : 9a 6a 0c 6c 4d bc 10 c6 - 0a e3 c3 84 6f 71 7f 79
0070 : 6d 14 54 5d 33 89 cc 09 - 83 b5 d5 4c da 26 87 8a
0080 : 22 de c1 8b 95 32 6b 90 - 9e a9 f4 0d 8d dd 45 35
0090 : 98 3a 93 ed b6 d6 a5 bd - ae c0 68 a3 55 05 4b 2a
00a0 : 9f cd 46 a2 f3 b4 b0 ad - b7 3b 2c 53 59 b9 3d c2
00b0 : 9c b8 0f 4f 24 97 07 eb - 7d 15 67 d9 0b d0 af dc
00c0 : 91 11 ea fc 50 36 ca d2 - 18 23 c5 a1 06 e2 8c d3
00d0 : 81 5a 76 d7 d8 f2 1b 5c - 04 34 db e1 df e8 e0 85
00e0 : 99 21 7b 08 f0 e6 e7 ec - a0 fd ef 25 c9 41 00 4a
00f0 : 5f 77 66 f5 fa c4 f8 27 - f9 aa 1d 61 1c fe ff 31

Asm source of RndLst

        DB      042H,069H,0bbH,020H,051H,0baH,040H,028H
        DB      002H,043H,0a6H,044H,064H,080H,038H,003H
        DB      01eH,01fH,039H,073H,075H,048H,02bH,016H
        DB      02eH,0e4H,086H,057H,08fH,052H,0d4H,049H
        DB      04eH,094H,096H,0eeH,09bH,0c8H,019H,03cH
        DB      029H,017H,0e9H,062H,09dH,047H,082H,058H
        DB      013H,012H,00eH,06eH,0e5H,0b2H,0fbH,070H
        DB      02dH,05eH,001H,0acH,088H,0d1H,0ceH,065H
        DB      056H,0f7H,060H,0a8H,0a4H,0f6H,030H,0cbH
        DB      072H,02fH,074H,0a7H,0beH,063H,037H,0cfH
        DB      08eH,05bH,092H,0bfH,078H,0b1H,01aH,07cH
        DB      07aH,0b3H,0c7H,03fH,03eH,07eH,0abH,0f1H
        DB      09aH,06aH,00cH,06cH,04dH,0bcH,010H,0c6H
        DB      00aH,0e3H,0c3H,084H,06fH,071H,07fH,079H
        DB      06dH,014H,054H,05dH,033H,089H,0ccH,009H
        DB      083H,0b5H,0d5H,04cH,0daH,026H,087H,08aH
        DB      022H,0deH,0c1H,08bH,095H,032H,06bH,090H
        DB      09eH,0a9H,0f4H,00dH,08dH,0ddH,045H,035H
        DB      098H,03aH,093H,0edH,0b6H,0d6H,0a5H,0bdH
        DB      0aeH,0c0H,068H,0a3H,055H,005H,04bH,02aH
        DB      09fH,0cdH,046H,0a2H,0f3H,0b4H,0b0H,0adH
        DB      0b7H,03bH,02cH,053H,059H,0b9H,03dH,0c2H
        DB      09cH,0b8H,00fH,04fH,024H,097H,007H,0ebH
        DB      07dH,015H,067H,0d9H,00bH,0d0H,0afH,0dcH
        DB      091H,011H,0eaH,0fcH,050H,036H,0caH,0d2H
        DB      018H,023H,0c5H,0a1H,006H,0e2H,08cH,0d3H
        DB      081H,05aH,076H,0d7H,0d8H,0f2H,01bH,05cH
        DB      004H,034H,0dbH,0e1H,0dfH,0e8H,0e0H,085H
        DB      099H,021H,07bH,008H,0f0H,0e6H,0e7H,0ecH
        DB      0a0H,0fdH,0efH,025H,0c9H,041H,000H,04aH
        DB      05fH,077H,066H,0f5H,0faH,0c4H,0f8H,027H
        DB      0f9H,0aaH,01dH,061H,01cH,0feH,0ffH,031H
$
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
<br>
<font size="+0"><b>４．まとめ</b></font><!-------------------------------------><br>
　乱数テーブルをリスト化することでかなり高速になりました。今回提案したリスト方式はテーブル方式と比較して要素値の重複が許されない反面、要素数を少なくした場合でも処理の変更は不要（AND演算等の追加が不要）という特徴があります。また、処理内容はseedの読み込みと書き込みだけで加工処理が全く無いので究極の速度と言えるのではないでしょうか？<br>
　乱数テーブルを使った方式は高速な反面、合同法等と比較し、
<ul>
<li>乱数の周期が短い</li>
<li>メモリ消費が多い</li>
</ul>
等の短所もありますので実装する処理に合わせて適宜使い分けることが必要かと思います。<br>
<font size="-2">※リスト方式の特徴を追記　2026/01/18</font><br>
<br>
<br>
<div id="add20260116">★追記　2026/01/16<br></div>
　処理が軽い乱数発生アルゴリズムとして 	<a target="WikiXorshift" href="https://ja.wikipedia.org/wiki/Xorshift">Xorshift</a> があります。<br>
　上記で書いた周期が 256 のテーブル方式の乱数は 8bit の Xorshift で代用できるかもしれません。テーブル方式と同様に Xorshift8 は周期内で同じ値が出ることはありませんが、周期が 255 で 0 は出力されません。<br>
　8bit の Xorshift の計算式を<a target="xorshift8calc" href="https://github.com/alcadia-kiritan/tetris/blob/main/04/xorshift16.cpp">ここ</a>で見つけたので、Z80 のアセンブラ用に書いてみたものが下記のソースになります。私がネット上で確認した限りでは Z80 での16bit 版 Xorshift の最速コードは <a target="RetroProg" href="http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html">Retro Programming</a> のサイトに書いてあるもので RET を含めないで 20 バイトの 86 クロックと書かれていますが <font color="darkblue"><b>82</b></font> クロックの間違いではないかと思います。<br>
　下記の Xorshift8 では RET を含めなければ 17 バイトの 68 クロックになり、16bit 版よりも高速でコードも短くなるので Z80 を実装したレトロなマシンでのゲーム製作等で使えるかもしれませんね。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">Xorshift8 Z80 version（Z80アセンブラ）</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">                        ; Xorshift 8bits version for Z80
                        ;  Ver 0.01 2026/01/16 by skyriver
                        ;	x ^= x &gt;&gt; 1
                        ;	x ^= x &lt;&lt; 1
                        ;	x ^= x &gt;&gt; 2
                        ;
                        ; 17 bytes, 68 clocks(excluding ret)
                        ;
                        ; A -&gt; random value

[0200] : 3E 01          XS8:	LD	A,1
[0201] :                SEED8	EQU	$ - 1
[0202] : 4F             	LD	C,A
[0203] : B7             	OR	A
[0204] : 1F             	RRA
[0205] : A9             	XOR	C
[0206] : 4F             	LD	C,A
[0207] : 87             	ADD	A,A
[0208] : A9             	XOR	C
[0209] : 4F             	LD	C,A
[020A] : 1F             	RRA
[020B] : B7             	OR	A
[020C] : 1F             	RRA
[020D] : A9             	XOR	C
[020E] : 32 01 02       	LD	(SEED8),A
[0211] : C9             	RET
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
　参考として seed の初期値が１の場合に発生した乱数値も貼っておきます。周期が 255 なので先頭と末尾が同じ値になっています。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">Xorshift8 で生成された乱数値</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">0000 : 03 07 0F 1E 3F 78 FF A0 - 14 2A 51 A9 06 0C 19 30
0010 : 66 C0 D8 EB 8A 45 83 57 - A5 1F 3C 7F F0 BE 2B 52
0020 : AE 09 12 26 48 99 60 CC - C1 DB EC 85 5B BC 2F 5A
0030 : BF 28 55 A1 17 2D 5E B7 - 39 74 E6 90 72 EA 89 42
0040 : 8C 49 9A 67 C3 DF E4 94 - 7A FB A8 05 0B 16 2E 59
0050 : B8 27 4B 9E 6F D2 FE A3 - 13 25 4F 96 7E F3 B9 24
0060 : 4C 91 71 ED 86 5C B3 31 - 65 C7 D7 F5 B5 3D 7C F7
0070 : B1 35 6D D6 F6 B2 32 62 - C8 C9 CA CD C2 DC E3 9B
0080 : 64 C4 D0 FA AB 02 04 08 - 11 21 47 87 5F B4 3E 7B
0090 : F8 AF 0A 15 29 56 A6 18 - 33 61 CF C6 D4 F2 BA 23
00A0 : 43 8F 4E 95 79 FC A7 1B - 34 6E D1 F9 AC 0D 1A 37
00B0 : 69 DE E7 93 75 E5 97 7D - F4 B6 3A 73 E9 8E 4D 92
00C0 : 76 E2 98 63 CB CE C5 D3 - FD A4 1C 3B 70 EE 81 53
00D0 : AD 0E 1D 38 77 E1 9F 6C - D5 F1 BD 2C 5D B0 36 6A
00E0 : D9 E8 8D 4A 9D 68 DD E0 - 9C 6B DA EF 82 54 A2 10
00F0 : 22 40 88 41 8B 46 84 58 - BB 20 44 80 50 AA 01 03
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
<br>
<div id="add20260124">★追記　2026/01/24<br></div>
　ネットで<a target="Xorshift2" href="https://gist.github.com/bhickey/0de228c02cc60b5965582d2d946d8c38">最初に左シフトする Xorshift8 の計算式</a>を見つけました。<br>
　RET を含めなければ <font color="darkblue"><b>15 バイトで 60 クロック</b></font>となり更にコンパクト＆高速になりました。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">Xorshift8 Z80 version その２（Z80アセンブラ）</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">                        ; Xorshift 8bit version for Z80
                        ;  Ver 0.01 2026/01/24 by skyriver
                        ;	x ^= x &lt;&lt; 1
                        ;	x ^= x &gt;&gt; 1
                        ;	x ^= x &lt;&lt; 2
                        ;
                        ; 15 bytes, 60 clocks(excluding ret)
                        ;
                        ; A -&gt; random value
                        
[0200] : 3E 01          XS82:	LD	A,1
[0201] :                SEED82	EQU	$ - 1
[0202] : 4F             	LD	C,A
[0203] : 87             	ADD	A,A
[0204] : A9             	XOR	C
[0205] : 4F             	LD	C,A
[0206] : 1F             	RRA
[0207] : A9             	XOR	C
[0208] : 4F             	LD	C,A
[0209] : 87             	ADD	A,A
[020A] : 87             	ADD	A,A
[020B] : A9             	XOR	C
[020C] : 32 01 02       	LD	(SEED82),A
[020F] : C9             	RET
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
　参考として seed の初期値が１の場合に発生した乱数値も貼っておきます。周期が 255 であることも確認できました。<br>
<br>
<center><table>
<tr><td align="center" bgcolor="darkslategray">
<font color="lightgray">Xorshift8 で生成された乱数値　その２</font>
</td></tr>
<tr><td bgcolor="darkblue">
<font color="lightgray" size="-1"><pre><div class="TextScrollSmall">0000 : 0A 55 80 C0 E0 F0 78 FC - 1E FF 05 28 54 8A 95 60
0010 : 30 98 0C 66 03 1B D7 51 - A2 C1 EA A5 F8 3C FE 0F
0020 : 7D D4 4A 75 90 48 64 12 - 99 06 33 83 DB 37 A1 DA
0030 : 3D F4 5A FD 14 AA 85 E8 - B4 7A ED 9C 2E 67 09 4E
0040 : 57 91 42 31 92 59 E6 C3 - FB 27 29 5E DF 15 A0 D0
0050 : 68 74 9A 1D E4 D2 79 F6 - 4B 7F C5 C8 A4 F2 69 7E
0060 : CF 9D 24 32 89 8E B7 61 - 3A CD 8C A6 E3 EB AF AD
0070 : BC 3E EF 8D AC B6 6B 6F - 4D 4C 46 13 93 53 B3 43
0080 : 3B C7 D9 26 23 0B 5F D5 - 40 20 10 88 84 E2 E1 FA
0090 : 2D 7C DE 1F F5 50 A8 94 - 6A 65 18 CC 86 F3 63 2B
00A0 : 4F 5D C4 C2 F1 72 A9 9E - 3F E5 D8 2C 76 8B 9F 35
00B0 : B0 58 EC 96 7B E7 C9 AE - A7 E9 BE 2F 6D 5C CE 97
00C0 : 71 B2 49 6E 47 19 C6 D3 - 73 A3 CB BF 25 38 DC 0E
00D0 : 77 81 CA B5 70 B8 1C EE - 87 F9 36 AB 8F BD 34 BA
00E0 : 0D 6C 56 9B 17 B1 52 B9 - 16 BB 07 39 D6 5B F7 41
00F0 : 2A 45 08 44 02 11 82 D1 - 62 21 1A DD 04 22 01 0A
</div></pre></font></td></tr>
<tr><td align="ledf"><font color="black" size="-2"><div class="LfNallow">
</div></font></td></tr>
</table></center>
<br>
<br>
★追記　2026/05/10<br>
　上記の「乱数テーブルのリスト化処理の例（Ｃ言語）」のソースの中でGenRndTbl()で乱数テーブルを生成しています。<br>
　X（旧Twitter）のタイムラインでトランプをシャッフルする処理に関して話題にのぼり、より簡単（高速）にシャッフルする処理は<a target="FastShuffle" href="https://x.com/wcinp/status/2053393359075721463">こんな処理</a>ということが判りました。<br>
<br>
★追記　2026/05/14<br>
　高速なシャッフル処理について<a target="FastShuffle" href="https://piclabo.seesaa.net/article/FastShuffle.html">ブログ</a>にまとめました。
<br>
<br>
★追記　2026/07/12<br>
　Z80 での 16bit の xorshift に関しては「<a target="ProgRetro" href="http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html">Retro Programming</a>」のサイトが参考になります。<br>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/TwitterLookBack2025.html.html">
<link>https://piclabo.seesaa.net/article/TwitterLookBack2025.html.html</link>
<title>X(Twitter)での今年（2025年）の振り返り</title>
<description>１．はじめに　常々日記などは書いていないので今年も去年のようにＸ（旧Twitter）に投稿したメッセージで今年一年を振り返りたいと思います。２．受賞メッセージ　今年も個人的見解により賞を次のように決定しました。２－１．いいね貰ったで賞　今年はタイムラインで見かけた穿孔テープ情報が懐かしかったことがきっかけで開発を始めた穿孔テープ関連のメッセージで久々に10万以上のビューを頂きました。　いいねを沢山頂いたメッセージに対する「いいね貰ったで賞」は下記に決まりました。■第一位　栄光..</description>
<dc:subject>日記</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2025-12-30T22:51:35+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　常々日記などは書いていないので今年も<a target="2024" href="https://piclabo.seesaa.net/article/TwitterLookBack2024.html">去年のよう</a>にＸ（旧Twitter）に投稿したメッセージで今年一年を振り返りたいと思います。<br>
<br>
<br>
<font size="+0"><b>２．受賞メッセージ</b></font><!-------------------------------------><br>
　今年も個人的見解により賞を次のように決定しました。<br>
<br>
<br>
<font size="+0"><b>２－１．いいね貰ったで賞</b></font><!-------------------------------------><br>
　今年はタイムラインで見かけた穿孔テープ情報が懐かしかったことがきっかけで開発を始めた穿孔テープ関連のメッセージで久々に10万以上のビューを頂きました。<br>
　いいねを沢山頂いたメッセージに対する「いいね貰ったで賞」は下記に決まりました。<br>
<br>
■第一位<br>
　栄光の第一位は・・・フルスクラッチで開発中の穿孔テープリーダーの状況を書いたポストで、498個のいいねと14万ビューを頂きました＾＾<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">穿孔テープのリーダーをフルスクラッチで開発中です<br>センサー周りの調整が終わり安定してデータが読み取れるようになりました<br>詳細は下記のurlを参照して下さい<a href="https://t.co/UviWeRhqfI">https://t.co/UviWeRhqfI</a><a href="https://twitter.com/hashtag/%E7%A9%BF%E5%AD%94%E3%83%86%E3%83%BC%E3%83%97?src=hash&amp;ref_src=twsrc%5Etfw">#穿孔テープ</a> <a href="https://twitter.com/hashtag/%E3%83%86%E3%83%BC%E3%83%97%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#テープリーダー</a> <a href="https://t.co/snDbnvm9rS">https://t.co/snDbnvm9rS</a> <a href="https://t.co/I8x9zGdgp2">pic.twitter.com/I8x9zGdgp2</a></p>&mdash; skyriver (@wcinp) <a href="https://twitter.com/wcinp/status/1991883027413377247?ref_src=twsrc%5Etfw">November 21, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
■第ニ位<br>
　フルスクラッチで開発中のテープリーダーをPuntareaderと命名し、実装機能デモの動画を貼ったポストです。117個のいいねを頂きました。<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">穿孔テープのリーダーをフルスクラッチで開発中でPuntareaderと命名<br>マイコン（PIC18F14K50）のソフトもほぼ完成<br>調歩同期シリアル出力も実装し通信速度等の設定も可能です<br>動画は左奥がシリアル受信、手前がUSB接続の画面です<br>2回目はディバッグモードでの読込<a href="https://t.co/H2aFhzoisI">https://t.co/H2aFhzoisI</a><a href="https://twitter.com/hashtag/Puntareader?src=hash&amp;ref_src=twsrc%5Etfw">#Puntareader</a> <a href="https://t.co/cyceXpkq2c">https://t.co/cyceXpkq2c</a> <a href="https://t.co/WlnM5Ke81A">pic.twitter.com/WlnM5Ke81A</a></p>&mdash; skyriver (@wcinp) <a href="https://twitter.com/wcinp/status/1996207353075773593?ref_src=twsrc%5Etfw">December 3, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
■第三位<br>
　68の日にポストした「自作のCP/M-68Kボード」の写真を添付したメッセージです。67個のいいねを頂きました。<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/68%E3%81%AE%E6%97%A5?src=hash&amp;ref_src=twsrc%5Etfw">#68の日</a> ということで自作のCP/M-68Kボードをライトボックスで撮影しました<br>廉価な68Kチップはまがい品が多く、16MHz動作するチップを入手するのに苦労したことは今では懐かしい思い出ですね<a href="https://twitter.com/hashtag/Pic24MC68K?src=hash&amp;ref_src=twsrc%5Etfw">#Pic24MC68K</a> <a href="https://t.co/kJnGNsYENe">pic.twitter.com/kJnGNsYENe</a></p>&mdash; skyriver (@wcinp) <a href="https://twitter.com/wcinp/status/1931621522642440255?ref_src=twsrc%5Etfw">June 8, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<font size="+0"><b>２－２．予想外だったで賞</font></b><!-------------------------------------><br>
　下記の「秋月さんのZ80用Ｃコンパイラでの「食事する哲学者の問題」」のポストは私的には結構面白い内容だと思っていましたが、予想に反して「いいね」が１個も貰えませんでしたorz<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">並列処理で有名な「食事する哲学者の問題」を自作のリアルタイムモニタと秋月さんのZ80用Ｃコンパイラ<br>を使い実験してみた<br>更に資源の使用効率が向上する仕掛けを考え実装してみた<br>Super AKI-80のCPUを使った実際のボードでこういう実験ができるとは感慨深いですね<a href="https://twitter.com/hashtag/ZealMon?src=hash&amp;ref_src=twsrc%5Etfw">#ZealMon</a><a href="https://t.co/Cq5KaONWDz">https://t.co/Cq5KaONWDz</a> <a href="https://t.co/vGh8GpUtjA">https://t.co/vGh8GpUtjA</a> <a href="https://t.co/lTXHtFNtCd">pic.twitter.com/lTXHtFNtCd</a></p>&mdash; skyriver (@wcinp) <a href="https://twitter.com/wcinp/status/1973681075470934493?ref_src=twsrc%5Etfw">October 2, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<font size="+0"><b>２－３．懐かしかったで賞</font></b>　<font size="-2">※追記　2026/01/01</font><!-------------------------------------><br>
　学生の頃、自作のマイコンを作成し始めた頃にパチパチスイッチでＤＭＡによりメモリを設定し、アドレスとデータバスのLED表示くらいしか出力が無い（つまりＺ８０にはＩ／Ｏが全く無い）状態なのに研究室の先輩がリセットスイッチとアドレス表示のＬＥＤを使ってピンポンゲームを作ったのを見て大変驚いた記憶があります。<br>
　ゲーム内容の詳細までは覚えていませんが、今回、実装部品最小化を目指してプリント基板化して開発したパチパチマイコンボードで同様のゲームを作り、感慨深い思いでした。<br>
<br>
<center>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">アドレスバス用LEDで表示実験を行ってきましたがI/Oが全く無いパチパチマイコン（Z80Pachin）でゲームは可能でしょうか？<br>⇒可能です<br>入力はリセットSWを使います<br>ゲーム可能なマイコンボードの中で最もI/O数の少ないボードに認定されましたw<br>詳細は下記を参照してください<a href="https://t.co/JY7k4rVgOh">https://t.co/JY7k4rVgOh</a> <a href="https://t.co/HtpUl2xdEX">https://t.co/HtpUl2xdEX</a> <a href="https://t.co/8z1Qu61u40">pic.twitter.com/8z1Qu61u40</a></p>&mdash; skyriver (@wcinp) <a href="https://twitter.com/wcinp/status/1887087617919058170?ref_src=twsrc%5Etfw">February 5, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</center>
<br>
<br>
<font size="+0"><b>３．まとめ</b></font><!-------------------------------------><br>
　いいね数のトップは穿孔テープ関連のメッセージがほぼ独占という結果になりました。ポスト時はそれほど反響があるとは思ってもいませんでしたが海外の技術系のサイトでも紹介して頂いたことから予想を遥かに上回る反応に驚きました。逆に「食事する哲学者の問題」は・・・<br>
<br>
　最後に2025年に投稿した主要なメッセージのサマリを表にまとめましたので貼っておきます。いいねとビュー数は2025/12/30時点で確認した数値です。<br>
<br>
<font color="black"><center><table border="1" bgcolor="white">
<tr>
 <th bgcolor="lightcyan" width="10">No.</th>
 <th bgcolor="lightcyan" width="20">ranking</th>
 <th bgcolor="lightcyan" width="50">date</th>
 <th bgcolor="lightcyan">content</th>
 <th bgcolor="lightcyan" width="20">like</th>
 <th bgcolor="lightcyan" width="50">view</th>
</tr>
<tr>
 <td align="right">1</td>
 <td align="right"></td>
 <td align="center">2025/01/26</td>
 <td><a target="1" href="https://x.com/wcinp/status/1883450506183676363">Z80パチパチマイコン(Z80Pachin)</a></td>
 <td align="right">47</td>
 <td align="right">5,868</td>
</tr>
<tr>
 <td align="right">2</td>
 <td align="right"></td>
 <td align="center">2025/02/05</td>
 <td><a target="1" href="https://x.com/wcinp/status/1887087617919058170">I/Oが全く無いパチパチマイコン（Z80Pachin）でゲーム</a></td>
 <td align="right">16</td>
 <td align="right">3,474</td>
</tr>
<tr>
 <td align="right">3</td>
 <td align="right"></td>
 <td align="center">2025/03/01</td>
 <td><a target="1" href="https://x.com/wcinp/status/1895700350394606043">一次元ライフゲーム</a></td>
 <td align="right">38</td>
 <td align="right">2,354</td>
</tr>
<tr>
 <td align="right">4</td>
 <td align="right"></td>
 <td align="center">2025/03/01</td>
 <td><a target="1" href="https://x.com/wcinp/status/1901924914208412118">三ッ池公園</a></td>
 <td align="right">3</td>
 <td align="right">686</td>
</tr>
<tr>
 <td align="right">5</td>
 <td align="right"></td>
 <td align="center">2025/03/01</td>
 <td><a target="1" href="https://x.com/wcinp/status/1902347034088100251">デルタ変調を使った音声合成</a></td>
 <td align="right">6</td>
 <td align="right">838</td>
</tr>
<tr>
 <td align="right">6</td>
 <td align="right"></td>
 <td align="center">2025/03/21</td>
 <td><a target="1" href="https://x.com/wcinp/status/1903028237053333875">素数生成プログラミングコンテスト</a></td>
 <td align="right">5</td>
 <td align="right">817</td>
</tr>
<tr>
 <td align="right">7</td>
 <td align="right">★３</td>
 <td align="center">2025/06/08</td>
 <td><a target="1" href="https://x.com/wcinp/status/1931621522642440255">自作のCP/M-68Kボード</a></td>
 <td align="right">67</td>
 <td align="right">2,189</td>
</tr>
<tr>
 <td align="right">8</td>
 <td align="right"></td>
 <td align="center">2025/06/27</td>
 <td><a target="1" href="https://x.com/wcinp/status/1938576072582529387">Z80クイズ　全メモリ同一値設定クイズ</a></td>
 <td align="right">52</td>
 <td align="right">8,911</td>
</tr>
<tr>
 <td align="right">9</td>
 <td align="right"></td>
 <td align="center">2025/07/31</td>
 <td><a target="1" href="https://x.com/wcinp/status/1950896186338250825">東芝製のZ80互換CPU（TMPZ84C015）を使ったプリント基板</a></td>
 <td align="right">34</td>
 <td align="right">5,559</td>
</tr>
<tr>
 <td align="right">10</td>
 <td align="right"></td>
 <td align="center">2025/08/23</td>
 <td><a target="1" href="https://x.com/wcinp/status/1959269172489134321">Free版MITOUJTAGでのXC9572で書込み実験</a></td>
 <td align="right">17</td>
 <td align="right">2,284</td>
</tr>
<tr>
 <td align="right">11</td>
 <td align="right"></td>
 <td align="center">2025/09/09</td>
 <td><a target="1" href="https://x.com/wcinp/status/1965419134050841016">Z80での高速なバイナリデータの10進数変換</a></td>
 <td align="right">11</td>
 <td align="right">673</td>
</tr>
<tr>
 <td align="right">12</td>
 <td align="right"></td>
 <td align="center">2025/09/20</td>
 <td><a target="1" href="https://x.com/wcinp/status/1969298527059689841">Z80での高速な16bitの平方根処理</a></td>
 <td align="right">6</td>
 <td align="right">469</td>
</tr>
<tr>
 <td align="right">13</td>
 <td align="right"></td>
 <td align="center">2025/09/26</td>
 <td><a target="1" href="https://x.com/wcinp/status/1971558593527964139">AKI-80 用のCコンパイラをZ-Visionに連携させたソースディバッグ</a></td>
 <td align="right">14</td>
 <td align="right">1,349</td>
</tr>
<tr>
 <td align="right">14</td>
 <td align="right"></td>
 <td align="center">2025/10/02</td>
 <td><a target="1" href="https://x.com/wcinp/status/1973681075470934493">秋月さんのZ80用Ｃコンパイラでの「食事する哲学者の問題」</a></td>
 <td align="right">0</td>
 <td align="right">453</td>
</tr>
<tr>
 <td align="right">15</td>
 <td align="right"></td>
 <td align="center">2025/10/13</td>
 <td><a target="1" href="https://x.com/wcinp/status/1977669553514799502">穿孔テープのDXFファイルを生成するツール作成</a></td>
 <td align="right">42</td>
 <td align="right">3.3万</td>
</tr>
<tr>
 <td align="right">16</td>
 <td align="right">★１</td>
 <td align="center">2025/11/21</td>
 <td><a target="1" href="https://x.com/wcinp/status/1991883027413377247">穿孔テープのリーダーをフルスクラッチで開発中</a></td>
 <td align="right">498</td>
 <td align="right">14万</td>
</tr>
<tr>
 <td align="right">17</td>
 <td align="right">★２</td>
 <td align="center">2025/12/03</td>
 <td><a target="1" href="https://x.com/wcinp/status/1996207353075773593">穿孔テープのリーダーをフルスクラッチで開発中でPuntareaderと命名</a></td>
 <td align="right">117</td>
 <td align="right">1.2万</td>
</tr>
<tr>
 <td align="right">18</td>
 <td align="right"></td>
 <td align="center">2025/12/15</td>
 <td><a target="1" href="https://x.com/wcinp/status/2000490534842851492">スクラッチで開発中の紙テープリーダー(Pantareader)のケースが完成</a></td>
 <td align="right">55</td>
 <td align="right">3,427</td>
</tr>
</table></center></font>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://piclabo.seesaa.net/article/PunchedTape005.html">
<link>https://piclabo.seesaa.net/article/PunchedTape005.html</link>
<title>穿孔テープの再現実験（その５）紙テープリーダーの開発（ケース作成）</title>
<description>フルスクラッチで開発中の穿孔テープリーダーのケース作成談</description>
<dc:subject>RetroDevice</dc:subject>
<dc:creator>skyriver</dc:creator>
<dc:date>2025-12-15T17:41:11+09:00</dc:date>
<content:encoded><![CDATA[
<br>
<font size="+0"><b>１．はじめに</b></font><!-------------------------------------><br>
　<a target="prev" href="https://piclabo.seesaa.net/article/PunchedTape004.html">前回の記事</a>で今回開発中の穿孔テープ（以降、紙テープと記す）リーダーに実装する機能について書きましたが、今回はケースの作成についてメモしておきたいと思います。<br>
<br>
<br>
<font size="+0"><b>２．ケース検討でネックになる点</b></font><!-------------------------------------><br>
　下の写真は今回作成した紙テープリーダー（Pantareader）の制御部の写真ですが、裏側の赤外線LEDへの電源供給のための白いコネクタのサイズが大きく、コンパクトなケースを設計する上でネックになりました。<br>

<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
紙テープリーダーの試作機（再掲）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('TapeReaderTop','https://piclabo.byte.jp/image/etc/PunchedTape/003/PhotPuntareader01.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/003/PhotPuntareader01.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
　そこで基板には電源用のケーブルを直付けしてケーブル同士をコネクタで接続する方式にしました。使用するコネクタは1.25mmピッチのマイクロコネクタです。AliExpressさんで手配したので届くまで一週間程度かかりました。<br>
　下の写真はマイクロコネクタを使って接続した様子です。ピッタリ収まりましたね^^<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
マイクロコネクタでの結線状態
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('MicroConnector','https://piclabo.byte.jp/image/etc/PunchedTape/005/PantareaderConnector.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/PantareaderConnector.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>３．ＣＡＤでのケース設計</b></font><!-------------------------------------><br>
　CADを使って設計したケースが下図になります。想定通りにコンパクトにまとまりました。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
紙テープリーダーのケース設計その１（ＣＡＤ画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCaseCad01','https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase01.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase01.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　ケースの上側を非表示にすると下図のようになります。下図では見えていませんが右サイドにはマイクロコネクタを格納するための空間を設けています。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
紙テープリーダーのケース設計その２（ＣＡＤ画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCaseCad02','https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase02.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase02.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　ケースの上側の内部が下図になります。ケースをコンパクトにするためにリーダー制御部が辛うじて格納できるサイズにしていて制御部の格納時に少し出っ張っているUSBコネクタが通る溝を設けました。格納作業はちょっとしたパズルのようになりますｗ<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ケースの内部設計その３（ＣＡＤ画面）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCaseCad03','https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase03.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/CadPuntareaderCase03.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>４．３Ｄプリンタでの出力</b></font><!-------------------------------------><br>
　紙テープリーダーの制御部をケースに入れた状態が下の写真です。<br>
　マイクロコネクタも綺麗に収まっていますね。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ケースに収めた制御部
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCase01','https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader01.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader01.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
　下の写真は完成した紙テープリーダーのです。いつもはPEIプレートの凹凸が上面に転写されてかなり綺麗に仕上がるのですが、試作造形作業の途中でフィラメントを交換してから少し不調です（１層目の流量を増やしたいのですが流量キャリブレーションしても変わらず）。<br>　<font size="-2">★追記　2025/12/17　動的流量キャリブレーションを行うことで問題の現象は８割方解決しました。<br></font>
右端の緑色の部分は制御基板のLEDの光です。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
完成した紙テープリーダー
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCase02','https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader02.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader02.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
完成した紙テープリーダー（その２）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCase03','https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader03.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/Pantareader03.jpg"></a>
		</td>
	</tr>
	<tr><td align="left"><font size="-2">※2025/12/20　追加</font></td></tr>
</table>
</center>
<br>
<br>
<font size="+0"><b>５．まとめ</b></font><!-------------------------------------><br>
　今回のケース作成ではコンパクトにするために制御部を格納できるギリギリの大きさで作ったので試作時の造形リトライ回数が普段よりも多めになってしまいました。また、ケース検討時に思い付きでマイクロコネクタに変更するために手配したり、今まで好調だったプリンタの調子が悪くなったりで、想定より時間が掛かってしまいました。<br>
　紙テープリーダーに関しては今回のケース作成で一段しましたので次のことを検討していきたいと思います。<br>
<br>
<br>
<div id="add20251216">★追記　2025/12/16<br></div>
　久々にＬＣＤ方式の３Ｄプリンタでもケースを造形してみました。<br>
　このような形状であればビルドプレートに対して斜めに配置するのが一般的だと思いますが、トップパネルの部分にビルトプレートの質感を転写したかったのでビルドプレートに直置きにしています。斜めの平面部分には積層ピッチが拡大されて現れてしまうことも斜めに配置したくない理由です。<br>
　そのままだとサポートとケースがボトム面付近で一体化してしまうので、ボトム設定で「Platform Touch Shape」を「none」に設定変更しています。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ＬＣＤ方式でのサポート生成状況
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCaseLcd','https://piclabo.byte.jp/image/etc/PunchedTape/005/PuntareaderCaseSlp.png')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/PuntareaderCaseSlp.png"></a>
		</td>
	</tr>
</table>
</center>
<br>
　下の写真は造形したケースです。LCD方式では評価のために最近購入しておいた「ELEGOO ABSライク3.0 8Kレジン」を使用しました。FDM方式で使用したフィラメントはPETGです。<br>
　色が違うので比較しにくいですが、LCD側は流石に文字などの細部まで綺麗に出力されていますが、側面では目視では見えない積層痕により光が変に反射されてしまいます。この問題は紫外線防止用のラッカー等を塗布すれば対処できますがFDM方式に比べ手が掛かるのに更なる手間は避けたいところです。<br>
　また、写真では判り辛いですがトップ面にはビルドプレートの質感がしっかり転写されていてしぶい感じに仕上がっています。<br>
　今回、ABSライクレジンを初めて使いましたが、確かに強度的には従来のものより靱性は高そうで、ケース作成にも使えそうです（経年変化の影響は現時点では未知数）。<br>
<br>
<center>
<table border="0">
	<tr>
		<td align="center" valign="center" bgcolor="blue">
			<font size=2 color="white">
ケースの造形比較（左：LCD方式、右：FDM方式）
			</font>
		</td>
	</tr>
	<tr>
		<td align="center" valign="top">
<a href="JavaScript:DspImg('PuntareaderCaseComparison','https://piclabo.byte.jp/image/etc/PunchedTape/005/PuntareaderSlaCase.jpg')"><image width="440" src="https://piclabo.byte.jp/image/etc/PunchedTape/005/PuntareaderSlaCase.jpg"></a>
		</td>
	</tr>
</table>
</center>
<br>


<br>
<br>
<br>
<a href="https://piclabo.seesaa.net/article/PunchedTape.html">[TOP]</a> <a href="https://piclabo.seesaa.net/article/PunchedTape004.html">[ 前へ ]</a> <a href="https://piclabo.seesaa.net/tag/BlogPanchedTape"><b>穿孔テープの再現実験</b></a> <a href="https://piclabo.seesaa.net/article/PunchedTape006.html">[ 次へ ]</a>
<br>
<br>
<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
</rdf:RDF>

