tag:blogger.com,1999:blog-16620074517175380192024-03-25T20:39:38.044+09:006809 / 6800とFLEXWindows上の仮想ドライブを用いて、シングルボードコンピュータで68用のOSであるFLEXを走らせる。Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.comBlogger145125tag:blogger.com,1999:blog-1662007451717538019.post-12486371947745618022024-03-25T20:38:00.001+09:002024-03-25T20:38:58.993+09:00FM-7/77用の自作基板(RS232Cカード、FT245通信カード、1024KB拡張RAMカード)のプチ改良<h4 style="text-align: left;"> FM-7/77用の自作基板3枚を少しですが改良しました</h4><p>改良版を製作したのは次の3カードです。</p><p>1.RS232Cカード</p><p> D-Sub9ピンコネクタに加えてTTL-USB変換ケーブル用コネクタを増設</p><p>2.768KB拡張RAMカード(1024KB拡張RAMカード改め)</p><p> 512KBのSRAMを2個搭載で1024KBですが、最上位の256KBを切り離して768KBにするジャンパスイッチを増設</p><p>3.FT245高速通信カード</p><p> 制御・データアドレスとして使用しているアドレス$FDFD,FEを$FD06,07に変更</p><p><br /></p><p><b>1.RS232Cカード</b></p><p>2019年10月26日のブログ「FM-7/77用RS-232Cカードの改良版」https://flexonsbd.blogspot.com/2019/10/fm-777rs-232c.html</p><p>などで紹介したものです。D-Sub9ピンコネクタが使用されているのですが、現在では、Windows機と接続するケーブルとしてはシリアル-USB変換ケーブルではなくTTL-USB変換ケーブルを使用する方が便利ですので、それ用の6ピンコネクタを増設しました。これに伴ってシリアル変換ICも実装不要になりました。</p><p>右上の6ピンソケットが増設したコネクタです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhhYjnCM7rrHv8pZwYtDB5jrBTpOzgiy4gFeQPj8J5sPjGIgcy6sh-U21mLuGQtXcDKe05wmM2nQIcLETg1Gp-fp3_h2G2xsbe4YdricwPqBBTEm3kN93mNd3pYfQJzqP6yPxciOGK-pzMQV__SZK0ex-tPrY86FbteE8Xx0W89XDaSRkxyK2RVxruaw8/s901/RS232C_R12.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="703" data-original-width="901" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhhYjnCM7rrHv8pZwYtDB5jrBTpOzgiy4gFeQPj8J5sPjGIgcy6sh-U21mLuGQtXcDKe05wmM2nQIcLETg1Gp-fp3_h2G2xsbe4YdricwPqBBTEm3kN93mNd3pYfQJzqP6yPxciOGK-pzMQV__SZK0ex-tPrY86FbteE8Xx0W89XDaSRkxyK2RVxruaw8/w400-h313/RS232C_R12.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RS232C_R1.2<br /></td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7b8dJ2J7-c8YBMx2LNU_-JtKOkhfNrzcKOhwBpe4swo7Q2E2u7JF2oGbbe69_DA8uxFZuK7PEO4NPLdvCo3Eg2y4xGJHCvcWsPPTh3ZoNg36Jd8IiNXbov7Jh-B4o28KU-x7QCMQvN8Mz446hjcmvQSFB5kyMkFKvbwqX80d7brawRelU1iyEd6k0K_U/s959/RS232C_%E8%A3%8F%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="648" data-original-width="959" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7b8dJ2J7-c8YBMx2LNU_-JtKOkhfNrzcKOhwBpe4swo7Q2E2u7JF2oGbbe69_DA8uxFZuK7PEO4NPLdvCo3Eg2y4xGJHCvcWsPPTh3ZoNg36Jd8IiNXbov7Jh-B4o28KU-x7QCMQvN8Mz446hjcmvQSFB5kyMkFKvbwqX80d7brawRelU1iyEd6k0K_U/w400-h270/RS232C_%E8%A3%8F%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">右上が増設したコネクタ</td></tr></tbody></table><p><br /></p><p>回路的にはただ単に8251からコネクタへ信号線を引き出しただけです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvJw2noMWGFlMIZEDlX46_xATfLnocYDfw9RS-V2itq5PxpjNy9eC7KKz4GN9m7zKMQeleXs6JSsGI2m357F45-ymScC8dAbTpjDxNwjnARa4NW4n7NyUymt6xOi8RzHYQXduyAfVh3cXLGIvXGRZu4Grn6vntjoZV2jd8TZcYPqhSPx_yndWC5XnpxN0/s3309/RS232C_R12%E5%9B%9E%E8%B7%AF%E5%9B%B3.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2339" data-original-width="3309" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvJw2noMWGFlMIZEDlX46_xATfLnocYDfw9RS-V2itq5PxpjNy9eC7KKz4GN9m7zKMQeleXs6JSsGI2m357F45-ymScC8dAbTpjDxNwjnARa4NW4n7NyUymt6xOi8RzHYQXduyAfVh3cXLGIvXGRZu4Grn6vntjoZV2jd8TZcYPqhSPx_yndWC5XnpxN0/w400-h283/RS232C_R12%E5%9B%9E%E8%B7%AF%E5%9B%B3.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RS232C回路図</td></tr></tbody></table><br /><br />使用したケーブルは以下のようなものです。ピン配置は1番ピンから順にGND, RTS, VCC, RXD, TXD, CTSになっていますが、VCCは接続しないのでピンを抜いてあります。<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFFu7mRj01f-Qgfe9jQJlUJvvxMRoL6aZkT7HgkvXuCRjkYek44GbdvX1it2Fe0dcuz5fHGHviQBrav1BbYDPb-3qyxyOCcdRIQjaYoQ8o36D0iiEEw3cnBapcVCrcAY7Xf435AzRu_8F9zu6tu0Cn42MNTkN63M3TyvTW-wvW9LY8v7XxOlwG-JA0mQA/s909/TTL-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="743" data-original-width="909" height="328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFFu7mRj01f-Qgfe9jQJlUJvvxMRoL6aZkT7HgkvXuCRjkYek44GbdvX1it2Fe0dcuz5fHGHviQBrav1BbYDPb-3qyxyOCcdRIQjaYoQ8o36D0iiEEw3cnBapcVCrcAY7Xf435AzRu_8F9zu6tu0Cn42MNTkN63M3TyvTW-wvW9LY8v7XxOlwG-JA0mQA/w400-h328/TTL-USB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用したTTL-USB変換ケーブル<br /><br /></td></tr></tbody></table><br /><br /><p><b>2.768KB拡張RAMカード</b></p><p>2023年7月16日のブログ「FM77AV40用1024KB増設RAMカードの製作」https://flexonsbd.blogspot.com/2023/07/fm77av401024kbram.html</p><p>で紹介したものです。対象のFM77AV40では増設できるメモリの最大値は768KBなので最上位の256KBは使用されません。無視されるだけで問題は無いとは思いますが、何となく気持ち的にすっきりしないので、回路的に最上位の256KBを無効にできるように切り替えスイッチを増設しました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH3oi-pb2I5xHHc4ar6xn13XaOK-NfJ6bx2pBlzbi-ePEgq9UAORjHG9Qk_9tg5l8fuixZpZhYDTVrJMEo-GDXCbgBdHAVZxGXfJgN2jGIKRZQkfo0J6_GE9UNZgJDA83rkWjdaLSe80MOvjwIMiOTNdFzb1K88lubymJti6ogvqJu3_XiLnM_u0Q_4HA/s940/%E6%8B%A1%E5%BC%B5RAM.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="686" data-original-width="940" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH3oi-pb2I5xHHc4ar6xn13XaOK-NfJ6bx2pBlzbi-ePEgq9UAORjHG9Qk_9tg5l8fuixZpZhYDTVrJMEo-GDXCbgBdHAVZxGXfJgN2jGIKRZQkfo0J6_GE9UNZgJDA83rkWjdaLSe80MOvjwIMiOTNdFzb1K88lubymJti6ogvqJu3_XiLnM_u0Q_4HA/w400-h293/%E6%8B%A1%E5%BC%B5RAM.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">512KB拡張RAM</td></tr></tbody></table><br />ちなみにこの48ピンコネクタは、知人が32ピンのコネクタ2個からニコイチで作成されたものをいただいて使用していますが、全く不都合はなく使用できています。<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqDWkxDZ9ivyb5pPveSvTHIAMzN1GzL6lITGe0yr4pGMhilqfdRfz830rdwpcoBFgWyyvZ7_KBNVoI3t-KpdZ83N8TYttVRaywiHxHVVTX8i6H0ctwRjCF99AxiwnjgCktRMvd00i8x8ThHlgH5H-gudne_E7Zg8avsdsCP-C1CX4bCvT7OSHhiQ97wZg/s2339/FM77AV40-EXRAM23%E5%9B%9E%E8%B7%AF%E5%9B%B3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqDWkxDZ9ivyb5pPveSvTHIAMzN1GzL6lITGe0yr4pGMhilqfdRfz830rdwpcoBFgWyyvZ7_KBNVoI3t-KpdZ83N8TYttVRaywiHxHVVTX8i6H0ctwRjCF99AxiwnjgCktRMvd00i8x8ThHlgH5H-gudne_E7Zg8avsdsCP-C1CX4bCvT7OSHhiQ97wZg/w400-h283/FM77AV40-EXRAM23%E5%9B%9E%E8%B7%AF%E5%9B%B3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">768KB拡張RAM回路図</td></tr></tbody></table><br /><div><br /></div><div><p><b>3.FT245高速通信カード</b></p><p>2023年10月23日のブログ「FT245通信カードの新基板の製作」https://flexonsbd.blogspot.com/2023/10/ft245.html</p><p>などで紹介したものです。オリジナルでは制御・データアドレスとして$FDFD,FEを使用しているのですが、このアドレスを他のカードが使用している可能性があるので$FD06,07に変更したものを作成しました。このアドレスはRS232Cカードが使用しているものなので、他のカードとバッティングすることはないと考えました。また、FT245カードとRS232Cカードは使用目的が同じなので同時使用することはないだろうと判断しました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDBuHhRYvHegb2r3YOkfS6KbnufoG8qFToKR5iAxcgqMk2CRcNfvDP7P4z-Sy7qSaCAiCxbslIkXoGRO1SqrlvBOAiktl-pTV2tRTpU0KGpdIBYFqbV4ItXe93asqcx8wP07sPbv7m3u2FQt2sFp0ugVTIZydcUSy6HhnlMdTU6iXQg_e3JyFFWrcGF4c/s897/FT245_R3.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="717" data-original-width="897" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDBuHhRYvHegb2r3YOkfS6KbnufoG8qFToKR5iAxcgqMk2CRcNfvDP7P4z-Sy7qSaCAiCxbslIkXoGRO1SqrlvBOAiktl-pTV2tRTpU0KGpdIBYFqbV4ItXe93asqcx8wP07sPbv7m3u2FQt2sFp0ugVTIZydcUSy6HhnlMdTU6iXQg_e3JyFFWrcGF4c/w400-h320/FT245_R3.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FT245_R3</td></tr></tbody></table><br /><p>74LS04を1個増設しただけでアドレスを変更できました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwmJIFojY5Uma-DuAE30Ilrk4epOduSp3eouAyGQG3mNFGdwsenZwOX4u1cTROv2QT6oF4lD1ZH-vmQ6Bx8IhifyywbIt7SlqFJrOW6miMaJT7IDrEunWdj_EsU8Uhdj6_xmhuPeSxu__FFuu_6CjJo8S6eBVEAoTJu7_y1cFAKNU_QElGTFCDTbUbHcU/s2339/FT245_R3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwmJIFojY5Uma-DuAE30Ilrk4epOduSp3eouAyGQG3mNFGdwsenZwOX4u1cTROv2QT6oF4lD1ZH-vmQ6Bx8IhifyywbIt7SlqFJrOW6miMaJT7IDrEunWdj_EsU8Uhdj6_xmhuPeSxu__FFuu_6CjJo8S6eBVEAoTJu7_y1cFAKNU_QElGTFCDTbUbHcU/w400-h283/FT245_R3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FT245_R3回路図</td></tr></tbody></table><br /><p>以上、自作のカードを少しでも使い易くするためにちょっとした改良を行ったという紹介でした。</p><p><br /></p></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-52451620744737443282024-03-24T23:01:00.021+09:002024-03-25T07:08:01.132+09:006800用GAMEインタプリタとコンパイラの6809への移植がようやく完成<h4 style="text-align: left;"> 6800用のGAMEインタプリタとコンパイラの6809への移植がようやく完成しました</h4><p>時代錯誤ではありますが、折を見ながら昔のマイコン時代に使用していたGAME言語を6809に移植する試みを続けていまして、今までに2回報告しています。</p><p>・2021年5月19日のブログ「6800用のGAMEインタプリタとコンパイラを6809に移植」https://www.blogger.com/blog/post/edit/1662007451717538019/285975797531168690</p><p>・2019年5月8日のブログ「6802基板でGAME68コンパイラを走らせる」https://www.blogger.com/blog/post/edit/1662007451717538019/2314144451913456377</p><p></p><p>できる限りオリジナルから改変せずに自作の6802/6809両用カードにインタプリタとコンパイラを移植することを目指したので、既に他の方々が実践されているような高速化・高機能化とは無縁ですが、移植過程の経験とソースを得られることが目標でした。</p><p>上記2回の報告では、とりあえず動作したというレベルでしたので、何とか完成させたいと折を見ながら取り組んできましたが、ようやく完成と言ってもよいものができあがりましたので紹介するとともに作成したファイルを公開します。</p><p><br /></p><p>作成に使用した自作マイコンですが、以前のブログで紹介したものと同じ6802/6809両用カードを使用しています。(見出しに画像を表示させるために以前と同じ画像を張り付けてあります。)</p><div><div class="separator" style="clear: both;"><br /></div></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0Aa-1kLnpvOijbkFE6zhTf8D01_VH3CDCAP-InUNUHVV7EdCOANrPCa7nNNUMil0o2QlEvbzfWbbddFkekaCciyHKOgkl25RQzuNvvmbA1fNR48vl7wCNXkBvjoGFNYkloqQUXLtoVQd2D4ZGCB4LfjSX0ue0Wz0zvKeRD-umJSf5n9AygxaYV9Zdkwg/s4032/DualBoard.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0Aa-1kLnpvOijbkFE6zhTf8D01_VH3CDCAP-InUNUHVV7EdCOANrPCa7nNNUMil0o2QlEvbzfWbbddFkekaCciyHKOgkl25RQzuNvvmbA1fNR48vl7wCNXkBvjoGFNYkloqQUXLtoVQd2D4ZGCB4LfjSX0ue0Wz0zvKeRD-umJSf5n9AygxaYV9Zdkwg/w400-h300/DualBoard.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">6802/6809両用カード</td></tr></tbody></table><div><div class="separator" style="clear: both;"><br /></div></div><p></p><p><br /></p><h4 style="text-align: left;">1.GAME3インタプリタ</h4><p>まずインタプリタですが、ASCII誌に連載されたオリジナルのGAME3に作者の大西氏が行編集機能を追加されたものを使用しています。</p><p>オリジナルのソースに追加する必要があるのはI/O関係の1文字入力、1文字出力、ブレーク判定ルーチンのみで、変更点はRUB,DELコード、RAM末アドレスなどですが、これらについてはソースプログラムを添付しますのでそれを見ていただければ分かると思います。</p><p><br /></p><h4 style="text-align: left;">2.GAME3コンパイラ</h4><p>前回のブログで紹介しましたが、ASCII誌に掲載された松島義明さんのH68/TR・TV用の「GAME68コンパイラ」を移植しました。(松島さんには申し訳ないのですが、名称をGAME3コンパイラに変更させていただきました。)</p><p>これはGAME3自身で記述されており、6809に移植しやすいということで使用しました。</p><p>基本的にはオリジナルのままで動作しますが、インタプリタ中のルーチンを使用していますので、上記のインタプリタとセットで使用します。</p><p>変更点は220行のモニタへのアドレス$F0B1と、オリジナルのままではコンパイル結果のバイナリを実行後に暴走しますので、80行の末尾にA:0)=$39を追加した2点のみです。</p><p><br /></p><h4 style="text-align: left;">3.GAME9インタプリタ</h4><p>6800用GAME3インタプリタを元にして、6809用GAME9インタプリタを作成するわけですが、以前のブログで報告しましたように、基本的にはソースプログラムが公開されていますのでその6800の命令を6809の命令に置き換えるだけです。</p><p>置き換えに当たってはスタックポインタをインデックスポインタとして使用している箇所や比較命令CPXを1バイトスキップに利用している箇所に注意するだけで良いはずなのですが、何と終了判定にプログラムコード中の$00を利用している箇所があり、6800と6809では命令の長さが異なるために判定位置がずれてしまうことに気づかず、最後まで悩まされました。</p><p>以上に注意しながらインタプリタのソースを書き換えた結果、正常に動作させることができました。出来上がったものは基本的にただ6800の命令を6809の命令に置き換えただけですので、他の方々が移植されたものとは速度や機能の面で劣りますが、とにかく正常に動作するソースが作成できたということで良しとします。</p><p><br /></p><h4 style="text-align: left;">4.GAME9コンパイラ</h4><p>続いて「GAME68コンパイラ」の移植に取り組みましたが、これも以前のブログで報告しましたが、まずランタイムルーチンのバイナリを逆アセンブルしてソースを起こし、それを6809の命令に書き換えました。</p><p>続いてコンパイラの移植ですが、まず、GAME自身で記述されているコンパイラのリスト中の、インタプリタ中のルーチンを呼んでいるアドレスを書き換え、次に、6800の命令コードを発行している箇所を見つけて6809の命令に置き換えました。 同じバイト数で置き換えられるものは単純に置き換えられるのですが、バイト数が変わる場合はそれに応じて、その周辺を書き換える必要がありました。</p><p>最後に、多少なりとも6809らしいコードを出力して欲しいということで、AccAとAccBの両方を使用している箇所をAccDに置き換える等を試みましたが、全てを置き換えることはできませんでした。</p><p>結果として作成したコンパイラですが、いくつかのサンプルプログラムを実行して正常にコンパイルできていることを確認し、最後にコンパイラ自身をコンパイルしてみました。</p><p>その結果、得られたバイナリが正常に動作しましたし、さらにそのバイナリでもう一度コンパイルしてみたところ、そのバイナリも正常に動作しました。</p><p>ただし、GAME9コンパイラ自身をコンパイルする過程では、最終行までコンパイルした後にハングアップしてしまいましたが、調べてみるとインタプリタに戻るアドレスが書き込まれていませんでしたので、手作業で該当の2個所に$0103を書き込むことで正常に動作するオブジェクトが得られました。</p><p>(この現象はGAME3でも同様でしたので、元のGAME68コンパイラに原因があるのではないかと思っていますが、コンパイルせずにそのまま使用した場合には正常に動作するので、原因については良く分かりません。)</p><p><br /></p><p>以上により得られたファイルは次のようです。</p><p>[1]GAME3</p><p>・GAME3EX インタプリタ</p><p>・GAME3C コンパイラ(GAME言語で書かれたもの)</p><p>・GAME3CC コンパイラオブジェクト(GAME3Cを自身でコンパイルしたもの)</p><p>・RELSUB3 コンパイラ用ランタイムルーチン($2000-212Aだが移動可能)</p><p>コンパイル結果のオブジェクトの実行開始アドレスはランタイムルーチンの先頭アドレス+$012Bです。</p><p><br /></p><p>[2]GAME9</p><p>・GAME9EX インタプリタ</p><p>・GAME9C コンパイラ(GAME言語で書かれたもの)</p><p>・GAME9CC コンパイラオブジェクト(GAME9Cを自身でコンパイルしたもの)</p><p>・RELSUB9 コンパイラ用ランタイムルーチン($2000-2106だが移動可能)</p><p>ランタイムルーチンがGAME3用よりも小さいのですが、操作を統一するためにコンパイル結果の実行開始アドレスをGAME3と同じランタイムルーチンの先頭アドレス+$012Bに揃えてあります。</p><p><br /></p><div><div class="separator" style="clear: both; text-align: left;">メモリマップです。</div><div class="separator" style="clear: both; text-align: left;">もちろんソースプログラムの位置は変更可能です。</div><div class="separator" style="clear: both; text-align: left;">コンパイラの方は、ランタイムやコンパイル結果の配置も変更可能です。</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM1CEH2pW2k7ArW9c3Ocmu4PQlJWJs3AGMq_tODRyOCUr8iWatOjxLLSNPgFH3lGxAH9RVYx2ZNGzQLOmET8Ff26BOWXLxuPSqe3oDUsR5lpwFoW8Nzy_DHfhs3_-sbMG8M4CyAiBdC67I-LyuJuj5GZmb0Sa164bq1EXq_jxSqsfSnW8-RSIRbcA5Av0/s1780/GAME%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97.jpg" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="1019" data-original-width="1780" height="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM1CEH2pW2k7ArW9c3Ocmu4PQlJWJs3AGMq_tODRyOCUr8iWatOjxLLSNPgFH3lGxAH9RVYx2ZNGzQLOmET8Ff26BOWXLxuPSqe3oDUsR5lpwFoW8Nzy_DHfhs3_-sbMG8M4CyAiBdC67I-LyuJuj5GZmb0Sa164bq1EXq_jxSqsfSnW8-RSIRbcA5Av0/w640-h366/GAME%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%9E%E3%83%83%E3%83%97.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br />メモリマップ</td></tr></tbody></table><br /></div><p>コンパイラの動作速度を知るために、参考までに、インタプリタで300行弱のコンパイラプログラムを実行(コンパイル)した場合と、コンパイル済みのオブジェクトでコンパイルした時の時間を測ってみました。</p><p>(1)GAME3</p><p> ・インタプリタでは、パス1終了までに4分30秒、パス2終了までに10分30秒</p><p> ・コンパイラでは、パス1終了までに約11秒、パス2終了までに約29秒</p><p>(2)GAME9</p><p> ・インタプリタでは、パス1終了までに4分11秒、パス2終了までに9分27秒</p><p> ・コンパイラでは、パス1終了までに約11秒、パス2終了までに約25秒</p><div>という結果でしたので、インタプリタとコンパイラの実行速度比はGAME3でおよそ22倍、GAME9でおよそ23倍となりました。</div><div><br /></div><div>作成したGAME9インタプリタとコンパイラをGAME3のそれと一緒に<a href="https://1drv.ms/u/s!Ags8oP_HCWjTnHYO_9ay2URH7WJR?e=bQTfxn" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。(GAME3のコンパイラについては、以前のブログで公開する際に作者の了解を得てあります。)</div><p><br /></p><p></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-53717357879526893532024-01-27T22:37:00.002+09:002024-01-28T09:52:44.384+09:00FT245高速通信カードを用いるファイル転送ソフトのCP/M版とOS-9版をアセンブラで書き直しました<h4 style="text-align: left;"> Cで書いたCP/M版とOS-9版が満足できなかったのでアセンブラで書き直しました</h4><p>先に作成したC版はサイズが12KB程度と大きく、そのために起動時や動作にやや時間がかかっていました。</p><p>その点が不満でしたのでアセンブラで書き直すことにしました。プログラム全体の構造はC版と同じで良いので、Cの命令をひとつひとつアセンブラの命令に置き換えていきました。CP/Mでのアセンブラ開発も初めてでしたので、命令表と首っ引きでしたが勘違いも多く、変なところで手間を食ったりしました。</p><p>結果、CP/M版もOS-9版もC版では12KBほどだったサイズが2KB程度と小さくなり、起動はもちろんですが動作も多少ですが速くなりました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZjI7MgSHmNsN_ov7NjyqqPR602b7EzY7B4A0xq6JNtm_IbYPCm3LtN3cmMLUBjDgTPX8gshUqA850oyalOtzrwE6c1vEoxjbXohcnitljyw98ynSL7eGA-cYoC3HYxuBFr1B7sJ4j-9FSYOpnhLWLUE-s4HARC8v4-hP3XmY-Qcg5Nif6VTxIMsisBMg/s747/OS9%E3%83%A1%E3%83%8B%E3%83%A5.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="637" data-original-width="747" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZjI7MgSHmNsN_ov7NjyqqPR602b7EzY7B4A0xq6JNtm_IbYPCm3LtN3cmMLUBjDgTPX8gshUqA850oyalOtzrwE6c1vEoxjbXohcnitljyw98ynSL7eGA-cYoC3HYxuBFr1B7sJ4j-9FSYOpnhLWLUE-s4HARC8v4-hP3XmY-Qcg5Nif6VTxIMsisBMg/w400-h341/OS9%E3%83%A1%E3%83%8B%E3%83%A5.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">OS-9メニュー画面</td></tr></tbody></table><br /><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY0DYXju-tSjmqZYtomEF668CzOkdRr2TqPnPVCxqLE6gJ-9OP5fnBxCEqgiA1VO6iNw4KnTb6wdHVVrS4laxc_wLeIIPF_48RkyYFdNpPORy3nwUZ5cWPf3dZUx7fi3BAn_R_QdzDXHY9nltqFfN84dC9SHzaR1zN9IdbpX8EPGJq-uNc4rHKIcHK48w/s907/CPM%E3%83%A1%E3%83%8B%E3%83%A5.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="801" data-original-width="907" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY0DYXju-tSjmqZYtomEF668CzOkdRr2TqPnPVCxqLE6gJ-9OP5fnBxCEqgiA1VO6iNw4KnTb6wdHVVrS4laxc_wLeIIPF_48RkyYFdNpPORy3nwUZ5cWPf3dZUx7fi3BAn_R_QdzDXHY9nltqFfN84dC9SHzaR1zN9IdbpX8EPGJq-uNc4rHKIcHK48w/w400-h354/CPM%E3%83%A1%E3%83%8B%E3%83%A5.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">CP/Mメニュー画面</td></tr></tbody></table><br /><p><br /></p><p>メニュー3,4のディレクトリ表示のために、CP/M版ではディレクトリ表示ルーチンを作成してサブルーチンとして組み込みましたが、残念ながらOS-9版では今のところ、コンパクトなディレクトリ表示ルーチンをアセンブラで作成できていませんので、メニュー3,4は動作しません。メニュー3,4が必要な場合はC版を使用することになります。(以前、仮想ドライブ構築ソフトOs9DrvWin.exeをCで作成したときに、ディレクトリ表示部にはかなり複雑な処理が必要でしたので、これをアセンブラで作成できるかどうかは分かりません。)</p><p>これでF-BASIC版、FLEX9版、CP/M版、OS-9版の全てがアセンブラで作成できましたので、ファイル転送ソフトslwinftの制作はこれで一区切りをつけようと思います。あとはこれらをツールとしてプログラム開発に生かしていくつもりです。</p><p>参考までに、私のプログラム開発の手順を図で示します。</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEins_cLIctTfmz2oe45LQW19Jb7u832phQSUuAynSpW1Bbq9fTkFebgwRzcNj559tJoe0C8c1YF89wCCzYzhqAbHQ1NCTenmIm0GLge6nV9ZsFrlWTqmIxBkALX0VYasj-KqAzF6DFtic7IzJwKMyruQhG_-OfXvMqjGk5rLAcr8HG7kCRvKNVI6wtpXyI/s1765/FT245.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="975" data-original-width="1765" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEins_cLIctTfmz2oe45LQW19Jb7u832phQSUuAynSpW1Bbq9fTkFebgwRzcNj559tJoe0C8c1YF89wCCzYzhqAbHQ1NCTenmIm0GLge6nV9ZsFrlWTqmIxBkALX0VYasj-KqAzF6DFtic7IzJwKMyruQhG_-OfXvMqjGk5rLAcr8HG7kCRvKNVI6wtpXyI/w400-h221/FT245.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br />プログラム開発の手順</td></tr></tbody></table><br /><p>これで一区切りとしますので、今までに制作したFM側のF-BASIC版、FLEX9版、CP/M版、OS-9版のslwinftとWindows側のslwinft245.exeを<a href="https://1drv.ms/u/s!Ags8oP_HCWjTnEciGuMfW5TYU2bP?e=4Q51Bf" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。ディスクイメージ転送ソフトft245も同梱してあり、簡単な使い方の説明も付けてあります。</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com3tag:blogger.com,1999:blog-1662007451717538019.post-36696305270571469862024-01-13T14:08:00.002+09:002024-01-13T14:08:43.909+09:00FT245高速通信カードを用いるファイル転送ソフトのCP/M版ができました<h4 style="text-align: left;"> これでようやく、F-BASIC版、FLEX9版、OS-9版、CP/M版の4種が揃いました。</h4><p>最後のCP/M版ができたので、FM-7で動作する全てのDOS(?)用の版(F-BASIC版、FLEX9版、OS-9版、CP/M版)が揃ったことになります。</p><p><br /></p><p>CP/M版の動作画面です。FM-7上の富士通版CP/M-80上で動作しています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4pj7jkHUgfEt659v46Oh7EP6ijLXMoYQkTVajily1b6dpMfOp1gbsiYUSE2AleC2B2IFvnWXH1NWyRwxO_7q9sZQE8PW1gZyWfArIR5pbhEEymCRyygC97OBPhNFoqlZjUFRpiqR6xzF-apXR4AulSruA5atr2gkXMhwfGlGgViwmrFF-XdK1VfjP2H8/s745/cpm.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="676" data-original-width="745" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4pj7jkHUgfEt659v46Oh7EP6ijLXMoYQkTVajily1b6dpMfOp1gbsiYUSE2AleC2B2IFvnWXH1NWyRwxO_7q9sZQE8PW1gZyWfArIR5pbhEEymCRyygC97OBPhNFoqlZjUFRpiqR6xzF-apXR4AulSruA5atr2gkXMhwfGlGgViwmrFF-XdK1VfjP2H8/w400-h363/cpm.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">CP/M版slwinft</td></tr></tbody></table><br /><p>しかし残念ながら、メニュー3,4のディレクトリ表示は未実装です。BDS-Cで書いたのですが、標準関数のexec()などではビルトインコマンドのdirは動作しないのです。ということで、dirコマンドに相当するものを作成する必要がありますが、それには時間がかかりそうです。</p><p>また、現在のところ、FM77AV2に装着してあるZ80Hカード(IDATEN)上のCP/Mでは何故か正常に動作していません。(ソフトは正常に動作しているように見えるのですが、実際にはファイルが転送されないのです...)AV2でもF-BASIC版など他の版では正常に転送できていますので、ハードには問題はないと思うのですが、原因はまだ分かっていません。</p><p><br /></p><p>蛇足ですが、純正のCP/M-80カードは大切に保管してあるので、普段は自作のカードを使用しています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGZegCdnVtjT4Pa5evd4aPfvsDxNVgQvIFGSdODXp6eG5oXzk1ysXAYDzBSqBwsvqAMAqBrc0TUgJohr7ot8wwAse5iaGqZZZyR6sE-V9Zyk-LhoynzwopywILAmEWZGjtGJRTWLan6PQS2dFlD2PMlUOzdZ8pB6ckdAiw_j4Nb10ShfQshAXnwGIfqM8/s738/cpm%E3%82%AB%E3%83%BC%E3%83%89.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="585" data-original-width="738" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGZegCdnVtjT4Pa5evd4aPfvsDxNVgQvIFGSdODXp6eG5oXzk1ysXAYDzBSqBwsvqAMAqBrc0TUgJohr7ot8wwAse5iaGqZZZyR6sE-V9Zyk-LhoynzwopywILAmEWZGjtGJRTWLan6PQS2dFlD2PMlUOzdZ8pB6ckdAiw_j4Nb10ShfQshAXnwGIfqM8/w400-h318/cpm%E3%82%AB%E3%83%BC%E3%83%89.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">自作CP/M-80カード</td></tr></tbody></table><br /><p><br /></p><p>完成度については、F-BASIC版>FLEX9版>OS-9版>CP/M版という感じで、特にCP/M版についてはBDS-Cを使うのは初めてということもあり、試行錯誤の連続でした。現在のところ、メニューの3,4は実行できませんし、動作速度もアセンブラで書いたF-BASIC版やFLEX9版より遅いようです。</p><p>しかし、今まではディスクイメージ全体を転送するソフトしかなく、2Dディスク一枚の転送に1分ほどの時間がかかっていたので、Windows上のエディタでプログラムソースを作成し、それを各DOSに転送してアセンブルやコンパイルするという手順の繰り返しが面倒でしたが、これらのファイル転送ソフトのおかげで大幅に時間が短縮できるようになりました。これらのソフトの開発中も、Windowsー>FM-7方向の転送部分をまず作成し、それを繰り返し使いながらソフト全体を仕上げていくことができました。(CP/Mに標準添付のエディタEDを流石に使う気にはなれないので、制作途中の手直しは全てWindows上のエディタで行うという開発スタイルです。)</p><p>完成度の低いOS-9版とCP/M版についてはこれからも改善していくことになると思いますが、とりあえず一段落したということにして作成した4種の版をまとめて<a href="https://1drv.ms/u/s!Ags8oP_HCWjTnDTA2mid8mxk5UQJ?e=DQh7Ox" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。CP/M版以外の版も細かい修正を重ねていますので、ここに上げたものが最新版となります。また、ディスクイメージ転送ソフトも含まれています。</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-25376084352719799422023-12-15T19:45:00.030+09:002024-01-13T23:21:47.778+09:00FT245高速通信カードを用いるファイル転送ソフト(FLEX9版とOS-9版改)<p> </p><h4>F-BASIC版、OS-9版に続いてFLEX9版を作成すると共にOS-9版を微修正しました<br /></h4><div><br /></div><div>【2024年1月13日追記】F-BASIC版、OS-9版、FLEX9版、CP/M版の最新版を1月13日のブログ「<a href="https://flexonsbd.blogspot.com/2024/01/ft245cpm.html" target="_blank"><span style="color: #2b00fe;">FT245高速通信カードを用いるファイル転送ソフトのCP/M版ができました</span></a>」にアップしましたので、このブログのOneDriveを削除しました。</div><div><br /></div><div>【12月17日追記】OneDriveに上げたファイルの中のOS-9版が古いものでしたので、最新版に差し替えました。</div><div><br /></div><div>ようやくFLEX9版ができあがり、これでCP/Mを除いて3つの環境でファイルをFMとWindowsPC間でファイルを自由に転送することができるようになりましたので、Windows上の慣れたエディタで作成したプログラムをFMに転送して最後の仕上げ作業をするという一連の流れがよりスムーズに進められるようになりました。(以前はRS232を使用したものを使っていたのですが、転送時間が格段に短くなりました。)</div><div><br /></div><div>CP/M版の作成は80系の知識がない自分にとっては敷居が高く、時間がかかりそうですので、とりあえず、これまでのまとめとして3種の版をまとめて紹介しておきます。</div><div><br /></div><h4 style="text-align: left;">まずはWindows側のslwinft245.exeです。</h4><div><br /></div><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrz8awaWz7BYxGa1dnwpq2ImBM7OLJsDXw-DJD6vIOgyzO_fFapn5UpDUBINZwFrXuxLNlRQwCL6C85wH6ZsVpUWC3a57_T13ToW6IdYQzDcL45cLwSLNNHjcmN0kvMrX9N6K7XcJP6asB3R-6J6WgfheYYSmsUR_15DNgkeM0toZuesC1jNKodttuSN4/s623/slwinft245.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="332" data-original-width="623" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrz8awaWz7BYxGa1dnwpq2ImBM7OLJsDXw-DJD6vIOgyzO_fFapn5UpDUBINZwFrXuxLNlRQwCL6C85wH6ZsVpUWC3a57_T13ToW6IdYQzDcL45cLwSLNNHjcmN0kvMrX9N6K7XcJP6asB3R-6J6WgfheYYSmsUR_15DNgkeM0toZuesC1jNKodttuSN4/w400-h214/slwinft245.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">slwinft245.exe</td></tr></tbody></table></div><div><br /></div><div><br /></div><div>F-BASIC版、OS-9版、FLEX9版に共通して使用できます。</div><div>COMポートはbaud:115200以上, 8bit, non-parity, 1stop bit に設定します。</div><div>また、FT245通信カードのTXE機能はOFFのままで構いません。</div><div><br /></div><h4 style="text-align: left;">FM側のドライブソフトです。</h4><div><br /></div><div>(1)F-BASIC版です</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh19qBg-S7WcYS8sJA4c1zb95RY81lmVV9neCk_MpEnk_azBItJA_iD6PCmsvbVseMzE4i5JqdHMax6j0HLgOczbk-Q1zrpDLaL2tPcC6l3AjP-bmHYGR24OG-iwbysqnILaWG-WUCQrL7coezNoNeYKedypBGdsbA161RIMc4uQ2feHLqrE70Glth88Ro/s747/FBASIC%E7%89%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="746" data-original-width="747" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh19qBg-S7WcYS8sJA4c1zb95RY81lmVV9neCk_MpEnk_azBItJA_iD6PCmsvbVseMzE4i5JqdHMax6j0HLgOczbk-Q1zrpDLaL2tPcC6l3AjP-bmHYGR24OG-iwbysqnILaWG-WUCQrL7coezNoNeYKedypBGdsbA161RIMc4uQ2feHLqrE70Glth88Ro/w400-h400/FBASIC%E7%89%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">F-BASIC版のSLWINFT</td></tr></tbody></table><br /><div><br /></div><div>(2)OS-9版です</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIO9b4249xcwhqLPngfW3CM8VYYcPkmG0R3KxNd1eF24t4c3opGj3SS8aQAdypDvkXC-KBG7cpKIzOJAg7TYARodSsl5Iow4ua9JVvTZrzwDQ3w7HC-Z8_z7liuF4wFaD5TSKMV8pH4VS42jSHZNADkor2sF_gh91uQpJkLKbnj5xKRqS2x8eZUGEBu80/s751/OS9%E7%89%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="686" data-original-width="751" height="365" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIO9b4249xcwhqLPngfW3CM8VYYcPkmG0R3KxNd1eF24t4c3opGj3SS8aQAdypDvkXC-KBG7cpKIzOJAg7TYARodSsl5Iow4ua9JVvTZrzwDQ3w7HC-Z8_z7liuF4wFaD5TSKMV8pH4VS42jSHZNADkor2sF_gh91uQpJkLKbnj5xKRqS2x8eZUGEBu80/w400-h365/OS9%E7%89%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">OS-9版のslwinft</td></tr></tbody></table><br /><div><br /></div><div>前回のブログのものではディレクトリを表示するメニュー項目がありませんでしたが、追加することができました。また、FM-7用のOS-9LevelIで動作することも確認しました。</div><div><br /></div><div>(3)FLEX9版です</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIe9kLHWU2HathnP2yuGuYA63H2QgS2DjnNQayKq8-N6Z2Ho-E8yDNeAhBuwLnrCHe050OZgqF_ax_keaF-PWKtE4iWXjMolNwAW3om0SqQ2qMWGvXWxPsSGw1SNcbZ3mmQ11fFJ_1lqjJFfolKDdCexvokNxbJn0g5JEfcdiNZM8uVfSNMyS1BTiIODc/s748/FLEX9%E7%89%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="701" data-original-width="748" height="375" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIe9kLHWU2HathnP2yuGuYA63H2QgS2DjnNQayKq8-N6Z2Ho-E8yDNeAhBuwLnrCHe050OZgqF_ax_keaF-PWKtE4iWXjMolNwAW3om0SqQ2qMWGvXWxPsSGw1SNcbZ3mmQ11fFJ_1lqjJFfolKDdCexvokNxbJn0g5JEfcdiNZM8uVfSNMyS1BTiIODc/w400-h375/FLEX9%E7%89%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FLEX9版のSLWINFT</td></tr></tbody></table><br /><div><br /></div><div>見てわかりますようにメニューはほとんど同じにしてあり、操作性もほとんど同じですが、処理対象のドライブ指定だけは、OS-9やFLEX9ではOSであらかじめ指定できるのに対して、F-BASICではできないのでメニューでドライブ変更できるようにしてあります。ただし、メニューからディレクトリ表示できるのはドライブ0と1だけです。(メニューソフトはF-BASICで書いてありますので、簡単に書き換えることができますが。)</div><div><br /></div><div><strike>以上の3つのOS(F-BASIC版、OS-9版、FLEX9版)に対応したソフトを<span>OneDrive</span>に上げておきますので、</strike>FT245高速通信カード(RAMディスク付きも)をお持ちの方は自由にご使用ください。</div><div><br /></div><div><div>【<strike>12月17日追記】差し替えたのはOS-9版のみで、他は変更していません。</strike></div></div><div><br /></div><div><strike>【2024年1月4日追記】最新版を<span style="color: #2b00fe;">OneDrive</span>に上げました。</strike></div><div><br /></div><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-63242732599866769802023-12-07T21:22:00.003+09:002023-12-15T19:57:37.853+09:00FT245高速通信カードを用いるファイル転送ソフト(F-BASIC版とOS-9版)<h4 style="text-align: left;"> FT245高速通信カードを用いるファイル転送ソフトのF-BASIC版とOS-9版を作成しました</h4><div style="text-align: left;"><br /></div><div style="text-align: left;">【追記】Windows側のslwinft245.exeの機能拡張やOS-9版の修正をしましたので、次のブログ「<a href="https://www.blogger.com/blog/post/edit/1662007451717538019/2537608435271979942" target="_blank"><span style="color: #2b00fe;">FT245高速通信カードを用いるファイル転送ソフト(FLEX9版とOS-9版改)</span></a>」の方にソフトの公開を移動しました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">今までFT245高速通信カードを用いる場合には、2D(2DD)ディスクを丸ごと転送するディスク転送ソフト(FDDIMG_RW77.exeやFT245DRV.exe)を使用していました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">しかし、いくら高速とはいえ2Dディスクで約1分、2DDディスクで約2分かかりますので、ファイルを一つだけコピーしたい場合には時間がかかりすぎです。</div><div style="text-align: left;">特に、Windows上の慣れたエディタで作成したプログラム等をF-BASICやOS-9等に転送して使用するという、私のプログラム開発の手順の中では転送時間が長いのは致命的です。</div><div style="text-align: left;">ということで、ディスク転送ソフトではなくファイル転送ソフトが必要と感じていました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">ディスク転送ソフトの場合にはOSの種類によらず、40(80)トラック、16x2セクタ/トラック</div><div style="text-align: left;">のディスクであればF-BASIC上のドライブソフトで転送できましたが(ただし、FLEX9だけは32セクタ/トラックなので転送できない)、ファイル転送の場合にはOSの機能を用いてファイルを読み書きしますので、当然OSに依存することになります。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">ということで、まずは使用頻度の高いF-BASIC版を作成し、続いてOS-9版も作成しました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Windows側のslwinft245.exeはもちろん、全OS共通です。</div><div style="text-align: left;">起動後にCOMポートとOSの選択をしたのちに使用可能状態になります。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_kDlNW5MWXTikyUrCq0anFgkT6jzFti2AfT6w3pFJlRuq0bfH4IpXWefuQTiQ-DqpYpNf8tO2R9kjxdG1krjyfjSOIYtOIm3-TaeKwVQRHTijlcssiJuecKRMHuunGOYB5ts-WwN0xpv94pFzjNiVA9Zq2gLM8ZumTuZGtUM-41qffem6-W7pIfnqCSk/s601/slwinft_V14.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="332" data-original-width="601" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_kDlNW5MWXTikyUrCq0anFgkT6jzFti2AfT6w3pFJlRuq0bfH4IpXWefuQTiQ-DqpYpNf8tO2R9kjxdG1krjyfjSOIYtOIm3-TaeKwVQRHTijlcssiJuecKRMHuunGOYB5ts-WwN0xpv94pFzjNiVA9Zq2gLM8ZumTuZGtUM-41qffem6-W7pIfnqCSk/w400-h221/slwinft_V14.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Windows側のslwinft245</td></tr></tbody></table><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><br /><div style="text-align: left;"><br /></div><div style="text-align: left;">FM-7/77側のドライブソフトはOSに依存しますので、それぞれのOS用に作成しました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h4 style="text-align: left;">【1】F-BASIC用のSLWINFT</h4><div style="text-align: left;"><br /></div><div style="text-align: left;">まずF-BASIC用のSLWINFTを紹介します。</div><div style="text-align: left;">対象ドライブはデフォルトで1ですが、もちろん変更できます。</div><div style="text-align: left;">TXE機能のON,OFFはFT245通信カードの設定と一致させます。</div><div style="text-align: left;">(TXE機能がないカードの場合はOFFに設定します。)</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUxS9gM1eAuyuC8YkKKHAMRSId_WrMHAWFPWacLV1n4G-eUU30mh8CxH1wLpuoqrM7dQnM6V3SxU0oRdtFfXcE5fruU2FafLMF-cWqh7t_su9-MP-tJ9OXv9je0XBLDPUGSZa0FBvEMfD1o2NXX0ob-OASjQxF5kJyJaj4oW72zpacm8rAuXvvn48cDE/s738/SLWINFT.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="629" data-original-width="738" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcUxS9gM1eAuyuC8YkKKHAMRSId_WrMHAWFPWacLV1n4G-eUU30mh8CxH1wLpuoqrM7dQnM6V3SxU0oRdtFfXcE5fruU2FafLMF-cWqh7t_su9-MP-tJ9OXv9je0XBLDPUGSZa0FBvEMfD1o2NXX0ob-OASjQxF5kJyJaj4oW72zpacm8rAuXvvn48cDE/w400-h341/SLWINFT.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FM-7/77側のSLWINFTメニュー</td></tr></tbody></table><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">使用するソフト</div><div style="text-align: left;">〇FM-7/77側 メニュープログラムSLWINFT(F-BASIC)を実行する。</div><div style="text-align: left;"> 起動時に機械語サブプログラムSLWINFToが読み込まれる。</div><div style="text-align: left;"> (SLWINFToは&H6000~&H61E7に配置される)</div><div style="text-align: left;">〇WindowsPC側 SLWINFT245.exeを実行する。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">動作環境</div><div style="text-align: left;">〇FM-7 F-BASIC V3.0</div><div style="text-align: left;">〇FM77AV2 F-BASIC V3.0、V3.3</div><div style="text-align: left;">〇FM77AV40SX F-BASIC V3.0、V3.4</div><div style="text-align: left;">以上の環境で動作することを確認してあります。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">使い方</div><div style="text-align: left;">◎WindowsPC -> FM-7/77 への転送</div><div style="text-align: left;"> FM-7/77側でメニュー2を選択する。</div><div style="text-align: left;"> Windows側で転送するファイルを選択(ドラッグ&ドロップまたは直接書き込み)して「FMへの書き込み」ボタンを押す。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"> FM-7/77側に既に同名のファイルが存在する場合には、重ね書きをするかどうかを選択できます。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"> ファイル種別は自動的に判別しますが、通常のバイナリファイルの場合は先頭に5バイトのヘッダー、末尾に5バイトのフッターが必要ですので、そのための情報として保存アドレスと実行アドレスをセットします。(既にヘッダー、フッターがついているファイルの場合はそのまま転送されます。)</div><div style="text-align: left;"><br /></div><div style="text-align: left;">◎FM-7/77 -> WindowsPC への転送</div><div style="text-align: left;"> Windows側で読み込んだファイルを保存するファイル名をセットして、「FMから読み込み」ボタンを押す。</div><div style="text-align: left;"> FM-7/77側のファイル名と異なるファイル名でも構いません。</div><div style="text-align: left;"> FM-7/77側でメニュー1を選択し、転送するファイル名を入力してEnterキーを押す。</div><div style="text-align: left;"> 存在しないファイル名を入力した場合にはエラーメッセージが出て、再入力を促されます。</div><div style="text-align: left;"> 機械語ファイルの場合にはヘッダーとフッターが削除された通常のバイナリファイルとして保存されます。(読み取った保存アドレスと実行アドレスは画面上に表示されます。)</div><div style="text-align: left;"><br /></div><div style="text-align: left;">その他</div><div style="text-align: left;"> FM-7/77側ではドライブ番号をメニュー3で変更できます。</div><div style="text-align: left;"> また、メニュー4でTXE機能を使用するかしないかを選択できます。通常は機能OFFで問題はありません。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h4>【2】OS-9用のslwinftos9</h4><div style="text-align: left;"><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi9tEaOCzVhizfKmCCRVFrl3ybdIf_F-2kM5e7qhyphenhyphenmV9vLNKF9teg-oNYYuSiy4JGKx0fpjm82H806FVVDbTfD4T-M63d1_SVomlqe7-cWwb5OyDD2SONKmOxCFrewnKru-Tee0et1knrEFCYr0wm1KImmRrdpGsfTpYocg0ii28kXWlGx3Eumz32TG4s/s732/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="364" data-original-width="732" height="199" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi9tEaOCzVhizfKmCCRVFrl3ybdIf_F-2kM5e7qhyphenhyphenmV9vLNKF9teg-oNYYuSiy4JGKx0fpjm82H806FVVDbTfD4T-M63d1_SVomlqe7-cWwb5OyDD2SONKmOxCFrewnKru-Tee0et1knrEFCYr0wm1KImmRrdpGsfTpYocg0ii28kXWlGx3Eumz32TG4s/w400-h199/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">OS-9側のslwinftos9のメニュー</td></tr></tbody></table><br /><div><br /></div><div>使用するソフト</div><div>〇FM側 ドライブプログラムslwinftos9を実行する。</div><div>〇WindowsPC側 SLWINFT245.exe(F-BASIC版と同じ)を実行する。</div><div><br /></div><div> (FM側のslwinftos9をどうやってOS-9に読み込むかですが、OS-9のディスクもF-BASIC</div><div>上のディスク転送ソフトft245drvで転送できますので、これを利用してOS-9のディスクに</div><div>読み込みます。)</div><div><br /></div><div>動作環境</div><div>〇FM77AV40SX OS-9Level2</div><div> <strike>Level1では動作確認をしていません</strike></div><div> 【12月15日追記】動作することを確認しました。</div><div><br /></div><div>使い方</div><div>◎WindowsPC -> FM への転送</div><div><br /></div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjeVKlHxzTQqU8ZxEKGd5K0EGkV5wmdAiqV9wGmqPK1EZTn2IvOirQHYNQs_0DhowVf1vsPN3eW6pdcR2oLMgG-5Q0-xtQEQAhdIiaWmQustprp3w8XaEbXRh6Wpf6qorVwVmhPvJYDDRn43w5MTdYi0LYn85KsfwNV6Q5lqwHIdgyVa5GMGWkOCVoC5s/s751/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%EF%BC%92.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="492" data-original-width="751" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjeVKlHxzTQqU8ZxEKGd5K0EGkV5wmdAiqV9wGmqPK1EZTn2IvOirQHYNQs_0DhowVf1vsPN3eW6pdcR2oLMgG-5Q0-xtQEQAhdIiaWmQustprp3w8XaEbXRh6Wpf6qorVwVmhPvJYDDRn43w5MTdYi0LYn85KsfwNV6Q5lqwHIdgyVa5GMGWkOCVoC5s/w400-h263/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%EF%BC%92.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">メニュー2の実行例<br /></td></tr></tbody></table></div><div><br /></div><div> FM側でメニュー2を選択する。</div><div> 「Send file from Windows...」が出て受信モードに入る。</div><div> Windows側で転送するファイルを選択(ドラッグ&ドロップまたは直接書き込み)して「FMへの書き込み」ボタンを押す。このファイル名でFMに保存される。</div><div><br /></div><div> FM側に既に同名のファイルが存在する場合には上書きされる。</div><div><br /></div><div> ファイル種別は自動的に判別するので、実行モジュールファイルとテキストファイルのどちらであっても構わない。</div><div><br /></div><div>◎FM -> WindowsPC への転送</div><div><br /></div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlKGiyCFp-TMJhqjQxY93ebXNkADmRmOsg3l21hV1efLR-wrQTrBWXQfjnfWbhyfGY0KOPgrmrsTwsNyUkGRepPVvtPA_YiIOykriu9bxnDr0uvvRzKpittkW5IPPxPTCNCg183Ak3LyQmL6AdlIYPjgbMFUuMbN7-ay5kQTzpjACu2hmJ_V7XgCjx8qQ/s718/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%EF%BC%91.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="532" data-original-width="718" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlKGiyCFp-TMJhqjQxY93ebXNkADmRmOsg3l21hV1efLR-wrQTrBWXQfjnfWbhyfGY0KOPgrmrsTwsNyUkGRepPVvtPA_YiIOykriu9bxnDr0uvvRzKpittkW5IPPxPTCNCg183Ak3LyQmL6AdlIYPjgbMFUuMbN7-ay5kQTzpjACu2hmJ_V7XgCjx8qQ/w400-h296/OS9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%EF%BC%91.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">メニュー1の実行例<br /></td></tr></tbody></table><div><br /></div><div> FM側でメニュー1を選択する。 </div><div> Windows側で読み込んだファイルを保存するファイル名をセットして、「FMから読み込み」ボタンを押す。</div><div> FM側のファイル名と異なるファイル名でも構いません。</div><div> FM側でメニュー1を選択し、表示「Input file name:」に続いて転送するファイル名を入力してEnterキーを押す。</div><div> 存在しないファイル名を入力した場合にはメニューに戻ってしまうので、最初からやり直す。</div><div><br /></div><div>その他</div><div> メニュー3でTXE機能を使用するかしないかを選択できます。通常は機能OFFで構いません。</div><div><br /></div></div><div style="text-align: left;">現在のところはF-BASIC版とOS-9版のみですが、順次CP/M版、FLEX9版を作成する予定です。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><strike>現在のF-BASIC版とOS-9版をOneDriveに上げておきます</strike>ので、FT245高速通信カード(RAMディスク付きも)をお持ちの方は自由にご使用ください。</div><div style="text-align: left;">【12月15日追記】ソフトの公開は12月15日のブログに移動しました。</div><div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br />Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-87693907652905356142023-11-17T21:14:00.018+09:002023-11-19T22:56:02.569+09:00PC-G850V用USB-シリアルケーブルの作成<h4 style="text-align: left;"> 以前作成してあったPC-G850V用のUSB-シリアルケーブルを新たに作り直しました</h4><p>いつも興味深い記事が連載されているskyriverさんのブログ「<a href="https://piclabo.blog.ss-blog.jp/" target="_blank"><span style="color: #2b00fe;">PICマイコンは面白い</span></a>」で、以前、PC-G850Vを入手されたという記事を読み、そういえば昔、同僚が面白いと言っていたポケコンだなと思い出し、私も入手してみました。同時に、skyriverさんが作られた<a href="https://piclabo.blog.ss-blog.jp/G850VSerialCable" target="_blank"><span style="color: #2b00fe;">USB-シリアルケーブル</span></a>を見習って同様なケーブルを作って使用してきました。</p><p>それがこれです。</p><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHEIV5M99o-gWilgV3Hn1KAmqme5z8tTLC3gF-0qOFGBng4PPxUaqd3Gup9aeVfuqN_lyptNoPvQadSfdo7XWqeLsEHmVqcezBK_Ec_ICIycBLzzbPG24DBhE1i0BXc29g8PE4mSSkBnbi6WcLlwVosGtXfdSOCUxje52SHxW1laWGtjvT_6eO4Wyg4S0/s977/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E5%85%83%EF%BC%91.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="732" data-original-width="977" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHEIV5M99o-gWilgV3Hn1KAmqme5z8tTLC3gF-0qOFGBng4PPxUaqd3Gup9aeVfuqN_lyptNoPvQadSfdo7XWqeLsEHmVqcezBK_Ec_ICIycBLzzbPG24DBhE1i0BXc29g8PE4mSSkBnbi6WcLlwVosGtXfdSOCUxje52SHxW1laWGtjvT_6eO4Wyg4S0/w400-h300/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E5%85%83%EF%BC%91.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">以前作成したケーブル</td></tr></tbody></table><br /><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-31O9r-LcON0BNk0RsUb_YVjKKM2jf4MhSEcLllY9wTRw0Swhp2nfZoD45WhOGUCvxIG9DBh61MPgMljIJFveaDtw6EelLF0kdPtmv8RobLu8OTYER3qAjViCjB_Mxhx9A70vEJemLxZsEhKNIfCLniKXvubEtfsoAeO1XGlauXBpimJlxSPE7cBfSWI/s981/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E5%85%832.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="732" data-original-width="981" height="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-31O9r-LcON0BNk0RsUb_YVjKKM2jf4MhSEcLllY9wTRw0Swhp2nfZoD45WhOGUCvxIG9DBh61MPgMljIJFveaDtw6EelLF0kdPtmv8RobLu8OTYER3qAjViCjB_Mxhx9A70vEJemLxZsEhKNIfCLniKXvubEtfsoAeO1XGlauXBpimJlxSPE7cBfSWI/w400-h299/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E5%85%832.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">そのアダプタ部</td></tr></tbody></table><br /><p></p><div><div>74HC00をインバータとして使用して、TxD,RxD,RTS,CTSを反転してUSB-TTL変換ケーブルに接続しているだけです。</div><div><br /></div><div>機能的にはこれで十分でしたので、skyriverさんの実践をそのまま後追いする形で楽しく遊んできましたが、流石にCP/Mを走らせるまではやってみるつもりはありませんでした。</div><div><br /></div><div><br /></div><div>ところが、skyriverさんが開発されたCP/Mも実行できる<a href="https://piclabo.blog.ss-blog.jp/EborsyEEP_Usage" target="_blank"><span style="color: #2b00fe;">増設メモリボード(EborsyEEP)</span></a>を見て、そのコンパクトさと実用性に感心してしまいBOOTHで購入させていただきました。</div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2L8ESu_pAYsMpKecn5U4LpSpfMAQQ2-1Nat_x3mjtU9O5qvP-9cL9IooxnLLLbaxcSFSF6TQbwj0yv11Ke2CJNhQO2SFwSWu4Ah1BhakEcMt8JyeggdjJtfLcwLYIbGLo0B02EgOgYkHOCCV7957Dl3xx1ODM5sL7-Ut5ra8vzumsaYQvMKF_GhtFr1E/s632/%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="632" data-original-width="381" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2L8ESu_pAYsMpKecn5U4LpSpfMAQQ2-1Nat_x3mjtU9O5qvP-9cL9IooxnLLLbaxcSFSF6TQbwj0yv11Ke2CJNhQO2SFwSWu4Ah1BhakEcMt8JyeggdjJtfLcwLYIbGLo0B02EgOgYkHOCCV7957Dl3xx1ODM5sL7-Ut5ra8vzumsaYQvMKF_GhtFr1E/s320/%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF.JPG" width="193" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">見つけたコネクタ</td></tr></tbody></table>さらに純正の電源も入手したので、これで本格的に遊べると思っていたところに、偶然PC-G850のシリアル端子用のコネクタを入手することができました。(右画像)</div><div>これでしたら、ピンの両側にガイドが付いているので安定感があります。</div><div><br /></div><div>ということで、これを使用してUSB-シリアルケーブルを作成しようと考えてネットで参考資料を探していたところ、「<a href="http://www.charatsoft.com/software/pocket-computer/usb_serial.html" target="_blank"><span style="color: #2b00fe;">ポケコン用USB通信ケーブルを作ろう</span></a>」というサイトに、変換ケーブルがFTDI社のチップを使用していればFT_PROGというユーティリティを用いてピンの極性を反転させることができると書かれてありました。</div></div><div><br /></div><div>私のケーブルは以前紹介しましたように、格安で入手したものですので、FTDI社の純正チップではないだろうと思ったのですが、試してみたところFT_PROGで認識できて、無事に書き換えることができました。</div><div><br /></div><div>書き換えたケーブルを用いることで、アダプタの機能としては単なるケーブルの6ピンとPC-G850Vの11ピンとの間を接続するだけで良いことになります。</div><br />作成したアダプタです。<div>裏面画像で分かりますように、単なるピン間を接続しているだけです。<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk-8WcIGobBbGGvFCqNXQGgucLf9r2cbbXDVZ04vwWxegujg8HdbTGO_Pi5PucgNP-rI5b5Vsp3ZU0_T-xGScS75GzfipQYi6XH0WRRnxdbuousk2sVvRDftF8uIY92xfsUO9DVT6aP-Hx6v7GZrF8pT1dQcOcI4Cj3EXAHmbN6Xnf1wY14uHRfSThSn0/s1428/%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E8%A1%A8%E8%A3%8F.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="911" data-original-width="1428" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk-8WcIGobBbGGvFCqNXQGgucLf9r2cbbXDVZ04vwWxegujg8HdbTGO_Pi5PucgNP-rI5b5Vsp3ZU0_T-xGScS75GzfipQYi6XH0WRRnxdbuousk2sVvRDftF8uIY92xfsUO9DVT6aP-Hx6v7GZrF8pT1dQcOcI4Cj3EXAHmbN6Xnf1wY14uHRfSThSn0/w400-h255/%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E8%A1%A8%E8%A3%8F.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">アダプタ表面・裏面</td></tr></tbody></table><br /><br />FT_PROGで書き換えたケーブルと組み合わせます。<br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwMSdKS-mrqAZ4u8SrEp0O8GZMzquk73243fRydTs-lx_jwRDWZFObHFrUc8fKGcxZ3adnyN_rAixRbxfrxD7tZ1NKNfbyF0L8o2AqeUMvRvUGdSLDw6k_g_kWx9XL1DwieznYNiFMXe-K8lJ15bpDCLW70zG_CK78DFzcw5BEWHXZrA6yjb-4aTooRPk/s980/%E6%96%B0USB-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="710" data-original-width="980" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwMSdKS-mrqAZ4u8SrEp0O8GZMzquk73243fRydTs-lx_jwRDWZFObHFrUc8fKGcxZ3adnyN_rAixRbxfrxD7tZ1NKNfbyF0L8o2AqeUMvRvUGdSLDw6k_g_kWx9XL1DwieznYNiFMXe-K8lJ15bpDCLW70zG_CK78DFzcw5BEWHXZrA6yjb-4aTooRPk/w400-h290/%E6%96%B0USB-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">新USB-シリアルケーブル</td></tr></tbody></table><br /><br />最後に動作画面を載せておきます。</div><div>右端のシステムバスに装着してあるのが増設メモリボード(EborsyEEP)です。</div><div>CP/Mをセット済みですので、増設メモリを装着して電源を入れれば、モニタに移ってG100でCP/Mが起動します。<br /><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgDjB8FPebtLHb61snIuQw2ed4qL_LRQamu9yzLLNLMI8vc1ozNNG2n5w3ho5dB21Ho9BqLvn8acPeJ-qDw8eV_wq5qECxgtlcryPUhqZhowe87tySgcRFgzfEmF8SIwU6hSokN5ketS7IOlt91SmO2XdH1PQg5bcVFvdmGGcJQbce7Mvy2vzOZKSlups/s996/%E5%8B%95%E4%BD%9C%E7%94%BB%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="750" data-original-width="996" height="301" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgDjB8FPebtLHb61snIuQw2ed4qL_LRQamu9yzLLNLMI8vc1ozNNG2n5w3ho5dB21Ho9BqLvn8acPeJ-qDw8eV_wq5qECxgtlcryPUhqZhowe87tySgcRFgzfEmF8SIwU6hSokN5ketS7IOlt91SmO2XdH1PQg5bcVFvdmGGcJQbce7Mvy2vzOZKSlups/w400-h301/%E5%8B%95%E4%BD%9C%E7%94%BB%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">動作画面</td></tr></tbody></table><br /><div>最後に</div><div>貴重な情報や資料を公開してくださったskyriverさん他の方々に感謝いたします。</div><div><br /></div><div><br /></div><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com2tag:blogger.com,1999:blog-1662007451717538019.post-20389623572396368962023-10-23T20:01:00.003+09:002024-01-24T12:57:21.686+09:00FT245通信カードの新基板の製作<h4 style="text-align: left;"> FT245通信カードの新基板を製作しました</h4><p>【2024年1月24日】末尾にOneDriveを追加して、RAMディスクのない従来のFT245カード用のドライバ一式を上げました。</p><p>ブログ「思いつきハードでソフトに七転八倒(<span lang="EN-US"><a href="https://vehwk3yxv7hw.blog.fc2.com/blog-date-202206.html">https://vehwk3yxv7hw.blog.fc2.com/blog-date-202206.html</a></span>)」のshujiakitaさんの発案・製作によるFM-7/77用の「FT245使用の高速通信カード」と「RAMディスクカード」について、プリント基板を作成したり、両カードの合体カードを製作したりしながら、その都度それらをブログで紹介してきました。</p>
<p>FT245通信カード用のディスクイメージ転送専用ソフトhttps://flexonsbd.blogspot.com/2023/01/ft245.html</p>
<p>FT245通信カードとRAMディスクカードの合体カードの製作https://flexonsbd.blogspot.com/2022/06/ft245ram.html</p>
<div style="text-align: left;">FT245高速通信カードの改造の試み</div><div style="text-align: left;">https://flexonsbd.blogspot.com/2022/04/ft245.html</div><div style="text-align: left;"><br /></div>
<div style="text-align: left;">FM-7用の512KB RAMディスクカードの紹介</div><div style="text-align: left;">https://flexonsbd.blogspot.com/2022/02/fm-7512kb-ram.html</div><div style="text-align: left;"><br /></div>
<div style="text-align: left;">高速通信カードFT245の使い方の紹介</div><div style="text-align: left;">https://flexonsbd.blogspot.com/2022/02/ft245.html</div><div style="text-align: left;"><br /></div>
<div style="text-align: left;">FT-245カード用の転送ソフトの使い方<br />https://flexonsbd.blogspot.com/2021/04/ft-245.html</div><div style="text-align: left;"><br /></div>
<div style="text-align: left;">FT-245カード用の高機能な転送ソフト<br />https://flexonsbd.blogspot.com/2021/01/ft-245.html</div>
<p>Ndittを使用しないでGOTEK用のHFEファイルを作成する(その3)https://flexonsbd.blogspot.com/2020/12/ndittgotekhfe_11.html</p>
<p><br /></p><p>振り返ってみますと、2020年12月11日のブログから始まって、上記のように8回も紹介していますが、それだけ私にとっても非常に有用なツールであり手放せないものになっています。</p><p><br /></p><h4 style="text-align: left;">今回製作したカードの改善点</h4><p>今回新たに基板を作成することにしました。回路には見直すところはありませんでしたが、念のために電源ラインを強化すること、FT245カードにはコネクタの取り付け穴の追加と、合体基板で採用したTXE#をソフトで読めるようにする切り替えスイッチの追加を行いました。</p><p>製作した3種のカードです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvo_R9pF0KR6m-8k5fpb51JvwrT9T_yf9pMxfiyQ7JYFxZUFzmTD4sMmf86awhoGH15ugPM1-y_mzpybVffPXVRv4SKprG23gv2kt_AOgGJIKkQF2PRmppYINClcZShZolqOdle0eKbxktRHUrHZXlfN4tBFJidmQ6NSen3NZDwfFLvqRVqDSz2d676g/s4032/%E8%A3%BD%E4%BD%9C%E3%81%97%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%89%EF%BC%93%E7%A8%AE.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyvo_R9pF0KR6m-8k5fpb51JvwrT9T_yf9pMxfiyQ7JYFxZUFzmTD4sMmf86awhoGH15ugPM1-y_mzpybVffPXVRv4SKprG23gv2kt_AOgGJIKkQF2PRmppYINClcZShZolqOdle0eKbxktRHUrHZXlfN4tBFJidmQ6NSen3NZDwfFLvqRVqDSz2d676g/w400-h300/%E8%A3%BD%E4%BD%9C%E3%81%97%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%89%EF%BC%93%E7%A8%AE.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">製作したカード3種</td></tr></tbody></table><p></p><p><br /></p><p>(1)上左のカード:オリジナルのカードで秋月電子製のFT245モジュールを使用しています。</p><p>(2)上右のカード:オリジナルのFT245モジュールをFT245RLチップに置き換えたものです。マイクロUSBケーブルも使用できるようにマイクロコネクタも装備しています。</p><p>(3)下のカード:(2)にRAMディスクカードを合体させたものです。(2)と同様にマイクロコネクタも装備しています。</p><p><br /></p><h4 style="text-align: left;">使用するドライブソフト</h4><p>使用するドライブソフトは従来のものと変わりませんが、メニューを多少変更しました。</p><p>(1)shujiakitaさん作成の高機能ソフト(転送機能のみでなく様々な機能があります)</p><p>FM-7側:メニューソフト:FM7FDRAM(従来のFM7FDUIXのメニューを多少変えましたのでFM7FDRAMと改名)、機械語サブプログラム:FDIMGFMX, XRAMDK77</p><p>Windows側:FDDIMG_RW77.exe</p><p>(2)私作成の単機能ソフト(使いやすさを求めて転送機能に特化)</p><p>FM-7側:メニューソフト:FT245DRV、機械語サブプログラムFTDRV11o</p><p>Windows側:ft245drv.exe</p><p><br /></p><p>以上、FT245通信カードを多少手直しして製作したという紹介でした。</p><p>ドライブソフト一式を<a href="https://1drv.ms/u/s!Ags8oP_HCWjTnBOfGebIsZ9qmLiQ?e=CjVhM8" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。</p><p><br /></p><p>【2024年1月24日追加】RAMディスクのない従来のFT245カード用のソフト(Windows側:FDDIMG_RW77.exe、FM-7側:FM7FDUI5, FDIMGFM2)を<a href="https://1drv.ms/u/s!Ags8oP_HCWjTnEIa2HP90mjVlkQC?e=dsrHEZ" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げました。なお、FM7FDUI5, FDDIMGFM2はFB_TRANS.DATの中にも入れてあります。</p><p><br /></p><br />Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com23tag:blogger.com,1999:blog-1662007451717538019.post-7264743036747045052023-10-22T22:14:00.000+09:002023-10-22T22:14:30.811+09:00FM77AV20/40用のFM77-732互換カードの製作<h4 style="text-align: left;">FM77AV20/40用の拡張ドライブ用のアダプターFM77-732の互換カードを製作しました </h4><p>FM77AV20/40には2台の2DDドライブが装備されていますが、時には2Dドライブ(5インチや3.5インチ)を増設したい時があります。</p><p>普通のドライブ増設の手段としては現在のドライブが接続されているケーブルにさらにドライブを接続する方法があります。FDC(フロッピィディスクコントローラ)として通常使用されているMB8877AやMB8866はドライブが4台まで接続できるので、この方法で増設できそうなのですが、実際に試みてみるとうまくいきません。2D、2DDドライブのどちらも正常に動作しないのです。</p><p>正規の方法としては、拡張ドライブ接続用の専用のアダプターFM77-732を使用することになっていますが、現在入手するのは困難です。</p><p>ということで手持ちのFM77AV40SXにドライブを増設することはあきらめていたのですが、最近、知人がSXを入手されたところ、それにFM77-732が取り付けられていました。</p><p>これが純正のFM77-732カードです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcyZ2Rj8i3qfVZzrxAEQ4Lh9ZAn2BbR7QjA3nP53cJEED_BnO6VAQYEPWIpvT4WlQXL-Lk2AKmUJS1hdR0etYNMxpyK3-SYHSFs81j8WkEz2vdukWznFUj0qajKXF7_j5NL-K3dtPsTdtskcaMKYtaOWFCvneZwcvTSxSOFpjfE2KGObVlJ74DpeRempY/s4032/FM77-732%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%AB%E3%83%BC%E3%83%89.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcyZ2Rj8i3qfVZzrxAEQ4Lh9ZAn2BbR7QjA3nP53cJEED_BnO6VAQYEPWIpvT4WlQXL-Lk2AKmUJS1hdR0etYNMxpyK3-SYHSFs81j8WkEz2vdukWznFUj0qajKXF7_j5NL-K3dtPsTdtskcaMKYtaOWFCvneZwcvTSxSOFpjfE2KGObVlJ74DpeRempY/w400-h300/FM77-732%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%AB%E3%83%BC%E3%83%89.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">オリジナルのFM77-732カード</td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p>早速そのFM77-732をお借りして調べてみました。</p><p>使用されているICは74HC04(2個), 74HC05, 74LS14, MB463(3個)の計7個のコンパクトなカードでしたが、ネット検索してもMB463の規格が分かりません。</p><p>基板のパターンは単純な二層基板なので、目視と導通テスターで調べて回路図を起こしてみました。ここに回路図を載せるのは差し障りがあるかもしれませんので掲載しませんが、基本的には単なるバッファ回路でした。</p><p>ただし、HeadLoadとStepPulseという2信号のみはフラットケーブル(つまり内蔵のドライブへの信号)からではなく、別途メインボードの5ピンソケットから取っています。内蔵ドライブへの信号は2DD用ですので、それとは別にメインボード上で2D用の信号を生成しているのだと思われます。</p><p>回路図の検討からMB463は通常のバッファICの7438で代用できそうだという見込みが立ちましたので、プリント基板を起こすことにしました。相変わらずドジをしてしまって作り直すことになりましたが、2枚目で無事に動作しました。</p><p>使用する部品のほとんどは何とか入手できましたが、5ピンコネクタだけはメインボードのソケットに合致するものが見つかりませんでした。。。</p><p>作成したプリント基板です。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlNGFz61pRjWNAGUrMZysiFgGSoFpuW6xJuaCN-O65Cnj4TJFYIrxNav11h-NieehjhwOStpbvNqob4AKOrzgz_7-agjT4rGhKxqAO6Z9VYct77yfn-PdGlpDZ-45dCoctWb_-fgHJo7p4aIoO4ZZiPFJ0XLotGDpe62OsxRYImtiVDWwe1aoSMMxY0kk/s4032/FM77-732%E5%9F%BA%E6%9D%BF.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlNGFz61pRjWNAGUrMZysiFgGSoFpuW6xJuaCN-O65Cnj4TJFYIrxNav11h-NieehjhwOStpbvNqob4AKOrzgz_7-agjT4rGhKxqAO6Z9VYct77yfn-PdGlpDZ-45dCoctWb_-fgHJo7p4aIoO4ZZiPFJ0XLotGDpe62OsxRYImtiVDWwe1aoSMMxY0kk/w400-h300/FM77-732%E5%9F%BA%E6%9D%BF.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">作成した基板</td></tr></tbody></table><p><br /></p><p>製作したFM77-732互換カード</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroxLfPVv44pKu4SDHoBD4rc4tGH888HKJD5LJ_QM1qOWFWtYRtEB9_YFp_ST09XRcSkeK0VZUOJ8O-d0829ahsJ4W8DUWH4WTHksds5nw6T89BW9rJQ0tBeVCWcLKiWc0OuqOjAbp9zLYlC53V2ubQ-OyXbVar9DIA__A8Yy2V2XWwoX0lvhkPJgposI/s4032/%E8%A3%BD%E4%BD%9C%E3%81%97%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%89.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjroxLfPVv44pKu4SDHoBD4rc4tGH888HKJD5LJ_QM1qOWFWtYRtEB9_YFp_ST09XRcSkeK0VZUOJ8O-d0829ahsJ4W8DUWH4WTHksds5nw6T89BW9rJQ0tBeVCWcLKiWc0OuqOjAbp9zLYlC53V2ubQ-OyXbVar9DIA__A8Yy2V2XWwoX0lvhkPJgposI/w400-h300/%E8%A3%BD%E4%BD%9C%E3%81%97%E3%81%9F%E3%82%AB%E3%83%BC%E3%83%89.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">製作した互換カード</td></tr></tbody></table><p></p><p><br /></p><p>このカードをFM77AV20/40の背面の拡張FDDのコネクタ取り付け部に固定し、メインボードのFDDへのケーブルを抜き、そこにフラットケーブルの先端のコネクタを装着し、抜いたケーブルは画像の白の中継コネクタに嵌め込みます。</p><p>5芯のケーブルはメインボードのコネクタに装着したいのですが、画像のコネクタでは合いませんので、両端がオス・メスのブレッドボード用のケーブル5本を用いて繋ぎます。</p><p>なお、37ピンD-Subコネクタと増設ドライブとの接続ケーブルは信号のピン配列が一致していますので画像のようにフラットケーブルの両端にコネクタを付けたものでOKでした。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK5dgK69AzJQ_B2x9GrYPvVLRMA0w0F71YNDhTRzVkZp3mFKqI2VCk3iWnldNiCezXeM1p-s_epwFdTMDG5IeIAc_uVtHrpDwsjMSeVTbv0p6p-GvesYXYz21BgZYS-rJ32bDWM82R1uge6AqRVa470sfoZ5CUU_ahYn0QQ7dXFBm4tGq1ubfzCUyIo8Y/s4032/FDD%E6%8E%A5%E7%B6%9A%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK5dgK69AzJQ_B2x9GrYPvVLRMA0w0F71YNDhTRzVkZp3mFKqI2VCk3iWnldNiCezXeM1p-s_epwFdTMDG5IeIAc_uVtHrpDwsjMSeVTbv0p6p-GvesYXYz21BgZYS-rJ32bDWM82R1uge6AqRVa470sfoZ5CUU_ahYn0QQ7dXFBm4tGq1ubfzCUyIo8Y/w400-h300/FDD%E6%8E%A5%E7%B6%9A%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FDD接続ケーブル</td></tr></tbody></table><br /><p>全体の接続図</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoZXvOgPZl_51kU-Bjv68C80JyrRV2eiXJmST_Gnhto15CXXg4mvtPw-LtweQ8rI_6PtV4cqGkmrMBSFATL3vwc144wllTA5ZyY4jYj96NvsWNbjYqtIKMg8LRD2dEYfeF-Yd5Eda0UrmuSGmMhgm3cKcM415wPvstxOkjuIdOGvR5T7fFTRtrNK3zf28/s1491/FM77-732%E6%8E%A5%E7%B6%9A%E5%9B%B3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1012" data-original-width="1491" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoZXvOgPZl_51kU-Bjv68C80JyrRV2eiXJmST_Gnhto15CXXg4mvtPw-LtweQ8rI_6PtV4cqGkmrMBSFATL3vwc144wllTA5ZyY4jYj96NvsWNbjYqtIKMg8LRD2dEYfeF-Yd5Eda0UrmuSGmMhgm3cKcM415wPvstxOkjuIdOGvR5T7fFTRtrNK3zf28/w400-h271/FM77-732%E6%8E%A5%E7%B6%9A%E5%9B%B3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FM77-732カードの接続図</td></tr></tbody></table><br /><p>接続テストとしては、2Dの3.5インチドライブYD-625を使用しましたが、DISK-BASICの起動時にドライブ数として3以上を設定することで、特に問題もなくドライブ2として読み書きができました。</p><p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsO9scQxp98rgE6bQ0Otbiphg-uWhbj3Y50sbAPOK43Cjri207RWFbPu3x4gltIWRWR-xZTs2_S0jnSQDKC7T80TO51ob5cC_Y_CkVQA6VqBkPPTS8dozg7XCrXcm51348CMDrUxE3hw79KIYxf1se3r8J1_2edIGbwdRuieWP6eTzPrnn17n4FlG82e4/s4032/%E9%96%93%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%AE%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsO9scQxp98rgE6bQ0Otbiphg-uWhbj3Y50sbAPOK43Cjri207RWFbPu3x4gltIWRWR-xZTs2_S0jnSQDKC7T80TO51ob5cC_Y_CkVQA6VqBkPPTS8dozg7XCrXcm51348CMDrUxE3hw79KIYxf1se3r8J1_2edIGbwdRuieWP6eTzPrnn17n4FlG82e4/w236-h177/%E9%96%93%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%AE%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB.JPG" width="236" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">間に合わせに使用したケーブル</td></tr></tbody></table>以上、現在では入手が困難なFM77-732カードと同等の機能を持つカードを製作してみたという報告でした。</p><p>唯一の問題は5ピンのコネクタが入手できないということですが、画像のようなオス・メスケーブルでとりあえず間に合わせることができました。<br /></p><p>回路図を公開できれば自作してみたいという方がおられる(?)かもとは思いますが、このような数十年前のメーカー製品の回路図の公開は許されるのでしょうか。</p><p><br /></p><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com4tag:blogger.com,1999:blog-1662007451717538019.post-19469542500632816652023-10-01T17:47:00.003+09:002023-10-17T09:45:12.698+09:00アップスキャンコンバータの製作(その2)<h4 style="text-align: left;"> 以前製作したアップスキャンコンバータのプリント基板を作成して作り直した結果、なんと3台も作ることになってしまいました</h4><p>以前、2021年6月15日のブログ「<a href="https://flexonsbd.blogspot.com/2021/06/blog-post.html" target="_blank"><span style="color: #2b00fe;">アップスキャンコンバータの製作</span></a>」で紹介しましたアップスキャンコンバータですが、FM-7に接続して2年ほど使用していました。機能面では特に問題はなかったのですが、ベース基板が手配線であることと切り替えボックスへの収め方にとりあえず感があるのが気にかかっていました。</p><p>そんな時に、入手しにくい12接点のロータリースイッチがヤフオクに出品されているのを見つけて、もう一台製作して今度はプリント基板を作成し、ちゃんとしたケースに収めようと考えました。</p><p>製作したプリント基板が下画像です。(ミスを重ねて3枚目でようやく完成しました。)</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOg_vmkdcruqjKrLWxPb165OSKR5MUo23Xlg54DwsRYgnfxvgavQqdp80sI-rbfCDgAIh9r6RgIFOoHMObpOIXIJK3WoJYIrnkqmEib2SGij7FtHDq_qoJL4YZT1O381iQRqyS_Q02wlpfEd_Hb45RDDRxWdwI3vN2KOajq8bZ7Z2bK6dFxDqzmN19Fe0/s4032/%E5%9F%BA%E6%9D%BF.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOg_vmkdcruqjKrLWxPb165OSKR5MUo23Xlg54DwsRYgnfxvgavQqdp80sI-rbfCDgAIh9r6RgIFOoHMObpOIXIJK3WoJYIrnkqmEib2SGij7FtHDq_qoJL4YZT1O381iQRqyS_Q02wlpfEd_Hb45RDDRxWdwI3vN2KOajq8bZ7Z2bK6dFxDqzmN19Fe0/w400-h300/%E5%9F%BA%E6%9D%BF.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">作成した基板</td></tr></tbody></table><p><br /></p><p>以前のものはこのようにとりあえずの手配線でした。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4GYBe-obfgMfCInMWWCtF5d7Piti2wRWHmcIbR6X6gDsmbEAN79gDRbmQ4_3LlDeu0FCCBZZf6UOQxr2vTvLxh3jp6E3Zvlw_8oQywgV5Yjh46V9qSBxMBExTd83Pt1ou_uUuMp-Vy8x93K8F87NNEV4jX_NhoabSKWyI__DuC_J2qmLp4ElyIvV8MUQ/s4032/IMG_2209.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4GYBe-obfgMfCInMWWCtF5d7Piti2wRWHmcIbR6X6gDsmbEAN79gDRbmQ4_3LlDeu0FCCBZZf6UOQxr2vTvLxh3jp6E3Zvlw_8oQywgV5Yjh46V9qSBxMBExTd83Pt1ou_uUuMp-Vy8x93K8F87NNEV4jX_NhoabSKWyI__DuC_J2qmLp4ElyIvV8MUQ/w400-h300/IMG_2209.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">第一作の手配線基板<br /></td></tr></tbody></table><br /><p>オリジナルの作者である<a href="https://cwaweb.bai.ne.jp/~ohishi/index.htm" target="_blank"><span style="color: #2b00fe;">Nibbles lab. HomePage</span></a>のOh!石さんが「RGBI対応スキャンコンバータ」で使われたケースはタカチのMX型モバイルケースMX2-8-10というアルミケースのしっかりしたもので、私も真似をして同じMX2-8-10SGを使いました。</p><p>なお、元の製作記事は上記サイト中の「研究成果->完了プロジェクト->RGBI対応アップスキャンコンバータ」です。貴重な製作記事を公開していただきありがとうございます。また、FPGAカードはデザインウェーブマガジン2007年7月号の付録基板です。</p><p>ケースに収めた状態です。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTCqgvkoOC5DyXKAYqISEbIFUfXuNp7yWXmO-qcmjAC_XBC836W8EMZj3IUlDmrM52fZkAFjFjORaZcXH9LL8iBS0mvVaeWnHeVbvbcX69pTnlVM1e8bw4LV9H8YDr4lmNJXqAK4zb00vq_5hzvTSHuGMB5iyaEEQKeQYpCNhRadHhNoWAe1uso-yWX5M/s4032/%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E5%8F%8E%E3%82%81%E3%81%9F.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTCqgvkoOC5DyXKAYqISEbIFUfXuNp7yWXmO-qcmjAC_XBC836W8EMZj3IUlDmrM52fZkAFjFjORaZcXH9LL8iBS0mvVaeWnHeVbvbcX69pTnlVM1e8bw4LV9H8YDr4lmNJXqAK4zb00vq_5hzvTSHuGMB5iyaEEQKeQYpCNhRadHhNoWAe1uso-yWX5M/w400-h300/%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E5%8F%8E%E3%82%81%E3%81%9F.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">上蓋と背面パネルを取り外した状態</td></tr></tbody></table><p></p><p><br /></p><p>分解した様子です。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdTCh26AppIBuJc8MVY3lPFTtHbgekxjFH1Tfhu-eRblY1Z_-Lc1ThpEPcREZiqSWBX19NAtG77m1lUsNNrDQ2p3Qag5At33SwwGJMAMMyT4SzvdQ_lHDtvlxmll_xmn16eUoDrInsV2zDSHsFMb1jCZGlodIgziVr3hlxdJ57Q1OKqtT8KN4l79CMfBw/s4032/2%E5%8F%B0.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdTCh26AppIBuJc8MVY3lPFTtHbgekxjFH1Tfhu-eRblY1Z_-Lc1ThpEPcREZiqSWBX19NAtG77m1lUsNNrDQ2p3Qag5At33SwwGJMAMMyT4SzvdQ_lHDtvlxmll_xmn16eUoDrInsV2zDSHsFMb1jCZGlodIgziVr3hlxdJ57Q1OKqtT8KN4l79CMfBw/w400-h300/2%E5%8F%B0.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">組み立てた状態とケースから取り出した状態</td></tr></tbody></table><div><br /></div><div><br /></div><div>前面・背面パネルです。</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjboVmy8FgFZMHiT4CiCIvnkLMmVSLq92A7UhqJeOnakveAx3LgHHWj2Ro_mlKzXTWSR-dUdaPIaCd0VXEeZDdXEDF-M2ZRtto1XkfMloBrHiI7dS_jiWsDH_nZGfK5vOmaxpWIF3-VLSDAp3RwNE7yfDj1oOqR0lstPlpzyY-nYPw7xs7pfC9f72tPgLQ/s4032/%E5%89%8D%E9%9D%A2%E3%83%BB%E8%83%8C%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjboVmy8FgFZMHiT4CiCIvnkLMmVSLq92A7UhqJeOnakveAx3LgHHWj2Ro_mlKzXTWSR-dUdaPIaCd0VXEeZDdXEDF-M2ZRtto1XkfMloBrHiI7dS_jiWsDH_nZGfK5vOmaxpWIF3-VLSDAp3RwNE7yfDj1oOqR0lstPlpzyY-nYPw7xs7pfC9f72tPgLQ/w400-h300/%E5%89%8D%E9%9D%A2%E3%83%BB%E8%83%8C%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">前面パネルと背面パネル</td></tr></tbody></table><div></div><div><br /></div><div>前面パネルには8ピンDINの入力端子と切り替えスイッチを、背面パネルにはD-Sub 15ピンのVGAコネクタと5V電源入力を配置しました。</div><div><br /></div><br /><div class="separator" style="clear: both; text-align: left;">以上の画像からお分かりのように、1台製作するだけのつもりだったのに結果的に2台作ってしまいました。</div><div class="separator" style="clear: both; text-align: left;">プリント基板も2回作り直して3作目でようやく完成したのですが、1作目はFPGAカードのコネクタ一位置の実測間違いでカードが取り付けられず、2作目は電源入力の番号付けのミスで5VがそのままFPGAカードにかかってしまうという致命的なミスを犯してしまいました。</div><div class="separator" style="clear: both; text-align: left;">3作目でようやく完成した基板ですが、組み立てても動作しませんでした。</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">その理由ですが、FPGAカードのコンフィグROMに書き込もうとしてもROMやFPGAを認識しないのです。てっきり5V印加のせいでFPGAが破損したものと思い込んで、新たにFPGAカードを入手しました。しかし、やはりこれも認識しないので、困り果ててネット検索したところXilinxの書き込みソフトがそのままではWindows10に対応しておらず、ドライバを前のバージョンのものに差し替える必要があることが分かりました。2年前はWindows7を使用していたので正常に使えていたのでした。</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">なお、第一作ですがFPGAカードの上に取り付けてあった部品を裏側に回すことで、下画像のように、切り替えスイッチの中に収めることができました。</div><div class="separator" style="clear: both; text-align: left;">(とはいっても、タカチのケースに合わせた基板のサイズが長すぎたので、数mmほど削ることになりましたが。)</div><div class="separator" style="clear: both; text-align: left;"><p style="text-align: center;"><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjMbFfMz6yZfYaL6Izkz7i0-viin8EzzMRe2nx3TaUYCpF98TGxv6fA73eoaImqaR8onKdUboly5hfEXwOIt8Numxbouv-wfw1DZYkGslZA5PmduPVwbbd_1P3TPhaA1edH4Ulp61ODmk2_mVO49dpkNQNmeP1H9L27NpBxAvssYhdD6IhdNpSC0-SH9g/s4032/%E6%96%B0%E5%9F%BA%E6%9D%BF.JPG" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto; text-align: left;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjMbFfMz6yZfYaL6Izkz7i0-viin8EzzMRe2nx3TaUYCpF98TGxv6fA73eoaImqaR8onKdUboly5hfEXwOIt8Numxbouv-wfw1DZYkGslZA5PmduPVwbbd_1P3TPhaA1edH4Ulp61ODmk2_mVO49dpkNQNmeP1H9L27NpBxAvssYhdD6IhdNpSC0-SH9g/w400-h300/%E6%96%B0%E5%9F%BA%E6%9D%BF.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">切り替え機に収めた</td></tr></tbody></table><p style="text-align: center;"><br /></p><p>以上で、気にかかっていたアップスキャンコンバータの製作ですが、これでようやくけりをつけることができました。(しかし、XRGB-2plusが常時使用と予備機で2台、今回製作した切り替え機中の1台、タカチのケース入りの2台と計5台にも増えてしまいました。どうしよう...)</p><p><strike>作成した基板が少しですが余っていますので、ご希望の方がおられましたらメールで連絡を下さい。郵便代のみでお送りいたします。</strike></p><p><br /></p><p style="text-align: center;"><br /></p></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-60257796323644551872023-08-20T20:34:00.002+09:002023-08-21T08:26:03.288+09:00MC09でASSIST09など用のPL/0の実行ファイルを作成する(補足)<h4 style="text-align: left;"> MC09でASSIST09など用のPL/0の実行ファイルを作成していて気付いたこと</h4><p>前回のブログで、MC09でコンパイルした実行ファイルをASSIST09などで走らせる方法を紹介しました。</p><p>その中で、<span style="background-color: white;">wnoy さんの</span>サイト「小さな言語」中でPL/0をMC09でコンパイルしてMPB6809のモニター上で走らせておられたので、それを私も走らせてみたと書きましたが、実際には、それはMPB6809のモニターを実装してサイト中のバイナリリストを入力したものを、そのまま走らせたということでした。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieFK6z2_GwYbBMskFuEcplULwITGbuXde30DDFhhoAf-V8RGJqYJNowzY3-SYQuzLRkelw2ehQcYRBTJuviZoBC88JjspaJUAtezO_ashCFyI9w6B9cEN1_apNw72fZkE9n_EEee9HtFldfCJdxIs8ENUbj8lEN_Gl3NOF0bTxyJ_nsehkBFwMAN_4KpA/s4032/IMG_4146.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieFK6z2_GwYbBMskFuEcplULwITGbuXde30DDFhhoAf-V8RGJqYJNowzY3-SYQuzLRkelw2ehQcYRBTJuviZoBC88JjspaJUAtezO_ashCFyI9w6B9cEN1_apNw72fZkE9n_EEee9HtFldfCJdxIs8ENUbj8lEN_Gl3NOF0bTxyJ_nsehkBFwMAN_4KpA/w400-h300/IMG_4146.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">前回も掲載した画像ですが</td></tr></tbody></table><p><br /></p><p>上記サイトにはMC09でコンパイルした結果のアセンブルリストが掲載されていたので、その中のI/O関係を自分の環境に合わせて書き換えてアセンブルすれば実行ファイルが生成されるはずです。</p><p>しかし、実はこのようにして生成された実行ファイルは、最初は正常に動作しませんでした。</p><p>私が通常使用している6809用のアセンブラはFLEX09上のASMBと自作のWindows上で動作するクロスアセンブラです。加えて、リファレンス用としてアークピットさんのX6809を使用しています。</p><p>残念ながらPL/0のアセンブルリストはラベルの長さが6文字を超えているためにASMBではアセンブルできないので、自作のクロスアセンブラでアセンブルしていましたが、結果がwnoyさんのものと異なってしまうのです。これは自作のソフトのバグかと疑って、X6809でアセンブルしてみても結果は自作のものと全く同じでした。</p><p><br /></p><h4 style="text-align: left;">LEAX 2,PC という命令の変換結果がおかしい!</h4><p>誤変換されてしまう命令を示します。MC09によるコンパイル結果のアセンブルソースでは、文字列の表示に下記のパターンが多用されています。(十数か所あります!)</p><p>LEAX 2,PC</p><p>BRA ZZZZ <- 表示ルーチンへ</p><p>FCB $xx1,$xx2,$xx3,...,$xxn</p><p>ZZZZ (表示ルーチン)</p><p>これは、LEAX 2,PCで表示すべき文字列の先頭のアドレスをXに入れておいて、BRA命令で表示ルーチンへ飛んでいるわけですが、問題は先頭行の LEAX 2,PC で、これが正しく変換されていないのが正常に動作しない原因でした。</p><p>wnoyさんのサイトでは、変換結果は 30 8C 02 であるのに対して、自作のアセンブラやアークピットさんのX6809ではいずれも 30 8D XXXX となりますし、LEAX <2,PC と書き換えてみても X6809では 30 8C XX となるのですが、XXは02にはなりませんでした。</p><p>参考までに、X6809でのアセンブル結果を示します。<span style="font-size: small;"> </span></p><p><span style="font-size: x-small;">
<textarea class="listbox" data-ex-code-prettify-param="{codeType:''}" style="height: 300px; margin: 0px; overflow: scroll; width: 400px;">
1 1000 ORG $1000
2
3 1000 START EQU *
4 1000 308DEFFE LEAX 2,PC
5 1004 2007 BRA DISP1
6 1006 544553542D31 FCC /TEST-1/
7 100C 00 FCB 0
8 100D DISP1
9
10 100D 308CF2 LEAX <2,PC
11 1010 2006 BRA DISP2
12 1012 544553542D32 FCC /TEST-2/
13
14 1018 DISP2
15
16 1000 END START
</textarea></span></p>
<p><br /></p><p>このLEAX命令の意味としては、LEAX命令の位置のPC値に2を加えた値をXの値とするということですから、EFFEやF2という値は明らかにおかしくて0002や02にならなければなりません。</p><h4 style="text-align: left;">結局、自作のクロスアセンブラを修正することになった</h4><p>めったに使うことのない命令でしたので気づくのが遅れましたが、自作のクロスアセンブラを正しく変換できるように修正し、改めてPL/0のアセンブルリストをアセンブルし直した結果、正しく動作する実行ファイルが得られました。ということで、ようやくPL/0をASSIST09や自作モニター上で走らせることができました。(長かった、、、)</p><p>ちなみに、この変換結果はアークピットさんのX6809だけでなく、FLEX09上のASMBでも同様で上記と全く同じ結果となります。ということは、これは誤変換ということではなく、このLEAX命令の解釈としては上記の変換結果の方が正しいということを意味するのでしょうか。しかし、実際に実行してみると、30 8C 02 でないと正しく動作しないのですが,,,</p><p>(wnoyさんがどのアセンブラを使用されたのかは分かりませんが、アセンブルリストの行末記号が$0Aですので、おそらくLinux上のクロスアセンブラas09を使用されたのだと推測しています。)</p><p><br /></p><p></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com2tag:blogger.com,1999:blog-1662007451717538019.post-38950405197444154442023-08-16T11:38:00.000+09:002023-08-16T11:38:58.490+09:00FLEX09上のMC09でASSIST09などのモニター下で動作する実行ファイルを作成する<h4 style="text-align: left;"> FLEX09上のMC09を用いてFLEX09がない環境で動作する実行ファイルを作成する</h4><p>FLEX09には高機能で使いやすいアセンブラASMBがあって便利に使っています。さらに有名な整数型CコンパイラMC09もあります。</p><p>ASMBで作成した実行ファイルはもちろんFLEX09のない環境に移行して動作させることができるので、しばしばそのような使い方をしているのですが、MC09については、生成された実行ファイルがFLEX09と密接に関連していて、他の環境で動作させることはできないと思い込んでいました。</p><p><span style="background-color: white;">しかし以前、「小さな言語」という</span><span style="background-color: white;">wnoy さんのサイトがありまして、そこではMPB6809というボードマイコンとそれ用のモニタープログラムが公開されていました。</span></p><p><span style="background-color: white;">(現在このサイトは存在しませんが、その内容を保存された方が紹介されています。「MPB6809」で検索するとヒットします。)</span></p><p><span style="background-color: white;">このサイトでは他にもForthの移植やTinyBasicの解析などもされているのですが、何とPL/0をMC09でコンパイルして移植しておられるのです。</span></p><p><span style="background-color: white;">私もこのモニタープログラムを入力してROMに焼き、自作の6809マイコンでPL/0を走らせてみました。PL/0は実用を目指したコンパイラではないので、特に使い続けるつもりはありませんでしたが、MC09でコンパイルした実行ファイルをMPB6809というマイコンに移植したという点に興味を持ちました。</span></p><p><span style="background-color: white;">FLEX09に依存しているファイルI/Oを使わないプログラムならFLEX09がなくても動作するのは当然ではありますが、初めて見る実例でした。このサイトを知ったのは十年以上前なのですが、それ以来、時々ですがMC09でコンパイルした結果のソースリストをいじって自作のマイコンで走らないかと試していました。</span></p><p><span style="background-color: white;">PL/0のソースは大幅に書き換えないとそのままではMC09でコンパイルできないので、まだPL/0をコンパイルすることはできていないのですが、他のプログラムについては、最近ようやく何とか動くようになりました。</span></p><p><span style="background-color: white;">動作試験に用いたマイコンは下画像のもので、2MHz動作の63B09と68B02を切り替えて使用しています。モニターは6809では自作のものとASSIST09を、6802では自作のものとMIKBUG2をROMに入れてあり、FlexDrvWin.exeという仮想ドライブ構築ソフトを用いることで6809のFLEX09と6800のFLEX2が走っています。</span></p><p><span style="background-color: white;"><br /></span></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh15C3N_ey667sG6mSvCdMnThQ-UAnl1ScQKMpL8G1IbDLFn-1VbX7Fiul4aAVOnP2sR-OizDARGSVHyi9hdRIbuOV9FqxP5gx_6JBSiLwIoNrSc-Vs4vsLXy0rfz-vzoxN6pY1qD8G9TpAzbktt8zzU38Yjd1P5g48FeGeHL273br4tbrfvAkJylochfY/s4032/IMG_4146.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh15C3N_ey667sG6mSvCdMnThQ-UAnl1ScQKMpL8G1IbDLFn-1VbX7Fiul4aAVOnP2sR-OizDARGSVHyi9hdRIbuOV9FqxP5gx_6JBSiLwIoNrSc-Vs4vsLXy0rfz-vzoxN6pY1qD8G9TpAzbktt8zzU38Yjd1P5g48FeGeHL273br4tbrfvAkJylochfY/w400-h300/IMG_4146.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用したボードマイコン</td></tr></tbody></table><br /><p></p><p><span style="background-color: white;"><br /></span></p><h4 style="text-align: left;"><span style="background-color: white;">MC09での実行ファイル作成手順</span></h4><p><span style="background-color: white;">MC09でコンパイルした結果はC.OUTというアセンブルリストとして出力され、それをMC09に標準で添付されているC.TXTというアセンブルリスト中に読み込んで、全体をアセンブルすることで実行ファイルが生成されます。</span></p><p><span style="background-color: white;">MC09 oooo.C --> アセンブルリスト C.OUTが作られる。</span></p><p><span style="background-color: white;">ASMB C.TXT oooo.CMD --> C.TXT中にC.OUTが読み込まれ、実行ファイル oooo.CMDが生成される。</span></p><p><span style="background-color: white;"><br /></span></p><h4 style="text-align: left;"><span style="background-color: white;">C.TXTを書き換えれば良いはず</span></h4><p><span style="background-color: white;">このC.TXT中にコンソールI/OやファイルI/Oなどが書き込まれているので、コンソールI/Oを自分の環境に合うように書き換え、ファイルI/Oは不要ということで削除すれば良いはずなのですが、エラーの連発でなかなかうまくいかず、試行錯誤の連続でしたが、wnoyさんのPL/0のアセンブルリストを参考にしながら何とか動作するものを作ることがで</span><span style="background-color: white;">きました。</span></p><p><span style="background-color: white;">もちろん、FLEX09のファイルI/Oを必要とするプログラムはダメですが、ファイルI/OがないプログラムならMC09で作成して、マイコン等で走らせることができます。サンプルとしてメモリダンププログラム mdump.c を作成してみました。</span></p><p><span style="background-color: white;"><br /></span></p><h4 style="text-align: left;"><span style="background-color: white;">ASSIST09用と自作モニター用の2種を作成した</span></h4><p>作成したのは、私の自作マイコンにインストールしてある自作モニター用のC_SBC.TXTとモトローラ社のモニターASSIST09用のC_ASSIST.TXTの2種です。</p><p>これらを標準のC.TXTの代わりに用いることで、自作モニタ―上やASSIST09上で動作する実行ファイルが得られます。</p><p>MC09 -O1.C.OUT oooo.C --> アセンブルリスト C.OUTがドライブ1に作成される</p><p>ASMB C_SBC oooo.BIN +YLS または ASMB C_ASSIST oooo.BIN +YLS --> 実行ファイル oooo.BIN がドライブ1に作成される</p><p>この実行ファイルをFLEX09のディスクから取り出してマイコン側にインストールして、$100から実行します。</p><p>(C.TXTにORG $100と書いてあるので、MC09で作成した実行ファイルは$100から実行することになっていますが、実は、アドレス依存のコードではないのでどのアドレスに置いても実行できます。)</p><p>作成したC.SBC.TXTとC.ASSIST.TXTを下記に示します。基本的にI/O関係のアドレスが異なるだけですが、ASSIST09のI/OルーチンはSWI命令を使っているのに対して、私の自作モニターは普通にJSR命令を使っているので、コールの仕方もそれぞれに合わせています。</p><p><br /></p><h4 style="text-align: left;">以下にC.ASSIST.TXTとC.SBC.TXTのリストを示します</h4><p>C_SBC.TXT </p><div><div> </div><div>
<textarea class="listbox" data-ex-code-prettify-param="{codeType:''}" style="height: 600px; margin: 0px; overflow: scroll; width: 400px;">
*
* micro-C driver under SBC
*
* 14-Aug-23 Y.Yamamoto
* 12-Dec-81 M.Ohta,H.Tezuka
*
INCHA EQU $F000
OUTCHA EQU $F002
MONITR EQU $F83A
PCRLF EQU $FAE9
ORG $100
_00000
LDX #$BFFF memory end
LEAS 1,X
*
JSR PCRLF CR/LF
*
LEAS -256,S ALLOCATE WORK AREA
LEAU 128,S POINT TO CONTENT OF ARGUMENT VECTOR
LEAY _99999,PCR clear globals
LDX #_GLOBALS
_0C002 BEQ _0C003
CLR ,Y+
LEAX -1,X
BRA _0C002
*
_0C003 LEAY _99999,PCR
LBSR _INITIALIZE call initializer
LBSR _main
exit JMP MONITR
FMS RTS added by Y.Y.
GETCH PSHS X,Y,U
JSR INCHA get character
TFR A,B
ANDB #$7F
CMPB #26 control-Z ?
BNE _0G001
LDD #-1
PULS X,Y,U,PC
_0G001 CMPB #$0D
BNE _0G002
LDB #$0A
_0G002 CLRA
PULS X,Y,U,PC
*
PUTCH2 EQU *
PUTCH LDD 2,S
PSHS D,X,Y,U
TFR B,A
CMPA #$09
BNE _0P001
LDA #$20
_0P001 CMPA #$0A
BNE _0P002
JSR PCRLF
PULS D,X,Y,U,PC
_0P002 JSR OUTCHA put character
PULS D,X,Y,U,PC
(以下省略)
</textarea></div></div>
<p><br /></p>
<p>C_ASSIST.TXT </p><div><div> </div><div>
<textarea class="listbox" data-ex-code-prettify-param="{codeType:''}" style="height: 600px; margin: 0px; overflow: scroll; width: 400px;">
*
* micro-C driver under ASSIST09
*
* 14-Aug-23 Y.Yamamoto
* 12-Dec-81 M.Ohta,H.Tezuka
*
INCHA EQU 0
OUTCHA EQU 1
MONITR EQU 8
PCRLF EQU 6
ORG $100
_00000
LDX #$BFFF memory end
LEAS 1,X
*
SWI
FCB PCRLF
*
LEAS -256,S ALLOCATE WORK AREA
LEAU 128,S POINT TO CONTENT OF ARGUMENT VECTOR
LEAY _99999,PCR clear globals
LDX #_GLOBALS
_0C002 BEQ _0C003
CLR ,Y+
LEAX -1,X
BRA _0C002
*
_0C003 LEAY _99999,PCR
LBSR _INITIALIZE call initializer
LBSR _main
exit SWI
FCB MONITR
FMS RTS added by Y.Y.
GETCH PSHS X,Y,U
SWI
FCB INCHA get character
TFR A,B
ANDB #$7F
CMPB #26 control-Z ?
BNE _0G001
LDD #-1
PULS X,Y,U,PC
_0G001 CMPB #$0D
BNE _0G002
LDB #$0A
_0G002 CLRA
PULS X,Y,U,PC
*
PUTCH2 EQU *
PUTCH LDD 2,S
PSHS D,X,Y,U
TFR B,A
CMPA #$09
BNE _0P001
LDA #$20
_0P001 CMPA #$0A
BNE _0P002
SWI
FCB PCRLF
PULS D,X,Y,U,PC
_0P002
SWI
FCB OUTCHA put character
PULS D,X,Y,U,PC
(以下省略)
</textarea></div></div>
<p><br /></p><p>(以下省略)の部分は標準のC.TXTの192行目以降と同じです。</p><p><br /></p><p>参考までに、サンプルとして作成した mdump.c を示しておきます。このような、ファイルI/OがないプログラムはFLEX09がなくても動作するわけです。</p>
<p>mdump.c </p><div><div> </div><div>
<textarea class="listbox" data-ex-code-prettify-param="{codeType:''}" style="height: 600px; margin: 0px; overflow: scroll; width: 550px;">
/* memory dump */
#include "STDIO.TXT"
#include "ALLOC.TXT"
#include "STRING.TXT"
int main()
{
int d, i, sadr, eadr;
char sttadr[12], endadr[12];
char ch, *pa;
char msttadr[12];
char mendadr[12];
char header[80];
strcpy(msttadr, "sttadr= $");
strcpy(mendadr, "endadr= $");
strcpy(header, " +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF");
/* input disp adrs area */
printf(msttadr);
i = 0;
while ((ch = getchar()) != '\n' && i < 12) {
sttadr[i++] = ch;
}
sttadr[i] = '\0';
printf("\n%s", mendadr);
i = 0;
while ((ch = getchar()) != '\n' && i < 12) {
endadr[i++] = ch;
}
endadr[i] = '\0';
printf("\n");
sadr = asc2bin(sttadr[0])*0x1000+asc2bin(sttadr[1])*0x100
+asc2bin(sttadr[2])*0x10+asc2bin(sttadr[3]);
eadr = asc2bin(endadr[0])*0x1000+asc2bin(endadr[1])*0x100
+asc2bin(endadr[2])*0x10+asc2bin(endadr[3]);
/* disp memory data */
sadr &= 0xfff0;
do {
printf("\n%s\n", header);
do {
pa = sadr;
printf("%04x: ", sadr); /* disp adrs */
for (i=0; i<16; i++) {
ch = *(pa+i) & 0xff;
if (ch >= 0 && ch < 0x10)
printf("%c%x ", '0', ch & 0xff); /* disp data by hex */
else
printf("%x ", ch & 0xff);
}
putchar(' ');
for (i=0; i<16; i++) {
d = *(pa+i);
ch = (d>=0x20 & d<=0x7e)?d:'.';
putchar(ch); /* disp data by ascii */
}
printf("\n");
sadr += 0x10;
} while ((sadr < eadr) && (sadr & 0xff) != 0);
} while (sadr < eadr);
printf("\n");
}
/* asc to bin */
asc2bin(ch)
char ch;
{
return (ch>=0 && ch<0x39)?ch-0x30:ch-0x37;
}
</textarea></div></div>
<p>出来あがった mdump.bin のサイズは4.2KBほどでした。サイズは大きくなりますが、アセンブラで書くよりも作成時間が短くなるので、サイズがそれほど問題にならない場合にはMC09を使用するメリットはあると思います。</p><p><br /></p><p>参考までに、私の場合の具体的な実行ファイル作成・実行手順を示します。</p><p>1.WindowsPC上のエディタでソースプログラムを作成する。</p><p>2.FlexDrvWin.exe中のイメージファイル(.DSKまたは.D77)にソースをドラッグ&ドロップする。</p><p>3.MC09でコンパイル、ASMBでアセンブルする。</p><p>4.出来あがった実行ファイル(.BIN)をイメージファイルからWindowsPCへ読み出す。</p><p>5.バイナリ形式の実行ファイルを自作の変換ソフトCvtMotHexBin.exeを用いてモトローラ形式(.MOT)に変換する。</p><p>6.モニターのLoadコマンドでモトローラ形式の実行ファイルを読み込む。</p><p>7.モニターのGoコマンドで実行する。</p><p><br /></p><p>以上ですが、作成・使用したファイル(C_ASSIST.TXT, C_SBC.TXT, 最新版のFlexDrvWin.exe, CvtMotHexBin.exe, サンプルのmdump.c)を<a href="https://1drv.ms/u/s!Ags8oP_HCWjTm0OrQhFc7a8307gv?e=UOlxQ0" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。なお、FLEX09やMC09の作成手順は以前のブログで紹介しております。</p><p><br /></p>
Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-57332455436475024672023-07-16T22:40:00.001+09:002023-07-16T22:40:23.481+09:00FM77AV40用1024KB増設RAMカードの製作<h4 style="text-align: left;"> FM77AV40用512KB増設RAMカードの容量を760KBに増加させました</h4><p>2022年10月21日に「FM77AV40用512KB増設RAMカードの製作」を紹介しました。製作した基板のサイズは純正の256KB増設メモリカードよりはるかに小さなものでしたが、それでもまだ基板に余裕がありましたので、512KBメモリをもうひとつ載せられそうです。ということで、容量を倍増させたカードを製作してみることにしました。</p><p>これが製作した1024KB増設RAMカードです。(実際に増加する容量は760KBです。)</p><p>512KBメモリはSOP型のHM628512を自作変換基板にセットしたものを使用しています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitDaJxxQF5vd9xRhf4YuzTEDV0e2JmVdQSUSScgXIpdD8TXmGYG8sTgC5Gu5DKBeP3iL7169N5QIHWIjaxZ-E-QzPu50L_BzQTYwUPSY6yYZZe91ZAsI6c_h7pYYyz-9C2ktDE0vFI9J5xwI0oD9svNqCXof_0wOXE4lLuCUUmtQPei6MmB9YlSQmrzAE/s4032/IMG_4034.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitDaJxxQF5vd9xRhf4YuzTEDV0e2JmVdQSUSScgXIpdD8TXmGYG8sTgC5Gu5DKBeP3iL7169N5QIHWIjaxZ-E-QzPu50L_BzQTYwUPSY6yYZZe91ZAsI6c_h7pYYyz-9C2ktDE0vFI9J5xwI0oD9svNqCXof_0wOXE4lLuCUUmtQPei6MmB9YlSQmrzAE/w400-h300/IMG_4034.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">1024KB増設RAM</td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><p>回路図を下に示します。</p><p>最初は通常のTTL-ICで試作しましたが、未使用のゲートが多く、あまりにも無駄が多いのでどうしようかと思っていたところに、知人からこういう時にはGALを使ったら良いかもとのアドバイスを受けて、GALに変更することにしました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT9sdqVrJn4MBCQglwVc-crX8W3nMTXQgyKAyE5znkBqHWUBKxxxoWsnFQRtDPdZ4JKnXF1khK8MsiSq21-i_1mAz9ZDhw-ffskiK-uJEF_kmcuA1uSWYf-07buycWLUrSa4xhc1AFRzbvOoQk9KFss7cwuOyi2q3t83n2geao4whwKlBRHx86bL8imi8/s2339/FM77AV40_EXRAM21.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT9sdqVrJn4MBCQglwVc-crX8W3nMTXQgyKAyE5znkBqHWUBKxxxoWsnFQRtDPdZ4JKnXF1khK8MsiSq21-i_1mAz9ZDhw-ffskiK-uJEF_kmcuA1uSWYf-07buycWLUrSa4xhc1AFRzbvOoQk9KFss7cwuOyi2q3t83n2geao4whwKlBRHx86bL8imi8/w400-h283/FM77AV40_EXRAM21.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">最初に試作した回路</td></tr></tbody></table><br /><p>Latticeの16V8Bを使用しましたが、3個のTTL-ICを1個のGALで置き換えることができました。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0lWMmE7U9d6H6j6Qq2l8nWiIKrIXdv8-KDUfqcarj4-tmydtW1RnRRPf8XaMU8GlNIUMGYETUmyAb1fQAtlQTe9sd7YpCuNAGIGC7qbEa3ll0Z0Lvjjsg0ojpFQ1PAwPRBcnMFaMCYw02pA6Up2kjkaVHdli2H749LYMQP6mbaMYDPsUIAnVbBjn0dHw/s2339/FM77AV40-EXRAM22.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0lWMmE7U9d6H6j6Qq2l8nWiIKrIXdv8-KDUfqcarj4-tmydtW1RnRRPf8XaMU8GlNIUMGYETUmyAb1fQAtlQTe9sd7YpCuNAGIGC7qbEa3ll0Z0Lvjjsg0ojpFQ1PAwPRBcnMFaMCYw02pA6Up2kjkaVHdli2H749LYMQP6mbaMYDPsUIAnVbBjn0dHw/w400-h283/FM77AV40-EXRAM22.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">GALに変更<br /><br /></td></tr></tbody></table><p>GALのプログラムにはMicrochip社のWINCUPLを用いました。</p><p>GALを使用するのは初めてだったのですが、実際に使用してみて、この程度のロジックをGALのプログラムに置き換えるのは、初心者でもそう難しいことではないと感じました。</p><p>参考までに、今回の置き換えの部分を示しますが、あとはそれぞれの入出力信号を16V8Bのピンに割り当てればOKです。</p><p>/* EQUATIONS */</p><p>CS1 = !(A18 & A19) ;</p><p>CS2 = !(A18 $ A19) ;</p><p>WE = !(!RW & E) ;</p><p>OE = !(RW & E) ;</p><p><br /></p><h4 style="text-align: left;">製作した結果は</h4><p>前回と同様、OS-9 Level2でフリーメモリを確認しました。</p><p>その結果が下記ですが、760KB増えています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSttleqkKlhmUjhNd83bd_GriDniEjY7tjjH8ITvM2hCAoqcnmy-LXqgw4Ff2KLayouqkcNI2vhmH3i_N0FT0fJdBqb6P65SoZNFT-9Nvyj9ncgNcGctVtVdUE5bR7hcn_-CcaJQcmG-pu9Eo0DLve9E6nCfNd8X-hQ1z9TKUlqax0wFj0yToE6N0dpaM/s4032/IMG_4036.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSttleqkKlhmUjhNd83bd_GriDniEjY7tjjH8ITvM2hCAoqcnmy-LXqgw4Ff2KLayouqkcNI2vhmH3i_N0FT0fJdBqb6P65SoZNFT-9Nvyj9ncgNcGctVtVdUE5bR7hcn_-CcaJQcmG-pu9Eo0DLve9E6nCfNd8X-hQ1z9TKUlqax0wFj0yToE6N0dpaM/w400-h300/IMG_4036.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">フリーメモリ確認</td></tr></tbody></table><p><br /></p><p>512KBのメモリを2個搭載しているので1024KBの容量なのですが、拡張メモリの範囲は$40000~$FFFFFの768KBですので、これだけ増加するはずですが、実際には$40000~$FDFFFの760KBの増加になっています。OS-9の場合は、最上位の$FE000~$FFFFFの$2000バイト(8Kバイト)は使用不可のようです。</p><p>この位のRAM容量があれば、一部をRAMディスクに充てることもできそうです。</p><p>以上、512KBの増設RAMの容量をさらに増やしてみたという報告でした。</p><p>現在48ピンのコネクタの入手は困難ですが、コネクタさえ入手できれば回路は簡単ですし512KBのSRAMも入手は容易ですので製作そのものは容易です。</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-22908272182867195262023-07-05T16:48:00.036+09:002023-07-28T22:29:17.806+09:00コンパイラ作成の試み その3 番外編 (Z80版8ビットコンパイラの入力)<p> Z80版8ビットコンパイラ stellarを入力してみました</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv1nvJPhMiVFj1xH2CItV4-MWTMy5W4JP16gK2gdSQ0YsBY81Y218hKqOr-WdR-Mg6hrzlzViotRBCmLstgnRp9EAk36XsAnG3mjDJr6MCVuOf78E3C24rc6H_qPKbp1k2Ziaejl2RM-IgXSzT-g6oxP2eWz6jPf_Nl2MRENUHiE77IjSzJeAQEGG37qg/s4032/IMG_3990.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv1nvJPhMiVFj1xH2CItV4-MWTMy5W4JP16gK2gdSQ0YsBY81Y218hKqOr-WdR-Mg6hrzlzViotRBCmLstgnRp9EAk36XsAnG3mjDJr6MCVuOf78E3C24rc6H_qPKbp1k2Ziaejl2RM-IgXSzT-g6oxP2eWz6jPf_Nl2MRENUHiE77IjSzJeAQEGG37qg/w300-h400/IMG_3990.JPG" width="300" /></a></div><br /><p><br /></p><p>5月20日の「コンパイラ作成の試み その1「ハイクラスC言語」のリストを入力」で参考文献として紹介しました「<span style="background-color: white; color: #565959;">Z80CPU対応 新言語作成の技法 (大貫広幸著 MIA社)</span>」中に掲載されています、<span style="background-color: white; color: #565959;">CP/M-80で動作するコンパイラ言語 stellarのアセンブルリストを入力してみました。</span></p><p><span style="background-color: white; color: #565959;">120ページ以上ありましたが、何とか入力してCP/M-80のMacro-80でアセンブルして実行形式を作成することができました。</span></p><p><span style="background-color: white; color: #565959;">作成したファイルは</span></p><p><span style="background-color: white; color: #565959;">・stellar.com コンパイラ オブジェクトファイルを生成</span></p><p><span style="background-color: white; color: #565959;">・convobj.com 生成されたオブジェクトファイルをHEX形式に変換</span></p><p><span style="color: #565959;"><span style="background-color: white;">の2つで、コンパイルの手順は 下に例を示しましたが、stellar.com でコンパイル、convobj.com でHEX形式に変換、save.comでディスクに保存した後に実行となります。</span></span></p><p><br /></p><pre class="brush:text" title="stellar">d>stellar mdump
Stellar compiler Rev 1.01 ( CP/M-80,MSX-DOS Version )
Copyright (c) 1984 H.Ohnuki / MIA
Program name : mdump
Function name : getchr
Function name : putchr
Function name : putnl
Function name : putstr
Function name : puthex
Function name : puthex1
Function name : bdos
Program 04EF (0100-05EE)
Data 0047 (4000-4046)
** End of compile, No error(s)
d>convobj mdump
Stellar utility, convert object ==> intel HEX
Rev 1.00 Copyright (c) 1984 H.Ohnuki / MIA
Program name : mdump = 0100
Function name : getchr = 0482
Function name : putchr = 04A1
Function name : putnl = 04C4
Function name : putstr = 0511
Function name : puthex = 0549
Function name : puthex1 = 057A
Function name : bdos = 05B6
Constant name : _work = 4000
Constant name : _var = 4030
Constant name : _code = 0100
Constant name : ngetchr = 0001
Constant name : nputchr = 0002
Variable name : d = 4030
Variable name : i = 4031
Variable name : sttadr = 4032
Variable name : endadr = 4036
Variable name : sadr = 403A
Variable name : eadr = 403C
Variable name : ch = 403E
Data name : msttadr = 020D
Data name : mendadr = 0217
Data name : header = 0221
End address : 05EE
Program size : 04EF [ 5 Page ]
d>save 5 mdump.com
d>
d>mdump
sttadr= $1234
endadr= $1567
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
1230: 55 E5 22 DD 55 CD E8 12 3E 32 2B CD 79 23 21 00 U.".U...>2+.y#!.
1240: 00 22 DF 55 3A 93 55 FE 7B 28 1F FE 9A C2 19 2A .".U:.U.{(.....*
1250: CD 1A 25 CD C5 17 FE 7B C2 19 2A 2A 6D 55 22 DF ..%....{..**mU".
1260: 55 CD E8 12 3E 32 2B CD 79 23 CD 50 15 2A DD 55 U...>2+.y#.P.*.U
1270: CD 48 22 2A DB 55 CD 48 22 21 F9 12 CD A5 22 2A .H"*.U.H"!...."*
1280: 69 55 2B 2B 22 D9 55 CD 93 11 2A DF 55 7C B5 20 iU++".U...*.U|.
1290: 19 2A DB 55 3E 21 CD 79 23 3E 34 CD 5E 23 2A D7 .*.U>!.y#>4.^#*.
12A0: 55 3E 20 CD 35 15 3E C2 18 19 CD 48 22 2A DB 55 U> .5.>....H"*.U
12B0: CD 48 22 21 04 13 CD A5 22 2A D7 55 3E 30 CD 35 .H"!...."*.U>0.5
12C0: 15 3E D2 DC 79 23 CD 68 15 E1 22 6D 55 01 06 00 .>..y#.h.."mU...
12D0: 21 DB 55 CD 0E 25 01 0F 00 21 73 55 CD 0E 25 21 !.U..%...!sU..%!
12E0: 73 55 CD 39 08 C3 1A 25 23 22 6D 55 EB 2A 6B 55 sU.9...%#"mU.*kU
12F0: B7 ED 52 EB D0 22 6B 55 C9 0A 3A B9 B9 21 BB BB ..R.."kU..:..!..
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
1300: 96 DA 00 00 08 3A B9 B9 21 BB BB 86 77 FE 23 CA .....:..!...w.#.
1310: 97 13 3D C2 19 2A 21 73 55 CD C0 08 B7 C4 7F 28 ..=..*!sU......(
1320: 21 73 55 7E E6 2F FE 02 C2 19 2A 01 0F 00 CD FE !sU~./....*.....
1330: 24 21 73 55 CB EE CD 39 08 2A DB 55 E5 2A 80 55 $!sU...9.*.U.*.U
1340: 22 DB 55 CD 1A 25 FE 2C C2 19 2A CD 1A 25 CD C5 ".U..%.,..*..%..
1350: 17 FE 7B C2 19 2A 3E 32 2A DB 55 CD 79 23 CD 50 ..{..*>2*.U.y#.P
1360: 15 CD 93 11 3E 21 2A DB 55 CD 79 23 3E 35 CD 5E ....>!*.U.y#>5.^
1370: 23 2A D7 55 3E 20 CD 35 15 3E C2 DC 79 23 CD 68 #*.U> .5.>..y#.h
1380: 15 E1 22 DB 55 01 0F 00 21 73 55 CD 0E 25 21 73 ..".U...!sU..%!s
1390: 55 CD 39 08 C3 1A 25 21 96 55 7E B7 C2 19 2A 2F U.9...%!.U~...*/
13A0: 77 CD 1A 25 FE 2C C2 19 2A CD 1A 25 CD 00 18 47 w..%.,..*..%...G
13B0: 3A 98 55 3D C2 48 2A 78 FE 7B C2 19 2A FD 7E FD :.U=.H*x.{..*.~.
13C0: B7 28 11 21 F7 17 3D 28 08 21 FF 13 CD 9A 22 18 .(.!..=(.!....".
13D0: 08 CD 9A 22 3E 47 CD 5E 23 CD 50 15 CD 93 11 2A ...">G.^#.P....*
13E0: D7 55 3E 10 CD 35 15 30 0C E5 3E 05 CD 5E 23 E1 .U>..5.0..>..^#.
13F0: 3E C2 CD 79 23 AF 32 96 55 CD 68 15 C3 1A 25 02 >..y#.2.U.h...%.
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
1400: 06 B8 2A E3 55 E5 2A E1 55 E5 21 00 00 22 E3 55 ..*.U.*.U.!..".U
1410: 22 E1 55 CD C5 17 FE 94 C2 19 2A 3E B7 CD 5E 23 ".U.......*>..^#
1420: 3E CA 21 00 00 CD 79 23 2A 69 55 2B 2B 22 E1 55 >.!...y#*iU++".U
1430: CD 1A 25 CD 91 10 3A 93 55 FE BD 28 2A FE 95 28 ..%...:.U..(*..(
1440: 08 2A E1 55 CD C2 23 18 0D CD 1A 25 FE 93 28 17 .*.U..#....%..(.
1450: CD 6F 14 CD 91 10 2A E3 55 7C B5 C4 C2 23 E1 22 .o....*.U|...#."
1460: E1 55 E1 22 E3 55 C9 CD 6F 14 CD 1A 25 18 A4 2A .U.".U..o...%..*
1470: E3 55 3E C3 CD 79 23 2A E1 55 CD C2 23 2A 69 55 .U>..y#*.U..#*iU
1480: 2B 2B 22 E3 55 C9 FE 3B C2 19 2A 3E C3 2A D9 55 ++".U..;..*>.*.U
1490: CD 79 23 2A 69 55 2B 2B 22 D9 55 C3 1A 25 FE 99 .y#*iU++".U..%..
14A0: C2 19 2A CD 1A 25 3D C2 19 2A 21 73 55 CD C0 08 ..*..%=..*!sU...
14B0: B7 28 0D 3E 98 32 73 55 21 00 00 22 80 55 18 1E .(.>.2sU!..".U..
14C0: 3A 73 55 47 E6 0F FE 08 C2 19 2A 2A 80 55 78 87 :sUG......**.Ux.
14D0: 38 0C 3E 18 CD 35 15 3E C3 DC 79 23 18 13 3E C3 8.>..5.>..y#..>.
14E0: CD 79 23 2A 69 55 2B 2B 22 80 55 21 73 55 CD 39 .y#*iU++".U!sU.9
14F0: 08 CD 1A 25 FE 3B C2 19 2A C3 1A 25 FE 3B C2 19 ...%.;..*..%.;..
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
1500: 2A 3A E9 55 B7 28 12 3E C3 2A EA 55 CD 79 23 2A *:.U.(.>.*.U.y#*
1510: 69 55 2B 2B 22 EA 55 18 05 3E C9 CD 5E 23 C3 1A iU++".U..>..^#..
1520: 25 FE 3B C2 19 2A 3E C3 2A 63 55 11 03 00 19 CD %.;..*>.*cU.....
1530: 79 23 C3 1A 25 E5 F5 ED 5B 69 55 13 13 B7 ED 52 y#..%...[iU....R
1540: D1 5D 7D 87 9F BC E1 20 05 CD 6F 23 B7 C9 37 C9 .]}.... ..o#..7.
1550: DD E1 2A D7 55 E5 2A D9 55 E5 21 00 00 22 D9 55 ..*.U.*.U.!..".U
1560: 2A 69 55 22 D7 55 DD E9 DD E1 2A D9 55 7C B5 C4 *iU".U....*.U|..
<br /></pre>
<p><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></p><p><span style="color: #565959;"><span style="background-color: white;">
stellar言語の特徴ですが、基本データ長は8ビットです。(68系のTL/1と同じですね)</span></span></p><p><span style="color: #565959;"><span style="background-color: white;">しかし、64KBのメモリ範囲をアクセスできる関数が用意されているので、それ程不都合はないようです。また、制御構文も if, while, until, for, loop文があるのでプログラムが組みやすいようです。</span></span></p><p><span style="color: #565959;"><span style="background-color: white;">特筆すべきは、inline文が用意されていて、プログラム中に機械語命令やデータを入れることができることと、インデックスレジスタ IX,IYを操作する文があることです。</span></span></p><p><span style="color: #565959;"><span style="background-color: white;">書籍にはサンプルとしてファイルダンプ fdumpとハノイの塔 hanoi がありましたので、それらを参考にして、メモリダンププログラム mdump を作成してみました。</span></span></p>
<p><br /></p><pre class="brush:text" title="mdump"> /* memory dump */
prog mdump();
cons ngetchr := 1, /* get chr from console */
nputchr := 2; /* put chr to console */
var d, i,
sttadr[4], endadr[4],
sadr[2], eadr[2],
ch;
data msttadr: "sttadr= $",0,
mendadr: "endadr= $",0,
header: " +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF",0;
{
/* input disp adrs area */
putstr(;.msttadr);
for i:=0 to 3 {
sttadr[i] := getchr();
}
putnl();
putstr(;.mendadr);
for i:=0 to 3 {
endadr[i] := getchr();
}
putnl(2);
sadr[0] := (sttadr[0]-$30)*$10+(sttadr[1]-$30);
sadr[1] := (sttadr[2]-$30)*$10+(sttadr[3]-$30);
eadr[0] := (endadr[0]-$30)*$10+(endadr[1]-$30);
eadr[1] := (endadr[2]-$30)*$10+(endadr[3]-$30);
/* disp memory data */
sadr[1] := sadr[1] & $f0; /* start from adrlow=$x0 */
{
putstr(;.header);
putnl();
{
puthex(sadr[0]); puthex(sadr[1]);putchr(':');putchr(' '); /* disp adrs */
for i:=0 to 15 {
puthex(memory[sadr[0], (sadr[1])+i]); putchr(' '); /* disp by hex */
}
putchr(' ');
for i:=0 to 15 {
d:=memory[sadr[0], (sadr[1])+i];
ch:= ?(d>=$20 & d<=$7e;d,'.');
putchr(ch); /* disp by ascii */
}
putnl();
sadr[1] := sadr[1] + $10;
} until (((sadr[0] <> eadr[0]) & (sadr[1] = $00)) | ((sadr[0] = eadr[0]) & (sadr[1] > eadr[1])));
putnl();
sadr[0] := sadr[0] + 1;
} until ((sadr[0] > eadr[0]));
}
/***** subroutine *****/
getchr();
{
bdos(ngetchr);
}
putchr(x);
{
bdos(nputchr, x);
}
putnl(n);
cons
cr := $0d,
lf := $0a;
var
pn at ( _work );
{
if pn=0 then n:=1;
loop #,n {
bdos(nputchr, cr);
bdos(nputchr, lf);
}
}
putstr(;ix);
var x;
{
while x:=@[ix+] {
bdos(nputchr, x);
}
}
puthex(h);
{
puthex1(h>>4);
puthex1(h);
}
puthex1(h);
{
bdos(nputchr, ?((h:=h & $0f)<10 0005h="" _work="" a="" argn="1" at="" bdos="" br="" c="" call="" cd="" d1="" dd="" de="" e1="" e5="" e="" else="" f="" fd="" func="" h="" hl="" if="" inline="" ix="" iy="" ld="" pop="" push="" then="" var="" x=""></10></pre>
<p><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></p><p><span style="color: #565959;"><span style="background-color: white;">
この例で分かりますように、CP/MのBDOSを直接呼べますので、I/O関連のプログラムも容易に作成できます。ということで、GAMEやTL/1言語のようなマシンに密着したツールソフトを作成するのに向いている言語ではないかなという印象です。以上、書籍に掲載されていたCP/M版のZ80用の8ビットコンパイラを入力して、簡単なサンプルプログラムを作ってみたという報告でした。 </span></span></p><p><span style="color: #565959;"><span style="background-color: white;">もし、使ってみたいという方がおられましたら、メールで連絡をくだされば実行ファイル(stellar.comとconvobj.com)を返信メールに添付してお送りできます。</span></span><span style="background-color: white; color: #565959;"> (もっとも、書籍中の構文や文法の解説を読まないと、使ってみるのもなかなか大変ですが。)</span></p><p></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-74169387154775586552023-07-04T21:47:00.001+09:002023-07-04T21:47:33.871+09:00コンパイラ作成の試み その2 言語の拡張(コメントとFOR文など)<h4 style="text-align: left;"> コンパイラ作成の試み その2 言語の拡張(FOR文で四苦八苦)</h4><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1On0O05LZ5ulRjyzmaygCJphWm-UHvbPSReXfQXE62EzqhrBJ1KmvO7G3nAql-cMQqJcBUkWYfJvOdGSJG74j4X50Sd30GfBF73-Vinnj_0g9x_hOTsLIuaMZfyhqQEibnoiL0MUcBRxIhFa-grlRxefQHQAog1o1LJ4yEAQ8BENCYxYrMB-Exa-Q3XA/s4032/IMG_3841.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1On0O05LZ5ulRjyzmaygCJphWm-UHvbPSReXfQXE62EzqhrBJ1KmvO7G3nAql-cMQqJcBUkWYfJvOdGSJG74j4X50Sd30GfBF73-Vinnj_0g9x_hOTsLIuaMZfyhqQEibnoiL0MUcBRxIhFa-grlRxefQHQAog1o1LJ4yEAQ8BENCYxYrMB-Exa-Q3XA/w300-h400/IMG_3841.JPG" width="300" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">(表示用のアイコンとして入れてあります)</td></tr></tbody></table><br /><p>前回からずいぶんと時間が過ぎましたが、言語の拡張がなかなかうまくいかず、四苦八苦していますが、とりあえず現在の状況です。</p><p>拡張したのは以下の3つです。</p><h4 style="text-align: left;">1.コメント文が使えるようにした。</h4><p> プログラム作成時にはコメントアウト機能は必須だと思いますので、/*と*/で囲んだ部分はコメントとして読み飛ばされるようにしました。</p><h4 style="text-align: left;">2.PRINT文(PRINTLNも)の書式を変更した。</h4><p> C言語に慣れているせいか PRINT文の書式には違和感がありましたので、プリントする式部分を括弧で囲むように書式を変更しました。</p><p> 変更前:PRINT I, ": ", DATA[I];</p><p> 変更後:PRINT (I, ": ", DATA[I]);</p><h4 style="text-align: left;">3.FOR文を追加した。(...未完成)</h4><p> 制御文としては、IF文、WHILE文、DO..WHILE文があるのですが、やはりFOR文があると便利ということで追加してみようと試みました。</p><p>1と2は何とか実現できたのですが、3のFOR文の追加については四苦八苦した挙句、一応それらしく動作するものができたのですが、動作が思ったようにはなりません。。。</p><p> 例えば FOR (I=0; I<10; I=I+1) PRINT(I,","); の場合</p><p> 結果は 1,2,3,4,5,6,7,8,9,10 となってしまうのです。</p><p>その理由ですが、FOR文を頭から見ていくため、まず I=0 の初期設定で I の値を設定し、次に I<10 の終了条件の真偽判定をして、真の場合は続いて I=I+1 の増分を実行してから PRINT文を実行した後にFOR文の先頭に戻るという手順を繰り返すために、繰り返しの1回目から制御変数の増分を実行してしまうためです。</p><p>この言語は全てをスタックに積む形式で行っているために、途中経過をどこかに保存しておくということができず、プログラムをシーケンシャルに実行していくために、このような結果になってしまっています。</p><p>(WHILE文やDO..WHILE文ではシーケンシャルに実行していって正しい結果が得られるような書式になっています。)</p><p>スタック言語ではFOR文のような、解析した順序とは異なる順序で実行しなければならない文は不可能なのでしょうか。それとも何か実現できるような手法があるのでしょうか。</p><p>(そういえば、中田先生のPL/0にもFOR文はありませんね、、、)</p><p>私の知識・経験不足のためにこれ以上は無理なようですので、言語の拡張はここまでにして、次は、中間言語に変換しているところを直接6809の命令語に変換するように変更して、6809機で動作するコードを生成するコンパイラに仕上げていこうと思います。</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-21123055990776840932023-05-20T11:54:00.112+09:002023-05-20T19:48:05.001+09:00コンパイラ作成の試み その1「ハイクラスC言語」のリストを入力<h4 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><br /></div><br /> コンパイラを作ってみたくて「ハイクラスC言語」のリストを入力してみました</h4><p>昔からコンパイラの自作に憧れていまして、入手した書籍は十数冊になると思いますが、本をいくら読んでも(もちろん、完全に理解できるまで読み込めていないのですが)、コンパイラ(あるいはインタプリタ)の構造についてはおぼろげには理解できたような気がしても、実際のプログラムをどのように構成すればよいのかが良く分かりませんでした。</p><p>目標は6809用の整数型のコンパイラの自作なので、特に具体的なコード生成手法を知りたいのですが、何しろコンパイラの本というのは理論的な本が多くて、、、</p><p><br /></p><h4 style="text-align: left;">今までに読んだ本で印象に残っている本を挙げると、</h4><div style="text-align: left;"><br /></div><div style="text-align: left;">・明解入門 コンパイラ・インタプリタ開発 (林晴比古 SoftBank社)</div><div style="text-align: left;"> 分かりやすかったのですが、変数の使える電卓プログラムまででめげました。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">・Go言語でつくるインタプリタ (Thorsten Ball著、設楽<span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;">洋爾訳 技術評論社)</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"> 段階ごとにテストで確認しながら進む手法に感心しましたが、使ったことがないGo言語に戸惑いながらでしたので、途中で力尽きました。</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"><br /></span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;">・コンパイラ 作りながら学ぶ (中田育男 オーム社)</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"> 言わずと知れた中田先生の本です。この本で扱われているPL/0をFLEX9上のMicroCコンパイラを使用して6809に移植しようと試みたのですが、私には無理でした。</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"><br /></span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;">・Z80CPU対応 新言語作成の技法 (大貫広幸著 MIA社)</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"> ほとんど使用経験のないZ80の本ですが、この本で初めてコード生成の具体的手法を知りました。後半はPC-8801とCP/M-80で動作するコンパイラ言語Stellarのアセンブルリストが掲載されています。(いつかCP/M-80版を入力してみたいです。</span><span style="background-color: white; color: #565959;">120ページ以上ありますが</span><span style="background-color: white; color: #565959;">)</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"><br /></span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;">・ハイクラスC言語 (末石吾朗、小林優 技術評論社)</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"> 具体的なコード生成に重点を置いているので読みやすいです。仮想マシンの命令コードを設定して、それに対応するコンパイラと、生成された仮想コードを解釈・実行するインタプリタのソースリストが掲載されています。</span></div><div style="text-align: left;"><span face=""Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif" style="background-color: white; color: #565959;"><br /></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">何冊読んでもなかなか進めないので、思い切って作り始めようと考えたのですが、実は今までにも始めながら途中で投げ出したことが数回ありますので、ゼロから作り始めるのは無理だと考えて、大昔に購入して本棚に入れたままになっていた「ハイクラスC言語」中のリストをまず入力して、その仮想マシンの部分を6809に置き換えるという方針で始めることにしました。</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb6Bu2LkimHySAH4-yC4OVQy9dnEDVQN3n5onsOL2Dgyvl6w_3N6OVWE4e9zuF03_u_ec24LHR2hBow2MK3LHKc4A7rMZB-o-FQEJg0HpZZTw8MB3dGe47asElkgZRuo97u8dkjFshcoaxoaIglYk6v_-dy0gV9yZFfg1us5IUzL9G6rzR_Zhvke90/s4032/IMG_3841.JPG" style="font-weight: 700; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb6Bu2LkimHySAH4-yC4OVQy9dnEDVQN3n5onsOL2Dgyvl6w_3N6OVWE4e9zuF03_u_ec24LHR2hBow2MK3LHKc4A7rMZB-o-FQEJg0HpZZTw8MB3dGe47asElkgZRuo97u8dkjFshcoaxoaIglYk6v_-dy0gV9yZFfg1us5IUzL9G6rzR_Zhvke90/w300-h400/IMG_3841.JPG" width="300" /></a></div><div style="text-align: left;"><span style="color: #565959;"></span><span style="background-color: white;"></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><h4 style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">何とプログラムリストの一部が欠落していた</span></span></h4><div style="text-align: left;"><span style="background-color: white; color: #565959;"><br /></span></div><div style="text-align: left;"><span style="background-color: white; color: #565959;">コンパイラプログラムmccとインタプリタプログラムmaiを入力してみました。</span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">入力してみて初めて分かったのですが、何とmccの8個のファイルのうちの c_dec.c のリストが抜け落ちているのです。。。(誤植にしてはヒドイ...)</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">ただ、その中に3つの関数があることは分かっていて、それらの処理内容も本文中に書かれているので、既に他のファイルは入力してしまったこともあり、何とか自分で記述するしかないと覚悟をしました。</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">(ちなみに、所有しているのは平成5年の初版で誤植が非常に多いのですが、30年前のものなので、出版社のサイトを見ても関連する資料が見つかりません...)</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">作成しなければならない関数は、変数宣言を処理する vardec()、関数を処理する function()、文をコンパイルする statement()の3つです。</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">その仕様についての解説です。</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #565959;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBLJz9GojEFTjmdCKTLCysGEsrftj5gye8FLnMc-FuAGaSkHBxOQIdl0vProJBO0PvgHP4JytY8go_vmGoALF6i0awC_fS-wnkFRqT3l9w33srKwHIVbkNcDIVWUPJjzRyk9YGs8YuvVZElTN8vx5-KBrYHTYV1c6eQUWyLSL3aqtd3uDSgzoVBB3s/s1964/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_1.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1964" data-original-width="1816" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBLJz9GojEFTjmdCKTLCysGEsrftj5gye8FLnMc-FuAGaSkHBxOQIdl0vProJBO0PvgHP4JytY8go_vmGoALF6i0awC_fS-wnkFRqT3l9w33srKwHIVbkNcDIVWUPJjzRyk9YGs8YuvVZElTN8vx5-KBrYHTYV1c6eQUWyLSL3aqtd3uDSgzoVBB3s/w370-h400/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_1.jpg" width="370" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">vardec関数の仕様</td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbzmQ2Bg1TRZp9P2IcTdA3MEXa_stX9X9nrQ052s3MPcoccokP00pO2UXkYTLEpHcF07apc4wnfKMcxC6oQPx2e3vS5W0GMHagziDbd1VoDceQbB9jfkTFrwVGVJuuN7nwzVHvcqE-pix9xqoOhtuzNr1s--aWepwSEmkRBHUpL-wtwJnPfyK6REZ/s2448/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_2.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2448" data-original-width="1992" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQbzmQ2Bg1TRZp9P2IcTdA3MEXa_stX9X9nrQ052s3MPcoccokP00pO2UXkYTLEpHcF07apc4wnfKMcxC6oQPx2e3vS5W0GMHagziDbd1VoDceQbB9jfkTFrwVGVJuuN7nwzVHvcqE-pix9xqoOhtuzNr1s--aWepwSEmkRBHUpL-wtwJnPfyK6REZ/w325-h400/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_2.jpg" width="325" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">function関数の仕様</td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJPM546fmp7D8FU1Qs8zkK1Viff3-2eDz0WVUoi7UouAb667OEMQksL5bKvBRNPUw_4L848y_WYHoVgWvQfMo9YGS1HN5c9lTEkk81HbHkny4LC6vdLUtR2HvJXuzY9WSrFtDAoZ_j7UlurYqU9WU8pPrbRMwdiWOKQpVPibRK74jpmS8LtQeXCVRX/s1796/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1296" data-original-width="1796" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJPM546fmp7D8FU1Qs8zkK1Viff3-2eDz0WVUoi7UouAb667OEMQksL5bKvBRNPUw_4L848y_WYHoVgWvQfMo9YGS1HN5c9lTEkk81HbHkny4LC6vdLUtR2HvJXuzY9WSrFtDAoZ_j7UlurYqU9WU8pPrbRMwdiWOKQpVPibRK74jpmS8LtQeXCVRX/w400-h289/c_dec_%E3%83%9A%E3%83%BC%E3%82%B8_3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">statement関数の仕様</td></tr></tbody></table><br /></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;">四苦八苦しながら2週間近くかかって何とかエラーが出ない状態にすることができましたが、その過程でプログラムの構造について結構理解が進んだような気がしますので、結果的には良かったと考えることにします。</span></span></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><br /></span></span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #565959;"><span style="background-color: white;"><div>30年も前の書籍ですし、今更リストを入力しようとする方もおられないとは思いますが、私が書いた c_dec.c を下に示しておきます。(書籍中のリストにこれを追加することで、一応、正常に動作すると思います。)</div></span></span></div>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="c_dec.c">/***********************************************************************
**** ****
**** c_dec.c Micro C Compiler declaration procedure file <span> </span>****
**** ****
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "c_mcc.h"
/***************************************************************
* vardec() 変数宣言の処理
* 戻り値: なし
* 引数: なし
***************************************************************/
void vardec(void)
{
do {
getsym();
if (sym != IDENT)
puterr("Variable ID expected.");
getsym();
if (sym != LBRCKT) { /* 単純変数 */
enter(VAR_SMPL);
gen(VAR_SMPL, lblcnt++);
}
else { /* 配列変数 */
getsym();
if (isdigit(sym) != 0)
puterr("Number expected.");
enter(VAR_ARY);
gen(VAR_ARY, lblcnt++);
getsym();
if (sym != RBRCKT)
puterr("']' expected.");
getsym();
}
} while(sym == COMMA);
if (sym != SEMICOL)
puterr("';' expected.");
getsym();
}
/***************************************************************
* function() 関数処理
* 戻り値: なし
* 引数: なし
***************************************************************/
void function(void)
{
int i, mflag;
int j;
source_f();
if ((i = position()) < 0) {
label(lblcnt++, fp);
// enter(FUNCID);
enter(UNDEFID);
}
else {
if (strcmp(id, "main") == 0) { /* if "main" */
j = 0;
while (strcmp(idtbl[j].name, id) != 0 && j <= idcnt) {
j++;
}
if (j < idcnt) { /* already exist */
if (idtbl[j].kind != UNDEFID) {
puterr("Symbol redeclarated.");
}
else {
mflag = ON;
label(0, fp);
// enter(BLTFUNC);
idtbl[j].kind = BLTFUNC;
idtbl[j].addr = j;
}
}
}
else if (idtbl[i].kind == UNDEFID) {
label(idtbl[i].addr, fp);
// enter(FUNCID);
idtbl[i].kind = FUNCID;
// idtbl[i].addr = lblcnt;
}
else
puterr("Symbol redeclarated.");
}
getsym();
if (sym == LBRACE) {
// i = 0;
// while (strcmp(id, idtbl[i].name) != 0 && i < idcnt)
// i++;
// label(idtbl[i].addr, fp);
getsym();
while (sym != RBRACE) {
statement();
if (sym == EOFSYM)
puterr("'}' expected.");
}
// if (strcmp(id, "main") == 0 && mflag == ON) { /* if "main" */
if (mflag == ON) { /* if "main" */
gen(JUMP, 1);
mflag = OFF;
} else
gen(RET, DUMY);
// }
}
else
puterr("'{' expected.");
getsym();
}
/***************************************************************
* statement() 文処理
* 戻り値: なし
* 引数: なし
***************************************************************/
void statement(void)
{
switch (sym) {
case IDENT:
assign();
break;
case IFSYM:
if_proc();
break;
case WHILESYM:
while_proc();
break;
case DOSYM:
do_while();
break;
case CALLSYM:
call_proc();
break;
case INPUTSYM:
input_proc();
break;
case PRINTSYM:
print_proc();
break;
case PRTLNSYM:
print_proc();
gen(NEW_LINE, 0);
break;
case LBRACE:
lbrace();
break;
case SEMICOL:
getsym();
break;
default:
puterr("statement expected.");
}
}
</pre><div><br /></div>
わずか160行ほどのプログラムの作成に2週間もかかってしまって情けないですが、他の関数の動作を推測・確認しながらでしたので、こんなものかなと、、、<div><br /></div><div><div><span style="color: #565959;"><span style="background-color: white;">入力して出来上がった言語mcコンパイラ・アセンブラの仕様ですが、2バイトの整数型のもので、次に示したhit & blowの例で大体の雰囲気が分かってもらえるかと思います。</span></span></div><div><br /></div><div><span style="color: #565959;"><span style="background-color: white;"><div>var<span style="white-space: pre;"> </span>i, j, inp, cnt;</div><div>var ans[4], in[4];</div><div>var hit, blow;</div><div>var flag[10], endflag, once_more;</div><div><br /></div><div>main</div><div>{</div><div><span><span style="white-space: pre;"> </span>println "*** Hit & Blow ***";</span></div><div><span><span style="white-space: pre;"> </span>println "Guess 4 digit number (Miunus to abort)";</span></div><div><span><span style="white-space: pre;"> </span>do {</span></div><div><span><span style="white-space: pre;"> </span>call game;</span></div><div><span><span style="white-space: pre;"> </span>print "Once more ( YES: 1, NO: other ) ? ";</span></div><div><span><span style="white-space: pre;"> </span>input once_more;</span></div><div><span><span style="white-space: pre;"> </span>} while (once_more == 1);</span></div><div><span><span style="white-space: pre;"> </span>println "See you again !";</span></div><div>}</div><div><br /></div><div>game</div><div>{</div><div><span><span style="white-space: pre;"> </span>call init;</span></div><div><span><span style="white-space: pre;"> </span>cnt = 1;</span></div><div><span><span style="white-space: pre;"> </span>endflag = 0;</span></div><div><span><span style="white-space: pre;"> </span>do {</span></div><div><span><span style="white-space: pre;"> </span>call inpnum;</span></div><div><span><span style="white-space: pre;"> </span>if (inp < 0)</span></div><div><span><span style="white-space: pre;"> </span>endflag = 1;</span></div><div><span><span style="white-space: pre;"> </span>else</span></div><div><span><span style="white-space: pre;"> </span>call compare;</span></div><div><span><span style="white-space: pre;"> </span>cnt = cnt + 1;</span></div><div><span><span style="white-space: pre;"> </span>} while (endflag == 0);</span></div><div>}</div><div><br /></div><div>init</div><div>{</div><div><span><span style="white-space: pre;"> </span>i = 0;</span></div><div><span><span style="white-space: pre;"> </span>while (i < 10) {</span></div><div><span><span style="white-space: pre;"> </span>flag[i] = 0;</span></div><div><span><span style="white-space: pre;"> </span>i = i + 1;</span></div><div><span><span style="white-space: pre;"> </span>}</span></div><div><span><span style="white-space: pre;"> </span>i = 0;</span></div><div><span><span style="white-space: pre;"> </span>while (i < 4) {</span></div><div><span><span style="white-space: pre;"> </span>ans[i] = rnd % 10;</span></div><div><span><span style="white-space: pre;"> </span>while (flag[ans[i]] != 0)</span></div><div><span><span style="white-space: pre;"> </span>ans[i] = rnd % 10;</span></div><div><span><span style="white-space: pre;"> </span>flag[ans[i]] = 1;</span></div><div><span><span style="white-space: pre;"> </span>i = i + 1;</span></div><div><span><span style="white-space: pre;"> </span>}</span></div><div>}</div><div><br /></div><div>inpnum</div><div>{</div><div><span><span style="white-space: pre;"> </span>do {</span></div><div><span><span style="white-space: pre;"> </span>print "Guess ? ";</span></div><div><span><span style="white-space: pre;"> </span>input inp;</span></div><div><span><span style="white-space: pre;"> </span>if (inp >= 10000)</span></div><div><span><span style="white-space: pre;"> </span>println "Too Big. Re-enter!";</span></div><div><span><span style="white-space: pre;"> </span>} while (inp >= 10000);</span></div><div><span><span style="white-space: pre;"> </span>in[0] = inp / 1000;</span></div><div><span><span style="white-space: pre;"> </span>in[1] = (inp % 1000) / 100;</span></div><div><span><span style="white-space: pre;"> </span>in[2] = (inp % 100) / 10;</span></div><div><span><span style="white-space: pre;"> </span>in[3] = inp % 10;</span></div><div>}</div><div><br /></div><div>compare</div><div>{</div><div><span><span style="white-space: pre;"> </span>hit = 0;</span></div><div><span><span style="white-space: pre;"> </span>blow = 0;</span></div><div><span><span style="white-space: pre;"> </span>i = 0;</span></div><div><span><span style="white-space: pre;"> </span>while (i < 4) {</span></div><div><span><span style="white-space: pre;"> </span>j = 0;</span></div><div><span><span style="white-space: pre;"> </span>while (j < 4) {</span></div><div><span><span style="white-space: pre;"> </span>if (ans[j] == in[i]) blow = blow + 1;</span></div><div><span><span style="white-space: pre;"> </span>if (j == 1) if (ans[j] == in[i]) hit = hit + 1;</span></div><div><span><span style="white-space: pre;"> </span>j = j + 1;</span></div><div><span><span style="white-space: pre;"> </span>}</span></div><div><span><span style="white-space: pre;"> </span>i = i + 1;</span></div><div><span><span style="white-space: pre;"> </span>}</span></div><div><span><span style="white-space: pre;"> </span>blow = blow - hit;</span></div><div><span><span style="white-space: pre;"> </span>print cnt, " times. ";</span></div><div><span><span style="white-space: pre;"> </span>if (hit == 4) {</span></div><div><span><span style="white-space: pre;"> </span>println "Match !!";</span></div><div><span><span style="white-space: pre;"> </span>endflag = 1;</span></div><div><span><span style="white-space: pre;"> </span>}</span></div><div><span><span style="white-space: pre;"> </span>else println "Hit=", hit, " Blow=", blow;</span></div><div>}</div><div><br /></div></span></span></div></div><div>このコンパイラの拡張例として、言語仕様の拡張(関数の引数、戻り値、ローカル変数の追加)や、特定CPUのコードを生成するための手順が解説されていますので、これをベースにして、仮想マシンのコードを生成している部分を6809の命令に置き換えることができれば6809のコンパイラができるはずですので、ぜひ実現させたいと思っています。</div><div><br /></div><div>以上、書籍「ハイクラスC言語」中のコンパイラ・インタプリタのリストを入力してみたという紹介でした。</div><div><br /></div><div><br /></div><div><div><br /></div><div><br /></div></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com2tag:blogger.com,1999:blog-1662007451717538019.post-69848718375198271432023-05-19T20:22:00.084+09:002023-05-20T08:42:03.932+09:00FM-7にRTCとSDを接続する試み(SDカード編 その5 修正版です)<h4 style="text-align: left;">SDRWFMが完成したつもりでしたが、不具合がいくつか見つかりましたので修正しました。</h4><div><br /></div>自分で使用する場合には無意識のうちに不具合が出ないような使い方をしてしまいますので、知人に使用していただいて不具合などのチェックをしていただきました。<div><br /><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgStk1u_R1p_XAv7P6Jo9ZHHz1-Ir8fTjTu8J1u-hDl0R18czQNhCTct1rmd9JYsJ8blh4E7WipjPvi2Docf9a2TgezFXwQRMG2qGAdsXUnOg27yzpvlyqZDaXG2Wj2nufHHNB6BAh6YmO8yOtZe5NqZkLPJAQZBCS7Xs4rG6_GloGCvGlHOvRXuMHY/s4032/RTC_SD%E3%82%AB%E3%83%BC%E3%83%89.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgStk1u_R1p_XAv7P6Jo9ZHHz1-Ir8fTjTu8J1u-hDl0R18czQNhCTct1rmd9JYsJ8blh4E7WipjPvi2Docf9a2TgezFXwQRMG2qGAdsXUnOg27yzpvlyqZDaXG2Wj2nufHHNB6BAh6YmO8yOtZe5NqZkLPJAQZBCS7Xs4rG6_GloGCvGlHOvRXuMHY/w400-h300/RTC_SD%E3%82%AB%E3%83%BC%E3%83%89.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">前回と同じ画像です</td></tr></tbody></table><br /><div>(前回と同じ画像を貼ってありますが、画像がないとアイコンが表示されないようなので、それを避けるためです。)</div><div><div><br /></div><div><br /><div>修正点は以下の3点です。<br /><div>(1)ファイル名に「-」(ハイフン)を使えるようにしました。</div></div><div> パラメータ取得時に、入力文字列を区切るための文字を0x30未満の文字すべてとしていたので、ハイフンも区切り文字として扱われてしまっていました。F-BASICではファイル名にハイフンも含まれますので、区切り文字から外すように修正しました。</div><div>(2)Windows上のXM7などでバイナリ保存したファイルをSDにコピーして、それをFM-7で読み出すと正常に読み込めない場合がある点を修正しました。</div><div> バイナリ保存されたBASICプログラム中には、リンクポインタとして保存アドレスが直接書き込まれているので、同じFM-7であっても機器の条件によってBASICプログラムの保存アドレスが異なることがあるために、そのまま読み込んだのでは正常な範囲に保存されないことがあり得ます。これを解決するために、F-BASICに用意されているリンクポインタの修正をするルーチンを使用して、リンクポインタを変換しながら読み込むことにしました。</div><div>(3)FM-7上で機械語ファイルを保存する場合に、末尾の5バイトのフッタを付加していませんでした。実用上の不便はありませんが、互換性を考慮してフッタを付加することにしました。</div><div><br /></div><div>その他、修正点ではありませんが、使用するSD(SDHCも)カードを初期化する際にはアロケーションサイズを32KBにする必要があることも指摘していただきました。</div><div><br /></div></div>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="SDRWFM">0001 *
0002 * SDRWFM.TXT
0003 *
0004 * SD Read/Write for FM-7
0005 *
0006 * use RTC & SD Card
0007 *
0008 * 6821(PIA) Port A -- RTC (I2C Mode)
0009 *
0010 * SBC RTC Ext IO
0011 * CA2 2 -- -- HV4 LV4 -- IO1
0012 * PA0 3 -- SCL -- HV1 LV1 -- IO4
0013 * PA1 4 -- -- HV2 LV2 -- IO3
0014 * PA7 10 -- SDA -- HV3 LV3 -- IO2
0015 * GND -- -- -- GND
0016 * -- -- -- 3V3
0017 *
0018 *
0019 * 6821(PIA) Port B -- SD (SPI Mode)
0020 *
0021 * SBC SD
0022 * CB2 12 -- HV4 LV4 -- SCK
0023 * PB0 13 -- HV1 LV1 -- CS
0024 * PB1 14 -- HV2 LV2 -- MISO
0025 * PB7 20 -- HV3 LV3 -- MOSI
0026 * GND 31 -- -- GND
0027 * VCC 33 -- -- VCC
0028 *
0029 * cf. all data line use level converter
0030 *
0031 * PB output mode
0032 * CB2 1bit output
0033 *
0034 * READ/WRITE BUFFER $5E00 - 5FFF
0035 *
0036 * Ascii program readable '2023.04.18
0037 * Fix date routine '2023.04.12
0038 * Implement write cmd '2023.04.07
0039 * Add command '2023.03.14
0040 * Change use Port B '2023.03.07
0041 * Original version '2022.06.11
0042 * Copyright by Y.Yamamoto
0043 *
0044 6000 STTADR EQU $6000
0045
0046 FBB8 INCHA EQU $FBB8 for FM-7
0047 FBBB OUTCHA EQU $FBBB for FM-7
0048 FBF7 CSRON EQU $FBF7 for FM-7
0049 D807 LININP EQU $D807 for FM-7 (to $043D- )
0050 *DEVNO EQU $BF for FM-7
0051 043D LINBUF EQU $043D 1 line input buffer for F-BASIC
0052 033C TXTBUF EQU $033C text buffer after conversion for F-BASIC
0053 9162 RDLINO EQU $9162 read line number for F-BASIC
0054 FBF1 LININT EQU $FBF1 (=C28C) one line translation for F-BASIC
0055 C730 FIXPTR EQU $C730 fix link pointer of binary saved file for F-BASIC
0056 004B LINO1 EQU $4B
0057 033A LINO2 EQU $33A
0058 000D CR EQU $0D
0059 000A LF EQU $0A
0060 0020 SPC EQU $20
0061 001B ESC EQU $1B
0062
0063 5E00 RWBUF EQU STTADR-$200
0064
0065 02FA FMDAT EQU $02FA date of FM-7
0066 FD9E PBDAT EQU $FD9E for FM-7
0067 FD9F PBCTL EQU PBDAT+1
0068 0033 BASADP EQU $33 (33,34) pointer for F-BASIC
0069 0035 BASAEP EQU $35 (35,36) pointer for F-BASIC
0070 2000 TXTADR EQU $2000 load adr for TEXT
0071 00E5 DELMK EQU $E5 delete mark
0072
0073 6000 ORG STTADR
0074
0075 6000 16 00A0 START LBRA MAIN
0076 6003 01 VN FCB 1 version no
0077 6004 00 SCTN0 FCB 0 top adrs of sct
0078 6005 00 SCTN1 FCB 0
0079 6006 00 SCTN2 FCB 0
0080 6007 00 SCTN3 FCB 0
0081 6008 00 RESDAT FCB 0 response data
0082 6009 00 SDHC FCB 0 sd:0,sdhc:1
0083
0084 600A 0000 SCTBPB FDB 00 sct no of BPB(4bytes)
0085 600C 0000 FDB 00
0086 600E 0000 SCTFAT FDB 00 sct no of FAT#1(4bytes)
0087 6010 0000 FDB 00
0088 6012 0000 SCTDIR FDB 00 sct no of DIR(4bytes)
0089 6014 0000 FDB 00
0090 6016 0000 SCTDSV FDB 00 save sct no of DIR(4bytes)
0091 6018 0000 FDB 00
0092 601A 0000 SCTCLT FDB 00 sct no of top CLUSTER(4bytes)
0093 601C 0000 FDB 00 if SD:#2, SDHC:#3
0094 601E 00 SCTPCL FCB 0 sct per cluster
0095 601F FF DIRENT RMB 32 directory entry
0096 603F FF WMDY RMB 3 mon,day,year
0097 6042 FF WFSIZ RMB 4 file size(4bytes)
0098 6046 FF FILSIZ RMB 2 file size
0099 6048 0000 CLSTH FDB 00 cluster High
0100 604A 0000 CLSTL FDB 00 cluster Low
0101 604C 00 CNT FCB 0
0102 604D 00 MCFLG FCB 0 0:machine code, $FF,$FE:binary save 1:else
0103 604E 00 TPGFLG FCB 0 1:top page 0:else
0104 604F FF FNAME RMB 11 file name(8+3)
0105 605A 00 DPGNO FCB 0 page no of empty dir entry
0106 605B 0000 DIROFS FDB 00 offset of empty dir entry
0107 605D 0000 BASEXP FDB 00 basic exe adr
0108 605F 0000 MCADP FDB 00 machine code start adr
0109 6061 0000 MCAEP FDB 00 machine code end adr
0110 6063 0000 MCEXP FDB 00 machine dode exec adr
0111 6065 0000 EXSTFL FDB 00 ofset of exist dir entry
0112 6067 0000 CVTLEN FDB 00 length of converted text
0113 6069 0000 RDTOP FDB 00 adr of read point
0114 606B 0000 SVTOP FDB 00 adr of saved point
0115 606D 0000 WK1 FDB 00
0116 606F 0000 WK2 FDB 00
0117 6071 0000 WK3 FDB 00
0118 6073 0000 WK4 FDB 00
0119 6075 0000 WK0 FDB 00
0120
0121 6077 FF INPBUF RMB 8
0122 607F FF CNVBUF RMB 4
0123 6083 FF FILBUF RMB 32
0124
0125 60A3 MAIN EQU *
0126 *=====reset pia=====
0127 *portB:output
0128 60A3 86 30 LDA #$30
0129 60A5 B7 FD9F STA PBCTL select ddra, cb2:0
0130 60A8 86 FD LDA #$FD pb0,7:out,pb1:in
0131 60AA B7 FD9E STA PBDAT set output mode
0132 60AD 86 34 LDA #$34
0133 60AF B7 FD9F STA PBCTL select peripheral,cb2:0
0134
0135 *for pia exist check
0136 60B2 86 55 LDA #$55 test data
0137 60B4 B7 FD9E STA PBDAT
0138 60B7 B6 FD9E LDA PBDAT
0139 60BA 84 FD ANDA #$FD pb1=0
0140 60BC 81 55 CMPA #$55
0141 60BE 27 07 BEQ INIT
0142 60C0 8E 707B LDX #MERR
0143 60C3 17 0D5D LBSR PSTRNG
0144 60C6 39 RTS Return F-BASIC
0145
0146 60C7 INIT EQU *
0147 60C7 17 0094 LBSR SDINIT
0148
0149 ****************************************
0150 * MAIN MENU
0151 ****************************************
0152 60CA MENU EQU *
0153 60CA 4F CLRA
0154 60CB 1F 8B TFR A,DP
0155 60CD 8E 6F90 LDX #MSMENU1
0156 60D0 17 0D50 LBSR PSTRNG
0157 60D3 BD FBF7 JSR CSRON cursor on
0158 60D6 BD 6F12 JSR INOUTC
0159 60D9 84 DF ANDA #$DF to upper
0160
0161 60DB 81 46 CMPA #'F
0162 60DD 26 05 BNE MENU1
0163 60DF 17 0324 LBSR DSPDIR
0164 60E2 20 E6 BRA MENU
0165 60E4 81 4C MENU1 CMPA #'L
0166 60E6 26 05 BNE MENU2
0167 60E8 17 03BF LBSR LDFILE
0168 60EB 20 DD BRA MENU
0169 60ED 81 42 MENU2 CMPA #'B
0170 60EF 26 05 BNE MENU3
0171 60F1 17 06C5 LBSR WRBFILE
0172 60F4 20 D4 BRA MENU
0173 60F6 81 4D MENU3 CMPA #'M
0174 60F8 26 05 BNE MENU4
0175 60FA 17 0732 LBSR WRMFILE
0176 60FD 20 CB BRA MENU
0177 60FF 81 4B MENU4 CMPA #'K
0178 6101 26 05 BNE MENU5
0179 6103 17 065E LBSR KILFILE
0180 6106 20 C2 BRA MENU
0181 6108 81 53 MENU5 CMPA #'S
0182 610A 26 04 BNE MENU6
0183 610C 8D 50 BSR SDINIT
0184 610E 20 BA BRA MENU
0185 6110 81 4F MENU6 CMPA #'O
0186 6112 26 04 BNE MENU7
0187 6114 20 0A BRA OPMENU
0188 6116 20 B2 BRA MENU
0189 6118 81 51 MENU7 CMPA #'Q
0190 611A 26 AE BNE MENU
0191 611C 17 0C49 LBSR PCRLF
0192 611F 39 RTS Return F-BASIC
0193
0194 *
0195 6120 OPMENU EQU *
0196 6120 8E 6FE9 LDX #MSMENU2
0197 6123 17 0CFD LBSR PSTRNG
0198 6126 BD 6F12 JSR INOUTC
0199 6129 80 30 SUBA #$30
0200 612B 26 02 BNE OPMEN6 0?
0201 612D 20 9B BRA MENU
0202
0203 612F 4A OPMEN6 DECA 1?
0204 6130 26 05 BNE OPMEN7
0205 6132 17 0246 LBSR RDSCT
0206 6135 20 E9 BRA OPMENU
0207 6137 4A OPMEN7 DECA 2?
0208 6138 26 05 BNE OPMEN8
0209 613A 17 01C1 LBSR DSPSDDAT
0210 613D 20 E1 BRA OPMENU
0211 613F 4A OPMEN8 DECA 3?
0212 6140 26 05 BNE OPMEN9
0213 6142 17 0249 LBSR DSPMBR
0214 6145 20 D9 BRA OPMENU
0215 6147 4A OPMEN9 DECA 4?
0216 6148 26 05 BNE OPMEN10
0217 614A 17 0295 LBSR DSPBPB
0218 614D 20 D1 BRA OPMENU
0219 614F 4A OPMEN10 DECA 5?
0220 6150 26 CE BNE OPMENU
0221 6152 17 029F LBSR DSPFAT
0222 6155 20 C9 BRA OPMENU
0223
0224 *
0225 6157 SDERR EQU *
0226 6157 8E 707B LDX #MERR
0227 615A 17 0CC6 LBSR PSTRNG
0228 615D 39 RTS Return F-BASIC
0229
0230 ****************************************
0231 * SD Initialize routine
0232 ****************************************
0233 615E SDINIT EQU *
0234 *---------- start ----------
0235 615E 8E 7064 LDX #MSINIT
0236 6161 17 0CBF LBSR PSTRNG
0237 * cs:1,di:1,sck>74ms
0238 6164 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
0239 6166 B7 FD9E STA PBDAT
0240 6169 C6 50 LDB #80 80times
0241 616B 17 0BB5 ISTT LBSR SETCKL
0242 616E 17 0BBB LBSR SETCKH
0243 6171 5A DECB
0244 6172 26 F7 BNE ISTT
0245 *
0246 *---------- cmd 0 ----------
0247 6174 SCMD0 EQU *
0248 6174 17 0BAC LBSR SETCKL
0249 6177 C6 06 LDB #6
0250 6179 8E 6F2C LDX #CMD0
0251 617C A6 80 SC01 LDA ,X+
0252 617E 17 0B34 LBSR SNDDAT
0253 6181 5A DECB
0254 6182 26 F8 BNE SC01
0255 *get response
0256 6184 5F CLRB
0257 6185 GR00
0258 6185 5A DECB
0259 6186 27 CF BEQ SDERR
0260 6188 17 0B46 LBSR GETDAT
0261 618B B6 6008 LDA RESDAT
0262 618E 81 01 CMPA #$01
0263 6190 26 F3 BNE GR00
0264 *
0265 *---------- cmd 8 ----------
0266 6192 SCMD8 EQU *
0267 6192 17 0B8E LBSR SETCKL
0268 6195 86 FF LDA #$FF dummy cmd
0269 6197 17 0B1B LBSR SNDDAT
0270 619A C6 06 LDB #6
0271 619C 8E 6F44 LDX #CMD8
0272 619F A6 80 SC80 LDA ,X+
0273 61A1 17 0B11 LBSR SNDDAT
0274 61A4 5A DECB
0275 61A5 26 F8 BNE SC80
0276 *get response
0277 61A7 GR80
0278 61A7 17 0B27 LBSR GETDAT
0279 61AA B6 6008 LDA RESDAT
0280
0281 61AD 17 0B21 LBSR GETDAT
0282 61B0 B6 6008 LDA RESDAT
0283 61B3 81 01 CMPA #$01
0284 61B5 26 F0 BNE GR80
0285 61B7 C6 04 LDB #4
0286 61B9 17 0B15 GR81 LBSR GETDAT
0287 61BC B6 6008 LDA RESDAT
0288 61BF 5A DECB
0289 61C0 26 F7 BNE GR81
0290 *
0291 *---------- cmd 58 ----------
0292 61C2 SCMD58 EQU *
0293 61C2 17 0B5E LBSR SETCKL
0294 61C5 86 FF LDA #$FF dummy cmd
0295 61C7 17 0AEB LBSR SNDDAT
0296 61CA C6 06 LDB #6
0297 61CC 8E 6F4A LDX #CMD58
0298 61CF A6 80 SC581 LDA ,X+
0299 61D1 17 0AE1 LBSR SNDDAT
0300 61D4 5A DECB
0301 61D5 26 F8 BNE SC581
0302 *get response
0303 61D7 GR580
0304 61D7 17 0AF7 LBSR GETDAT
0305 61DA B6 6008 LDA RESDAT
0306 61DD 81 01 CMPA #$01
0307 61DF 26 F6 BNE GR580
0308 61E1 C6 04 GR581 LDB #4
0309 61E3 17 0AEB GR582 LBSR GETDAT
0310 61E6 B6 6008 LDA RESDAT
0311 61E9 5A DECB
0312 61EA 26 F7 BNE GR582
0313 61EC RPT41 EQU *
0314 *---------- cmd 55 ----------
0315 61EC SCMD55 EQU *
0316 61EC 17 0B34 LBSR SETCKL
0317 61EF 86 FF LDA #$FF dummy cmd
0318 61F1 17 0AC1 LBSR SNDDAT
0319 61F4 C6 06 LDB #6
0320 61F6 8E 6F50 LDX #CMD55
0321 61F9 A6 80 SC551 LDA ,X+
0322 61FB 17 0AB7 LBSR SNDDAT
0323 61FE 5A DECB
0324 61FF 26 F8 BNE SC551
0325 *get response
0326 * CLRB
0327 6201 GR550
0328 6201 17 0ACD LBSR GETDAT
0329 6204 B6 6008 LDA RESDAT
0330 6207 81 01 CMPA #$01
0331 6209 26 F6 BNE GR550
0332
0333 *---------- acmd 41 ----------
0334 620B ASCMD41 EQU *
0335 620B 17 0B15 LBSR SETCKL
0336 620E 86 FF LDA #$FF dummy cmd
0337 6210 17 0AA2 LBSR SNDDAT
0338 6213 C6 06 LDB #6
0339 6215 8E 6F56 LDX #ACMD41
0340 6218 A6 80 ASC411 LDA ,X+
0341 621A 17 0A98 LBSR SNDDAT
0342 621D 5A DECB
0343 621E 26 F8 BNE ASC411
0344 *get response
0345 6220 GR410
0346 6220 17 0AAE LBSR GETDAT
0347 6223 B6 6008 LDA RESDAT
0348 6226 17 0AA8 LBSR GETDAT
0349 6229 B6 6008 LDA RESDAT
0350 622C 81 00 CMPA #$00
0351 622E 26 BC BNE RPT41
0352
0353 *---------- second cmd 58 ----------
0354 6230 SCMD258 EQU *
0355 6230 17 0AF0 LBSR SETCKL
0356 6233 86 FF LDA #$FF dummy cmd
0357 6235 17 0A7D LBSR SNDDAT
0358 6238 C6 06 LDB #6
0359 623A 8E 6F4A LDX #CMD58
0360 623D A6 80 SC2581 LDA ,X+
0361 623F 17 0A73 LBSR SNDDAT
0362 6242 5A DECB
0363 6243 26 F8 BNE SC2581
0364 *get response
0365 6245 GR2580
0366 6245 17 0A89 LBSR GETDAT
0367 6248 B6 6008 LDA RESDAT
0368 624B 81 00 CMPA #$00
0369 624D 26 F6 BNE GR2580
0370 624F 17 0A7F LBSR GETDAT
0371 6252 B6 6008 LDA RESDAT
0372 6255 48 LSLA
0373 6256 48 LSLA
0374 6257 24 03 BCC GR2581
0375 6259 7C 6009 INC SDHC if sdhc then 1
0376 625C C6 03 GR2581 LDB #3
0377 625E 17 0A70 GR2582 LBSR GETDAT
0378 6261 B6 6008 LDA RESDAT
0379 6264 5A DECB
0380 6265 26 F7 BNE GR2582
0381
0382 6267 8E 704E LDX #MSSD0
0383 626A B6 6009 LDA SDHC
0384 626D 27 03 BEQ SD1
0385 626F 8E 7058 LDX #MSSD1
0386 6272 17 0BAE SD1 LBSR PSTRNG
0387 *
0388 *set sct no of BPB
0389 6275 17 0134 LBSR GETMBR
0390 6278 8E 5FCA LDX #RWBUF+446+8+4
0391 627B 108E 600A LDY #SCTBPB
0392 627F C6 04 LDB #4
0393 6281 A6 82 ILOP1 LDA ,-X
0394 6283 A7 A0 STA ,Y+
0395 6285 5A DECB
0396 6286 26 F9 BNE ILOP1
0397
0398 *set sct no of FAT#1
0399 6288 17 013E LBSR GETBPB
0400 628B 8E 600A LDX #SCTBPB
0401 628E 108E 600E LDY #SCTFAT
0402 6292 C6 04 LDB #4
0403 6294 17 0982 LBSR TRANS
0404 6297 8E 600E LDX #SCTFAT
0405 629A 108E 5E0E LDY #RWBUF+$0E for SD & SDHC
0406 629E 17 0B51 LBSR ADD42
0407
0408 *set sct no of DIR
0409 62A1 8E 600E LDX #SCTFAT
0410 62A4 108E 6012 LDY #SCTDIR
0411 62A8 C6 04 LDB #4
0412 62AA 17 096C LBSR TRANS
0413 62AD 8E 5E16 LDX #RWBUF+$16 for SD
0414 62B0 7D 6009 TST SDHC 0:SD,1:SDHC
0415 62B3 27 03 BEQ SKP1
0416 62B5 C6 0E LDB #$24-$16
0417 62B7 3A ABX for SDHC
0418 62B8 1F 12 SKP1 TFR X,Y
0419 62BA 8E 6012 LDX #SCTDIR
0420 62BD 17 0B32 LBSR ADD42
0421 62C0 17 0B2F LBSR ADD42 skip for FAT#2
0422
0423 *save no of directory
0424 62C3 8E 6012 LDX #SCTDIR
0425 62C6 108E 6016 LDY #SCTDSV
0426 62CA C6 04 LDB #4
0427 62CC 17 094A LBSR TRANS
0428
0429 *set sct per cluster
0430 62CF 8E 5E0D LDX #RWBUF+$0D
0431 62D2 A6 84 LDA ,X
0432 62D4 B7 601E STA SCTPCL
0433
0434 *set sct no of CLUSTER#2
0435 62D7 8E 6012 LDX #SCTDIR
0436 62DA 108E 601A LDY #SCTCLT
0437 62DE C6 04 LDB #4
0438 62E0 17 0936 LBSR TRANS
0439
0440 62E3 108E 606F LDY #WK1+2
0441 62E7 86 00 LDA #$00
0442 62E9 A7 A2 STA ,-Y
0443 62EB 86 20 LDA #$20 for SD
0444 62ED 7D 6009 TST SDHC
0445 62F0 27 03 BEQ SKP2
0446 62F2 B6 601E LDA SCTPCL for SDHC
0447 62F5 A7 A2 SKP2 STA ,-Y
0448 62F7 8E 601A LDX #SCTCLT
0449 62FA 17 0AF5 LBSR ADD42
0450 62FD 39 RTS
0451
0452 ****************************************
0453 * GET SD DATA ROUTINE
0454 * use CMD9
0455 ****************************************
0456 62FE DSPSDDAT EQU *
0457 62FE 17 0A67 LBSR PCRLF
0458 6301 17 0A1F LBSR SETCKL
0459 6304 C6 06 LDB #6
0460 6306 8E 6F5C LDX #CMD9
0461 6309 A6 80 SC91 LDA ,X+
0462 630B 17 09A7 LBSR SNDDAT
0463 630E 5A DECB
0464 630F 26 F8 BNE SC91
0465 *get response
0466 6311 GR90
0467 6311 17 09BD LBSR GETDAT
0468 6314 B6 6008 LDA RESDAT
0469 6317 81 00 CMPA #$00
0470 6319 26 F6 BNE GR90
0471
0472 631B C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
0473 631D 17 09B1 GR91 LBSR GETDAT
0474 6320 B6 6008 LDA RESDAT
0475 6323 5A DECB
0476 6324 26 F7 BNE GR91
0477 6326 17 0A3F LBSR PCRLF
0478
0479 *disp offset of MBR,FAT#1,DIR,CLUSTER#2
0480 6329 8E 709B LDX #MSOFS
0481 632C 17 0AF4 LBSR PSTRNG
0482 632F 8E 70AB LDX #MSBPB
0483 6332 17 0AEE LBSR PSTRNG
0484 6335 8E 600A LDX #SCTBPB
0485 6338 17 0A24 LBSR DSPBI2
0486 633B 17 0A35 LBSR OUTSPC
0487 633E 17 0A1E LBSR DSPBI2
0488
0489 6341 8E 70B4 LDX #MSFAT
0490 6344 17 0ADC LBSR PSTRNG
0491 6347 8E 600E LDX #SCTFAT
0492 634A 17 0A12 LBSR DSPBI2
0493 634D 17 0A23 LBSR OUTSPC
0494 6350 17 0A0C LBSR DSPBI2
0495
0496 6353 8E 70BD LDX #MSDIR
0497 6356 17 0ACA LBSR PSTRNG
0498 6359 8E 6012 LDX #SCTDIR
0499 635C 17 0A00 LBSR DSPBI2
0500 635F 17 0A11 LBSR OUTSPC
0501 6362 17 09FA LBSR DSPBI2
0502
0503 6365 8E 70C6 LDX #MSCL2
0504 6368 17 0AB8 LBSR PSTRNG
0505 636B 8E 601A LDX #SCTCLT
0506 636E 17 09EE LBSR DSPBI2
0507 6371 17 09FF LBSR OUTSPC
0508 6374 17 09E8 LBSR DSPBI2
0509 6377 17 09EE LBSR PCRLF
0510 637A 39 RTS
0511
0512 *
0513 ****************************************
0514 * READ ROUTINE
0515 * use CMD17
0516 * set sctno to SCTN2,SCTN3
0517 * read data set to RWBUF
0518 ****************************************
0519 637B RDSCT EQU *
0520 637B 17 09EA LBSR PCRLF
0521 637E 17 096A LBSR INSCT input sct no
0522 6381 17 08DD LBSR RD1SCT read 1 sct
0523
0524 *disp data
0525 6384 17 09E1 LBSR PCRLF
0526 6387 17 090D LBSR DSPBUF
0527 638A 17 09DB LBSR PCRLF
0528 638D 39 RTS
0529
0530 ****************************************
0531 * Read MBR & Disp parameter of BPB
0532 ****************************************
0533 638E DSPMBR EQU *
0534 638E 17 09D7 LBSR PCRLF
0535 6391 8D 19 BSR GETMBR
0536
0537 *disp BPB
0538 6393 17 09D2 LBSR PCRLF
0539 6396 8E 5FBE LDX #RWBUF+446 1st BPB point
0540 6399 C6 10 GET1 LDB #16
0541 639B A6 80 GET2 LDA ,X+
0542 639D 17 0995 LBSR DSPBIN disp data
0543 63A0 5A DECB
0544 63A1 26 F8 BNE GET2
0545 63A3 17 09C2 LBSR PCRLF
0546 63A6 8C 5FFE CMPX #RWBUF+510 446+16*4
0547 63A9 25 EE BLO GET1
0548 63AB 39 RTS
0549
0550 *----------------------------------------
0551 *read MBR
0552 63AC GETMBR EQU *
0553 63AC 8E 6004 LDX #SCTN0
0554 63AF C6 04 LDB #4
0555 63B1 4F CLRA
0556 63B2 17 086F LBSR FILL set sct no is 0
0557 63B5 17 093C LBSR SETSCT
0558 63B8 17 08A6 LBSR RD1SCT read 1 sct
0559 63BB 39 RTS
0560
0561 *----------------------------------------
0562 *set sector no to SCTN0
0563 *from X,X+1,X+2,X+3 to SCTN0-SCTN3
0564 63BC SETSNO EQU *
0565 63BC 108E 6004 LDY #SCTN0
0566 63C0 C6 04 LDB #4
0567 63C2 17 0854 LBSR TRANS
0568 63C5 17 092C LBSR SETSCT
0569 63C8 39 RTS
0570
0571 *----------------------------------------
0572 *read BPB
0573 63C9 GETBPB EQU *
0574 63C9 8D E1 BSR GETMBR
0575 *set sct no of BPB
0576 63CB 8E 5FCA LDX #RWBUF+446+8+4
0577 63CE 108E 6004 LDY #SCTN0
0578 63D2 C6 04 LDB #4
0579 63D4 A6 82 GTBLOP LDA ,-X
0580 63D6 A7 A0 STA ,Y+
0581 63D8 5A DECB
0582 63D9 26 F9 BNE GTBLOP
0583 63DB 17 0916 LBSR SETSCT
0584 63DE 17 0880 LBSR RD1SCT read 1 sct
0585 63E1 39 RTS
0586
0587 ****************************************
0588 * Disp BPB(Bios Parameter Block)
0589 ****************************************
0590 63E2 DSPBPB EQU *
0591 63E2 8E 600A LDX #SCTBPB
0592 63E5 8D D5 BSR SETSNO
0593 63E7 17 0877 LBSR RD1SCT read 1 sct
0594
0595 *disp BPB
0596 63EA 17 097B LBSR PCRLF
0597 63ED 17 08A7 LBSR DSPBUF
0598 63F0 17 0975 LBSR PCRLF
0599 63F3 39 RTS
0600
0601 ****************************************
0602 * Disp FAT#1
0603 ****************************************
0604 63F4 DSPFAT EQU *
0605 63F4 8E 600E LDX #SCTFAT
0606 63F7 8D C3 BSR SETSNO
0607 63F9 17 0865 LBSR RD1SCT read 1 sct
0608
0609 *disp FAT
0610 63FC 17 0969 LBSR PCRLF
0611 63FF 17 0895 LBSR DSPBUF
0612 6402 17 0963 LBSR PCRLF
0613 6405 39 RTS
0614
0615 ****************************************
0616 * Disp Directory
0617 ****************************************
0618 6406 DSPDIR EQU *
0619 *return no of DIR
0620 6406 8E 6016 LDX #SCTDSV
0621 6409 108E 6012 LDY #SCTDIR
0622 640D C6 04 LDB #4
0623 640F 17 0807 LBSR TRANS
0624 6412 8E 6012 DSPFL0 LDX #SCTDIR
0625 6415 8D A5 BSR SETSNO
0626 6417 17 0847 LBSR RD1SCT read 1 sct
0627
0628 *disp FILE name
0629 641A 17 094B LBSR PCRLF
0630 641D 17 0948 LBSR PCRLF
0631 6420 8E 5E00 LDX #RWBUF
0632
0633 6423 A6 84 DSPFL1 LDA ,X
0634 6425 1027 0080 LBEQ DSPEND if top of filename is 0 then end
0635 6429 81 E5 CMPA #$E5 delete mark?
0636 642B 27 06 BEQ DSPCKE
0637 642D A6 0B LDA 11,X attr
0638 * CMPA #$0F long file name?
0639 * BEQ DSPCKE
0640 * CMPA #$10 directory?
0641 * BEQ DSPCKE
0642 642F 81 20 CMPA #$20
0643 6431 27 0A BEQ DSPFL2 archive file only
0644 6433 30 88 20 DSPCKE LEAX 32,X next directory entry
0645 6436 8C 6000 CMPX #RWBUF+512 over buf?
0646 6439 24 56 BHS DSPFL5
0647 643B 20 E6 BRA DSPFL1
0648
0649 643D DSPFL2
0650 *disp filename
0651 643D C6 08 LDB #8
0652 643F A6 80 DSPFL3 LDA ,X+
0653 6441 BD FBBB JSR OUTCHA
0654 6444 5A DECB
0655 6445 26 F8 BNE DSPFL3
0656 *disp ext
0657 6447 86 2E LDA #'.
0658 6449 BD FBBB JSR OUTCHA
0659 644C C6 03 LDB #3
0660 644E A6 80 DSPFL4 LDA ,X+
0661 6450 BD FBBB JSR OUTCHA
0662 6453 5A DECB
0663 6454 26 F8 BNE DSPFL4
0664
0665 *get FILE time data
0666 6456 30 07 LEAX 7,X
0667 6458 EC 81 LDD ,X++
0668 645A FD 606D STD WK1
0669
0670 *get CLUSTER(H) data
0671 645D EC 81 LDD ,X++
0672 645F 1E 89 EXG A,B
0673 6461 FD 6048 STD CLSTH
0674 6464 30 04 LEAX 4,X
0675 6466 EC 81 LDD ,X++
0676 6468 1E 89 EXG A,B
0677 646A FD 604A STD CLSTL
0678
0679 *get FILE size data
0680 646D 108E 6046 LDY #WFSIZ+4
0681 6471 C6 04 LDB #4
0682 6473 A6 80 DSPC1 LDA ,X+
0683 6475 A7 A2 STA ,-Y
0684 6477 5A DECB
0685 6478 26 F9 BNE DSPC1
0686
0687 *disp FILE size
0688 647A BD 6D73 JSR OUTSPC
0689 647D 17 0A12 LBSR DSPSIZ disp FILE size
0690
0691 *disp FILE time
0692 6480 FC 606D LDD WK1
0693 6483 17 09AD LBSR DSPYMD disp MM-DD-YY
0694
0695 *disp CLUSTER(Lonly)
0696 6486 17 0A5A LBSR DSPCLS
0697 6489 17 08DC LBSR PCRLF
0698
0699 648C 8C 6000 CMPX #RWBUF+512
0700 648F 25 92 BLO DSPFL1
0701 6491 8E 6012 DSPFL5 LDX #SCTDIR
0702 6494 17 0796 LBSR INCX4 sct no +1
0703 6497 8E 713F LDX #MSNXTP
0704 649A 17 0986 LBSR PSTRNG
0705 649D BD FBB8 DSPFL6 JSR INCHA
0706 64A0 81 20 CMPA #SPC
0707 64A2 1027 FF6C LBEQ DSPFL0
0708 64A6 BD 6D68 JSR PCRLF
0709 64A9 39 DSPEND RTS
0710
0711 ****************************************
0712 * Load FILE
0713 ****************************************
0714 64AA LDFILE EQU *
0715 64AA 17 0241 LBSR GETFDT
0716 64AD BE 6065 LDX EXSTFL if 0 not exist
0717 64B0 1027 0125 LBEQ LDNEND
0718
0719 *get cluster no
0720 64B4 EC 88 14 LDD $14,X
0721 64B7 1E 89 EXG A,B
0722 64B9 FD 6048 STD CLSTH high cluster no
0723 64BC EC 88 1A LDD $1A,X
0724 64BF 1E 89 EXG A,B
0725 64C1 FD 604A STD CLSTL low cluster no
0726 *sub start cluster no (SD:2,SDHC:3)
0727 64C4 83 0002 SUBD #2
0728 64C7 7D 6009 TST SDHC SD:0,SDHC:1
0729 64CA 27 03 BEQ LD3
0730 64CC 83 0001 SUBD #1 D:cluster no (start 0)
0731 * (A=0,cluster no is only B)
0732
0733 64CF 34 36 LD3 PSHS A,B,X,Y
0734 64D1 8E 601A LDX #SCTCLT top of cluster no
0735 64D4 108E 606D LDY #WK1
0736 64D8 C6 04 LDB #4
0737 64DA 17 073C LBSR TRANS
0738 64DD 35 36 PULS A,B,X,Y
0739
0740 *calc start cluster no of file
0741 *(B)x40h
0742 64DF 34 30 PSHS X,Y
0743 64E1 8E 606D LDX #WK1
0744 64E4 17 0755 LBSR ADD40H
0745 64E7 35 30 PULS X,Y
0746
0747 *get file size
0748 64E9 34 30 PSHS X,Y
0749 64EB 30 88 20 LEAX 32,X
0750 64EE 108E 6042 LDY #WFSIZ
0751 64F2 C6 04 LDB #4
0752 64F4 A6 82 LD41 LDA ,-X
0753 64F6 A7 A0 STA ,Y+
0754 64F8 5A DECB
0755 64F9 26 F9 BNE LD41
0756 64FB 35 30 PULS X,Y
0757
0758 64FD EC 88 1D LDD $1D,X upper of file size
0759 6500 1E 89 EXG A,B
0760 6502 44 LSRA
0761 6503 56 RORB
0762 6504 C3 0001 ADDD #1 wfsiz/$200+1
0763
0764 *limited to 1 cluster(40h sct)
0765 6507 C1 40 CMPB #$40 40h sct?
0766 6509 23 02 BLS LD5
0767 650B C6 40 LDB #$40
0768 650D F7 604C LD5 STB CNT sct counter
0769 6510 F7 604E STB TPGFLG set top page
0770
0771 *set start sct no of file
0772 6513 34 12 PSHS A,X
0773 6515 8E 70FE LDX #MSLDNG
0774 6518 17 0908 LBSR PSTRNG
0775 651B 35 12 PULS A,X
0776 651D LDLOP
0777 651D 86 2E LDA #'.
0778 651F BD FBBB JSR OUTCHA
0779 6522 8E 606D LDX #WK1
0780 6525 108E 6004 LDY #SCTN0
0781 6529 C6 04 LDB #4
0782 652B 17 06EB LBSR TRANS
0783 652E 17 07C3 LBSR SETSCT
0784 6531 17 072D LBSR RD1SCT read 1 file data
0785
0786 6534 7D 604E TST TPGFLG top sector page?
0787 6537 27 71 BEQ LD9
0788
0789 *at top sector, ini set
0790 *offset 00 data is
0791 * $00 :machine code
0792 * $0D :BASIC PROGRAM (ascii save)
0793 * $FF,$FE:BASIC PROGRAM (binary save)
0794 * else :general text
0795 6539 10BE 6044 LDY WFSIZ+2
0796 653D 10BF 6046 STY FILSIZ set file size
0797
0798 6541 8E 5E00 LDX #RWBUF
0799 6544 A6 84 LDA ,X
0800 6546 B7 604D STA MCFLG
0801 6549 27 04 BEQ LD8 machine code
0802 654B 2A 4B BPL LD81 ascii saved basic or else
0803 654D 2B 45 BMI LD80 binary saved basic
0804 *at machine code, read header
0805 654F 10AE 01 LD8 LDY 1,X get file size
0806 6552 10BF 6046 STY FILSIZ
0807 6556 EE 03 LDU 3,X get store addr
0808 *disp store adr, size
0809 6558 8E 71A5 LDX #MSMCAS
0810 655B 17 08C5 LBSR PSTRNG
0811 655E 1F 30 TFR U,D
0812 6560 34 04 PSHS B
0813 6562 17 07D6 LBSR DSPBI0
0814 6565 35 04 PULS B
0815 6567 1F 98 TFR B,A
0816 6569 17 07CF LBSR DSPBI0
0817 656C 86 2C LDA #',
0818 656E BD FBBB JSR OUTCHA
0819 6571 1F 20 TFR Y,D
0820 6573 34 04 PSHS B
0821 6575 17 07C3 LBSR DSPBI0
0822 6578 35 04 PULS B
0823 657A 1F 98 TFR B,A
0824 657C BD 6D3B JSR DSPBI0
0825
0826 *offset?
0827 657F 8E 718C LDX #MSMCOF
0828 6582 17 089E LBSR PSTRNG
0829 6585 BD 6F12 JSR INOUTC
0830 6588 84 DF ANDA #$DF
0831 658A 81 59 CMPA #'Y
0832 658C 26 1C BNE LD9
0833 658E 33C9 E000 LEAU -$2000,U -$2000 offset
0834 6592 20 16 BRA LD9
0835
0836 6594 DE 33 LD80 LDU BASADP basic file
0837 6596 20 12 BRA LD9
0838
0839 6598 LD81
0840 6598 81 0D CMPA #$0D ascii saved BASIC?
0841 659A 27 05 BEQ LD82
0842 659C CE 2000 LDU #TXTADR (else) not basic file
0843 659F 20 09 BRA LD9
0844
0845 65A1 LD82
0846 65A1 DE 33 LDU BASADP
0847 65A3 FF 606B STU SVTOP set save adr
0848 65A6 8D 69 BSR MEMSET2 for ascii saved BASIC
0849 65A8 20 02 BRA LD10
0850
0851 65AA LD9
0852 65AA 8D 35 BSR MEMSET expand memory from rwbuf
0853
0854 65AC LD10
0855 65AC 7F 604E CLR TPGFLG end of top page
0856 65AF 8E 606D LDX #WK1
0857 65B2 17 0678 LBSR INCX4 sct no +1
0858 65B5 7A 604C DEC CNT
0859 65B8 1026 FF61 LBNE LDLOP
0860
0861 65BC LDEND
0862 65BC 7D 604D TST MCFLG
0863 65BF 27 0E BEQ LDE0
0864 65C1 2A 0C BPL LDE0
0865 *fix link pointer
0866 65C3 9E 33 LDX BASADP
0867 65C5 BD C730 JSR FIXPTR
0868
0869 65C8 FC 6044 LDD WFSIZ+2
0870 65CB D3 33 ADDD BASADP
0871 65CD DD 35 STD BASAEP end adrs
0872 65CF 8E 7116 LDE0 LDX #MSLDED
0873 65D2 17 084E LBSR PSTRNG
0874 65D5 17 0790 LDE1 LBSR PCRLF
0875 65D8 39 RTS
0876
0877 65D9 8E 7131 LDNEND LDX #MSNOFL
0878 65DC 17 0844 LBSR PSTRNG
0879 65DF 20 F4 BRA LDE1
0880
0881 *expand in memory from rwbuf
0882 *X:rwbuf, U:memory adr, Y:filesize
0883 65E1 MEMSET EQU *
0884 65E1 34 30 PSHS X,Y
0885 65E3 8E 5E00 LDX #RWBUF
0886 65E6 10BE 6046 LDY FILSIZ
0887 65EA 7D 604E TST TPGFLG top page?
0888 65ED 27 0F BEQ MSLOP
0889 65EF 7D 604D TST MCFLG 0,$FF($FE),etc
0890 65F2 27 04 BEQ MS0
0891 65F4 2A 08 BPL MSLOP etc
0892 65F6 2B 04 BMI MS1 basic file
0893 * machine code
0894 65F8 30 05 MS0 LEAX 5,X skip header
0895 65FA 20 02 BRA MSLOP
0896 65FC 30 03 MS1 LEAX 3,X skip 3 FFs
0897
0898 65FE A6 80 MSLOP LDA ,X+
0899 6600 A7 C0 STA ,U+
0900 6602 31 3F LEAY -1,Y
0901 6604 27 05 BEQ MS3
0902 6606 8C 6000 CMPX #RWBUF+512
0903 6609 25 F3 BLO MSLOP
0904 660B 10BF 6046 MS3 STY FILSIZ
0905 660F 35 B0 PULS X,Y,PC
0906 *
0907 *----------
0908 *after conversion, expand in memory from rwbuf
0909 *X:rwbuf, U:memory adr, Y:filesize
0910 6611 MEMSET2 EQU *
0911 6611 34 30 PSHS X,Y
0912 6613 A6 80 LDA ,X+
0913 6615 81 0D CMPA #$0D skip top CR
0914 6617 26 0D BNE MEM2ED
0915 6619 A6 84 LDA ,X
0916 661B 81 0A CMPA #$0A skip top LF
0917 661D 26 02 BNE MM21
0918 661F 30 01 LEAX 1,X
0919 6621 MM21
0920 6621 BF 6069 STX RDTOP start rwbuf+2
0921 6624 8D 0B BSR CNVINT
0922 6626 MEM2ED
0923 6626 BE 606B LDX SVTOP
0924 6629 6F 80 CLR ,X+
0925 662B 6F 80 CLR ,X+
0926 662D 9F 35 STX BASAEP
0927 662F 35 B0 PULS X,Y,PC
0928
0929 *
0930 6631 CNVINT EQU *
0931 *trans to LINBUF with change CR,LF to 00
0932 *X:rdtop
0933 6631 CNVLOP
0934 6631 BE 6069 LDX RDTOP
0935 6634 108E 043D LDY #LINBUF
0936
0937 6638 INLOP
0938 6638 A6 80 LDA ,X+
0939 663A A7 A0 STA ,Y+
0940 *----------------------------
0941 663C 8C 6000 CMPX #RWBUF+512
0942 663F 25 2A BLO INL11
0943
0944 6641 7A 604C DEC CNT
0945 6644 26 01 BNE INL10
0946 6646 39 RTS
0947
0948 6647 INL10
0949 6647 34 70 PSHS X,Y,U
0950 6649 86 2E LDA #'.
0951 664B BD FBBB JSR OUTCHA
0952
0953 664E 8E 606D LDX #WK1
0954 6651 17 05D9 LBSR INCX4 sct no +1
0955 6654 108E 6004 LDY #SCTN0
0956 6658 C6 04 LDB #4
0957 665A 17 05BC LBSR TRANS
0958 665D 17 0694 LBSR SETSCT
0959 6660 17 05FE LBSR RD1SCT read 1 file data
0960 6663 35 70 PULS X,Y,U
0961
0962 6665 8E 5E00 LDX #RWBUF
0963 6668 BF 6069 STX RDTOP
0964 *----------------------------
0965 666B 81 0D INL11 CMPA #$0D
0966 666D 26 C9 BNE INLOP
0967 666F A6 80 LDA ,X+
0968 6671 81 0A CMPA #$0A
0969 6673 27 02 BEQ INL2
0970 6675 30 1F LEAX -1,X
0971 6677 BF 6069 INL2 STX RDTOP next read point
0972 667A 6F 3F CLR -1,Y set terminate 00
0973 667C 6F A4 CLR ,Y
0974 667E 6F 21 CLR 1,Y
0975
0976 *convert
0977 6680 DE D9 LDU $D9
0978 6682 34 40 PSHS U
0979 6684 8E 043D LDX #LINBUF
0980 6687 9F D9 STX $D9
0981 6689 A6 84 LDA ,X
0982 668B 1A 01 ORCC #$01
0983 668D BD 9162 JSR RDLINO read line number
0984 6690 9E 4B LDX $4B
0985 6692 BF 033A STX $33A
0986 6695 0F BF CLR $BF assume keyin
0987 6697 BD FBF1 JSR LININT (=C28C) one line translation
0988 669A 35 40 PULS U
0989 669C DF D9 STU $D9
0990
0991 669E FD 6067 STD CVTLEN store len+1
0992 66A1 10BE 6067 LDY CVTLEN
0993
0994 *trans from TXTBUF to BASIC PROGRAM
0995 66A5 FE 606B LDU SVTOP
0996 66A8 33 42 LEAU 2,U
0997 66AA BE 033A LDX $33A
0998 66AD AF C1 STX ,U++
0999 66AF 8E 033C LDX #TXTBUF
1000
1001 *save to bas buf
1002 66B2 A6 80 INL12 LDA ,X+
1003 66B4 A7 C0 STA ,U+
1004 66B6 31 3F LEAY -1,Y
1005 66B8 26 F8 BNE INL12
1006
1007 66BA BE 606B LDX SVTOP
1008 66BD 1F 10 TFR X,D
1009 66BF F3 6067 ADDD CVTLEN
1010 66C2 ED 84 STD ,X store next pointer
1011 66C4 FD 606B STD SVTOP save next point
1012
1013 66C7 BE 6069 LDX RDTOP
1014 66CA A6 84 LDA ,X
1015 66CC 1026 FF61 LBNE CNVLOP
1016 66D0 39 CEND RTS
1017
1018 *----------
1019 *X:top of FILE NAME
1020 *return C=1:match,C=0:not match
1021 66D1 CMPFN EQU *
1022 66D1 34 10 PSHS X
1023 66D3 108E 604F LDY #FNAME
1024 66D7 C6 08 LDB #8
1025 66D9 A6 80 CMPLOP LDA ,X+
1026 66DB 81 E5 CMPA #$E5 delete mark?
1027 66DD 27 0B BEQ NOTM
1028 66DF A1 A0 CMPA ,Y+
1029 66E1 26 07 BNE NOTM
1030 66E3 5A DECB
1031 66E4 26 F3 BNE CMPLOP
1032 66E6 1A 01 MATCH ORCC #$01 C=1
1033 66E8 20 02 BRA CMPEND
1034 66EA 1C FE NOTM ANDCC #$FE C=0
1035 66EC 35 90 CMPEND PULS X,PC
1036
1037 *------------------------------
1038 *input filename
1039 *output:
1040 * if exist EXSTFL(directory entry)
1041 * not exist EXSTFL(=0)
1042 66EE GETFDT EQU *
1043 66EE 34 02 PSHS A
1044 66F0 8E 0000 LDX #0
1045 66F3 BF 6065 STX EXSTFL
1046 *return no of DIR
1047 66F6 8E 6016 LDX #SCTDSV
1048 66F9 108E 6012 LDY #SCTDIR
1049 66FD C6 04 LDB #4
1050 66FF 17 0517 LBSR TRANS
1051
1052 6702 35 02 PULS A
1053 6704 81 4D CMPA #'M
1054 6706 26 05 BNE GTF1
1055 6708 8E 70E6 LDX #MSMSV
1056 670B 20 03 BRA GTF2
1057 670D 8E 70D6 GTF1 LDX #MSINFN
1058 6710 17 0710 GTF2 LBSR PSTRNG
1059 6713 17 0166 LBSR INPFLDAT input file name
1060
1061 *set filename
1062 6716 8E 6083 LDX #FILBUF
1063 6719 17 00E9 LBSR SETFNM
1064
1065 671C 8E 6012 LDFL0 LDX #SCTDIR
1066 671F 17 FC9A LBSR SETSNO
1067 6722 17 053C LBSR RD1SCT read 1 sct
1068
1069 6725 8E 5E00 LDX #RWBUF
1070 6728 A6 84 LDFL1 LDA ,X
1071 672A 27 37 BEQ LDFLE if top of filename is 0 then end
1072 672C 81 E5 CMPA #$E5 delete mark?
1073 672E 26 10 BNE LD1
1074 6730 A6 0B LDA 11,X attr
1075 6732 81 20 CMPA #$20 archive file only
1076 6734 27 0A BEQ LD1
1077 6736 30 88 20 LEAX 32,X next directory entry
1078 6739 8C 6000 CMPX #RWBUF+512 over buf?
1079 673C 24 0E BHS LDFL5
1080 673E 20 E8 BRA LDFL1
1081
1082 *check file name
1083 6740 LD1
1084 6740 8D 8F BSR CMPFN C=1:match
1085 6742 25 10 BCS LD2
1086 6744 30 88 20 LEAX 32,X
1087 6747 8C 6000 CMPX #RWBUF+512
1088 674A 25 DC BLO LDFL1
1089
1090 674C LDFL5
1091 674C 8E 6012 LDX #SCTDIR
1092 674F 17 04DB LBSR INCX4 sct no +1
1093 6752 20 C8 BRA LDFL0
1094
1095 *hit file, get dirctory entry
1096 6754 BF 6065 LD2 STX EXSTFL adr of dir entry
1097 6757 108E 601F LDY #DIRENT
1098 675B C6 20 LDB #32
1099 675D 17 04B9 LBSR TRANS
1100 6760 8E 601F LDX #DIRENT
1101 6763 39 LDFLE RTS
1102
1103 *
1104 ****************************************
1105 * KILL FILE
1106 ****************************************
1107 6764 KILFILE EQU *
1108 6764 8D 88 BSR GETFDT
1109 6766 BE 6065 LDX EXSTFL if 0 not exist
1110 6769 27 5B BEQ NOFEND
1111
1112 676B 8E 715C LDX #MSKILL
1113 676E 17 06B2 LBSR PSTRNG
1114 6771 BD 6F12 JSR INOUTC
1115 6774 84 DF ANDA #$DF
1116 6776 81 59 CMPA #'Y
1117 6778 26 3E BNE KILEND
1118 677A 8D 01 BSR KILSUB
1119 677C 39 RTS
1120
1121 *----------
1122 677D KILSUB EQU *
1123 *write dir
1124 677D BE 6065 LDX EXSTFL top adr of dir entry
1125 6780 EC 88 1A LDD $1A,X get clstlD
1126 6783 1E 89 EXG A,B B:cluster
1127 6785 FD 604A STD CLSTL
1128 6788 86 E5 LDA #$E5 delete mark
1129 678A A7 84 STA ,X
1130 678C 17 03C4 LBSR WRTSD1
1131
1132 *get fat sct & write
1133 678F 8E 600E LDX #SCTFAT
1134 6792 17 FC27 LBSR SETSNO
1135 6795 17 04C9 LBSR RD1SCT read 1 sct
1136
1137 6798 FC 604A LDD CLSTL B:cluster
1138 679B 58 LSLB
1139 679C 7D 6009 TST SDHC sd:0,sdhc:1
1140 679F 27 01 BEQ KL1
1141 67A1 58 LSLB
1142 67A2 8E 5E00 KL1 LDX #RWBUF
1143 67A5 30 85 LEAX B,X
1144 67A7 C6 02 LDB #2
1145 67A9 7D 6009 TST SDHC sd:0,sdhc:1
1146 67AC 27 02 BEQ KL2
1147 67AE C6 04 LDB #4
1148 67B0 6F 80 KL2 CLR ,X+
1149 67B2 5A DECB
1150 67B3 26 FB BNE KL2
1151 67B5 17 039B LBSR WRTSD1
1152 67B8 KILEND
1153 67B8 39 RTS
1154
1155 *
1156 ****************************************
1157 * Write BASIC FILE
1158 ****************************************
1159 67B9 WRBFILE EQU *
1160 *basic file exist check
1161 67B9 DC 35 LDD BASAEP
1162 67BB 93 33 SUBD BASADP
1163 67BD 1083 0002 CMPD #2
1164 67C1 22 0A BHI WRB0 exist
1165 67C3 17 05A2 LBSR PCRLF
1166 67C6 8E 7131 NOFEND LDX #MSNOFL
1167 67C9 17 0657 LBSR PSTRNG
1168 67CC 39 RTS
1169
1170 *save BASIC program file(binary saved)
1171 67CD 86 FF WRB0 LDA #$FF
1172 67CF B7 604D STA MCFLG set basic file
1173 *input file name
1174 67D2 17 FF19 LBSR GETFDT
1175 67D5 BE 6065 LDX EXSTFL if 0 not exist
1176 67D8 27 11 BEQ WRB1
1177
1178 *confirm over write
1179 67DA 8E 716F LDX #MSEXST
1180 67DD 17 0643 LBSR PSTRNG
1181 67E0 BD 6F12 JSR INOUTC
1182 67E3 84 DF ANDA #$DF
1183 67E5 81 59 CMPA #'Y
1184 67E7 26 1B BNE WRBEND
1185 *delete exist file
1186 67E9 8D 92 BSR KILSUB
1187
1188 67EB WRB1
1189 *set filename
1190 67EB 8E 6083 LDX #FILBUF
1191 67EE 8D 15 BSR SETFNM
1192
1193 *adrs
1194 * BASADP start adr
1195 * BASAEP end adr
1196 * BASEXP exec adr
1197
1198 *main of write routine
1199 *clear dir entry
1200 67F0 8D 2F BSR CLRDIR
1201
1202 67F2 17 0104 LBSR SRCFAT search empty cluster on FAT
1203 67F5 17 0159 LBSR SRCDIR search empty DIR entry
1204 67F8 17 0195 LBSR MKFLDT make file data
1205 67FB 17 021B LBSR WRTFIL write file
1206 67FE 17 03AF LBSR WRTDIR write DIR entry
1207 6801 17 03D9 LBSR WRTFAT set FAT
1208 6804 WRBEND
1209 6804 39 RTS
1210
1211 *------------------------------
1212 *set filename
1213 6805 SETFNM EQU *
1214 *clear buf
1215 6805 108E 605A LDY #FNAME+11
1216 6809 C6 0B LDB #11
1217 680B 86 20 LDA #$20
1218 680D A7 A2 WRFLP2 STA ,-Y
1219 680F 5A DECB
1220 6810 26 FB BNE WRFLP2
1221
1222 *store filename
1223 6812 A6 80 WRFL1 LDA ,X+
1224 6814 81 2D CMPA #'-
1225 6816 27 04 BEQ WRFL11
1226 6818 81 30 CMPA #$30
1227 681A 25 04 BLO WRFL2 until delimiter
1228 681C A7 A0 WRFL11 STA ,Y+
1229 681E 20 F2 BRA WRFL1
1230 6820 WRFL2
1231 6820 39 RTS
1232
1233 *------------------------------
1234 *clear dir entry
1235 6821 CLRDIR EQU *
1236 6821 8E 601F LDX #DIRENT
1237 6824 C6 20 LDB #32
1238 6826 4F CLRA
1239 6827 17 03FA LBSR FILL
1240 682A 86 20 LDA #$20 set attr
1241 682C A7 0B STA $0B,X
1242 682E 39 RTS
1243
1244 *
1245 ****************************************
1246 * Write MACHINE FILE
1247 ****************************************
1248 682F WRMFILE EQU *
1249 *save machine code
1250 *filename,topadr,endadr,exeadr ...machine file
1251 682F 17 FEBC LBSR GETFDT
1252 6832 BE 6065 LDX EXSTFL if 0 not exist
1253 6835 27 12 BEQ WRM1
1254
1255 *confirm over write
1256 6837 8E 716F LDX #MSEXST
1257 683A 17 05E6 LBSR PSTRNG
1258 683D BD 6F12 JSR INOUTC
1259 6840 84 DF ANDA #$DF
1260 6842 81 59 CMPA #'Y
1261 6844 26 35 BNE WRMEND
1262 *delete exist file
1263 6846 17 FF34 LBSR KILSUB
1264
1265 6849 WRM1
1266 6849 7F 604D CLR MCFLG set machine code(set 0)
1267
1268 *set filename
1269 684C 8E 6083 LDX #FILBUF
1270 684F 8D B4 BSR SETFNM
1271
1272 *set top adr
1273 6851 8D 43 BSR ASC2BIN
1274 6853 10BF 605F STY MCADP start adr
1275 6857 8D 30 BSR SRCDLM
1276 6859 8D 3B BSR ASC2BIN
1277 685B 10BF 6061 STY MCAEP end adr
1278 685F 8D 28 BSR SRCDLM
1279 6861 8D 33 BSR ASC2BIN
1280 6863 10BF 6063 STY MCEXP exec adr
1281
1282 *main of write routine
1283 *clear dir entry
1284 6867 8D B8 BSR CLRDIR
1285
1286 6869 17 008D LBSR SRCFAT search empty cluster on FAT
1287 686C 17 00E2 LBSR SRCDIR search empty DIR entry
1288 686F 17 011E LBSR MKFLDT make file data
1289 6872 17 01A4 LBSR WRTFIL write file
1290 6875 17 0338 LBSR WRTDIR write DIR entry
1291 6878 17 0362 LBSR WRTFAT set FAT
1292 687B WRMEND
1293 687B 39 RTS
1294
1295 *--------------------
1296 *input filename & parameter to filbuf
1297 687C INPFLDAT EQU *
1298 687C 34 24 PSHS B,Y
1299 687E 108E 6083 LDY #FILBUF
1300 6882 C6 1E LDB #30
1301 6884 17 0692 LBSR LININ
1302 6887 35 A4 PULS B,Y,PC
1303
1304 *--------------------
1305 *search delimiter
1306 *delimiter:less than $30, excluding '-'($2D)
1307 *return X:point next char of delimiter
1308 6889 SRCDLM EQU *
1309 6889 30 1F LEAX -1,X
1310 688B A6 80 SRDLM1 LDA ,X+
1311 688D 81 2D CMPA #'-
1312 688F 27 FA BEQ SRDLM1
1313 6891 81 30 CMPA #$30
1314 6893 24 F6 BHS SRDLM1
1315 6895 39 RTS
1316
1317 *--------------------
1318 *X - X+3, return Y
1319 6896 ASC2BIN EQU *
1320 *clr buf
1321 6896 34 10 PSHS X
1322 6898 8E 607F LDX #CNVBUF
1323 689B 86 30 LDA #$30
1324 689D C6 04 LDB #4
1325 689F 17 0382 LBSR FILL
1326 68A2 35 10 PULS X
1327
1328 *search next delimiter
1329 *return B:char count
1330 68A4 34 10 PSHS X
1331 68A6 5F CLRB
1332 68A7 5C SRLOP1 INCB
1333 68A8 A6 80 LDA ,X+
1334 68AA 81 30 CMPA #$30 count over $30
1335 68AC 24 F9 BHS SRLOP1
1336 68AE 5A DECB
1337 68AF 35 10 PULS X
1338
1339 *trans
1340 68B1 108E 607F LDY #CNVBUF
1341 68B5 34 04 PSHS B
1342 68B7 C6 04 LDB #4
1343 68B9 E0 E4 SUBB ,S
1344 68BB 31 A5 LEAY B,Y
1345 68BD 35 04 PULS B
1346 68BF A6 80 SRLOP2 LDA ,X+
1347 68C1 A7 A0 STA ,Y+
1348 68C3 5A DECB
1349 68C4 26 F9 BNE SRLOP2
1350
1351 *convert to bin
1352 68C6 34 10 PSHS X
1353 68C8 8E 607F LDX #CNVBUF
1354 68CB EC 81 LDD ,X++
1355 68CD 8D 0F BSR CNVSUB
1356 68CF 34 02 PSHS A
1357 68D1 EC 81 LDD ,X++
1358 68D3 8D 09 BSR CNVSUB
1359 68D5 1F 89 TFR A,B
1360 68D7 35 02 PULS A
1361 68D9 1F 02 TFR D,Y
1362 68DB 35 10 PULS X
1363 68DD 39 RTS
1364
1365 *cnv sub
1366 *return A
1367 68DE CNVSUB EQU *
1368 68DE 80 30 SUBA #$30
1369 68E0 81 11 CMPA #$11
1370 68E2 25 02 BLO CNV1
1371 68E4 80 07 SUBA #7
1372 68E6 48 CNV1 LSLA
1373 68E7 48 LSLA
1374 68E8 48 LSLA
1375 68E9 48 LSLA
1376 68EA C0 30 SUBB #$30
1377 68EC C1 11 CMPB #$11
1378 68EE 25 02 BLO CNV2
1379 68F0 C0 07 SUBB #7
1380 68F2 C4 0F CNV2 ANDB #$0F
1381 68F4 34 04 PSHS B
1382 68F6 AB E0 ADDA ,S+
1383 68F8 39 RTS
1384
1385 *--------------------
1386 * search empty area in FAT
1387 68F9 SRCFAT EQU *
1388 68F9 8E 600E LDX #SCTFAT
1389 68FC 17 FABD LBSR SETSNO
1390 68FF 17 035F LBSR RD1SCT read 1 sct
1391
1392 6902 8E 5E00 LDX #RWBUF
1393 *search $00
1394 6905 SRC0
1395 6905 C6 02 LDB #2 SD
1396 6907 7D 6009 TST SDHC 0:SD,1:SDHC
1397 690A 27 02 BEQ SRCLOP
1398 690C C6 04 LDB #4 SDHC
1399 690E 8D 32 SRCLOP BSR SRC00 search 1st 00 ...1st 00
1400 6910 24 2F BCC SFATED not exist empty area
1401 6912 A6 80 LDA ,X+ next is 00? ..2nd 00
1402 6914 26 EF BNE SRC0 restart
1403 6916 7D 6009 TST SDHC 0:SD,1:SDHC
1404 6919 27 0A BEQ SETX
1405 691B A6 80 LDA ,X+ next is 00? ..3rd 00
1406 691D 26 E6 BNE SRC0 restart
1407 691F A6 80 LDA ,X+ next is 00? ..4th 00
1408 6921 26 E2 BNE SRC0 restart
1409 6923 30 1E LEAX -2,X
1410 6925 SETX
1411 6925 30 1E LEAX -2,X pos in RWBUF
1412 6927 3089 A200 LEAX -RWBUF,X relative pos
1413 692B 1F 10 TFR X,D
1414 692D 44 LSRA
1415 692E 56 RORB 1/2
1416 692F 7D 6009 TST SDHC 0:SD,1:SDHC
1417 6932 27 02 BEQ SETCL
1418 6934 44 LSRA
1419 6935 56 RORB 1/2
1420 6936 FD 604A SETCL STD CLSTL
1421 6939 1E 89 EXG A,B
1422 693B 8E 601F LDX #DIRENT
1423 693E ED 88 1A STD $1A,X set cluster L to dirent
1424 6941 39 SFATED RTS
1425
1426 *search 00 in FAT
1427 6942 8C 6000 SRC00 CMPX #RWBUF+512
1428 6945 24 07 BHS NOEXST
1429 6947 A6 80 LDA ,X+
1430 6949 26 F7 BNE SRC00
1431 694B 1A 01 EXIST ORCC #$01 set C
1432 694D 39 RTS
1433 694E 1C FE NOEXST ANDCC #$FE reset C
1434 6950 39 RTS
1435
1436 *--------------------
1437 * search empty DIR entry
1438 * return:DPGNO,DIROFS
1439 6951 SRCDIR EQU *
1440 6951 7F 605A CLR DPGNO
1441 *return no of DIR
1442 6954 8E 6016 LDX #SCTDSV
1443 6957 108E 6012 LDY #SCTDIR
1444 695B C6 04 LDB #4
1445 695D 17 02B9 LBSR TRANS
1446 6960 8E 6012 SRCFL0 LDX #SCTDIR
1447 6963 17 FA56 SRCFL1 LBSR SETSNO
1448 6966 17 02F8 LBSR RD1SCT read 1 sct
1449
1450 6969 8E 5E00 LDX #RWBUF
1451 696C 8C 6000 DLOP1 CMPX #RWBUF+512
1452 696F 24 0D BHS SRCFL5
1453 6971 A6 80 LDA ,X+
1454 6973 27 15 BEQ DIRGET
1455 6975 81 E5 CMPA #$E5 delete mark?
1456 6977 27 11 BEQ DIRGET
1457 6979 30 88 1F LEAX 32-1,X
1458 697C 20 EE BRA DLOP1
1459
1460 697E 7C 605A SRCFL5 INC DPGNO
1461 6981 8E 6012 LDX #SCTDIR
1462 6984 17 02A6 LBSR INCX4 sct no +1
1463 6987 20 DA BRA SRCFL1
1464 6989 DSPED
1465 6989 39 RTS
1466
1467 698A 30 1F DIRGET LEAX -1,X
1468 698C BF 605B STX DIROFS
1469 698F 39 RTS
1470
1471 *--------------------
1472 6990 MKFLDT EQU *
1473 *cluster no & attr already set
1474 *file name input&set
1475 6990 8E 604F LDX #FNAME
1476 6993 108E 601F LDY #DIRENT
1477 6997 C6 0B LDB #11
1478 6999 17 027D LBSR TRANS set file name
1479
1480 *cal file size
1481 699C 7D 604D TST MCFLG 00,FF(FE),else
1482 699F 2B 08 BMI MKF1
1483 69A1 FC 6061 LDD MCAEP
1484 69A4 B3 605F SUBD MCADP
1485 69A7 20 04 BRA MKF2
1486 69A9 MKF1
1487 69A9 DC 35 LDD BASAEP
1488 69AB 93 33 SUBD BASADP
1489 69AD MKF2
1490 69AD C3 0001 ADDD #1
1491 69B0 FD 6046 STD FILSIZ
1492 69B3 FD 6075 STD WK0
1493 * EXG A,B
1494 * LDX #DIRENT
1495 * STD $1C,X
1496
1497 *set date (for FM-7)
1498 69B6 8D 12 BSR STDATE
1499 69B8 FC 603F LDD WMDY
1500 69BB 1E 89 EXG A,B
1501
1502 *year,month,day
1503 69BD 8E 601F LDX #DIRENT
1504 69C0 ED 88 18 STD $18,X
1505 69C3 ED 88 10 STD $10,X
1506 69C6 ED 88 12 STD $12,X
1507 69C9 39 RTS
1508
1509 *----------
1510 *FM day to SD
1511 *retuen WMDY,WMDY+1
1512 69CA STDATE EQU *
1513 69CA 8E 02FA LDX #FMDAT date of FM-7
1514 69CD 108E 603F LDY #WMDY
1515 69D1 C6 03 LDB #3
1516 69D3 34 04 ABLOP PSHS B
1517 69D5 EC 81 LDD ,X++
1518 69D7 8D 2E BSR APLUSB
1519 69D9 A7 A0 STA ,Y+
1520 69DB 35 04 PULS B
1521 69DD 26 F4 BNE ABLOP
1522 *year
1523 69DF B6 603F LDA WMDY
1524 69E2 8B 14 ADDA #20 ---2000-1980
1525 69E4 48 LSLA
1526 69E5 B7 603F STA WMDY
1527 *month
1528 69E8 B6 6040 LDA WMDY+1
1529 69EB 48 LSLA
1530 69EC 48 LSLA
1531 69ED 48 LSLA
1532 69EE 48 LSLA
1533 69EF 48 ASLA
1534 69F0 B7 6040 STA WMDY+1
1535 69F3 F6 603F LDB WMDY
1536 69F6 C9 00 ADCB #0 plus C
1537 69F8 F7 603F STB WMDY
1538 *day
1539 69FB B6 6041 LDA WMDY+2
1540 69FE 84 1F ANDA #$1F
1541 6A00 BB 6040 ADDA WMDY+1
1542 6A03 B7 6040 STA WMDY+1
1543 6A06 39 RTS
1544
1545 *lower nibble of A,B to A+B
1546 6A07 APLUSB EQU *
1547 6A07 34 10 PSHS X
1548 6A09 34 04 PSHS B
1549 6A0B C6 0A LDB #10
1550 6A0D 3D MUL
1551 6A0E 1F 01 TFR D,X
1552 6A10 35 04 PULS B
1553 6A12 3A ABX
1554 6A13 1F 10 TFR X,D
1555 6A15 1E 89 EXG A,B A:data
1556 6A17 35 90 PULS X,PC
1557 *
1558 *--------------------
1559 6A19 WRTFIL EQU *
1560 *calc file size for write to sd
1561 6A19 FC 6075 LDD WK0
1562 6A1C 7D 604D TST MCFLG 0,FF(FE),else
1563 6A1F 27 04 BEQ WRTF0 machine code
1564 6A21 2B 07 BMI WRTF1 basic(binary)
1565 6A23 2A 08 BPL WRTF2 else
1566 6A25 C3 000A WRTF0 ADDD #10 add header(&footer)
1567 6A28 20 03 BRA WRTF2
1568 6A2A C3 0003 WRTF1 ADDD #3 add header
1569 6A2D WRTF2
1570 6A2D FD 6075 STD WK0 number of bytes actually written
1571 6A30 1E 89 EXG A,B
1572 6A32 8E 601F LDX #DIRENT
1573 6A35 ED 88 1C STD $1C,X
1574 6A38 1E 89 EXG A,B
1575 *calc counter (CNT:512byte units)
1576 6A3A 7F 604C CLR CNT
1577 6A3D 7C 604C CALLOP INC CNT
1578 6A40 83 0200 SUBD #512
1579 6A43 24 F8 BHS CALLOP
1580
1581 6A45 86 01 LDA #1
1582 6A47 B7 604E STA TPGFLG set top page
1583
1584 6A4A 7D 604D TST MCFLG 0,FF(FE),else
1585 6A4D 2B 05 BMI WRTF3
1586 6A4F BE 605F LDX MCADP saved top adr
1587 6A52 20 02 BRA WRTF4
1588 6A54 9E 33 WRTF3 LDX BASADP saved top adr
1589 6A56 BF 606D WRTF4 STX WK1 src topadr
1590 6A59 CE 5E00 LDU #RWBUF
1591
1592 *get clusterL
1593 6A5C 8E 601F LDX #DIRENT
1594 6A5F EC 88 1A LDD $1A,X
1595 6A62 1E 89 EXG A,B B:clusterL
1596
1597 6A64 BE 601A LDX SCTCLT sct no of top cluster
1598 6A67 BF 606F STX WK2
1599 6A6A BE 601C LDX SCTCLT+2
1600 6A6D BF 6071 STX WK2+2
1601
1602 6A70 C0 02 SUBB #2 for SD
1603 6A72 7D 6009 TST SDHC 0:SD,1:SDHC
1604 6A75 27 01 BEQ WR2
1605 6A77 5A DECB
1606 6A78 WR2
1607
1608 *(X)..(X+3)+(B)x40h
1609 6A78 8E 606F LDX #WK2
1610 6A7B 17 01BE LBSR ADD40H cal of sct no
1611
1612 *set start sct no of file
1613 6A7E 34 10 PSHS X
1614 6A80 8E 710A LDX #MSWTNG
1615 6A83 17 039D LBSR PSTRNG
1616 6A86 35 10 PULS X
1617
1618 6A88 WRLOP
1619 6A88 86 2E LDA #'.
1620 6A8A BD FBBB JSR OUTCHA
1621 6A8D FC 6075 LDD WK0
1622 6A90 1F 02 TFR D,Y
1623 6A92 1083 0200 CMPD #512
1624 6A96 23 0A BLS WR3
1625 6A98 83 0200 SUBD #512
1626 6A9B FD 6075 STD WK0
1627 6A9E 108E 0200 LDY #512
1628 6AA2 WR3
1629
1630 *write data to rwbuf
1631 * (X)->(U:RWBUF)
1632 * (Y):SIZE 512bytes or Less
1633 6AA2 BE 606D LDX WK1
1634 6AA5 CE 5E00 LDU #RWBUF
1635 6AA8 8D 44 BSR WRSUB
1636
1637 *set to sctn0-3
1638 6AAA 34 30 PSHS X,Y
1639 6AAC 8E 606F LDX #WK2
1640 6AAF 108E 6004 LDY #SCTN0
1641 6AB3 C6 04 LDB #4
1642 6AB5 17 0161 LBSR TRANS
1643 6AB8 35 30 PULS X,Y
1644
1645 *write data to sd
1646 6ABA 17 0093 LBSR WRTSD ...not wrtsd1
1647
1648 *inc sctn0-3
1649 6ABD 8E 606F LDX #WK2
1650 6AC0 17 016A LBSR INCX4
1651 6AC3 BE 606D LDX WK1 src topadr
1652 6AC6 3089 0200 LEAX 512,X
1653 *check top page
1654 6ACA 7D 604E TST TPGFLG top page?
1655 6ACD 27 0D BEQ WR6 no
1656 6ACF 7D 604D TST MCFLG
1657 6AD2 27 04 BEQ WR4 machine code
1658 6AD4 2B 04 BMI WR5 basic(binary)
1659 6AD6 2A 04 BPL WR6
1660 6AD8 30 1E WR4 LEAX -2,X rewind 3or5
1661 6ADA 30 1D WR5 LEAX -3,X
1662 6ADC WR6
1663 6ADC 7F 604E CLR TPGFLG
1664 6ADF BF 606D STX WK1
1665 6AE2 7A 604C DEC CNT
1666 6AE5 26 A1 BNE WRLOP
1667
1668 6AE7 8E 7123 WREND LDX #MSWTED
1669 6AEA 17 0336 LBSR PSTRNG
1670 6AED 39 RTS
1671
1672 *----------
1673 *write data to rwbuf
1674 * (X)->(U:RWBUF)
1675 * (Y):SIZE 512bytes or Less
1676 *clear rwbuf
1677 6AEE WRSUB EQU *
1678 6AEE 34 30 PSHS X,Y
1679 6AF0 4F CLRA
1680 6AF1 8E 5E00 LDX #RWBUF
1681 6AF4 108E 0200 LDY #512
1682 6AF8 A7 80 WWCLOP STA ,X+
1683 6AFA 31 3F LEAY -1,Y
1684 6AFC 26 FA BNE WWCLOP
1685 6AFE 35 30 PULS X,Y
1686
1687 *set data to rwbuf
1688 6B00 CE 5E00 LDU #RWBUF
1689
1690 6B03 7D 604E TST TPGFLG 1:top page,0:else
1691 6B06 27 16 BEQ WRS01 no
1692 6B08 7D 604D TST MCFLG 0,$FF($FE),etc
1693 6B0B 2B 32 BMI WRS1
1694
1695 *add header of machine code
1696 6B0D 34 10 PSHS X
1697 6B0F 4F CLRA
1698 6B10 A7 C0 STA ,U+ $00
1699 6B12 BE 6046 LDX FILSIZ
1700 6B15 AF C1 STX ,U++ file size
1701 6B17 BE 605F LDX MCADP
1702 6B1A AF C1 STX ,U++ save adr
1703 6B1C 35 10 PULS X
1704
1705 6B1E WRS01
1706 *check last page
1707 6B1E B6 604C LDA CNT
1708 6B21 81 01 CMPA #1
1709 6B23 26 02 BNE WRS2
1710 6B25 31 3B LEAY -5,Y
1711 *set write data
1712 6B27 8D 1E WRS2 BSR WRDSET
1713 *check last page
1714 6B29 B6 604C LDA CNT
1715 6B2C 81 01 CMPA #1
1716 6B2E 26 0E BNE WRS3
1717
1718 *add footer
1719 6B30 WRS211
1720 * CMPU #RWBUF+512-5
1721 * BLS WRS21
1722 * RTS
1723 6B30 86 FF WRS21 LDA #$FF
1724 6B32 A7 C0 STA ,U+
1725 6B34 4F CLRA
1726 6B35 A7 C0 STA ,U+
1727 6B37 A7 C0 STA ,U+
1728 6B39 BE 6063 LDX MCEXP
1729 6B3C AF C1 STX ,U++
1730 6B3E 39 WRS3 RTS
1731
1732 6B3F WRS1
1733 *add header of basic file
1734 6B3F 86 FF LDA #$FF
1735 6B41 A7 C0 STA ,U+
1736 6B43 A7 C0 STA ,U+
1737 6B45 A7 C0 STA ,U+
1738
1739 *data set
1740 6B47 A6 80 WRDSET LDA ,X+
1741 6B49 A7 C0 STA ,U+
1742 6B4B 31 3F LEAY -1,Y
1743 6B4D 26 F8 BNE WRDSET
1744 6B4F 39 RTS
1745
1746 *write data to sd
1747 6B50 WRTSD EQU *
1748 6B50 17 01A1 LBSR SETSCT *set SCT No
1749 *copy sct no to cmd param
1750 6B53 8E 6004 WRTSD1 LDX #SCTN0
1751 6B56 108E 6F3F LDY #CMD24+1
1752 6B5A C6 04 LDB #4
1753 6B5C 17 00BA LBSR TRANS
1754 *send cmd
1755 6B5F 17 01C1 LBSR SETCKL
1756 6B62 C6 06 LDB #6
1757 6B64 8E 6F3E LDX #CMD24
1758 6B67 A6 80 SDW1 LDA ,X+
1759 6B69 17 0149 LBSR SNDDAT
1760 6B6C 5A DECB
1761 6B6D 26 F8 BNE SDW1
1762 *get cmd response
1763 6B6F SDW2
1764 6B6F 17 015F LBSR GETDAT
1765 6B72 B6 6008 LDA RESDAT
1766 6B75 81 00 CMPA #$00
1767 6B77 26 F6 BNE SDW2
1768 *1byte skip
1769 6B79 86 FF LDA #$FF
1770 6B7B 17 0137 LBSR SNDDAT 1byte skip
1771
1772 *send data packet
1773 6B7E 8E 5E00 LDX #RWBUF <-temp -1="" 008d="" 0093="" 00b4="" 00b6="" 00ce="" 011a="" 011d="" 0126="" 0129="" 012b="" 0133="" 01="" 0200="" 02="" 03="" 04="" 05="" 06="" 08="" 0:sd="" 0f="" 108e="" 10be="" 12="" 16="" 1774="" 1775="" 1776="" 1777="" 1778="" 1779="" 1780="" 1781="" 1782="" 1783="" 1784="" 1785="" 1786="" 1787="" 1788="" 1789="" 1790="" 1791="" 1792="" 1793="" 1794="" 1795="" 1796="" 1797="" 1798="" 1799="" 17="" 1800="" 1801="" 1802="" 1803="" 1804="" 1805="" 1806="" 1807="" 1808="" 1809="" 1810="" 1811="" 1812="" 1813="" 1814="" 1815="" 1816="" 1817="" 1818="" 1819="" 1820="" 1821="" 1822="" 1823="" 1824="" 1825="" 1826="" 1827="" 1828="" 1829="" 1830="" 1831="" 1832="" 1833="" 1834="" 1835="" 1836="" 1837="" 1838="" 1839="" 1840="" 1841="" 1842="" 1843="" 1844="" 1845="" 1846="" 1847="" 1848="" 1849="" 1850="" 1851="" 1852="" 1853="" 1854="" 1855="" 1856="" 1857="" 1858="" 1859="" 1860="" 1861="" 1862="" 1863="" 1864="" 1865="" 1866="" 1867="" 1868="" 1869="" 1870="" 1871="" 1872="" 1873="" 1874="" 1875="" 1876="" 1877="" 1878="" 1879="" 1880="" 1881="" 1882="" 1883="" 1884="" 1885="" 1886="" 1887="" 1888="" 1889="" 1890="" 1891="" 1892="" 1893="" 1894="" 1895="" 1896="" 1897="" 1898="" 1899="" 1900="" 1901="" 1902="" 1903="" 1904="" 1905="" 1906="" 1907="" 1908="" 1909="" 1910="" 1911="" 1912="" 1913="" 1914="" 1915="" 1916="" 1917="" 1918="" 1919="" 1920="" 1921="" 1922="" 1923="" 1924="" 1925="" 1926="" 1927="" 1928="" 1929="" 1930="" 1931="" 1932="" 1933="" 1934="" 1935="" 1936="" 1937="" 1938="" 1939="" 1940="" 1941="" 1942="" 1943="" 1944="" 1945="" 1946="" 1947="" 1948="" 1949="" 1950="" 1951="" 1952="" 1953="" 1954="" 1955="" 1956="" 1957="" 1958="" 1959="" 1960="" 1961="" 1962="" 1963="" 1964="" 1965="" 1966="" 1967="" 1968="" 1969="" 1970="" 1971="" 1972="" 1973="" 1974="" 1975="" 1976="" 1977="" 1978="" 1979="" 1980="" 1981="" 1982="" 1983="" 1984="" 1985="" 1986="" 1987="" 1988="" 1989="" 1990="" 1991="" 1992="" 1993="" 1994="" 1995="" 1996="" 1997="" 1998="" 1="" 1a="" 1e="" 1f="" 20="" 24="" 26="" 27="" 2="" 31="" 34="" 35="" 36="" 39="" 3="" 3a="" 3d="" 3f="" 40="" 44="" 48="" 4c="" 50="" 54="" 5a="" 5c="" 5e00="" 5e="" 6004="" 6008="" 6009="" 600e="" 6012="" 6016="" 601f="" 605a="" 605b="" 60="" 68="" 6b81="" 6b85="" 6b87="" 6b8a="" 6b8c="" 6b8f="" 6b91="" 6b93="" 6b95="" 6b98="" 6b9b="" 6b9e="" 6ba1="" 6ba3="" 6ba5="" 6ba8="" 6bab="" 6bad="" 6baf="" 6bb0="" 6bb3="" 6bb7="" 6bb9="" 6bbb="" 6bbe="" 6bc1="" 6bc3="" 6bc5="" 6bc6="" 6bc8="" 6bcb="" 6bce="" 6bd1="" 6bd5="" 6bd7="" 6bd9="" 6bdc="" 6bdd="" 6be0="" 6be3="" 6be5="" 6be7="" 6be9="" 6bec="" 6bef="" 6bf1="" 6bf3="" 6bf5="" 6bf8="" 6bfa="" 6bfc="" 6bff="" 6c00="" 6c02="" 6c04="" 6c06="" 6c08="" 6c0a="" 6c0d="" 6c0f="" 6c11="" 6c13="" 6c15="" 6c18="" 6c19="" 6c1b="" 6c1d="" 6c1f="" 6c20="" 6c22="" 6c24="" 6c26="" 6c28="" 6c29="" 6c2b="" 6c2d="" 6c2f="" 6c31="" 6c33="" 6c35="" 6c37="" 6c39="" 6c3b="" 6c3c="" 6c3e="" 6c40="" 6c42="" 6c44="" 6c46="" 6c48="" 6c4a="" 6c4c="" 6c4e="" 6c50="" 6c52="" 6c54="" 6c56="" 6c58="" 6c5a="" 6c5c="" 6c5d="" 6c5f="" 6c61="" 6c64="" 6c68="" 6c6a="" 6c6c="" 6c6f="" 6c71="" 6c74="" 6c76="" 6c78="" 6c79="" 6c7b="" 6c7d="" 6c80="" 6c82="" 6c84="" 6c87="" 6c8b="" 6c8d="" 6c90="" 6c92="" 6c94="" 6c96="" 6c97="" 6c9a="" 6c9d="" 6c="" 6ca1="" 6ca3="" 6ca5="" 6ca8="" 6caa="" 6cac="" 6cad="" 6caf="" 6cb2="" 6cb4="" 6cb5="" 6cb7="" 6cba="" 6cbc="" 6cbe="" 6cc0="" 6cc2="" 6cc5="" 6cc7="" 6cc9="" 6cca="" 6ccc="" 6ccd="" 6ccf="" 6cd1="" 6cd3="" 6cd5="" 6cd7="" 6cd8="" 6cd9="" 6cda="" 6cdc="" 6cdf="" 6ce0="" 6f38="" 6f39="" 70="" 7d="" 7f="" 80="" 81="" 84="" 86="" 88="" 89="" 8a="" 8b="" 8d="" 8e="" 96="" a0="" a6="" a7="" a:fill="" a="" abx="" ad="" add0="" add1="" add2="" add3="" add40h="" adda="" addb="" adr="" adx0="" adx1="" adx2="" adx3="" anda="" b1-="" b6="" b7="" b:cnt="" bcc="" beq="" bne="" bra="" bsr="" buf="" busy="" c6="" cb="" ckrs="" clr="" cluster="" cmd="" cmpa="" copy="" crch="" crcl="" cs:b0="L" d="" data="" decb="" df="" dir="" dirofs="" disp="" dpgno="" dspb1="" dspb2="" dspb3="" dspbin="" dspbuf="" e5="" ec="" ed="" equ="" exg="" f4="" f5="" f6="" f7="" f7cd="" f7f1="" f9="" fb="" fc="" fd9e="" fe="" ff3b="" ff77="" ff="" fill="" filop="" get="" getd1="" getdat="" inc="" incx4="" lbsr="" lda="" ldb="" ldd="" ldx="" ldy="" leay="" lsla="" lsra="" miso:b1="H(for" no="" nop="" of="" ora="" param="" pbdat="" pcrlf="" pia="" pshs="" puls="" rd1="" rd1sct="" rd2="" rd3="" read="" resdat="" response="" return="" rts="" save="" sct="" sd:2="" sdhc:4="" sdhc="" send="" setckh="" setckl="" setsno="" sndd1="" snddat="" snddt1="" src="" sta="" temp="" tfr="" to="" token="" trans="" trlop="" tst="" until="" wait="" wrdlop="" wrdskp="" wrf1="" wrf2="" wrf3="" wrtdir="" wrtfat="" wrtsd1="" wspfl0="" x40h="" y:dst="" y="">C
1999 6CE1 79 6008 ROL RESDAT C->b0
2000 6CE4 5A DECB
2001 6CE5 26 EE BNE GETD1
2002 6CE7 8D 3A BSR SETCKL
2003 6CE9 35 86 PULS A,B,PC
2004 *
2005 *------------------------------
2006 *input SCT No
2007 6CEB INSCT EQU *
2008 6CEB 8E 7046 LDX #MSSCT
2009 6CEE 17 0132 LBSR PSTRNG
2010 6CF1 17 0085 LBSR GET8CH get 8chr, convert 4bin
2011
2012 6CF4 SETSCT EQU *
2013 6CF4 34 32 PSHS A,X,Y
2014 6CF6 7D 6009 TST SDHC 0:SD,1:SDHC
2015 6CF9 26 1A BNE CALCHC
2016 *SD card
2017 6CFB 8E 6005 LDX #SCTN1
2018 6CFE 108E 6004 LDY #SCTN0
2019 6D02 C6 03 LDB #3
2020 6D04 17 FF12 LBSR TRANS
2021 6D07 7F 6007 CLR SCTN3
2022 *calc top adrs of sct
2023 6D0A CALCSD EQU *
2024 6D0A 78 6007 LSL SCTN3
2025 6D0D 79 6006 ROL SCTN2
2026 6D10 79 6005 ROL SCTN1
2027 6D13 35 B2 PULS A,X,Y,PC
2028
2029 *SDHC card
2030 *calc top adrs of sct
2031 6D15 CALCHC EQU *
2032 6D15 8E 6004 LDX #SCTN0
2033 6D18 108E 6F39 LDY #CMD17+1
2034 6D1C C6 04 LDB #4
2035 6D1E 17 FEF8 LBSR TRANS
2036 6D21 35 B2 PULS A,X,Y,PC
2037
2038 *
2039 *set sck:L
2040 6D23 SETCKL EQU *
2041 6D23 34 02 PSHS A
2042 6D25 86 34 LDA #$34 ca2=L
2043 6D27 B7 FD9F STA PBCTL
2044 6D2A 35 82 PULS A,PC
2045
2046 *set sck:H
2047 6D2C SETCKH EQU *
2048 6D2C 34 02 PSHS A
2049 6D2E 86 3C LDA #$3C ca2=H
2050 6D30 B7 FD9F STA PBCTL
2051 6D33 35 82 PULS A,PC
2052
2053 *binary(A)->ascii(A)(B)
2054 6D35 DSPBIN EQU *
2055 6D35 8D 04 BSR DSPBI0
2056 6D37 BD 6D73 JSR OUTSPC
2057 6D3A 39 RTS
2058 *
2059 6D3B DSPBI0 EQU *
2060 6D3B 34 06 PSHS A,B
2061 6D3D 1F 89 TFR A,B
2062 6D3F 44 LSRA
2063 6D40 44 LSRA
2064 6D41 44 LSRA
2065 6D42 44 LSRA
2066 6D43 8A 30 ORA #$30
2067 6D45 C4 0F ANDB #$0F
2068 6D47 CA 30 ORB #$30
2069 6D49 81 39 CMPA #$39
2070 6D4B 23 02 BLS BI21
2071 6D4D 8B 07 ADDA #$07
2072 6D4F C1 39 BI21 CMPB #$39
2073 6D51 23 02 BLS BI22
2074 6D53 CB 07 ADDB #$07
2075 6D55 BD FBBB BI22 JSR OUTCHA
2076 6D58 1F 98 TFR B,A
2077 6D5A BD FBBB JSR OUTCHA
2078 6D5D 35 86 PULS A,B,PC
2079
2080 *
2081 6D5F DSPBI2 EQU *
2082 6D5F A6 80 LDA ,X+
2083 6D61 8D D8 BSR DSPBI0
2084 6D63 A6 80 LDA ,X+
2085 6D65 8D D4 BSR DSPBI0
2086 6D67 39 RTS
2087
2088 *
2089 *crlf
2090 6D68 PCRLF EQU *
2091 6D68 86 0D LDA #CR
2092 6D6A BD FBBB JSR OUTCHA
2093 6D6D 86 0A LDA #LF
2094 6D6F BD FBBB JSR OUTCHA
2095 6D72 39 RTS
2096
2097 *out spc
2098 6D73 OUTSPC EQU *
2099 6D73 86 20 LDA #SPC
2100 6D75 BD FBBB JSR OUTCHA
2101 6D78 39 RTS
2102
2103 *
2104 6D79 GET8CH EQU *
2105 *input chr
2106 6D79 8E 6077 LDX #INPBUF
2107 6D7C 5F CLRB
2108 6D7D BD 6F12 CLOP JSR INOUTC
2109 6D80 81 0D CMPA #CR
2110 6D82 27 07 BEQ INEND
2111 6D84 A7 85 STA B,X
2112 6D86 5C INCB
2113 6D87 C1 08 CMPB #8
2114 6D89 25 F2 BLO CLOP
2115
2116 6D8B INEND
2117 *shift
2118 6D8B 5D TSTB
2119 6D8C 27 21 BEQ CLEND
2120 6D8E 8E 6077 LDX #INPBUF
2121 6D91 3A ABX
2122 6D92 108E 607F LDY #INPBUF+8
2123 6D96 34 04 PSHS B
2124 6D98 A6 82 SFLOP LDA ,-X
2125 6D9A A7 A2 STA ,-Y
2126 6D9C 5A DECB
2127 6D9D 26 F9 BNE SFLOP
2128 *clr
2129 6D9F C6 08 CL1 LDB #8
2130 6DA1 E0 E0 SUBB ,S+
2131 6DA3 27 0A BEQ CLEND
2132 6DA5 8E 6077 LDX #INPBUF
2133 6DA8 86 30 LDA #'0
2134 6DAA A7 80 CLLOP STA ,X+
2135 6DAC 5A DECB
2136 6DAD 26 FB BNE CLLOP
2137 6DAF CLEND
2138
2139 *convert to bin
2140 6DAF C6 04 LDB #4
2141 6DB1 8E 6077 LDX #INPBUF
2142 6DB4 108E 6004 LDY #SCTN0
2143 6DB8 CVT1
2144 6DB8 A6 80 LDA ,X+
2145 6DBA 8D 1E BSR CVBIN
2146 6DBC 25 16 BCS EREND1
2147 6DBE 48 LSLA
2148 6DBF 48 LSLA
2149 6DC0 48 LSLA
2150 6DC1 48 LSLA
2151 6DC2 34 02 PSHS A
2152 6DC4 A6 80 LDA ,X+
2153 6DC6 8D 12 BSR CVBIN
2154 6DC8 25 08 BCS EREND0
2155 6DCA AB E0 ADDA ,S+
2156 6DCC A7 A0 STA ,Y+
2157 6DCE 5A DECB
2158 6DCF 26 E7 BNE CVT1
2159 6DD1 39 RTS
2160
2161 6DD2 35 02 EREND0 PULS A
2162 6DD4 8E 708C EREND1 LDX #MSERR
2163 6DD7 8D 4A BSR PSTRNG
2164 6DD9 39 EEND RTS
2165
2166 *--------------------
2167 *ascii -> bin
2168 6DDA CVBIN EQU *
2169 6DDA 80 30 SUBA #'0
2170 6DDC 2B 11 BMI CVERR
2171 6DDE 81 09 CMPA #9
2172 6DE0 23 0A BLS CVBEND
2173 6DE2 81 11 CMPA #$11
2174 6DE4 25 09 BLO CVERR
2175 6DE6 81 16 CMPA #$16
2176 6DE8 22 05 BHI CVERR
2177 6DEA 80 07 SUBA #7
2178 6DEC CVBEND
2179 6DEC 1C FE ANDCC #$FE reset C
2180 6DEE 39 RTS
2181 6DEF 1A 01 CVERR ORCC #$01 set C
2182 6DF1 39 RTS
2183
2184 *--------------------
2185 *add 2bytes to 4bytes
2186 * X,X+1,X+2,X+3 + Y,Y+1
2187 * data X is big endian
2188 * data Y is little endian
2189 6DF2 ADD42 EQU *
2190 6DF2 34 36 PSHS A,B,X,Y
2191 6DF4 32 7C LEAS -4,S
2192 6DF6 C6 04 LDB #4
2193 6DF8 A6 80 AD1 LDA ,X+
2194 6DFA A7 E0 STA ,S+
2195 6DFC 5A DECB
2196 6DFD 26 F9 BNE AD1
2197
2198 *add (lower)
2199 6DFF A6 A0 LDA ,Y+
2200 6E01 AB E2 ADDA ,-S
2201 6E03 A7 E4 STA ,S
2202 6E05 24 02 BCC AD2
2203 6E07 6C 7F INC -1,S
2204 *add (upper)
2205 6E09 A6 A4 AD2 LDA ,Y
2206 6E0B AB E2 ADDA ,-S
2207 6E0D A7 E4 STA ,S
2208 6E0F 24 02 BCC AD3
2209 6E11 6C 7F INC -1,S
2210 6E13 30 1C AD3 LEAX -4,X
2211 6E15 32 7E LEAS -2,S
2212 6E17 C6 04 LDB #4
2213 6E19 A6 E0 AD4 LDA ,S+
2214 6E1B A7 80 STA ,X+
2215 6E1D 5A DECB
2216 6E1E 26 F9 BNE AD4
2217 6E20 35 36 PULS A,B,X,Y
2218 6E22 39 RTS
2219
2220 *--------------------
2221 * pstring
2222 6E23 PSTRNG EQU *
2223 6E23 34 02 PSHS A
2224 6E25 A6 80 PSLOP LDA ,X+
2225 6E27 81 04 CMPA #4
2226 6E29 27 05 BEQ PSEND
2227 6E2B BD FBBB JSR OUTCHA
2228 6E2E 20 F5 BRA PSLOP
2229 6E30 35 02 PSEND PULS A
2230 6E32 39 RTS
2231
2232 *--------------------
2233 *disp MM-DD-YY
2234 *indata A(Low),B(High)
2235 6E33 DSPYMD EQU *
2236 6E33 1E 89 EXG A,B
2237 6E35 34 10 PSHS X
2238 6E37 34 06 PSHS A,B
2239 6E39 C4 E0 ANDB #$E0
2240 6E3B 54 LSRB
2241 6E3C 54 LSRB
2242 6E3D 54 LSRB
2243 6E3E 54 LSRB
2244 6E3F 54 LSRB
2245 6E40 47 ASRA
2246 6E41 24 02 BCC DYMD1
2247 6E43 CB 08 ADDB #8
2248 6E45 F7 603F DYMD1 STB WMDY MM
2249 6E48 35 06 PULS A,B
2250 6E4A 34 04 PSHS B
2251 6E4C C4 1F ANDB #$1F
2252 6E4E F7 6040 STB WMDY+1 DD
2253 6E51 35 04 PULS B
2254
2255 6E53 44 LSRA
2256 * ASLB
2257 * BCC DYMD2
2258 * INCA
2259 6E54 DYMD2
2260 6E54 80 14 SUBA #20 A+1980-2000
2261 6E56 B7 6041 STA WMDY+2 YY
2262
2263 *disp MM-DD-YY
2264 6E59 BD 6D73 JSR OUTSPC
2265 6E5C 8E 603F LDX #WMDY
2266 6E5F A6 80 LDA ,X+
2267 6E61 8D 14 BSR DB2ASC MM
2268 6E63 86 2D LDA #'-
2269 6E65 BD FBBB JSR OUTCHA
2270 6E68 A6 80 LDA ,X+
2271 6E6A 8D 0B BSR DB2ASC DD
2272 6E6C 86 2D LDA #'-
2273 6E6E BD FBBB JSR OUTCHA
2274 6E71 A6 80 LDA ,X+
2275 6E73 8D 02 BSR DB2ASC YY
2276 6E75 35 90 PULS X,PC
2277 *
2278 *----------
2279 *convert decimal value to ascii code
2280 *(A:BIN)->ASCII
2281 6E77 DB2ASC EQU *
2282 6E77 34 06 PSHS A,B
2283 6E79 1F 89 TFR A,B
2284 6E7B 86 30 LDA #$30
2285 6E7D C1 0A DBLOP CMPB #10
2286 6E7F 25 05 BLO DB2
2287 6E81 C0 0A SUBB #10
2288 6E83 4C INCA
2289 6E84 20 F7 BRA DBLOP
2290 6E86 BD FBBB DB2 JSR OUTCHA
2291 6E89 1F 98 TFR B,A
2292 6E8B 8B 30 ADDA #$30
2293 6E8D BD FBBB JSR OUTCHA
2294 6E90 35 86 PULS A,B,PC
2295
2296 *disp FILE size
2297 6E92 DSPSIZ EQU *
2298 6E92 34 10 PSHS X
2299 6E94 BE 6042 LDX WFSIZ
2300 6E97 27 07 BEQ DSS1 if 64k over?
2301 6E99 8E 7157 LDX #MSOVR
2302 6E9C 8D 85 BSR PSTRNG
2303 6E9E 20 3E BRA DSEND
2304
2305 6EA0 DSS1
2306 * /1024(400h)
2307 6EA0 B6 6044 LDA WFSIZ+2 under 64k
2308 6EA3 44 LSRA
2309 6EA4 44 LSRA
2310 *disp dec
2311 6EA5 1F 89 TFR A,B
2312 6EA7 81 64 CMPA #100
2313 6EA9 23 10 BLS DSS13
2314 6EAB 86 30 LDA #'0
2315 6EAD C1 64 DSLOP1 CMPB #100
2316 6EAF 25 05 BLO DSS12
2317 6EB1 C0 64 SUBB #100
2318 6EB3 4C INCA
2319 6EB4 20 F7 BRA DSLOP1
2320 6EB6 BD FBBB DSS12 JSR OUTCHA
2321 6EB9 20 09 BRA DSS14
2322
2323 *under 100
2324 6EBB BD 6D73 DSS13 JSR OUTSPC
2325 6EBE 86 20 LDA #SPC
2326 6EC0 C1 0A CMPB #10
2327 6EC2 25 0B BLO DSS2
2328
2329 6EC4 86 30 DSS14 LDA #'0
2330 6EC6 C1 0A DSLOP2 CMPB #10
2331 6EC8 25 05 BLO DSS2
2332 6ECA C0 0A SUBB #10
2333 6ECC 4C INCA
2334 6ECD 20 F7 BRA DSLOP2
2335
2336 6ECF BD FBBB DSS2 JSR OUTCHA 10's place
2337 *under 10
2338 6ED2 1F 98 DSS21 TFR B,A
2339 6ED4 8B 31 ADDA #$31 '1
2340 6ED6 BD FBBB DSS3 JSR OUTCHA 1's place
2341 6ED9 86 6B LDA #'k
2342 6EDB BD FBBB JSR OUTCHA
2343 6EDE BD 6D73 DSEND JSR OUTSPC
2344 6EE1 35 90 PULS X,PC
2345
2346 *----------
2347 *disp cluster
2348 *return:clusterL
2349 6EE3 DSPCLS EQU *
2350 6EE3 34 10 PSHS X
2351 6EE5 BD 6D73 JSR OUTSPC
2352 6EE8 8E 604A LDX #CLSTL
2353 6EEB C6 02 LDB #2
2354 6EED A6 80 DCLOP1 LDA ,X+
2355 6EEF 8D 86 BSR DB2ASC
2356 6EF1 5A DECB
2357 6EF2 26 F9 BNE DCLOP1
2358 6EF4 35 90 PULS X,PC
2359
2360 *----------
2361 6EF6 FNMIN EQU *
2362 *clr buf
2363 6EF6 8E 605A LDX #FNAME+11
2364 6EF9 C6 0B LDB #8+3
2365 6EFB 86 20 LDA #SPC
2366 6EFD A7 82 FNIN0 STA ,-X
2367 6EFF 5A DECB
2368 6F00 26 FB BNE FNIN0
2369
2370 *fname in
2371 6F02 34 24 PSHS B,Y
2372 6F04 108E 604F LDY #FNAME
2373 6F08 C6 08 LDB #8
2374 6F0A 8D 0D BSR LININ
2375 6F0C 86 20 LDA #$20
2376 6F0E A7 3F STA -1,Y
2377 6F10 35 A4 PULS B,Y,PC
2378 *
2379 *--------------------
2380 *
2381 6F12 BD FBB8 INOUTC JSR INCHA
2382 6F15 BD FBBB JSR OUTCHA
2383 6F18 39 RTS
2384 *
2385 *--------------------
2386 * line input
2387 * input: B:count, Y:buf
2388 * output: FILBUF (terminate $00)
2389 * temp buf $043D - $053C
2390 6F19 LININ EQU *
2391 6F19 0F BF CLR $BF
2392 6F1B BD D807 JSR LININP
2393
2394 6F1E 8E 043D LDX #$043D
2395 6F21 A6 80 LINLOP LDA ,X+
2396 6F23 A7 A0 STA ,Y+
2397 6F25 5A DECB
2398 6F26 27 03 BEQ LEND
2399 6F28 4D TSTA
2400 6F29 26 F6 BNE LINLOP
2401 6F2B 39 LEND RTS
2402
2403 *
2404 **************************************************
2405 *========== parameter ==========
2406 6F2C 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
2407 6F32 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
2408 6F38 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
2409 6F3E 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
2410 6F44 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
2411 6F4A 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
2412 6F50 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
2413 6F56 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
2414 6F5C 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
2415 *
2416 6F62 43 MCMD0 FCC /CMD0/,CR,LF
2417 6F68 04 FCB 4
2418 6F69 43 MCMD8 FCC /CMD8/,CR,LF
2419 6F6F 04 FCB 4
2420 6F70 43 MCMD58 FCC /CMD58/,CR,LF
2421 6F77 04 FCB 4
2422 6F78 43 MCMD55 FCC /CMD55/,CR,LF
2423 6F7F 04 FCB 4
2424 6F80 41 MCMD41 FCC /ACMD41/,CR,LF
2425 6F88 04 FCB 4
2426 6F89 43 MCMD9 FCC /CMD9/,CR,LF
2427 6F8F 04 FCB 4
2428 *
2429 6F90 0D MSMENU1 FCC CR,LF,CR,LF,/Main MENU/
2430 6F9D 0D FCC CR,LF,/F)iles, L)oad, saveB)asic, saveM)code, K)ill, reS)etSD, O)ption, Q)uit: /
2431 6FE8 04 FCB 4
2432 6FE9 0D MSMENU2 FCC CR,LF,CR,LF,/Option MENU/
2433 6FF9 0D FCC CR,LF,/1:Read Sct, 2:Disp SD data, 3:Disp MBR, 4:Disp BPB, 5:Disp FAT, 0:Return: /
2434 7045 04 FCB 4
2435 7046 53 MSSCT FCC /SctNo: /
2436 704D 04 FCB 4
2437 704E 0D MSSD0 FCC CR,LF,/SD Card/
2438 7057 04 FCB 4
2439 7058 0D MSSD1 FCC CR,LF,/SDHC Card/
2440 7063 04 FCB 4
2441 7064 0D MSINIT FCC CR,LF,CR,LF,/SD Card setting.../
2442 707A 04 FCB 4
2443 707B 53 MERR FCC /Setting error!/,CR,LF
2444 708B 04 FCB 4
2445 708C 49 MSERR FCC /Input error!/,CR,LF
2446 709A 04 FCB 4
2447 709B 0D MSOFS FCC CR,LF,/Sector no is:/
2448 70AA 04 FCB 4
2449 70AB 0D MSBPB FCC CR,LF,/ BPB: /
2450 70B3 04 FCB 4
2451 70B4 0D MSFAT FCC CR,LF,/ FAT: /
2452 70BC 04 FCB 4
2453 70BD 0D MSDIR FCC CR,LF,/ DIR: /
2454 70C5 04 FCB 4
2455 70C6 0D MSCL2 FCC CR,LF,/ 1stCLUSTER: /
2456 70D5 04 FCB 4
2457 70D6 0D MSINFN FCC CR,LF,CR,LF,/ FileName: /
2458 70E5 04 FCB 4
2459 70E6 0D MSMSV FCC CR,LF,CR,LF,/ FileName & Param: /
2460 70FD 04 FCB 4
2461 70FE 0D MSLDNG FCC CR,LF,/ Loading /
2462 7109 04 FCB 4
2463 710A 0D MSWTNG FCC CR,LF,/ Writing /
2464 7115 04 FCB 4
2465 7116 0D MSLDED FCC CR,LF,/ Load end./
2466 7122 04 FCB 4
2467 7123 0D MSWTED FCC CR,LF,/ Write end./
2468 7130 04 FCB 4
2469 7131 0D MSNOFL FCC CR,LF,/ Not exist!/
2470 713E 04 FCB 4
2471 713F 0D MSNXTP FCC CR,LF,"Next page (SP:Next): "
2472 7156 04 FCB 4
2473 7157 3E MSOVR FCC />64k/
2474 715B 04 FCB 4
2475 715C 0D MSKILL FCC CR,LF," Kill OK?(Y/N): "
2476 716E 04 FCB 4
2477 716F 0D MSEXST FCC CR,LF," Exist! Over Write?(Y/N): "
2478 718B 04 FCB 4
2479 718C 0D MSMCOF FCC CR,LF," Offset -$2000?(Y/N): "
2480 71A4 04 FCB 4
2481 71A5 0D MSMCAS FCC CR,LF," Store ADR,SIZE: "
2482 71B8 04 FCB 4
2483 **************************************************
2484
2485 END START
0 error(s), 0 warning(s) is detected.
Label address
ABLOP 69D3 ACMD41 6F56 AD1 6DF8 AD2 6E09 AD3 6E13
AD4 6E19 ADD0 6C3E ADD1 6C4C ADD2 6C54 ADD3 6C5C
ADD40H 6C3C ADD42 6DF2 ADX0 6C2D ADX1 6C33 ADX2 6C37
ADX3 6C3B APLUSB 6A07 ASC2BIN 6896 ASC411 6218 ASCMD41 620B
BASADP 0033 BASAEP 0035 BASEXP 605D BI21 6D4F BI22 6D55
BUSY 6BA5 CALCHC 6D15 CALCSD 6D0A CALLOP 6A3D CEND 66D0
CKRS 6B9B CL1 6D9F CLEND 6DAF CLLOP 6DAA CLOP 6D7D
CLRDIR 6821 CLSTH 6048 CLSTL 604A CMD0 6F2C CMD1 6F32
CMD17 6F38 CMD24 6F3E CMD55 6F50 CMD58 6F4A CMD8 6F44
CMD9 6F5C CMPEND 66EC CMPFN 66D1 CMPLOP 66D9 CNT 604C
CNV1 68E6 CNV2 68F2 CNVBUF 607F CNVINT 6631 CNVLOP 6631
CNVSUB 68DE CR 000D CSRON FBF7 CVBEND 6DEC CVBIN 6DDA
CVERR 6DEF CVT1 6DB8 CVTLEN 6067 DB2 6E86 DB2ASC 6E77
DBLOP 6E7D DCLOP1 6EED DELMK 00E5 DIRENT 601F DIRGET 698A
DIROFS 605B DLOP1 696C DPGNO 605A DSEND 6EDE DSLOP1 6EAD
DSLOP2 6EC6 DSPB1 6CA1 DSPB2 6CA3 DSPB3 6CB4 DSPBI0 6D3B
DSPBI2 6D5F DSPBIN 6D35 DSPBPB 63E2 DSPBUF 6C97 DSPC1 6473
DSPCKE 6433 DSPCLS 6EE3 DSPDIR 6406 DSPED 6989 DSPEND 64A9
DSPFAT 63F4 DSPFL0 6412 DSPFL1 6423 DSPFL2 643D DSPFL3 643F
DSPFL4 644E DSPFL5 6491 DSPFL6 649D DSPMBR 638E DSPSDDAT 62FE
DSPSIZ 6E92 DSPYMD 6E33 DSS1 6EA0 DSS12 6EB6 DSS13 6EBB
DSS14 6EC4 DSS2 6ECF DSS21 6ED2 DSS3 6ED6 DYMD1 6E45
DYMD2 6E54 EEND 6DD9 EREND0 6DD2 EREND1 6DD4 ESC 001B
EXIST 694B EXSTFL 6065 FILBUF 6083 FILL 6C24 FILOP 6C26
FILSIZ 6046 FIXPTR C730 FMDAT 02FA FNAME 604F FNIN0 6EFD
FNMIN 6EF6 GET1 6399 GET2 639B GET8CH 6D79 GETBPB 63C9
GETD1 6CD5 GETDAT 6CD1 GETFDT 66EE GETMBR 63AC GR00 6185
GR2580 6245 GR2581 625C GR2582 625E GR410 6220 GR550 6201
GR580 61D7 GR581 61E1 GR582 61E3 GR80 61A7 GR81 61B9
GR90 6311 GR91 631D GTBLOP 63D4 GTF1 670D GTF2 6710
ILOP1 6281 INCHA FBB8 INCX4 6C2D INEND 6D8B INIT 60C7
INL10 6647 INL11 666B INL12 66B2 INL2 6677 INLOP 6638
INOUTC 6F12 INPBUF 6077 INPFLDAT 687C INSCT 6CEB ISTT 616B
KILEND 67B8 KILFILE 6764 KILSUB 677D KL1 67A2 KL2 67B0
LD1 6740 LD10 65AC LD2 6754 LD3 64CF LD41 64F4
LD5 650D LD8 654F LD80 6594 LD81 6598 LD82 65A1
LD9 65AA LDE0 65CF LDE1 65D5 LDEND 65BC LDFILE 64AA
LDFL0 671C LDFL1 6728 LDFL5 674C LDFLE 6763 LDLOP 651D
LDNEND 65D9 LEND 6F2B LF 000A LINBUF 043D LININ 6F19
LININP D807 LININT FBF1 LINLOP 6F21 LINO1 004B LINO2 033A
MAIN 60A3 MATCH 66E6 MCADP 605F MCAEP 6061 MCEXP 6063
MCFLG 604D MCMD0 6F62 MCMD41 6F80 MCMD55 6F78 MCMD58 6F70
MCMD8 6F69 MCMD9 6F89 MEM2ED 6626 MEMSET 65E1 MEMSET2 6611
MENU 60CA MENU1 60E4 MENU2 60ED MENU3 60F6 MENU4 60FF
MENU5 6108 MENU6 6110 MENU7 6118 MERR 707B MKF1 69A9
MKF2 69AD MKFLDT 6990 MM21 6621 MS0 65F8 MS1 65FC
MS3 660B MSBPB 70AB MSCL2 70C6 MSDIR 70BD MSERR 708C
MSEXST 716F MSFAT 70B4 MSINFN 70D6 MSINIT 7064 MSKILL 715C
MSLDED 7116 MSLDNG 70FE MSLOP 65FE MSMCAS 71A5 MSMCOF 718C
MSMENU1 6F90 MSMENU2 6FE9 MSMSV 70E6 MSNOFL 7131 MSNXTP 713F
MSOFS 709B MSOVR 7157 MSSCT 7046 MSSD0 704E MSSD1 7058
MSWTED 7123 MSWTNG 710A NOEXST 694E NOFEND 67C6 NOTM 66EA
OPMEN10 614F OPMEN6 612F OPMEN7 6137 OPMEN8 613F OPMEN9 6147
OPMENU 6120 OUTCHA FBBB OUTSPC 6D73 PBCTL FD9F PBDAT FD9E
PCRLF 6D68 PSEND 6E30 PSLOP 6E25 PSTRNG 6E23 RD1 6C74
RD1SCT 6C61 RD2 6C7B RD3 6C8B RDLINO 9162 RDSCT 637B
RDTOP 6069 RESDAT 6008 RPT41 61EC RWBUF 5E00 SC01 617C
SC2581 623D SC551 61F9 SC581 61CF SC80 619F SC91 6309
SCMD0 6174 SCMD258 6230 SCMD55 61EC SCMD58 61C2 SCMD8 6192
SCTBPB 600A SCTCLT 601A SCTDIR 6012 SCTDSV 6016 SCTFAT 600E
SCTN0 6004 SCTN1 6005 SCTN2 6006 SCTN3 6007 SCTPCL 601E
SD1 6272 SDERR 6157 SDHC 6009 SDINIT 615E SDW1 6B67
SDW2 6B6F SETCKH 6D2C SETCKL 6D23 SETCL 6936 SETFNM 6805
SETSCT 6CF4 SETSNO 63BC SETX 6925 SFATED 6941 SFLOP 6D98
SKP1 62B8 SKP2 62F5 SNDD1 6CBC SNDDAT 6CB5 SNDDT1 6B8A
SPC 0020 SRC0 6905 SRC00 6942 SRCDIR 6951 SRCDLM 6889
SRCFAT 68F9 SRCFL0 6960 SRCFL1 6963 SRCFL5 697E SRCLOP 690E
SRDLM1 688B SRLOP1 68A7 SRLOP2 68BF START 6000 STDATE 69CA
STTADR 6000 SVTOP 606B TPGFLG 604E TRANS 6C19 TRLOP 6C1B
TXTADR 2000 TXTBUF 033C VN 6003 WFSIZ 6042 WK0 6075
WK1 606D WK2 606F WK3 6071 WK4 6073 WMDY 603F
WR2 6A78 WR3 6AA2 WR4 6AD8 WR5 6ADA WR6 6ADC
WRB0 67CD WRB1 67EB WRBEND 6804 WRBFILE 67B9 WRDLOP 6BC3
WRDSET 6B47 WRDSKP 6BC8 WREND 6AE7 WRF1 6BFC WRF2 6BFF
WRF3 6C15 WRFL1 6812 WRFL11 681C WRFL2 6820 WRFLP2 680D
WRLOP 6A88 WRM1 6849 WRMEND 687B WRMFILE 682F WRS01 6B1E
WRS1 6B3F WRS2 6B27 WRS21 6B30 WRS211 6B30 WRS3 6B3E
WRSUB 6AEE WRTDIR 6BB0 WRTF0 6A25 WRTF1 6A2A WRTF2 6A2D
WRTF3 6A54 WRTF4 6A56 WRTFAT 6BDD WRTFIL 6A19 WRTSD 6B50
WRTSD1 6B53 WSPFL0 6BBB WWCLOP 6AF8
</-temp><-temp -1="" 008d="" 0093="" 00b4="" 00b6="" 00ce="" 011a="" 011d="" 0126="" 0129="" 012b="" 0133="" 01="" 0200="" 02="" 03="" 04="" 05="" 06="" 08="" 0:sd="" 0f="" 108e="" 10be="" 12="" 16="" 1774="" 1775="" 1776="" 1777="" 1778="" 1779="" 1780="" 1781="" 1782="" 1783="" 1784="" 1785="" 1786="" 1787="" 1788="" 1789="" 1790="" 1791="" 1792="" 1793="" 1794="" 1795="" 1796="" 1797="" 1798="" 1799="" 17="" 1800="" 1801="" 1802="" 1803="" 1804="" 1805="" 1806="" 1807="" 1808="" 1809="" 1810="" 1811="" 1812="" 1813="" 1814="" 1815="" 1816="" 1817="" 1818="" 1819="" 1820="" 1821="" 1822="" 1823="" 1824="" 1825="" 1826="" 1827="" 1828="" 1829="" 1830="" 1831="" 1832="" 1833="" 1834="" 1835="" 1836="" 1837="" 1838="" 1839="" 1840="" 1841="" 1842="" 1843="" 1844="" 1845="" 1846="" 1847="" 1848="" 1849="" 1850="" 1851="" 1852="" 1853="" 1854="" 1855="" 1856="" 1857="" 1858="" 1859="" 1860="" 1861="" 1862="" 1863="" 1864="" 1865="" 1866="" 1867="" 1868="" 1869="" 1870="" 1871="" 1872="" 1873="" 1874="" 1875="" 1876="" 1877="" 1878="" 1879="" 1880="" 1881="" 1882="" 1883="" 1884="" 1885="" 1886="" 1887="" 1888="" 1889="" 1890="" 1891="" 1892="" 1893="" 1894="" 1895="" 1896="" 1897="" 1898="" 1899="" 1900="" 1901="" 1902="" 1903="" 1904="" 1905="" 1906="" 1907="" 1908="" 1909="" 1910="" 1911="" 1912="" 1913="" 1914="" 1915="" 1916="" 1917="" 1918="" 1919="" 1920="" 1921="" 1922="" 1923="" 1924="" 1925="" 1926="" 1927="" 1928="" 1929="" 1930="" 1931="" 1932="" 1933="" 1934="" 1935="" 1936="" 1937="" 1938="" 1939="" 1940="" 1941="" 1942="" 1943="" 1944="" 1945="" 1946="" 1947="" 1948="" 1949="" 1950="" 1951="" 1952="" 1953="" 1954="" 1955="" 1956="" 1957="" 1958="" 1959="" 1960="" 1961="" 1962="" 1963="" 1964="" 1965="" 1966="" 1967="" 1968="" 1969="" 1970="" 1971="" 1972="" 1973="" 1974="" 1975="" 1976="" 1977="" 1978="" 1979="" 1980="" 1981="" 1982="" 1983="" 1984="" 1985="" 1986="" 1987="" 1988="" 1989="" 1990="" 1991="" 1992="" 1993="" 1994="" 1995="" 1996="" 1997="" 1998="" 1="" 1a="" 1e="" 1f="" 20="" 24="" 26="" 27="" 2="" 31="" 34="" 35="" 36="" 39="" 3="" 3a="" 3d="" 3f="" 40="" 44="" 48="" 4c="" 50="" 54="" 5a="" 5c="" 5e00="" 5e="" 6004="" 6008="" 6009="" 600e="" 6012="" 6016="" 601f="" 605a="" 605b="" 60="" 68="" 6b81="" 6b85="" 6b87="" 6b8a="" 6b8c="" 6b8f="" 6b91="" 6b93="" 6b95="" 6b98="" 6b9b="" 6b9e="" 6ba1="" 6ba3="" 6ba5="" 6ba8="" 6bab="" 6bad="" 6baf="" 6bb0="" 6bb3="" 6bb7="" 6bb9="" 6bbb="" 6bbe="" 6bc1="" 6bc3="" 6bc5="" 6bc6="" 6bc8="" 6bcb="" 6bce="" 6bd1="" 6bd5="" 6bd7="" 6bd9="" 6bdc="" 6bdd="" 6be0="" 6be3="" 6be5="" 6be7="" 6be9="" 6bec="" 6bef="" 6bf1="" 6bf3="" 6bf5="" 6bf8="" 6bfa="" 6bfc="" 6bff="" 6c00="" 6c02="" 6c04="" 6c06="" 6c08="" 6c0a="" 6c0d="" 6c0f="" 6c11="" 6c13="" 6c15="" 6c18="" 6c19="" 6c1b="" 6c1d="" 6c1f="" 6c20="" 6c22="" 6c24="" 6c26="" 6c28="" 6c29="" 6c2b="" 6c2d="" 6c2f="" 6c31="" 6c33="" 6c35="" 6c37="" 6c39="" 6c3b="" 6c3c="" 6c3e="" 6c40="" 6c42="" 6c44="" 6c46="" 6c48="" 6c4a="" 6c4c="" 6c4e="" 6c50="" 6c52="" 6c54="" 6c56="" 6c58="" 6c5a="" 6c5c="" 6c5d="" 6c5f="" 6c61="" 6c64="" 6c68="" 6c6a="" 6c6c="" 6c6f="" 6c71="" 6c74="" 6c76="" 6c78="" 6c79="" 6c7b="" 6c7d="" 6c80="" 6c82="" 6c84="" 6c87="" 6c8b="" 6c8d="" 6c90="" 6c92="" 6c94="" 6c96="" 6c97="" 6c9a="" 6c9d="" 6c="" 6ca1="" 6ca3="" 6ca5="" 6ca8="" 6caa="" 6cac="" 6cad="" 6caf="" 6cb2="" 6cb4="" 6cb5="" 6cb7="" 6cba="" 6cbc="" 6cbe="" 6cc0="" 6cc2="" 6cc5="" 6cc7="" 6cc9="" 6cca="" 6ccc="" 6ccd="" 6ccf="" 6cd1="" 6cd3="" 6cd5="" 6cd7="" 6cd8="" 6cd9="" 6cda="" 6cdc="" 6cdf="" 6ce0="" 6f38="" 6f39="" 70="" 7d="" 7f="" 80="" 81="" 84="" 86="" 88="" 89="" 8a="" 8b="" 8d="" 8e="" 96="" a0="" a6="" a7="" a:fill="" a="" abx="" ad="" add0="" add1="" add2="" add3="" add40h="" adda="" addb="" adr="" adx0="" adx1="" adx2="" adx3="" anda="" b1-="" b6="" b7="" b:cnt="" bcc="" beq="" bne="" bra="" bsr="" buf="" busy="" c6="" cb="" ckrs="" clr="" cluster="" cmd="" cmpa="" copy="" crch="" crcl="" cs:b0="L" d="" data="" decb="" df="" dir="" dirofs="" disp="" dpgno="" dspb1="" dspb2="" dspb3="" dspbin="" dspbuf="" e5="" ec="" ed="" equ="" exg="" f4="" f5="" f6="" f7="" f7cd="" f7f1="" f9="" fb="" fc="" fd9e="" fe="" ff3b="" ff77="" ff="" fill="" filop="" get="" getd1="" getdat="" inc="" incx4="" lbsr="" lda="" ldb="" ldd="" ldx="" ldy="" leay="" lsla="" lsra="" miso:b1="H(for" no="" nop="" of="" ora="" param="" pbdat="" pcrlf="" pia="" pshs="" puls="" rd1="" rd1sct="" rd2="" rd3="" read="" resdat="" response="" return="" rts="" save="" sct="" sd:2="" sdhc:4="" sdhc="" send="" setckh="" setckl="" setsno="" sndd1="" snddat="" snddt1="" src="" sta="" temp="" tfr="" to="" token="" trans="" trlop="" tst="" until="" wait="" wrdlop="" wrdskp="" wrf1="" wrf2="" wrf3="" wrtdir="" wrtfat="" wrtsd1="" wspfl0="" x40h="" y:dst="" y="">
</-temp></pre><div><br /></div><div><br /></div><div>私はこのカードを、FM-7用のプログラムを使い慣れたWindowsPC上のエディタで作成してFM-7に転送したり、逆に、FM-7上で動作しているプログラムをWindowsPCに保存したりするのに利用していますが、それなりに使えるツールではないかと感じています。</div><div>また、テストしてくださった知人のアイディアですが、SD上にフォルダがあってもFM-7では見えないのですが、逆にそれを利用して、フォルダ中にFM-7用のファイルを複数入れて(隠して)おき、必要な時にその中から必要なフィルをフォルダの外に出してFM-7で使用するという使い方も便利そうです。</div><div><br /></div>
使用法についての文章も修正しましたので、それらをまとめて<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmkuM-5FgyU5j5Lx7?e=IJBy2I" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。</div></div><div><br /></div><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-19788004442114205662023-04-25T22:14:00.042+09:002023-05-19T20:54:35.637+09:00FM-7にRTCとSDを接続する試み(SDカード編 その4 ついに完成!)<h4 style="text-align: left;"> アスキーセーブされたBASICプログラムをついに読み込むことができました。</h4><div><br /></div><div>【5月19日追記】修正版を「その5」としてアップしましたので、本記事中でのプログラムのアップは取り消します。必要でしたら「その5」からダウンロードしてください。</div><div><br /></div><div>最後に残っていた難関でしたが、ついに解決しましたので、まだいくつかの制約が残っていますが、これで完成ということにしたいと思います。</div><div><br /></div><div>まとめということで、画像と回路図を再掲しておきます。</div><div><br /></div><div>中央左が68B21(PIA)、その右がレベル変換モジュール(1個は予備)、左端がZS-042(RTCモジュール)、右端がSDカードモジュール(5V-3.3Vレベル変換付き)です。</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUGPiCpLVT3sgsvjGnj1TPWyc6JxZYPSNQe_agKzC6xe3raQ2Y3IVC-ZBL_8c14MA-bbcKiDBUuHJB1fVbFQKCP2RZ9G5RO-jMs_HXArPsdsJplxYzP_bfGX9UY5glKTPks9Ivs8yRLLPumZigM0x_jRi6tNazxBjCm_sVDbmmuu3qjwdGhHIlXTp/s4032/RTC_SD%E3%82%AB%E3%83%BC%E3%83%89.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUGPiCpLVT3sgsvjGnj1TPWyc6JxZYPSNQe_agKzC6xe3raQ2Y3IVC-ZBL_8c14MA-bbcKiDBUuHJB1fVbFQKCP2RZ9G5RO-jMs_HXArPsdsJplxYzP_bfGX9UY5glKTPks9Ivs8yRLLPumZigM0x_jRi6tNazxBjCm_sVDbmmuu3qjwdGhHIlXTp/w400-h300/RTC_SD%E3%82%AB%E3%83%BC%E3%83%89.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RTC_SDカード</td></tr></tbody></table><br /><div><br /></div><div>左上の5P端子(コネクタ未実装)はI2Cの拡張用です。I2CのLCDなどを接続することを想定しています。</div><div>SDカードモジュールは画像のものの他に秋月電子製のもののパターンも用意してあります。</div><div>(私としては珍しく1回目の基板でミスなく動作しました...)</div><div><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1C7Z5XMdpIl0gMMr7CMyQrfRORJe3YD6VO6EWmlHwa8UAeESjk-GJIEFWjKziB1SVlIwX3siRdCkNu4S1op8JHxdfuODvNEotTOCLYr-afUJTwogNHxqe2jcHlfhi6UF9QAeShbwTzYw4PRoyEgtGp6XRmswiyjI4ILmtzuWNAD7xeAa5yuMTZFnX/s4032/RTC_SD%E5%9F%BA%E6%9D%BF.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1C7Z5XMdpIl0gMMr7CMyQrfRORJe3YD6VO6EWmlHwa8UAeESjk-GJIEFWjKziB1SVlIwX3siRdCkNu4S1op8JHxdfuODvNEotTOCLYr-afUJTwogNHxqe2jcHlfhi6UF9QAeShbwTzYw4PRoyEgtGp6XRmswiyjI4ILmtzuWNAD7xeAa5yuMTZFnX/w400-h300/RTC_SD%E5%9F%BA%E6%9D%BF.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RTC_SD基板<br /></td></tr></tbody></table><br /><div><br /></div><div><br /></div><div>68B21を1個使用しAポートでI2Cを用いてRTCモジュールを、BポートでSPIを用いてSDカードをコントロールしています。</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3GvPNwluRk_IwW8iiYKjxPVUf9tH_5cD2XnGZaKBjdHNovYYLYFJ9rg6uwxbUW9AOSo1wV5ayT5xHOzcS6lc_ahKSEEe0_MLcXJ0bRosUItJkGrvvaC6ct7uDGfxdPBdPrhNb_RSB4E84CeIFudGBuk2dww7muzof0C8TIPETstI5VU-J4EPcu7L/s2339/RTC_SD.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3GvPNwluRk_IwW8iiYKjxPVUf9tH_5cD2XnGZaKBjdHNovYYLYFJ9rg6uwxbUW9AOSo1wV5ayT5xHOzcS6lc_ahKSEEe0_MLcXJ0bRosUItJkGrvvaC6ct7uDGfxdPBdPrhNb_RSB4E84CeIFudGBuk2dww7muzof0C8TIPETstI5VU-J4EPcu7L/w400-h283/RTC_SD.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">回路図</td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><h4 style="text-align: left;">アスキーセーブされたBASICプログラムの読み込みに最後までてこずった</h4><div><br /></div><div>アスキーセーブされたBASICプログラムファイルを読み込むためには、読み込んだファイルを一行ずつ中間言語形式に変換して所定のエリアに保存しなければならないわけですが、そのためにF-BASIC中には「一行翻訳ルーチン」が用意されています。</div><div>しかし、そのルーチンの使い方が良く分からず、当初はSDからファイルを読み込んだバッファから一行読むたびに「一行翻訳ルーチン」を呼び出して中間言語形式に変換していました。</div><div>結果はそれなりに正しいように見えて、しかも数行のプログラムでしたら読み込み後に実行することもできました。</div><div>ところが、特定の命令が誤変換されたり、あるいは行番号が100,110,...などだと変換された行番号がとんでもない値になったりと訳の分からない現象が生じるのです。</div><div><br /></div><div>あれこれと色々なプログラムファイルを読み込ませている中で、行番号の値によって変換後は2バイトにならずに1バイトになってしまうことが原因だということが分かってきました。</div><div>中間言語形式のフォーマット(リンクポインタ2バイト、行番号2バイト、行本体、行末記号$00)では変換後の行番号は必ず2バイトでなければなりません。</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWVicb1c9iOX721uQ_WtaYYJOyDSNJfNMjnpY-2EbAzRErKCKo-P1Qa0Pi3PZ5dY9j8ebbk3MG9iKbpgPYBzHp6a3StDVeqXdhPKxkVlWuFXMdlPv-NdmjZx7D3UIzkDeJfDHEsQT6k0Yb1kUokaPjTk7U2S0Rijqh9hro-29GF-5KFA0STYhoAZ9V/s1875/BASIC%E4%BF%9D%E5%AD%98%E5%BD%A2%E5%BC%8F.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="828" data-original-width="1875" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWVicb1c9iOX721uQ_WtaYYJOyDSNJfNMjnpY-2EbAzRErKCKo-P1Qa0Pi3PZ5dY9j8ebbk3MG9iKbpgPYBzHp6a3StDVeqXdhPKxkVlWuFXMdlPv-NdmjZx7D3UIzkDeJfDHEsQT6k0Yb1kUokaPjTk7U2S0Rijqh9hro-29GF-5KFA0STYhoAZ9V/w400-h176/BASIC%E4%BF%9D%E5%AD%98%E5%BD%A2%E5%BC%8F.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br />BASICプログラムの保存フォーマット</td></tr></tbody></table><br /><div><br /></div><div><br /></div><div>ということで、どうも行番号については、それを単独に読み込んで2バイトに変換させる必要があるようだと気づき、F-BASICに用意されている「行番号読み込みルーチン」を使うように変更しました。それでも最初はうまく変換されなかったのですが、このルーチンを実行するために必要な前処理を追加することで、最終的に正しく変換されるようになりました。</div><div><br /></div><div>結局、手順としては</div><div>(1)行番号の部分を「行番号読み込みルーチン」で読み込んで2バイトに変換しておく。</div><div>(2)行番号を除いた行本体を「一行翻訳ルーチン」を用いて中間言語形式に変換する。</div><div>(3)メモリの保存エリアにリンクポインタ2バイト分を空けて、その次の位置に行番号、続いて中間言語形式に変換された行本体、そして最後に行末記号として$00を書き込む。</div><div>(4)その行末記号の次の位置のアドレスを行の先頭のリンクポインタの位置に書き込む。</div><div> この(3)と(4)を行が続く限り繰り返す。</div><div>(5)最後の行の行末の次の位置にプログラム末記号として2バイトの$00を書き込み、その先頭位置のアドレスを$35,36に書き込む。</div><div><br /></div><div>(くどくどと書き連ねましたが、同様な試みをしたいと考えておられる方に少しでも参考になればという気持ちからですので、ご容赦ください。)</div><div><br /></div><div>これによってアスキーセーブされたBASICプログラムファイルも読み込めるようになりましたので、機能としては、SDカードに保存されているBASICファイル(バイナリセーブ、アスキーセーブ)や機械語ファイルを読み込むことと、SDカードに対してBASICファイル(バイナリセーブ)や機械語ファイルを書き込むことができることになり、当初の目的を達成することができました。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">その他、必要な周辺プログラム</h4><div><br /></div><div>実際に使用する際にはファイルの保存時にタイムスタンプが必要になりますので、あらかじめRTCから日付・時刻を読み込んでF-BASIC側に設定しておく必要があります。</div><div>それを手作業で行うのは面倒ですので、F-BASICの起動時にSTARTUPファイルを自動実行させて設定することにしました。用意したプログラムは次の2つです。</div><div> ・STARTUP</div><div> ・RTC_SET</div><div>また、SDカード処理プログラムの本体が$6000~を占めているので、重なるエリアへの機械語ファイルはそのままでは読み込めないため、それに対処するために-$2000バイトのオフセット機能を選択できるようにしてあります。従って、読み込み後に元の位置に戻すための転送プログラムが必要となりますが、そのためのBASICプログラムも用意しました。</div><div> ・SDTRS</div><div><br /></div><div><br /></div><div>作成したプログラム</div><div> ・SDRWFM FM-7用SDカードリードライトプログラム</div><div> 本体:$6000~$71D1、バッファ:$5E00~$5FFF</div><div> ・STARTUP BASICプログラム:機械語ルーチン RTC_SET を呼び出して実行</div><div> ・RTC_SET 機械語ルーチン:RTCを読んで日付・時刻をF-BASICに設定</div><div> ・SDTRS BASICプログラム:読み込んだ機械語ファイルを$2000上方に移動</div><div><br /></div><div><br /></div><div><h4>実現できた機能をまとめると</h4><p>1.SDカードとSDHCカードの両方に対応している。</p><p>2.Windows上でSDカードに書き込んだBASICファイル、機械語ファイルやデータファイルがFM-7で読み込める。</p><p>3.FM-7上でBASICファイルや機械語ファイルをSDカードに書き込めて、Windows上で読み込める。</p><p>4.コマンドとしては F-BASICの FILES、LOAD、LOADM、SAVE、SAVEM、KILLに相当するものが実現できている。</p><p>5.オプション機能として、SDカード上のFAT、DIRなどのセクタ表示機能がある。</p><p>最大の特長は、特別な専用のフォーマットではなく、Windowsの標準形式で保存されたデータを読み書きできるということです。</p><p><br /></p><h4>制約事項は</h4><p>F-BASICでの使用が前提なので下記の1,2,3,4はそれに合わせたものです。</p><p>1.大きなファイルには対応していない。(恐らく、20KB程度未満)</p><p>2.ディレクトリには対応していない。</p><p>3.F-BASICと同様、ファイル名には拡張子をつけない。</p><p>(あっても良いがチェックしていないので、有無で区別できない。)</p><p>4.BASICファイル、機械語ファイルはF-BASICのディスク保存形式でなければならない。</p><p>5.ファイル名に小文字は使えない。(ロングファイルネームには対応していないので。)</p><p>6.ファイルの保存時のタイムスタンプのためにF-BASICシステムの日付・日時を使用しているので、あらかじめ正しい時刻に設定しておく必要がある。</p><p>(STARTUPでRTCから読み込んで設定しておくことができる。)</p><p>7.SDHCカードは16GBまでしか動作確認できていない。(何故か手持ちの32GBは読めない...)</p><div><br /></div><div><br /></div><h4 style="text-align: left;">使用上の注意点は</h4><p>1.本プログラムを起動する前に CLEAR ,&H5DFF を実行しておく必要がある。</p><div>2.ファイルのサイズをSDカードの1クラスタ(64セクタ)に限定しているので、64x512=32768バイトが上限となり、これを超える部分はカットされてしまう。</div><div>(実際にはメモリエリアの制約で上限はもっと低くて、恐らく20KB以下。)</div><div><br /></div><div>3.ファイル形式は F-BASIC の方式に従っていなければならない。</div><p> ・F-BASICファイル(アスキーセーブ):先頭に改行($0D,$0A)がある。</p><p> ・F-BASICファイル(バイナリセーブ):先頭が$FF($FE),$FF,$FFで始まる。</p><p> ・機械語ファイル:先頭に5バイトのヘッダ($00,2バイトのサイズ、2バイトの先頭アドレス)があり、末尾に5バイトのフッタ($FF,$00,$00,2バイトの実行アドレス)がある。(実際には、フッタはチェックしていない。)</p><p> ・以上の3つに該当しない場合にはデータファイルとして$2000からにロードする。</p><p> 【注意】機械語ファイルでなくても、先頭が$00で始まっていると機械語ファイルと誤認識してしまう。</p><p><br /></p><div>まだ手直しをした方が良い箇所があるとは思いますが、とりあえず現段階でのプログラムを下に示しておきます。</div><div><br /></div><div><br /></div>
</div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="SDRWFM">0001 *
0002 * SDRWFM.TXT
0003 *
0004 * SD Read/Write for FM-7
0005 *
0006 * use RTC & SD Card
0007 *
0008 * 6821(PIA) Port A -- RTC (I2C Mode)
0009 *
0010 * SBC RTC Ext IO
0011 * CA2 2 -- -- HV4 LV4 -- IO1
0012 * PA0 3 -- SCL -- HV1 LV1 -- IO4
0013 * PA1 4 -- -- HV2 LV2 -- IO3
0014 * PA7 10 -- SDA -- HV3 LV3 -- IO2
0015 * GND -- -- -- GND
0016 * -- -- -- 3V3
0017 *
0018 *
0019 * 6821(PIA) Port B -- SD (SPI Mode)
0020 *
0021 * SBC SD
0022 * CB2 12 -- HV4 LV4 -- SCK
0023 * PB0 13 -- HV1 LV1 -- CS
0024 * PB1 14 -- HV2 LV2 -- MISO
0025 * PB7 20 -- HV3 LV3 -- MOSI
0026 * GND 31 -- -- GND
0027 * VCC 33 -- -- VCC
0028 *
0029 * cf. all data line use level converter
0030 *
0031 * PB output mode
0032 * CB2 1bit output
0033 *
0034 * READ/WRITE BUFFER $5E00 - 5FFF
0035 *
0036 * Fix date routine '2023.04.12
0037 * Implement write cmd '2023.04.07
0038 * Add command '2023.03.14
0039 * Change use Port B '2023.03.07
0040 * Original version '2022.06.11
0041 * Copyright by Y.Yamamoto
0042 *
0043 6000 STTADR EQU $6000
0044
0045 FBB8 INCHA EQU $FBB8 for FM-7
0046 FBBB OUTCHA EQU $FBBB for FM-7
0047 FBF7 CSRON EQU $FBF7 for FM-7
0048 D807 LININP EQU $D807 for FM-7 (to $043D- )
0049 00BF DEVNO EQU $BF for FM-7
0050 000D CR EQU $0D
0051 000A LF EQU $0A
0052 0020 SPC EQU $20
0053 001B ESC EQU $1B
0054
0055 5E00 RWBUF EQU STTADR-$200
0056
0057 02FA FMDAT EQU $02FA date of FM-7
0058 FD9E PBDAT EQU $FD9E for FM-7
0059 FD9F PBCTL EQU PBDAT+1
0060 0033 BASADP EQU $33 (33,34) pointer for F-BASIC top
0061 0035 BASAEP EQU $35 (35,36) pointer for F-BASIC end
0062 2000 TXTADR EQU $2000 load adr for TEXT
0063 00E5 DELMK EQU $E5 delete mark
0064
0065 6000 ORG STTADR
0066
0067 6000 16 0098 START LBRA MAIN
0068 6003 01 VN FCB 1 version no
0069 6004 00 SCTN0 FCB 0 top adrs of sct
0070 6005 00 SCTN1 FCB 0
0071 6006 00 SCTN2 FCB 0
0072 6007 00 SCTN3 FCB 0
0073 6008 00 RESDAT FCB 0 response data
0074 6009 00 SDHC FCB 0 sd:0,sdhc:1
0075
0076 600A 0000 SCTBPB FDB 00 sct no of BPB(4bytes)
0077 600C 0000 FDB 00
0078 600E 0000 SCTFAT FDB 00 sct no of FAT#1(4bytes)
0079 6010 0000 FDB 00
0080 6012 0000 SCTDIR FDB 00 sct no of DIR(4bytes)
0081 6014 0000 FDB 00
0082 6016 0000 SCTDSV FDB 00 save sct no of DIR(4bytes)
0083 6018 0000 FDB 00
0084 601A 0000 SCTCLT FDB 00 sct no of top CLUSTER(4bytes)
0085 601C 0000 FDB 00 if SD:#2, SDHC:#3
0086 601E 00 SCTPCL FCB 0 sct per cluster
0087 601F FF DIRENT RMB 32 directory entry
0088 603F FF WMDY RMB 3 mon,day,year
0089 6042 FF WFSIZ RMB 4 file size(4bytes)
0090 6046 FF FILSIZ RMB 2 file size
0091 6048 0000 CLSTH FDB 00 cluster High
0092 604A 0000 CLSTL FDB 00 cluster Low
0093 604C 00 CNT FCB 0
0094 604D 00 MCFLG FCB 0 0:machine code, $FF,$FE:binary save 1:else
0095 604E 00 TPGFLG FCB 0 1:top page 0:else
0096 604F FF FNAME RMB 11 file name(8+3)
0097 605A 00 DPGNO FCB 0 page no of empty dir entry
0098 605B 0000 DIROFS FDB 00 offset of empty dir entry
0099 605D 0000 BASEXP FDB 00 basic exe adr
0100 605F 0000 MCADP FDB 00 machine code start adr
0101 6061 0000 MCAEP FDB 00 machine code end adr
0102 6063 0000 MCEXP FDB 00 machine dode exec adr
0103 6065 0000 EXSTFL FDB 00 ofset of exist dir entry
0104 6067 0000 WK1 FDB 00
0105 6069 0000 WK2 FDB 00
0106 606B 0000 WK3 FDB 00
0107 606D 0000 WK4 FDB 00
0108
0109 606F FF INPBUF RMB 8
0110 6077 FF CNVBUF RMB 4
0111 607B FF FILBUF RMB 32
0112
0113 609B MAIN EQU *
0114 *=====reset pia=====
0115 *portB:output
0116 609B 86 30 LDA #$30
0117 609D B7 FD9F STA PBCTL select ddra, cb2:0
0118 60A0 86 FD LDA #$FD pb0,7:out,pb1:in
0119 60A2 B7 FD9E STA PBDAT set output mode
0120 60A5 86 34 LDA #$34
0121 60A7 B7 FD9F STA PBCTL select peripheral,cb2:0
0122
0123 *for pia exist check
0124 60AA 86 55 LDA #$55 test data
0125 60AC B7 FD9E STA PBDAT
0126 60AF B6 FD9E LDA PBDAT
0127 60B2 84 FD ANDA #$FD pb1=0
0128 60B4 81 55 CMPA #$55
0129 60B6 27 07 BEQ INIT
0130 60B8 8E 6F93 LDX #MERR
0131 60BB 17 0C68 LBSR PSTRNG
0132 60BE 39 RTS Return F-BASIC
0133
0134 60BF INIT EQU *
0135 60BF 17 0091 LBSR SDINIT
0136
0137 ****************************************
0138 * MAIN MENU
0139 ****************************************
0140 60C2 MENU EQU *
0141 60C2 8E 6EAB LDX #MSMENU1
0142 60C5 17 0C5E LBSR PSTRNG
0143 60C8 BD FBF7 JSR CSRON cursor on
0144 60CB BD 6E2D JSR INOUTC
0145 60CE 84 DF ANDA #$DF to upper
0146
0147 60D0 81 44 CMPA #'D
0148 60D2 26 05 BNE MENU1
0149 60D4 17 0328 LBSR DSPDIR
0150 60D7 20 E9 BRA MENU
0151 60D9 81 4C MENU1 CMPA #'L
0152 60DB 26 05 BNE MENU2
0153 60DD 17 03CD LBSR LDFILE
0154 60E0 20 E0 BRA MENU
0155 60E2 81 42 MENU2 CMPA #'B
0156 60E4 26 05 BNE MENU3
0157 60E6 17 05D8 LBSR WRBFILE
0158 60E9 20 D7 BRA MENU
0159 60EB 81 4D MENU3 CMPA #'M
0160 60ED 26 05 BNE MENU4
0161 60EF 17 0641 LBSR WRMFILE
0162 60F2 20 CE BRA MENU
0163 60F4 81 4B MENU4 CMPA #'K
0164 60F6 26 05 BNE MENU5
0165 60F8 17 0571 LBSR KILFILE
0166 60FB 20 C5 BRA MENU
0167 60FD 81 53 MENU5 CMPA #'S
0168 60FF 26 04 BNE MENU6
0169 6101 20 50 BRA SDINIT
0170 6103 20 BD BRA MENU
0171 6105 81 4F MENU6 CMPA #'O
0172 6107 26 04 BNE MENU7
0173 6109 20 0A BRA OPMENU
0174 610B 20 B5 BRA MENU
0175 610D 81 51 MENU7 CMPA #'Q
0176 610F 26 B1 BNE MENU
0177 6111 17 0B5D LBSR PCRLF
0178 6114 39 RTS Return F-BASIC
0179
0180 *
0181 6115 OPMENU EQU *
0182 6115 8E 6F01 LDX #MSMENU2
0183 6118 17 0C0B LBSR PSTRNG
0184 611B BD 6E2D JSR INOUTC
0185 611E 80 30 SUBA #$30
0186 6120 26 02 BNE OPMEN6 0?
0187 6122 20 9E BRA MENU
0188
0189 6124 4A OPMEN6 DECA 1?
0190 6125 26 05 BNE OPMEN7
0191 6127 17 024A LBSR RDSCT
0192 612A 20 E9 BRA OPMENU
0193 612C 4A OPMEN7 DECA 2?
0194 612D 26 05 BNE OPMEN8
0195 612F 17 01C1 LBSR DSPSDDAT
0196 6132 20 E1 BRA OPMENU
0197 6134 4A OPMEN8 DECA 3?
0198 6135 26 05 BNE OPMEN9
0199 6137 17 024D LBSR DSPMBR
0200 613A 20 D9 BRA OPMENU
0201 613C 4A OPMEN9 DECA 4?
0202 613D 26 05 BNE OPMEN10
0203 613F 17 0299 LBSR DSPBPB
0204 6142 20 D1 BRA OPMENU
0205 6144 4A OPMEN10 DECA 5?
0206 6145 26 CE BNE OPMENU
0207 6147 17 02A3 LBSR DSPFAT
0208 614A 20 C9 BRA OPMENU
0209
0210 *
0211 614C SDERR EQU *
0212 614C 8E 6F93 LDX #MERR
0213 614F 17 0BD4 LBSR PSTRNG
0214 6152 39 RTS Return F-BASIC
0215
0216 ****************************************
0217 * SD Initialize routine
0218 ****************************************
0219 6153 SDINIT EQU *
0220 *---------- start ----------
0221 6153 8E 6F7C LDX #MSINIT
0222 6156 17 0BCD LBSR PSTRNG
0223 * cs:1,di:1,sck>74ms
0224 6159 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
0225 615B B7 FD9E STA PBDAT
0226 615E C6 50 LDB #80 80times
0227 6160 17 0AD3 ISTT LBSR SETCKL
0228 6163 17 0AD9 LBSR SETCKH
0229 6166 5A DECB
0230 6167 26 F7 BNE ISTT
0231 *
0232 *---------- cmd 0 ----------
0233 6169 SCMD0 EQU *
0234 6169 17 0ACA LBSR SETCKL
0235 616C C6 06 LDB #6
0236 616E 8E 6E47 LDX #CMD0
0237 6171 A6 80 SC01 LDA ,X+
0238 6173 17 0A53 LBSR SNDDAT
0239 6176 5A DECB
0240 6177 26 F8 BNE SC01
0241 *get response
0242 6179 5F CLRB
0243 617A GR00
0244 617A 5A DECB
0245 617B 27 CF BEQ SDERR
0246 617D 17 0A65 LBSR GETDAT
0247 6180 B6 6008 LDA RESDAT
0248 6183 81 01 CMPA #$01
0249 6185 26 F3 BNE GR00
0250 *
0251 *---------- cmd 8 ----------
0252 6187 SCMD8 EQU *
0253 6187 17 0AAC LBSR SETCKL
0254 618A 86 FF LDA #$FF dummy cmd
0255 618C 17 0A3A LBSR SNDDAT
0256 618F C6 06 LDB #6
0257 6191 8E 6E5F LDX #CMD8
0258 6194 A6 80 SC80 LDA ,X+
0259 6196 17 0A30 LBSR SNDDAT
0260 6199 5A DECB
0261 619A 26 F8 BNE SC80
0262 *get response
0263 619C GR80
0264 619C 17 0A46 LBSR GETDAT
0265 619F B6 6008 LDA RESDAT
0266
0267 61A2 17 0A40 LBSR GETDAT
0268 61A5 B6 6008 LDA RESDAT
0269 61A8 81 01 CMPA #$01
0270 61AA 26 F0 BNE GR80
0271 61AC C6 04 LDB #4
0272 61AE 17 0A34 GR81 LBSR GETDAT
0273 61B1 B6 6008 LDA RESDAT
0274 61B4 5A DECB
0275 61B5 26 F7 BNE GR81
0276 *
0277 *---------- cmd 58 ----------
0278 61B7 SCMD58 EQU *
0279 61B7 17 0A7C LBSR SETCKL
0280 61BA 86 FF LDA #$FF dummy cmd
0281 61BC 17 0A0A LBSR SNDDAT
0282 61BF C6 06 LDB #6
0283 61C1 8E 6E65 LDX #CMD58
0284 61C4 A6 80 SC581 LDA ,X+
0285 61C6 17 0A00 LBSR SNDDAT
0286 61C9 5A DECB
0287 61CA 26 F8 BNE SC581
0288 *get response
0289 61CC GR580
0290 61CC 17 0A16 LBSR GETDAT
0291 61CF B6 6008 LDA RESDAT
0292 61D2 81 01 CMPA #$01
0293 61D4 26 F6 BNE GR580
0294 61D6 C6 04 GR581 LDB #4
0295 61D8 17 0A0A GR582 LBSR GETDAT
0296 61DB B6 6008 LDA RESDAT
0297 61DE 5A DECB
0298 61DF 26 F7 BNE GR582
0299 61E1 RPT41 EQU *
0300 *---------- cmd 55 ----------
0301 61E1 SCMD55 EQU *
0302 61E1 17 0A52 LBSR SETCKL
0303 61E4 86 FF LDA #$FF dummy cmd
0304 61E6 17 09E0 LBSR SNDDAT
0305 61E9 C6 06 LDB #6
0306 61EB 8E 6E6B LDX #CMD55
0307 61EE A6 80 SC551 LDA ,X+
0308 61F0 17 09D6 LBSR SNDDAT
0309 61F3 5A DECB
0310 61F4 26 F8 BNE SC551
0311 *get response
0312 * CLRB
0313 61F6 GR550
0314 61F6 17 09EC LBSR GETDAT
0315 61F9 B6 6008 LDA RESDAT
0316 61FC 81 01 CMPA #$01
0317 61FE 26 F6 BNE GR550
0318
0319 *---------- acmd 41 ----------
0320 6200 ASCMD41 EQU *
0321 6200 17 0A33 LBSR SETCKL
0322 6203 86 FF LDA #$FF dummy cmd
0323 6205 17 09C1 LBSR SNDDAT
0324 6208 C6 06 LDB #6
0325 620A 8E 6E71 LDX #ACMD41
0326 620D A6 80 ASC411 LDA ,X+
0327 620F 17 09B7 LBSR SNDDAT
0328 6212 5A DECB
0329 6213 26 F8 BNE ASC411
0330 *get response
0331 6215 GR410
0332 6215 17 09CD LBSR GETDAT
0333 6218 B6 6008 LDA RESDAT
0334 621B 17 09C7 LBSR GETDAT
0335 621E B6 6008 LDA RESDAT
0336 6221 81 00 CMPA #$00
0337 6223 26 BC BNE RPT41
0338
0339 *---------- second cmd 58 ----------
0340 6225 SCMD258 EQU *
0341 6225 17 0A0E LBSR SETCKL
0342 6228 86 FF LDA #$FF dummy cmd
0343 622A 17 099C LBSR SNDDAT
0344 622D C6 06 LDB #6
0345 622F 8E 6E65 LDX #CMD58
0346 6232 A6 80 SC2581 LDA ,X+
0347 6234 17 0992 LBSR SNDDAT
0348 6237 5A DECB
0349 6238 26 F8 BNE SC2581
0350 *get response
0351 623A GR2580
0352 623A 17 09A8 LBSR GETDAT
0353 623D B6 6008 LDA RESDAT
0354 6240 81 00 CMPA #$00
0355 6242 26 F6 BNE GR2580
0356 6244 17 099E LBSR GETDAT
0357 6247 B6 6008 LDA RESDAT
0358 624A 48 LSLA
0359 624B 48 LSLA
0360 624C 24 03 BCC GR2581
0361 624E 7C 6009 INC SDHC if sdhc then 1
0362 6251 C6 03 GR2581 LDB #3
0363 6253 17 098F GR2582 LBSR GETDAT
0364 6256 B6 6008 LDA RESDAT
0365 6259 5A DECB
0366 625A 26 F7 BNE GR2582
0367
0368 625C 8E 6F66 LDX #MSSD0
0369 625F B6 6009 LDA SDHC
0370 6262 27 03 BEQ SD1
0371 6264 8E 6F70 LDX #MSSD1
0372 6267 17 0ABC SD1 LBSR PSTRNG
0373 *
0374 *set sct no of BPB
0375 626A 17 0138 LBSR GETMBR
0376 626D 8E 5FCA LDX #RWBUF+446+8+4
0377 6270 108E 600A LDY #SCTBPB
0378 6274 C6 04 LDB #4
0379 6276 A6 82 ILOP1 LDA ,-X
0380 6278 A7 A0 STA ,Y+
0381 627A 5A DECB
0382 627B 26 F9 BNE ILOP1
0383
0384 *set sct no of FAT#1
0385 627D 17 0142 LBSR GETBPB
0386 6280 8E 600A LDX #SCTBPB
0387 6283 108E 600E LDY #SCTFAT
0388 6287 C6 04 LDB #4
0389 6289 17 08A1 LBSR TRANS
0390 628C 8E 600E LDX #SCTFAT
0391 628F 108E 5E0E LDY #RWBUF+$0E for SD & SDHC
0392 6293 17 0A5F LBSR ADD42
0393
0394 *set sct no of DIR
0395 6296 8E 600E LDX #SCTFAT
0396 6299 108E 6012 LDY #SCTDIR
0397 629D C6 04 LDB #4
0398 629F 17 088B LBSR TRANS
0399 62A2 8E 5E16 LDX #RWBUF+$16 for SD
0400 62A5 7D 6009 TST SDHC 0:SD,1:SDHC
0401 62A8 27 03 BEQ SKP1
0402 62AA C6 0E LDB #$24-$16
0403 62AC 3A ABX for SDHC
0404 62AD 1F 12 SKP1 TFR X,Y
0405 62AF 8E 6012 LDX #SCTDIR
0406 62B2 17 0A40 LBSR ADD42
0407 62B5 17 0A3D LBSR ADD42 skip for FAT#2
0408
0409 *save no of directory
0410 62B8 8E 6012 LDX #SCTDIR
0411 62BB 108E 6016 LDY #SCTDSV
0412 62BF C6 04 LDB #4
0413 62C1 17 0869 LBSR TRANS
0414
0415 *set sct per cluster
0416 62C4 8E 5E0D LDX #RWBUF+$0D
0417 62C7 A6 84 LDA ,X
0418 62C9 B7 601E STA SCTPCL
0419
0420 *set sct no of CLUSTER#2
0421 62CC 8E 6012 LDX #SCTDIR
0422 62CF 108E 601A LDY #SCTCLT
0423 62D3 C6 04 LDB #4
0424 62D5 17 0855 LBSR TRANS
0425
0426 62D8 108E 6069 LDY #WK1+2
0427 62DC 86 00 LDA #$00
0428 62DE A7 A2 STA ,-Y
0429 62E0 86 20 LDA #$20 for SD
0430 62E2 7D 6009 TST SDHC
0431 62E5 27 03 BEQ SKP2
0432 62E7 B6 601E LDA SCTPCL for SDHC
0433 62EA A7 A2 SKP2 STA ,-Y
0434 62EC 8E 601A LDX #SCTCLT
0435 62EF 17 0A03 LBSR ADD42
0436 62F2 39 RTS
0437
0438 ****************************************
0439 * GET SD DATA ROUTINE
0440 * use CMD9
0441 ****************************************
0442 62F3 DSPSDDAT EQU *
0443 62F3 17 097B LBSR PCRLF
0444 62F6 17 093D LBSR SETCKL
0445 62F9 C6 06 LDB #6
0446 62FB 8E 6E77 LDX #CMD9
0447 62FE A6 80 SC91 LDA ,X+
0448 6300 17 08C6 LBSR SNDDAT
0449 6303 5A DECB
0450 6304 26 F8 BNE SC91
0451 *get response
0452 6306 GR90
0453 6306 17 08DC LBSR GETDAT
0454 6309 B6 6008 LDA RESDAT
0455 630C 81 00 CMPA #$00
0456 630E 26 F6 BNE GR90
0457
0458 6310 C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
0459 6312 17 08D0 GR91 LBSR GETDAT
0460 6315 B6 6008 LDA RESDAT
0461 6318 5A DECB
0462 6319 26 F7 BNE GR91
0463 631B 17 0953 LBSR PCRLF
0464
0465 *disp offset of MBR,FAT#1,DIR,CLUSTER#2
0466 631E 8E 6FB3 LDX #MSOFS
0467 6321 17 0A02 LBSR PSTRNG
0468 6324 8E 6FC3 LDX #MSBPB
0469 6327 17 09FC LBSR PSTRNG
0470 632A 8E 600A LDX #SCTBPB
0471 632D C6 04 LDB #4
0472 632F A6 80 SCLOP1 LDA ,X+
0473 6331 17 0914 LBSR DSPBIN
0474 6334 5A DECB
0475 6335 26 F8 BNE SCLOP1
0476
0477 6337 8E 6FCC LDX #MSFAT
0478 633A 17 09E9 LBSR PSTRNG
0479 633D 8E 600E LDX #SCTFAT
0480 6340 C6 04 LDB #4
0481 6342 A6 80 SCLOP2 LDA ,X+
0482 6344 17 0901 LBSR DSPBIN
0483 6347 5A DECB
0484 6348 26 F8 BNE SCLOP2
0485
0486 634A 8E 6FD5 LDX #MSDIR
0487 634D 17 09D6 LBSR PSTRNG
0488 6350 8E 6012 LDX #SCTDIR
0489 6353 C6 04 LDB #4
0490 6355 A6 80 SCLOP3 LDA ,X+
0491 6357 17 08EE LBSR DSPBIN
0492 635A 5A DECB
0493 635B 26 F8 BNE SCLOP3
0494
0495 635D 8E 6FDE LDX #MSCL2
0496 6360 17 09C3 LBSR PSTRNG
0497 6363 8E 601A LDX #SCTCLT
0498 6366 C6 04 LDB #4
0499 6368 A6 80 SCLOP4 LDA ,X+
0500 636A 17 08DB LBSR DSPBIN
0501 636D 5A DECB
0502 636E 26 F8 BNE SCLOP4
0503 6370 17 08FE LBSR PCRLF
0504 6373 39 RTS
0505
0506 *
0507 ****************************************
0508 * READ ROUTINE
0509 * use CMD17
0510 * set sctno to SCTN2,SCTN3
0511 * read data set to RWBUF
0512 ****************************************
0513 6374 RDSCT EQU *
0514 6374 17 08FA LBSR PCRLF
0515 6377 17 0885 LBSR INSCT input sct no
0516 637A 17 07F8 LBSR RD1SCT read 1 sct
0517
0518 *disp data
0519 637D 17 08F1 LBSR PCRLF
0520 6380 17 0828 LBSR DSPBUF
0521 6383 17 08EB LBSR PCRLF
0522 6386 39 RTS
0523
0524 ****************************************
0525 * Read MBR & Disp parameter of BPB
0526 ****************************************
0527 6387 DSPMBR EQU *
0528 6387 17 08E7 LBSR PCRLF
0529 638A 8D 19 BSR GETMBR
0530
0531 *disp BPB
0532 638C 17 08E2 LBSR PCRLF
0533 638F 8E 5FBE LDX #RWBUF+446 1st BPB point
0534 6392 C6 10 GET1 LDB #16
0535 6394 A6 80 GET2 LDA ,X+
0536 6396 17 08AF LBSR DSPBIN disp data
0537 6399 5A DECB
0538 639A 26 F8 BNE GET2
0539 639C 17 08D2 LBSR PCRLF
0540 639F 8C 5FFE CMPX #RWBUF+510 446+16*4
0541 63A2 25 EE BLO GET1
0542 63A4 39 RTS
0543
0544 *----------------------------------------
0545 *read MBR
0546 63A5 GETMBR EQU *
0547 63A5 8E 6004 LDX #SCTN0
0548 63A8 C6 04 LDB #4
0549 63AA 4F CLRA
0550 63AB 17 078A LBSR FILL set sct no is 0
0551 63AE 17 0856 LBSR SETSCT
0552 63B1 17 07C1 LBSR RD1SCT read 1 sct
0553 63B4 39 RTS
0554
0555 *----------------------------------------
0556 *set sector no to SCTN0
0557 *from X,X+1,X+2,X+3 to SCTN0-SCTN3
0558 63B5 SETSNO EQU *
0559 63B5 108E 6004 LDY #SCTN0
0560 63B9 C6 04 LDB #4
0561 63BB 17 076F LBSR TRANS
0562 63BE 17 0846 LBSR SETSCT
0563 63C1 39 RTS
0564
0565 *----------------------------------------
0566 *read BPB
0567 63C2 GETBPB EQU *
0568 63C2 8D E1 BSR GETMBR
0569 *set sct no of BPB
0570 63C4 8E 5FCA LDX #RWBUF+446+8+4
0571 63C7 108E 6004 LDY #SCTN0
0572 63CB C6 04 LDB #4
0573 63CD A6 82 GTBLOP LDA ,-X
0574 63CF A7 A0 STA ,Y+
0575 63D1 5A DECB
0576 63D2 26 F9 BNE GTBLOP
0577 63D4 17 0830 LBSR SETSCT
0578 63D7 17 079B LBSR RD1SCT read 1 sct
0579 63DA 39 RTS
0580
0581 ****************************************
0582 * Disp BPB(Bios Parameter Block)
0583 ****************************************
0584 63DB DSPBPB EQU *
0585 63DB 8E 600A LDX #SCTBPB
0586 63DE 8D D5 BSR SETSNO
0587 63E0 17 0792 LBSR RD1SCT read 1 sct
0588
0589 *disp BPB
0590 63E3 17 088B LBSR PCRLF
0591 63E6 17 07C2 LBSR DSPBUF
0592 63E9 17 0885 LBSR PCRLF
0593 63EC 39 RTS
0594
0595 ****************************************
0596 * Disp FAT#1
0597 ****************************************
0598 63ED DSPFAT EQU *
0599 63ED 8E 600E LDX #SCTFAT
0600 63F0 8D C3 BSR SETSNO
0601 63F2 17 0780 LBSR RD1SCT read 1 sct
0602
0603 *disp FAT
0604 63F5 17 0879 LBSR PCRLF
0605 63F8 17 07B0 LBSR DSPBUF
0606 63FB 17 0873 LBSR PCRLF
0607 63FE 39 RTS
0608
0609 ****************************************
0610 * Disp Directory
0611 ****************************************
0612 63FF DSPDIR EQU *
0613 *return no of DIR
0614 63FF 8E 6016 LDX #SCTDSV
0615 6402 108E 6012 LDY #SCTDIR
0616 6406 C6 04 LDB #4
0617 6408 17 0722 LBSR TRANS
0618 640B 8E 6012 DSPFL0 LDX #SCTDIR
0619 640E 8D A5 BSR SETSNO
0620 6410 17 0762 LBSR RD1SCT read 1 sct
0621
0622 *disp FILE name
0623 6413 17 085B LBSR PCRLF
0624 6416 17 0858 LBSR PCRLF
0625 6419 8E 5E00 LDX #RWBUF
0626
0627 641C A6 84 DSPFL1 LDA ,X
0628 641E 1027 008A LBEQ DSPEND if top of filename is 0 then end
0629 6422 81 E5 CMPA #$E5 delete mark?
0630 6424 27 06 BEQ DSPCKE
0631 6426 A6 0B LDA 11,X attr
0632 * CMPA #$0F long file name?
0633 * BEQ DSPCKE
0634 * CMPA #$10 directory?
0635 * BEQ DSPCKE
0636 6428 81 20 CMPA #$20
0637 642A 27 0A BEQ DSPFL2 archive file only
0638 642C 30 88 20 DSPCKE LEAX 32,X next directory entry
0639 642F 8C 6000 CMPX #RWBUF+512 over buf?
0640 6432 24 60 BHS DSPFL5
0641 6434 20 E6 BRA DSPFL1
0642
0643 6436 DSPFL2
0644 *disp filename
0645 6436 C6 08 LDB #8
0646 6438 A6 80 DSPFL3 LDA ,X+
0647 643A BD FBBB JSR OUTCHA
0648 643D 5A DECB
0649 643E 26 F8 BNE DSPFL3
0650 *disp ext
0651 6440 86 2E LDA #'.
0652 6442 BD FBBB JSR OUTCHA
0653 6445 C6 03 LDB #3
0654 6447 A6 80 DSPFL4 LDA ,X+
0655 6449 BD FBBB JSR OUTCHA
0656 644C 5A DECB
0657 644D 26 F8 BNE DSPFL4
0658 644F 86 20 LDA #SPC
0659 6451 BD FBBB JSR OUTCHA
0660 6454 BD FBBB JSR OUTCHA
0661
0662 *get FILE time data
0663 6457 30 07 LEAX 7,X
0664 6459 EC 81 LDD ,X++
0665 645B FD 6067 STD WK1
0666
0667 *get CLUSTER(H) data
0668 645E EC 81 LDD ,X++
0669 6460 1E 89 EXG A,B
0670 6462 FD 6048 STD CLSTH
0671 6465 30 04 LEAX 4,X
0672 6467 EC 81 LDD ,X++
0673 6469 1E 89 EXG A,B
0674 646B FD 604A STD CLSTL
0675
0676 *get FILE size data
0677 646E 108E 6046 LDY #WFSIZ+4
0678 6472 C6 04 LDB #4
0679 6474 A6 80 DSPC1 LDA ,X+
0680 6476 A7 A2 STA ,-Y
0681 6478 5A DECB
0682 6479 26 F9 BNE DSPC1
0683
0684 *disp FILE size
0685 647B 86 20 LDA #SPC
0686 647D BD FBBB JSR OUTCHA
0687 6480 17 0914 LBSR DSPSIZ disp FILE size
0688
0689 *disp FILE time
0690 6483 FC 6067 LDD WK1
0691 6486 17 08AD LBSR DSPYMD disp MM-DD-YY
0692
0693 *disp CLUSTER(H,L)
0694 6489 17 0960 LBSR DSPCLS
0695 648C 17 07E2 LBSR PCRLF
0696
0697 648F 8C 6000 CMPX #RWBUF+512
0698 6492 25 88 BLO DSPFL1
0699 6494 8E 6012 DSPFL5 LDX #SCTDIR
0700 6497 17 06A7 LBSR INCX4 sct no +1
0701 649A 8E 7057 LDX #MSNXTP
0702 649D 17 0886 LBSR PSTRNG
0703 64A0 BD 6E2D DSPFL6 JSR INOUTC
0704 64A3 81 20 CMPA #SPC
0705 64A5 1027 FF62 LBEQ DSPFL0
0706 64A9 BD 6C71 JSR PCRLF
0707 64AC 39 DSPEND RTS
0708
0709 ****************************************
0710 * Load FILE
0711 ****************************************
0712 64AD LDFILE EQU *
0713 64AD 17 0146 LBSR GETFDT
0714 64B0 BE 6065 LDX EXSTFL if 0 not exist
0715 64B3 1027 00EA LBEQ LDNEND
0716
0717 *get cluster no
0718 64B7 EC 88 14 LDD $14,X
0719 64BA 1E 89 EXG A,B
0720 64BC FD 6048 STD CLSTH high cluster no
0721 64BF EC 88 1A LDD $1A,X
0722 64C2 1E 89 EXG A,B
0723 64C4 FD 604A STD CLSTL low cluster no
0724 *sub start cluster no (SD:2,SDHC:3)
0725 64C7 83 0002 SUBD #2
0726 64CA 7D 6009 TST SDHC SD:0,SDHC:1
0727 64CD 27 03 BEQ LD3
0728 64CF 83 0001 SUBD #1 D:cluster no (start 0)
0729 * (A=0,cluster no is only B)
0730
0731 64D2 34 36 LD3 PSHS A,B,X,Y
0732 64D4 8E 601A LDX #SCTCLT top of cluster no
0733 64D7 108E 6067 LDY #WK1
0734 64DB C6 04 LDB #4
0735 64DD 17 064D LBSR TRANS
0736 64E0 35 36 PULS A,B,X,Y
0737
0738 *calc start cluster no of file
0739 *(B)x40h
0740 64E2 34 30 PSHS X,Y
0741 64E4 8E 6067 LDX #WK1
0742 64E7 17 0666 LBSR ADD40H
0743 64EA 35 30 PULS X,Y
0744
0745 *get file size
0746 64EC 34 30 PSHS X,Y
0747 64EE 30 88 20 LEAX 32,X
0748 64F1 108E 6042 LDY #WFSIZ
0749 64F5 C6 04 LDB #4
0750 64F7 A6 82 LD41 LDA ,-X
0751 64F9 A7 A0 STA ,Y+
0752 64FB 5A DECB
0753 64FC 26 F9 BNE LD41
0754 64FE 35 30 PULS X,Y
0755
0756 6500 EC 88 1D LDD $1D,X upper of file size
0757 6503 1E 89 EXG A,B
0758 6505 44 LSRA wfsiz/$200+1
0759 6506 56 RORB
0760 6507 C3 0001 ADDD #1
0761
0762 650A C1 40 CMPB #$40 40h page?
0763 650C 23 02 BLS LD5
0764 650E C6 40 LDB #$40
0765 6510 F7 604C LD5 STB CNT sct counter
0766 6513 F7 604E STB TPGFLG set top page
0767
0768 *set start sct no of file
0769 6516 34 12 PSHS A,X
0770 6518 8E 7016 LDX #MSLDNG
0771 651B 17 0808 LBSR PSTRNG
0772 651E 35 12 PULS A,X
0773 6520 LDLOP
0774 6520 86 2E LDA #'.
0775 6522 BD FBBB JSR OUTCHA
0776 6525 8E 6067 LDX #WK1
0777 6528 108E 6004 LDY #SCTN0
0778 652C C6 04 LDB #4
0779 652E 17 05FC LBSR TRANS
0780 6531 17 06D3 LBSR SETSCT
0781 6534 17 063E LBSR RD1SCT read 1 file data
0782
0783 6537 7D 604E TST TPGFLG top sector page?
0784 653A 27 3B BEQ LD9
0785
0786 *at top sector, ini set
0787 *offset 00 data is
0788 * $00 :machine code
0789 * $FF,$FE:BASIC PROGRAM (binary save)
0790 * else :general text
0791 653C 10BE 6044 LDY WFSIZ+2
0792 6540 10BF 6046 STY FILSIZ set file size
0793
0794 * LDX FILSIZ
0795 * LEAX 1,X
0796 * STX BASAEP
0797
0798 6544 8E 5E00 LDX #RWBUF
0799 6547 A6 84 LDA ,X
0800 6549 B7 604D STA MCFLG
0801 654C 27 04 BEQ LD8
0802 654E 2A 24 BPL LD81
0803 6550 2B 1E BMI LD80
0804 *at machine code, read header
0805 6552 10AE 01 LD8 LDY 1,X get file size
0806 6555 10BF 6046 STY FILSIZ
0807 6559 EE 03 LDU 3,X get store addr
0808 *offset?
0809 655B 8E 70A4 LDX #MSMCOF
0810 655E 17 07C5 LBSR PSTRNG
0811 6561 BD 6E2D JSR INOUTC
0812 6564 84 DF ANDA #$DF
0813 6566 81 59 CMPA #'Y
0814 6568 26 0D BNE LD9
0815 656A 33C9 E000 LEAU -$2000,U
0816 656E 20 07 BRA LD9
0817
0818 6570 DE 33 LD80 LDU BASADP basic file
0819 6572 20 03 BRA LD9
0820 6574 LD81
0821 6574 CE 2000 LDU #TXTADR (else) not basic file
0822 6577 LD9
0823 6577 8D 30 BSR MEMSET expand memory from rwbuf
0824
0825 6579 7F 604E CLR TPGFLG end of top page
0826 657C 8E 6067 LDX #WK1
0827 657F 17 05BF LBSR INCX4 sct no +1
0828 6582 7A 604C DEC CNT
0829 6585 26 99 BNE LDLOP
0830
0831 6587 LDEND
0832 6587 7D 604D TST MCFLG
0833 658A 27 0B BEQ LDE0
0834 658C 2A 09 BPL LDE0
0835 658E FC 6044 LDD WFSIZ+2
0836 6591 DB 34 ADDB BASADP+1
0837 6593 99 33 ADCA BASADP
0838 6595 DD 35 STD BASAEP end adrs
0839 6597 8E 702E LDE0 LDX #MSLDED
0840 659A 17 0789 LBSR PSTRNG
0841 659D 17 06D1 LDE1 LBSR PCRLF
0842 65A0 39 RTS
0843
0844 65A1 8E 7049 LDNEND LDX #MSNOFL
0845 65A4 17 077F LBSR PSTRNG
0846 65A7 20 F4 BRA LDE1
0847
0848 *expand memory from rwbuf
0849 *X:rwbuf, U:memory adr, Y:filesize
0850 65A9 MEMSET EQU *
0851 65A9 34 30 PSHS X,Y
0852 65AB 8E 5E00 LDX #RWBUF
0853 65AE 10BE 6046 LDY FILSIZ
0854 65B2 7D 604E TST TPGFLG top page?
0855 65B5 27 0F BEQ MSLOP
0856 65B7 7D 604D TST MCFLG 0,$FF($FE),etc
0857 65BA 27 04 BEQ MS0
0858 65BC 2A 08 BPL MSLOP etc
0859 65BE 2B 04 BMI MS1 basic file
0860 * machine code
0861 65C0 30 05 MS0 LEAX 5,X skip header
0862 * LEAY -5,Y
0863 65C2 20 02 BRA MSLOP
0864 65C4 30 03 MS1 LEAX 3,X skip 3 FFs
0865 * LEAY -3,Y
0866
0867 65C6 A6 80 MSLOP LDA ,X+
0868 65C8 A7 C0 STA ,U+
0869 65CA 31 3F LEAY -1,Y
0870 65CC 27 05 BEQ MS3
0871 65CE 8C 6000 CMPX #RWBUF+512
0872 65D1 25 F3 BLO MSLOP
0873 65D3 10BF 6046 MS3 STY FILSIZ
0874 65D7 35 B0 PULS X,Y,PC
0875
0876 *----------
0877 *X:top of FILE NAME
0878 *return C=1:match,C=0:not match
0879 65D9 CMPFN EQU *
0880 65D9 34 10 PSHS X
0881 65DB 108E 604F LDY #FNAME
0882 65DF C6 08 LDB #8
0883 65E1 A6 80 CMPLOP LDA ,X+
0884 65E3 81 E5 CMPA #$E5 delete mark?
0885 65E5 27 0B BEQ NOTM
0886 65E7 A1 A0 CMPA ,Y+
0887 65E9 26 07 BNE NOTM
0888 65EB 5A DECB
0889 65EC 26 F3 BNE CMPLOP
0890 65EE 1A 01 MATCH ORCC #$01 C=1
0891 65F0 20 02 BRA CMPEND
0892 65F2 1C FE NOTM ANDCC #$FE C=0
0893 65F4 35 90 CMPEND PULS X,PC
0894
0895 *------------------------------
0896 *input filename
0897 *output:
0898 * if exist EXSTFL(directory entry)
0899 * not exist EXSTFL(=0)
0900 65F6 GETFDT EQU *
0901 65F6 34 02 PSHS A
0902 65F8 8E 0000 LDX #0
0903 65FB BF 6065 STX EXSTFL
0904 *return no of DIR
0905 65FE 8E 6016 LDX #SCTDSV
0906 6601 108E 6012 LDY #SCTDIR
0907 6605 C6 04 LDB #4
0908 6607 17 0523 LBSR TRANS
0909
0910 660A 35 02 PULS A
0911 660C 81 4D CMPA #'M
0912 660E 26 05 BNE GTF1
0913 6610 8E 6FFE LDX #MSMSV
0914 6613 20 03 BRA GTF2
0915 6615 8E 6FEE GTF1 LDX #MSINFN
0916 6618 17 070B GTF2 LBSR PSTRNG
0917 661B 17 0162 LBSR INPFLDAT input file name
0918
0919 *set filename
0920 661E 8E 607B LDX #FILBUF
0921 6621 17 00E9 LBSR SETFNM
0922
0923 6624 8E 6012 LDFL0 LDX #SCTDIR
0924 6627 17 FD8B LBSR SETSNO
0925 662A 17 0548 LBSR RD1SCT read 1 sct
0926
0927 662D 8E 5E00 LDX #RWBUF
0928 6630 A6 84 LDFL1 LDA ,X
0929 6632 27 37 BEQ LDFLE if top of filename is 0 then end
0930 6634 81 E5 CMPA #$E5 delete mark?
0931 6636 26 10 BNE LD1
0932 6638 A6 0B LDA 11,X attr
0933 663A 81 20 CMPA #$20 archive file only
0934 663C 27 0A BEQ LD1
0935 663E 30 88 20 LEAX 32,X next directory entry
0936 6641 8C 6000 CMPX #RWBUF+512 over buf?
0937 6644 24 0E BHS LDFL5
0938 6646 20 E8 BRA LDFL1
0939
0940 *check file name
0941 6648 LD1
0942 6648 8D 8F BSR CMPFN C=1:match
0943 664A 25 10 BCS LD2
0944 664C 30 88 20 LEAX 32,X
0945 664F 8C 6000 CMPX #RWBUF+512
0946 6652 25 DC BLO LDFL1
0947
0948 6654 LDFL5
0949 6654 8E 6012 LDX #SCTDIR
0950 6657 17 04E7 LBSR INCX4 sct no +1
0951 665A 20 C8 BRA LDFL0
0952
0953 *hit file, get dirctory entry
0954 665C BF 6065 LD2 STX EXSTFL adr of dir entry
0955 665F 108E 601F LDY #DIRENT
0956 6663 C6 20 LDB #32
0957 6665 17 04C5 LBSR TRANS
0958 6668 8E 601F LDX #DIRENT
0959 666B 39 LDFLE RTS
0960
0961 *
0962 ****************************************
0963 * KILL FILE
0964 ****************************************
0965 666C KILFILE EQU *
0966 666C 8D 88 BSR GETFDT
0967 666E BE 6065 LDX EXSTFL if 0 not exist
0968 6671 27 5B BEQ NOFEND
0969
0970 6673 8E 7074 LDX #MSKILL
0971 6676 17 06AD LBSR PSTRNG
0972 6679 BD 6E2D JSR INOUTC
0973 667C 84 DF ANDA #$DF
0974 667E 81 59 CMPA #'Y
0975 6680 26 3E BNE KILEND
0976 6682 8D 01 BSR KILSUB
0977 6684 39 RTS
0978
0979 *----------
0980 6685 KILSUB EQU *
0981 *write dir
0982 6685 BE 6065 LDX EXSTFL top adr of dir entry
0983 6688 EC 88 1A LDD $1A,X get clstlD
0984 668B 1E 89 EXG A,B B:cluster
0985 668D FD 604A STD CLSTL
0986 6690 86 E5 LDA #$E5 delete mark
0987 6692 A7 84 STA ,X
0988 6694 17 03D0 LBSR WRTSD1
0989
0990 *get fat sct & write
0991 6697 8E 600E LDX #SCTFAT
0992 669A 17 FD18 LBSR SETSNO
0993 669D 17 04D5 LBSR RD1SCT read 1 sct
0994
0995 66A0 FC 604A LDD CLSTL B:cluster
0996 66A3 58 LSLB
0997 66A4 7D 6009 TST SDHC sd:0,sdhc:1
0998 66A7 27 01 BEQ KL1
0999 66A9 58 LSLB
1000 66AA 8E 5E00 KL1 LDX #RWBUF
1001 66AD 30 85 LEAX B,X
1002 66AF C6 02 LDB #2
1003 66B1 7D 6009 TST SDHC sd:0,sdhc:1
1004 66B4 27 02 BEQ KL2
1005 66B6 C6 04 LDB #4
1006 66B8 6F 80 KL2 CLR ,X+
1007 66BA 5A DECB
1008 66BB 26 FB BNE KL2
1009 66BD 17 03A7 LBSR WRTSD1
1010 66C0 KILEND
1011 66C0 39 RTS
1012
1013 *
1014 ****************************************
1015 * Write BASIC FILE
1016 ****************************************
1017 66C1 WRBFILE EQU *
1018 *basic file exist check
1019 66C1 DC 35 LDD BASAEP
1020 66C3 93 33 SUBD BASADP
1021 66C5 1083 0002 CMPD #2
1022 66C9 22 0A BHI WRB0 exist
1023 66CB 17 05A3 LBSR PCRLF
1024 66CE 8E 7049 NOFEND LDX #MSNOFL
1025 66D1 17 0652 LBSR PSTRNG
1026 66D4 39 RTS
1027
1028 *save BASIC program file(binary saved)
1029 66D5 86 FF WRB0 LDA #$FF
1030 66D7 B7 604D STA MCFLG set basic file
1031 *input file name
1032 66DA 17 FF19 LBSR GETFDT
1033 66DD BE 6065 LDX EXSTFL if 0 not exist
1034 66E0 27 11 BEQ WRB1
1035
1036 *confirm over write
1037 66E2 8E 7087 LDX #MSEXST
1038 66E5 17 063E LBSR PSTRNG
1039 66E8 BD 6E2D JSR INOUTC
1040 66EB 84 DF ANDA #$DF
1041 66ED 81 59 CMPA #'Y
1042 66EF 26 1B BNE WRBEND
1043 *delete exist file
1044 66F1 8D 92 BSR KILSUB
1045
1046 66F3 WRB1
1047 *set filename
1048 66F3 8E 607B LDX #FILBUF
1049 66F6 8D 15 BSR SETFNM
1050
1051 *adrs
1052 * BASADP start adr
1053 * BASAEP end adr
1054 * BASEXP exec adr
1055
1056 *main of write routine
1057 *clear dir entry
1058 66F8 8D 2B BSR CLRDIR
1059
1060 66FA 17 0103 LBSR SRCFAT search empty cluster on FAT
1061 66FD 17 0158 LBSR SRCDIR search empty DIR entry
1062 6700 17 0194 LBSR MKFLDT make file data
1063 6703 17 0219 LBSR WRTFIL write file
1064 6706 17 03BB LBSR WRTDIR write DIR entry
1065 6709 17 03E5 LBSR WRTFAT set FAT
1066 670C WRBEND
1067 670C 39 RTS
1068
1069 *------------------------------
1070 *set filename
1071 670D SETFNM EQU *
1072 *clear buf
1073 670D 108E 605A LDY #FNAME+11
1074 6711 C6 0B LDB #11
1075 6713 86 20 LDA #$20
1076 6715 A7 A2 WRFLP2 STA ,-Y
1077 6717 5A DECB
1078 6718 26 FB BNE WRFLP2
1079
1080 *store filename
1081 671A A6 80 WRFL1 LDA ,X+
1082 671C 81 30 CMPA #$30
1083 671E 25 04 BLO WRFL2 until delimiter
1084 6720 A7 A0 STA ,Y+
1085 6722 20 F6 BRA WRFL1
1086 6724 WRFL2
1087 6724 39 RTS
1088
1089 *------------------------------
1090 *clear dir entry
1091 6725 CLRDIR EQU *
1092 6725 8E 601F LDX #DIRENT
1093 6728 C6 20 LDB #32
1094 672A 4F CLRA
1095 672B 17 040A LBSR FILL
1096 672E 86 20 LDA #$20 set attr
1097 6730 A7 0B STA $0B,X
1098 6732 39 RTS
1099
1100 *
1101 ****************************************
1102 * Write MACHINE FILE
1103 ****************************************
1104 6733 WRMFILE EQU *
1105 *save machine code
1106 *filename,topadr,endadr,exeadr ...machine file
1107 6733 17 FEC0 LBSR GETFDT
1108 6736 BE 6065 LDX EXSTFL if 0 not exist
1109 6739 27 12 BEQ WRM1
1110
1111 *confirm over write
1112 673B 8E 7087 LDX #MSEXST
1113 673E 17 05E5 LBSR PSTRNG
1114 6741 BD 6E2D JSR INOUTC
1115 6744 84 DF ANDA #$DF
1116 6746 81 59 CMPA #'Y
1117 6748 26 35 BNE WRMEND
1118 *delete exist file
1119 674A 17 FF38 LBSR KILSUB
1120
1121 674D WRM1
1122 674D 7F 604D CLR MCFLG set machine code
1123
1124 *set filename
1125 6750 8E 607B LDX #FILBUF
1126 6753 8D B8 BSR SETFNM
1127
1128 *set top adr
1129 6755 8D 46 BSR ASC2BIN
1130 6757 10BF 605F STY MCADP start adr
1131 675B 8D 30 BSR SRCDLM
1132 675D 8D 3E BSR ASC2BIN
1133 675F 10BF 6061 STY MCAEP end adr
1134 6763 8D 28 BSR SRCDLM
1135 6765 8D 36 BSR ASC2BIN
1136 6767 10BF 6063 STY MCEXP exec adr
1137
1138 *main of write routine
1139 *clear dir entry
1140 676B 8D B8 BSR CLRDIR
1141
1142 676D 17 0090 LBSR SRCFAT search empty cluster on FAT
1143 6770 17 00E5 LBSR SRCDIR search empty DIR entry
1144 6773 17 0121 LBSR MKFLDT make file data
1145 6776 17 01A6 LBSR WRTFIL write file
1146 6779 17 0348 LBSR WRTDIR write DIR entry
1147 677C 17 0372 LBSR WRTFAT set FAT
1148 677F WRMEND
1149 677F 39 RTS
1150
1151 *--------------------
1152 *input filename & parameter to filbuf
1153 6780 INPFLDAT EQU *
1154 6780 34 24 PSHS B,Y
1155 6782 108E 607B LDY #FILBUF
1156 6786 C6 1E LDB #30
1157 6788 17 06A9 LBSR LININ
1158 678B 35 A4 PULS B,Y,PC
1159
1160 *--------------------
1161 *search delimiter
1162 *return X:point next char of delimiter
1163 678D SRCDLM EQU *
1164 678D 30 1F LEAX -1,X
1165 678F A6 80 SRDLM1 LDA ,X+
1166 6791 81 30 CMPA #$30
1167 6793 24 FA BHS SRDLM1
1168 6795 39 RTS
1169
1170 *--------------------
1171 *skip delimiter
1172 *return X:point next char of delimiter
1173 6796 SKPDLM EQU *
1174 6796 A6 80 LDA ,X+
1175 6798 81 30 CMPA #$30
1176 679A 25 FA BLO SKPDLM
1177 679C 39 RTS
1178
1179 *--------------------
1180 *X - X+3, return Y
1181 679D ASC2BIN EQU *
1182 *clr buf
1183 679D 34 10 PSHS X
1184 679F 8E 6077 LDX #CNVBUF
1185 67A2 86 30 LDA #$30
1186 67A4 C6 04 LDB #4
1187 67A6 17 038F LBSR FILL
1188 67A9 35 10 PULS X
1189
1190 *search next delimiter
1191 *return B:char count
1192 67AB 34 10 PSHS X
1193 67AD 5F CLRB
1194 67AE 5C SRLOP1 INCB
1195 67AF A6 80 LDA ,X+
1196 67B1 81 30 CMPA #$30 count over $30
1197 67B3 24 F9 BHS SRLOP1
1198 67B5 5A DECB
1199 67B6 35 10 PULS X
1200
1201 *trans
1202 67B8 108E 6077 LDY #CNVBUF
1203 67BC 34 04 PSHS B
1204 67BE C6 04 LDB #4
1205 67C0 E0 E4 SUBB ,S
1206 67C2 31 A5 LEAY B,Y
1207 67C4 35 04 PULS B
1208 67C6 A6 80 SRLOP2 LDA ,X+
1209 67C8 A7 A0 STA ,Y+
1210 67CA 5A DECB
1211 67CB 26 F9 BNE SRLOP2
1212
1213 *convert to bin
1214 67CD 34 10 PSHS X
1215 67CF 8E 6077 LDX #CNVBUF
1216 67D2 EC 81 LDD ,X++
1217 67D4 8D 0F BSR CNVSUB
1218 67D6 34 02 PSHS A
1219 67D8 EC 81 LDD ,X++
1220 67DA 8D 09 BSR CNVSUB
1221 67DC 1F 89 TFR A,B
1222 67DE 35 02 PULS A
1223 67E0 1F 02 TFR D,Y
1224 67E2 35 10 PULS X
1225 67E4 39 RTS
1226
1227 *cnv sub
1228 *return A
1229 67E5 CNVSUB EQU *
1230 67E5 80 30 SUBA #$30
1231 67E7 81 11 CMPA #$11
1232 67E9 25 02 BLO CNV1
1233 67EB 80 07 SUBA #7
1234 67ED 48 CNV1 LSLA
1235 67EE 48 LSLA
1236 67EF 48 LSLA
1237 67F0 48 LSLA
1238 67F1 C0 30 SUBB #$30
1239 67F3 C1 11 CMPB #$11
1240 67F5 25 02 BLO CNV2
1241 67F7 C0 07 SUBB #7
1242 67F9 C4 0F CNV2 ANDB #$0F
1243 67FB 34 04 PSHS B
1244 67FD AB E0 ADDA ,S+
1245 67FF 39 RTS
1246
1247 *--------------------
1248 * search empty area in FAT
1249 6800 SRCFAT EQU *
1250 6800 8E 600E LDX #SCTFAT
1251 6803 17 FBAF LBSR SETSNO
1252 6806 17 036C LBSR RD1SCT read 1 sct
1253
1254 6809 8E 5E00 LDX #RWBUF
1255 *search $00
1256 680C SRC0
1257 680C C6 02 LDB #2 SD
1258 680E 7D 6009 TST SDHC 0:SD,1:SDHC
1259 6811 27 02 BEQ SRCLOP
1260 6813 C6 04 LDB #4 SDHC
1261 6815 8D 32 SRCLOP BSR SRC00 search 1st 00 ...1st 00
1262 6817 24 2F BCC SFATED not exist empty area
1263 6819 A6 80 LDA ,X+ next is 00? ..2nd 00
1264 681B 26 EF BNE SRC0 restart
1265 681D 7D 6009 TST SDHC 0:SD,1:SDHC
1266 6820 27 0A BEQ SETX
1267 6822 A6 80 LDA ,X+ next is 00? ..3rd 00
1268 6824 26 E6 BNE SRC0 restart
1269 6826 A6 80 LDA ,X+ next is 00? ..4th 00
1270 6828 26 E2 BNE SRC0 restart
1271 682A 30 1E LEAX -2,X
1272 682C SETX
1273 682C 30 1E LEAX -2,X pos in RWBUF
1274 682E 3089 A200 LEAX -RWBUF,X relative pos
1275 6832 1F 10 TFR X,D
1276 6834 44 LSRA
1277 6835 56 RORB 1/2
1278 6836 7D 6009 TST SDHC 0:SD,1:SDHC
1279 6839 27 02 BEQ SETCL
1280 683B 44 LSRA
1281 683C 56 RORB 1/2
1282 683D FD 604A SETCL STD CLSTL
1283 6840 1E 89 EXG A,B
1284 6842 8E 601F LDX #DIRENT
1285 6845 ED 88 1A STD $1A,X set cluster L to dirent
1286 6848 39 SFATED RTS
1287
1288 *search 00 in FAT
1289 6849 8C 6000 SRC00 CMPX #RWBUF+512
1290 684C 24 07 BHS NOEXST
1291 684E A6 80 LDA ,X+
1292 6850 26 F7 BNE SRC00
1293 6852 1A 01 EXIST ORCC #$01 set C
1294 6854 39 RTS
1295 6855 1C FE NOEXST ANDCC #$FE reset C
1296 6857 39 RTS
1297
1298 *--------------------
1299 * search empty DIR entry
1300 * return:DPGNO,DIROFS
1301 6858 SRCDIR EQU *
1302 6858 7F 605A CLR DPGNO
1303 *return no of DIR
1304 685B 8E 6016 LDX #SCTDSV
1305 685E 108E 6012 LDY #SCTDIR
1306 6862 C6 04 LDB #4
1307 6864 17 02C6 LBSR TRANS
1308 6867 8E 6012 SRCFL0 LDX #SCTDIR
1309 686A 17 FB48 SRCFL1 LBSR SETSNO
1310 686D 17 0305 LBSR RD1SCT read 1 sct
1311
1312 6870 8E 5E00 LDX #RWBUF
1313 6873 8C 6000 DLOP1 CMPX #RWBUF+512
1314 6876 24 0D BHS SRCFL5
1315 6878 A6 80 LDA ,X+
1316 687A 27 15 BEQ DIRGET
1317 687C 81 E5 CMPA #$E5 delete mark?
1318 687E 27 11 BEQ DIRGET
1319 6880 30 88 1F LEAX 32-1,X
1320 6883 20 EE BRA DLOP1
1321
1322 6885 7C 605A SRCFL5 INC DPGNO
1323 6888 8E 6012 LDX #SCTDIR
1324 688B 17 02B3 LBSR INCX4 sct no +1
1325 688E 20 DA BRA SRCFL1
1326 6890 DSPED
1327 6890 39 RTS
1328
1329 6891 30 1F DIRGET LEAX -1,X
1330 6893 BF 605B STX DIROFS
1331 6896 39 RTS
1332
1333 *--------------------
1334 6897 MKFLDT EQU *
1335 *cluster no & attr already set
1336 *file name input&set
1337 6897 8E 604F LDX #FNAME
1338 689A 108E 601F LDY #DIRENT
1339 689E C6 0B LDB #11
1340 68A0 17 028A LBSR TRANS set file name
1341
1342 *cal file size
1343 68A3 7D 604D TST MCFLG 00,FF(FE),else
1344 68A6 2B 08 BMI MKF1
1345 68A8 FC 6061 LDD MCAEP
1346 68AB B3 605F SUBD MCADP
1347 68AE 20 04 BRA MKF2
1348 68B0 MKF1
1349 68B0 DC 35 LDD BASAEP
1350 68B2 93 33 SUBD BASADP
1351 68B4 1E 89 MKF2 EXG A,B
1352 68B6 8E 601F LDX #DIRENT
1353 68B9 ED 88 1C STD $1C,X
1354
1355 *set date (for FM-7)
1356 68BC 8D 12 BSR STDATE
1357 68BE FC 603F LDD WMDY
1358 68C1 1E 89 EXG A,B
1359
1360 *year,month,day
1361 68C3 8E 601F LDX #DIRENT
1362 68C6 ED 88 18 STD $18,X
1363 68C9 ED 88 10 STD $10,X
1364 68CC ED 88 12 STD $12,X
1365 68CF 39 RTS
1366
1367 *----------
1368 *FM day to SD
1369 *retuen WMDY,WMDY+1
1370 68D0 STDATE EQU *
1371 68D0 8E 02FA LDX #FMDAT date of FM-7
1372 68D3 108E 603F LDY #WMDY
1373 68D7 C6 03 LDB #3
1374 68D9 34 04 ABLOP PSHS B
1375 68DB EC 81 LDD ,X++
1376 68DD 8D 2E BSR APLUSB
1377 68DF A7 A0 STA ,Y+
1378 68E1 35 04 PULS B
1379 68E3 26 F4 BNE ABLOP
1380 *year
1381 68E5 B6 603F LDA WMDY
1382 68E8 8B 14 ADDA #20 ---2000-1980
1383 68EA 48 LSLA
1384 68EB B7 603F STA WMDY
1385 *month
1386 68EE B6 6040 LDA WMDY+1
1387 68F1 48 LSLA
1388 68F2 48 LSLA
1389 68F3 48 LSLA
1390 68F4 48 LSLA
1391 68F5 48 ASLA
1392 68F6 B7 6040 STA WMDY+1
1393 68F9 F6 603F LDB WMDY
1394 68FC C9 00 ADCB #0 plus C
1395 68FE F7 603F STB WMDY
1396 *day
1397 6901 B6 6041 LDA WMDY+2
1398 6904 84 1F ANDA #$1F
1399 6906 BB 6040 ADDA WMDY+1
1400 6909 B7 6040 STA WMDY+1
1401 690C 39 RTS
1402
1403 *lower nibble of A,B to A+B
1404 690D APLUSB EQU *
1405 690D 34 10 PSHS X
1406 690F 34 04 PSHS B
1407 6911 C6 0A LDB #10
1408 6913 3D MUL
1409 6914 1F 01 TFR D,X
1410 6916 35 04 PULS B
1411 6918 3A ABX
1412 6919 1F 10 TFR X,D
1413 691B 1E 89 EXG A,B A:data
1414 691D 35 90 PULS X,PC
1415 *
1416 *--------------------
1417 691F WRTFIL EQU *
1418 *calc file size
1419 691F 7D 604D TST MCFLG 0,FF(FE),else
1420 6922 2B 08 BMI WRTF1
1421 6924 FC 6061 LDD MCAEP
1422 6927 B3 605F SUBD MCADP
1423 692A 20 04 BRA WRTF2
1424 692C WRTF1
1425 692C DC 35 LDD BASAEP
1426 692E 93 33 SUBD BASADP
1427 6930 FD 6046 WRTF2 STD FILSIZ
1428 6933 1F 02 TFR D,Y file size
1429 6935 10BF 606B STY WK3
1430 6939 1E 89 EXG A,B
1431 693B 8E 601F LDX #DIRENT
1432 693E ED 88 1C STD $1C,X
1433 6941 1E 89 EXG A,B
1434
1435 *add header&footer
1436 6943 7D 604D TST MCFLG 0,FF(FE),else
1437 6946 27 04 BEQ WRT3
1438 6948 2B 07 BMI WRT4
1439 694A 2A 08 BPL WRT5
1440
1441 694C C3 000A WRT3 ADDD #10 header&footer
1442 694F 20 03 BRA WRT5
1443 6951 C3 0003 WRT4 ADDD #3 header
1444 6954 1F 02 WRT5 TFR D,Y
1445
1446 *calc counter (CNT:512byte units)
1447 6956 7F 604C CLR CNT
1448 6959 7C 604C CALLOP INC CNT
1449 695C 83 0200 SUBD #512
1450 695F 22 F8 BHI CALLOP
1451 6961 B6 604C LDA CNT
1452 6964 B7 604E STA TPGFLG set top page
1453
1454 6967 7D 604D TST MCFLG
1455 696A 2B 05 BMI WRTF3
1456 696C BE 605F LDX MCADP saved top adr
1457 696F 20 02 BRA WRTF4
1458
1459 6971 9E 33 WRTF3 LDX BASADP saved top adr
1460 6973 BF 6067 WRTF4 STX WK1 src topadr
1461 6976 CE 5E00 LDU #RWBUF
1462
1463 *get clusterL
1464 6979 8E 601F LDX #DIRENT
1465 697C EC 88 1A LDD $1A,X
1466 697F 1E 89 EXG A,B B:clusterL
1467
1468 6981 BE 601A LDX SCTCLT sct no of top cluster
1469 6984 BF 6069 STX WK2
1470 6987 BE 601C LDX SCTCLT+2
1471 698A BF 606B STX WK2+2
1472
1473 698D C0 02 SUBB #2 for SD
1474 698F 7D 6009 TST SDHC 0:SD,1:SDHC
1475 6992 27 01 BEQ WR2
1476 6994 5A DECB
1477 6995 WR2
1478
1479 *(X)..(X+3)+(B)x40h
1480 6995 8E 6069 LDX #WK2
1481 6998 17 01B5 LBSR ADD40H cal of sct no
1482
1483 *set start sct no of file
1484 699B 34 10 PSHS X
1485 699D 8E 7022 LDX #MSWTNG
1486 69A0 17 0383 LBSR PSTRNG
1487 69A3 35 10 PULS X
1488
1489 69A5 WRLOP
1490 69A5 86 2E LDA #'.
1491 69A7 BD FBBB JSR OUTCHA
1492 69AA 10BE 606B LDY WK3
1493 69AE 1F 20 TFR Y,D
1494 69B0 1083 0200 CMPD #512
1495 69B4 23 04 BLS WR3
1496 69B6 108E 0200 LDY #512
1497 69BA WR3
1498
1499 *write data to rwbuf
1500 * (X)->(U:RWBUF)
1501 * (Y):SIZE 512bytes or Less
1502 69BA BE 6067 LDX WK1
1503 69BD CE 5E00 LDU #RWBUF
1504 69C0 8D 44 BSR WRSUB
1505
1506 *set to sctn0-3
1507 69C2 34 30 PSHS X,Y
1508 69C4 8E 6069 LDX #WK2
1509 69C7 108E 6004 LDY #SCTN0
1510 69CB C6 04 LDB #4
1511 69CD 17 015D LBSR TRANS
1512 69D0 35 30 PULS X,Y
1513
1514 *write data to sd
1515 69D2 17 008F LBSR WRTSD ...not wrtsd1
1516
1517 *inc sctn0-3
1518 69D5 8E 6069 LDX #WK2
1519 69D8 17 0166 LBSR INCX4
1520 69DB BE 6067 LDX WK1 src topadr
1521 69DE 3089 0200 LEAX 512,X
1522 *check top page
1523 69E2 7D 604E TST TPGFLG top page?
1524 69E5 27 0D BEQ WR6
1525 69E7 7D 604D TST MCFLG
1526 69EA 27 04 BEQ WR4
1527 69EC 2B 04 BMI WR5
1528 69EE 2A 04 BPL WR6
1529 69F0 30 1E WR4 LEAX -2,X rewind 3or5
1530 69F2 30 1D WR5 LEAX -3,X
1531 69F4 WR6
1532 69F4 7F 604E CLR TPGFLG
1533 69F7 BF 6067 STX WK1
1534 69FA 7A 604C DEC CNT
1535 * BEQ WREND
1536 * BRA WRLOP
1537 69FD 2A A6 BPL WRLOP
1538
1539 69FF 8E 703B WREND LDX #MSWTED
1540 6A02 17 0321 LBSR PSTRNG
1541 6A05 39 RTS
1542
1543 *----------
1544 *write data to rwbuf
1545 * (X)->(U:RWBUF)
1546 * (Y):SIZE 512bytes or Less
1547 *clear rwbuf
1548 6A06 WRSUB EQU *
1549 6A06 34 30 PSHS X,Y
1550 6A08 4F CLRA
1551 6A09 8E 5E00 LDX #RWBUF
1552 6A0C 108E 0200 LDY #512
1553 6A10 A7 80 WWCLOP STA ,X+
1554 6A12 31 3F LEAY -1,Y
1555 6A14 26 FA BNE WWCLOP
1556 6A16 35 30 PULS X,Y
1557
1558 *set data to rwbuf
1559 6A18 CE 5E00 LDU #RWBUF
1560
1561 6A1B 7D 604E TST TPGFLG top page?
1562 6A1E 27 24 BEQ WRLOP1
1563
1564 6A20 7D 604D TST MCFLG 0,$FF($FE),etc
1565 6A23 2B 15 BMI WRS1
1566 6A25 WRS0
1567 * add header of machine code
1568 6A25 34 10 PSHS X
1569 6A27 4F CLRA
1570 6A28 A7 C0 STA ,U+ 00
1571 6A2A BE 6046 LDX FILSIZ
1572 6A2D AF C1 STX ,U++ file size
1573 6A2F BE 605F LDX MCADP
1574 6A32 AF C1 STX ,U++ save adr
1575 6A34 31 3B LEAY -5,Y
1576 6A36 35 10 PULS X
1577 6A38 20 0A BRA WRLOP1
1578
1579 6A3A WRS1
1580 * add header of basic file
1581 6A3A 86 FF LDA #$FF
1582 6A3C A7 C0 STA ,U+
1583 6A3E A7 C0 STA ,U+
1584 6A40 A7 C0 STA ,U+
1585 6A42 31 3D LEAY -3,Y
1586
1587 6A44 A6 80 WRLOP1 LDA ,X+
1588 6A46 A7 C0 STA ,U+
1589 6A48 31 3F LEAY -1,Y
1590 6A4A 26 F8 BNE WRLOP1
1591
1592 *check last page
1593 6A4C B6 604C LDA CNT
1594 6A4F 81 01 CMPA #1
1595 6A51 26 10 BNE WRS2
1596 *add footer
1597 6A53 86 FF LDA #$FF
1598 6A55 A7 C0 STA ,U+
1599 6A57 4F CLRA
1600 6A58 A7 C0 STA ,U+
1601 6A5A A7 C0 STA ,U+
1602 6A5C BE 6063 LDX MCEXP
1603 6A5F AF C1 STX ,U++
1604 6A61 31 3B LEAY -5,Y
1605 6A63 39 WRS2 RTS
1606
1607 *write data to sd
1608 6A64 WRTSD EQU *
1609 6A64 17 01A0 LBSR SETSCT *set SCT No
1610 *copy sct no to cmd param
1611 6A67 8E 6004 WRTSD1 LDX #SCTN0
1612 6A6A 108E 6E5A LDY #CMD24+1
1613 6A6E C6 04 LDB #4
1614 6A70 17 00BA LBSR TRANS
1615 *send cmd
1616 6A73 17 01C0 LBSR SETCKL
1617 6A76 C6 06 LDB #6
1618 6A78 8E 6E59 LDX #CMD24
1619 6A7B A6 80 SDW1 LDA ,X+
1620 6A7D 17 0149 LBSR SNDDAT
1621 6A80 5A DECB
1622 6A81 26 F8 BNE SDW1
1623 *get cmd response
1624 6A83 SDW2
1625 6A83 17 015F LBSR GETDAT
1626 6A86 B6 6008 LDA RESDAT
1627 6A89 81 00 CMPA #$00
1628 6A8B 26 F6 BNE SDW2
1629 *1byte skip
1630 6A8D 86 FF LDA #$FF
1631 6A8F 17 0137 LBSR SNDDAT 1byte skip
1632
1633 *send data packet
1634 6A92 8E 5E00 LDX #RWBUF <-temp -1="" 008c="" 0093="" 00ab="" 00b3="" 00c3="" 011a="" 011d="" 0126="" 0129="" 012b="" 0133="" 01="" 0200="" 02="" 03="" 04="" 05="" 06="" 08="" 0:sd="" 0f="" 108e="" 10be="" 12="" 1635="" 1636="" 1637="" 1638="" 1639="" 1640="" 1641="" 1642="" 1643="" 1644="" 1645="" 1646="" 1647="" 1648="" 1649="" 1650="" 1651="" 1652="" 1653="" 1654="" 1655="" 1656="" 1657="" 1658="" 1659="" 1660="" 1661="" 1662="" 1663="" 1664="" 1665="" 1666="" 1667="" 1668="" 1669="" 1670="" 1671="" 1672="" 1673="" 1674="" 1675="" 1676="" 1677="" 1678="" 1679="" 1680="" 1681="" 1682="" 1683="" 1684="" 1685="" 1686="" 1687="" 1688="" 1689="" 1690="" 1691="" 1692="" 1693="" 1694="" 1695="" 1696="" 1697="" 1698="" 1699="" 16="" 1700="" 1701="" 1702="" 1703="" 1704="" 1705="" 1706="" 1707="" 1708="" 1709="" 1710="" 1711="" 1712="" 1713="" 1714="" 1715="" 1716="" 1717="" 1718="" 1719="" 1720="" 1721="" 1722="" 1723="" 1724="" 1725="" 1726="" 1727="" 1728="" 1729="" 1730="" 1731="" 1732="" 1733="" 1734="" 1735="" 1736="" 1737="" 1738="" 1739="" 1740="" 1741="" 1742="" 1743="" 1744="" 1745="" 1746="" 1747="" 1748="" 1749="" 1750="" 1751="" 1752="" 1753="" 1754="" 1755="" 1756="" 1757="" 1758="" 1759="" 1760="" 1761="" 1762="" 1763="" 1764="" 1765="" 1766="" 1767="" 1768="" 1769="" 1770="" 1771="" 1772="" 1773="" 1774="" 1775="" 1776="" 1777="" 1778="" 1779="" 1780="" 1781="" 1782="" 1783="" 1784="" 1785="" 1786="" 1787="" 1788="" 1789="" 1790="" 1791="" 1792="" 1793="" 1794="" 1795="" 1796="" 1797="" 1798="" 1799="" 17="" 1800="" 1801="" 1802="" 1803="" 1804="" 1805="" 1806="" 1807="" 1808="" 1809="" 1810="" 1811="" 1812="" 1813="" 1814="" 1815="" 1816="" 1817="" 1818="" 1819="" 1820="" 1821="" 1822="" 1823="" 1824="" 1825="" 1826="" 1827="" 1828="" 1829="" 1830="" 1831="" 1832="" 1833="" 1834="" 1835="" 1836="" 1837="" 1838="" 1839="" 1840="" 1841="" 1842="" 1843="" 1844="" 1845="" 1846="" 1847="" 1848="" 1849="" 1850="" 1851="" 1852="" 1853="" 1854="" 1855="" 1856="" 1857="" 1858="" 1859="" 1="" 1a="" 1e="" 1f="" 20="" 24="" 26="" 27="" 2="" 31="" 34="" 35="" 36="" 39="" 3="" 3a="" 3d="" 3f="" 40="" 44="" 48="" 4b="" 4f="" 54="" 5a="" 5b="" 5e00="" 5e="" 5f="" 6004="" 6008="" 6009="" 600e="" 6012="" 6016="" 601f="" 605a="" 605b="" 68="" 6a95="" 6a99="" 6a9b="" 6a9e="" 6aa0="" 6aa3="" 6aa5="" 6aa7="" 6aa9="" 6aac="" 6aaf="" 6ab2="" 6ab5="" 6ab7="" 6ab9="" 6abc="" 6abf="" 6ac1="" 6ac3="" 6ac4="" 6ac7="" 6acb="" 6acd="" 6acf="" 6ad2="" 6ad5="" 6ad7="" 6ad9="" 6ada="" 6adc="" 6adf="" 6ae2="" 6ae5="" 6ae9="" 6aeb="" 6aed="" 6af0="" 6af1="" 6af4="" 6af7="" 6af9="" 6afb="" 6afd="" 6b00="" 6b03="" 6b05="" 6b07="" 6b09="" 6b0c="" 6b0e="" 6b10="" 6b13="" 6b14="" 6b16="" 6b18="" 6b1a="" 6b1c="" 6b1e="" 6b21="" 6b23="" 6b25="" 6b27="" 6b29="" 6b2c="" 6b2d="" 6b2f="" 6b31="" 6b33="" 6b34="" 6b36="" 6b38="" 6b3a="" 6b3c="" 6b3d="" 6b3f="" 6b41="" 6b43="" 6b45="" 6b47="" 6b49="" 6b4b="" 6b4d="" 6b4f="" 6b50="" 6b52="" 6b54="" 6b56="" 6b58="" 6b5a="" 6b5c="" 6b5e="" 6b60="" 6b62="" 6b64="" 6b66="" 6b68="" 6b6a="" 6b6c="" 6b6e="" 6b70="" 6b71="" 6b73="" 6b75="" 6b78="" 6b7c="" 6b7e="" 6b80="" 6b83="" 6b85="" 6b88="" 6b8a="" 6b8c="" 6b8d="" 6b8f="" 6b91="" 6b94="" 6b96="" 6b98="" 6b9b="" 6b9f="" 6ba1="" 6ba4="" 6ba6="" 6ba8="" 6baa="" 6bab="" 6bae="" 6bb1="" 6bb5="" 6bb7="" 6bb9="" 6bbc="" 6bbe="" 6bc0="" 6bc1="" 6bc3="" 6bc6="" 6bc8="" 6bc9="" 6bcb="" 6bce="" 6bd0="" 6bd2="" 6bd4="" 6bd6="" 6bd9="" 6bdb="" 6bdd="" 6bde="" 6be0="" 6be1="" 6be3="" 6be5="" 6be7="" 6be9="" 6beb="" 6bec="" 6bed="" 6bee="" 6bf0="" 6bf3="" 6bf4="" 6c="" 6e53="" 6e54="" 70="" 7d="" 7f="" 80="" 81="" 84="" 86="" 88="" 89="" 8a="" 8b="" 8d="" 8e="" 96="" a0="" a6="" a7="" a:fill="" a="" abx="" ad="" add0="" add1="" add2="" add3="" add40h="" adda="" addb="" adr="" adx0="" adx1="" adx2="" adx3="" anda="" b1-="" b6="" b7="" b:cnt="" bcc="" beq="" bne="" bra="" bsr="" buf="" busy="" c6="" cb="" ckrs="" clr="" cluster="" cmd="" cmpa="" copy="" crch="" crcl="" cs:b0="L" d="" data="" decb="" df="" dir="" dirofs="" disp="" dpgno="" dspb1="" dspb2="" dspb3="" dspbin="" dspbuf="" e5="" ec="" ed="" equ="" exg="" f4="" f5="" f6="" f7="" f8b2="" f8d6="" f9="" fb="" fc="" fd9e="" fe="" ff3b="" ff77="" ff="" fill="" filop="" get="" getd1="" getdat="" inc="" incx4="" lbsr="" lda="" ldb="" ldd="" ldx="" ldy="" leay="" lsla="" lsra="" miso:b1="H(for" no="" nop="" of="" ora="" param="" pbdat="" pcrlf="" pia="" pshs="" puls="" rd1="" rd1sct="" rd2="" rd3="" read="" resdat="" response="" return="" rts="" save="" sct="" sd:2="" sdhc:4="" sdhc="" send="" setckh="" setckl="" setsno="" sndd1="" snddat="" snddt1="" src="" sta="" temp="" tfr="" to="" token="" trans="" trlop="" tst="" until="" wait="" wrdlop="" wrdskp="" wrf1="" wrf2="" wrf3="" wrtdir="" wrtfat="" wrtsd1="" wspfl0="" x40h="" y:dst="" y="">C
1860 6BF5 79 6008 ROL RESDAT C->b0
1861 6BF8 5A DECB
1862 6BF9 26 EE BNE GETD1
1863 6BFB 8D 39 BSR SETCKL
1864 6BFD 35 86 PULS A,B,PC
1865 *
1866 *------------------------------
1867 *input SCT No
1868 6BFF INSCT EQU *
1869 6BFF 8E 6F5E LDX #MSSCT
1870 6C02 17 0121 LBSR PSTRNG
1871 6C05 8D 75 BSR GET8CH get 8chr, convert 4bin
1872
1873 6C07 SETSCT EQU *
1874 6C07 34 32 PSHS A,X,Y
1875 6C09 7D 6009 TST SDHC 0:SD,1:SDHC
1876 6C0C 26 1A BNE CALCHC
1877 *SD card
1878 6C0E 8E 6005 LDX #SCTN1
1879 6C11 108E 6004 LDY #SCTN0
1880 6C15 C6 03 LDB #3
1881 6C17 17 FF13 LBSR TRANS
1882 6C1A 7F 6007 CLR SCTN3
1883 *calc top adrs of sct
1884 6C1D CALCSD EQU *
1885 6C1D 78 6007 LSL SCTN3
1886 6C20 79 6006 ROL SCTN2
1887 6C23 79 6005 ROL SCTN1
1888 6C26 35 B2 PULS A,X,Y,PC
1889
1890 *SDHC card
1891 *calc top adrs of sct
1892 6C28 CALCHC EQU *
1893 6C28 8E 6004 LDX #SCTN0
1894 6C2B 108E 6E54 LDY #CMD17+1
1895 6C2F C6 04 LDB #4
1896 6C31 17 FEF9 LBSR TRANS
1897 6C34 35 B2 PULS A,X,Y,PC
1898
1899 *
1900 *set sck:L
1901 6C36 SETCKL EQU *
1902 6C36 34 02 PSHS A
1903 6C38 86 34 LDA #$34 ca2=L
1904 6C3A B7 FD9F STA PBCTL
1905 6C3D 35 82 PULS A,PC
1906
1907 *set sck:H
1908 6C3F SETCKH EQU *
1909 6C3F 34 02 PSHS A
1910 6C41 86 3C LDA #$3C ca2=H
1911 6C43 B7 FD9F STA PBCTL
1912 6C46 35 82 PULS A,PC
1913
1914 *binary(A)->ascii(A)(B)
1915 6C48 DSPBIN EQU *
1916 6C48 34 06 PSHS A,B
1917 6C4A 1F 89 TFR A,B
1918 6C4C 44 LSRA
1919 6C4D 44 LSRA
1920 6C4E 44 LSRA
1921 6C4F 44 LSRA
1922 6C50 8A 30 ORA #$30
1923 6C52 C4 0F ANDB #$0F
1924 6C54 CA 30 ORB #$30
1925 6C56 81 39 CMPA #$39
1926 6C58 23 02 BLS BI21
1927 6C5A 8B 07 ADDA #$07
1928 6C5C C1 39 BI21 CMPB #$39
1929 6C5E 23 02 BLS BI22
1930 6C60 CB 07 ADDB #$07
1931 6C62 BD FBBB BI22 JSR OUTCHA
1932 6C65 1F 98 TFR B,A
1933 6C67 BD FBBB JSR OUTCHA
1934 6C6A 86 20 LDA #$20
1935 6C6C BD FBBB JSR OUTCHA
1936 6C6F 35 86 PULS A,B,PC
1937
1938 *crlf
1939 6C71 PCRLF EQU *
1940 6C71 86 0D LDA #CR
1941 6C73 BD FBBB JSR OUTCHA
1942 6C76 86 0A LDA #LF
1943 6C78 BD FBBB JSR OUTCHA
1944 6C7B 39 RTS
1945
1946 *
1947 6C7C GET8CH EQU *
1948 *input chr
1949 6C7C 8E 606F LDX #INPBUF
1950 6C7F 5F CLRB
1951 6C80 BD 6E2D CLOP JSR INOUTC
1952 6C83 81 0D CMPA #CR
1953 6C85 27 07 BEQ INEND
1954 6C87 A7 85 STA B,X
1955 6C89 5C INCB
1956 6C8A C1 08 CMPB #8
1957 6C8C 25 F2 BLO CLOP
1958
1959 6C8E INEND
1960 *shift
1961 6C8E 5D TSTB
1962 6C8F 27 21 BEQ CLEND
1963 6C91 8E 606F LDX #INPBUF
1964 6C94 3A ABX
1965 6C95 108E 6077 LDY #INPBUF+8
1966 6C99 34 04 PSHS B
1967 6C9B A6 82 SFLOP LDA ,-X
1968 6C9D A7 A2 STA ,-Y
1969 6C9F 5A DECB
1970 6CA0 26 F9 BNE SFLOP
1971 *clr
1972 6CA2 C6 08 CL1 LDB #8
1973 6CA4 E0 E0 SUBB ,S+
1974 6CA6 27 0A BEQ CLEND
1975 6CA8 8E 606F LDX #INPBUF
1976 6CAB 86 30 LDA #'0
1977 6CAD A7 80 CLLOP STA ,X+
1978 6CAF 5A DECB
1979 6CB0 26 FB BNE CLLOP
1980 6CB2 CLEND
1981
1982 *convert to bin
1983 6CB2 C6 04 LDB #4
1984 6CB4 8E 606F LDX #INPBUF
1985 6CB7 108E 6004 LDY #SCTN0
1986 6CBB CVT1
1987 6CBB A6 80 LDA ,X+
1988 6CBD 8D 1E BSR CVBIN
1989 6CBF 25 16 BCS EREND1
1990 6CC1 48 LSLA
1991 6CC2 48 LSLA
1992 6CC3 48 LSLA
1993 6CC4 48 LSLA
1994 6CC5 34 02 PSHS A
1995 6CC7 A6 80 LDA ,X+
1996 6CC9 8D 12 BSR CVBIN
1997 6CCB 25 08 BCS EREND0
1998 6CCD AB E0 ADDA ,S+
1999 6CCF A7 A0 STA ,Y+
2000 6CD1 5A DECB
2001 6CD2 26 E7 BNE CVT1
2002 6CD4 39 RTS
2003
2004 6CD5 35 02 EREND0 PULS A
2005 6CD7 8E 6FA4 EREND1 LDX #MSERR
2006 6CDA 8D 4A BSR PSTRNG
2007 6CDC 39 EEND RTS
2008
2009 *--------------------
2010 *ascii -> bin
2011 6CDD CVBIN EQU *
2012 6CDD 80 30 SUBA #'0
2013 6CDF 2B 11 BMI CVERR
2014 6CE1 81 09 CMPA #9
2015 6CE3 23 0A BLS CVBEND
2016 6CE5 81 11 CMPA #$11
2017 6CE7 25 09 BLO CVERR
2018 6CE9 81 16 CMPA #$16
2019 6CEB 22 05 BHI CVERR
2020 6CED 80 07 SUBA #7
2021 6CEF CVBEND
2022 6CEF 1C FE ANDCC #$FE reset C
2023 6CF1 39 RTS
2024 6CF2 1A 01 CVERR ORCC #$01 set C
2025 6CF4 39 RTS
2026
2027 *--------------------
2028 *add 2bytes to 4bytes
2029 * X,X+1,X+2,X+3 + Y,Y+1
2030 * data X is big endian
2031 * data Y is little endian
2032 6CF5 ADD42 EQU *
2033 6CF5 34 36 PSHS A,B,X,Y
2034 6CF7 32 7C LEAS -4,S
2035 6CF9 C6 04 LDB #4
2036 6CFB A6 80 AD1 LDA ,X+
2037 6CFD A7 E0 STA ,S+
2038 6CFF 5A DECB
2039 6D00 26 F9 BNE AD1
2040
2041 *add (lower)
2042 6D02 A6 A0 LDA ,Y+
2043 6D04 AB E2 ADDA ,-S
2044 6D06 A7 E4 STA ,S
2045 6D08 24 02 BCC AD2
2046 6D0A 6C 7F INC -1,S
2047 *add (upper)
2048 6D0C A6 A4 AD2 LDA ,Y
2049 6D0E AB E2 ADDA ,-S
2050 6D10 A7 E4 STA ,S
2051 6D12 24 02 BCC AD3
2052 6D14 6C 7F INC -1,S
2053 6D16 30 1C AD3 LEAX -4,X
2054 6D18 32 7E LEAS -2,S
2055 6D1A C6 04 LDB #4
2056 6D1C A6 E0 AD4 LDA ,S+
2057 6D1E A7 80 STA ,X+
2058 6D20 5A DECB
2059 6D21 26 F9 BNE AD4
2060 6D23 35 36 PULS A,B,X,Y
2061 6D25 39 RTS
2062
2063 *--------------------
2064 * pstring
2065 6D26 PSTRNG EQU *
2066 6D26 34 02 PSHS A
2067 6D28 A6 80 PSLOP LDA ,X+
2068 6D2A 81 04 CMPA #4
2069 6D2C 27 05 BEQ PSEND
2070 6D2E BD FBBB JSR OUTCHA
2071 6D31 20 F5 BRA PSLOP
2072 6D33 35 02 PSEND PULS A
2073 6D35 39 RTS
2074
2075 *--------------------
2076 *disp MM-DD-YY
2077 *indata A(Low),B(High)
2078 6D36 DSPYMD EQU *
2079 6D36 1E 89 EXG A,B
2080 6D38 34 10 PSHS X
2081 6D3A 34 06 PSHS A,B
2082 6D3C C4 E0 ANDB #$E0
2083 6D3E 54 LSRB
2084 6D3F 54 LSRB
2085 6D40 54 LSRB
2086 6D41 54 LSRB
2087 6D42 54 LSRB
2088 6D43 47 ASRA
2089 6D44 24 02 BCC DYMD1
2090 6D46 CB 08 ADDB #8
2091 6D48 F7 603F DYMD1 STB WMDY MM
2092 6D4B 35 06 PULS A,B
2093 6D4D 34 04 PSHS B
2094 6D4F C4 1F ANDB #$1F
2095 6D51 F7 6040 STB WMDY+1 DD
2096 6D54 35 04 PULS B
2097
2098 6D56 44 LSRA
2099 * ASLB
2100 * BCC DYMD2
2101 * INCA
2102 6D57 DYMD2
2103 6D57 80 14 SUBA #20 A+1980-2000
2104 6D59 B7 6041 STA WMDY+2 YY
2105
2106 *disp MM-DD-YY
2107 6D5C 86 20 LDA #SPC
2108 6D5E BD FBBB JSR OUTCHA
2109 6D61 8E 603F LDX #WMDY
2110 6D64 A6 80 LDA ,X+
2111 6D66 8D 14 BSR DB2ASC MM
2112 6D68 86 2D LDA #'-
2113 6D6A BD FBBB JSR OUTCHA
2114 6D6D A6 80 LDA ,X+
2115 6D6F 8D 0B BSR DB2ASC DD
2116 6D71 86 2D LDA #'-
2117 6D73 BD FBBB JSR OUTCHA
2118 6D76 A6 80 LDA ,X+
2119 6D78 8D 02 BSR DB2ASC YY
2120 6D7A 35 90 PULS X,PC
2121 *
2122 *----------
2123 *convert decimal value to ascii code
2124 *(A:BIN)->ASCII
2125 6D7C DB2ASC EQU *
2126 6D7C 34 06 PSHS A,B
2127 6D7E 1F 89 TFR A,B
2128 6D80 86 30 LDA #$30
2129 6D82 C1 0A DBLOP CMPB #10
2130 6D84 25 05 BLO DB2
2131 6D86 C0 0A SUBB #10
2132 6D88 4C INCA
2133 6D89 20 F7 BRA DBLOP
2134 6D8B BD FBBB DB2 JSR OUTCHA
2135 6D8E 1F 98 TFR B,A
2136 6D90 8B 30 ADDA #$30
2137 6D92 BD FBBB JSR OUTCHA
2138 6D95 35 86 PULS A,B,PC
2139
2140 *disp FILE size
2141 6D97 DSPSIZ EQU *
2142 6D97 34 10 PSHS X
2143 6D99 BE 6042 LDX WFSIZ
2144 6D9C 27 07 BEQ DSS1 if 64k over?
2145 6D9E 8E 706F LDX #MSOVR
2146 6DA1 8D 83 BSR PSTRNG
2147 6DA3 20 40 BRA DSEND
2148
2149 6DA5 DSS1
2150 * LDA #SPC
2151 * JSR OUTCHA
2152 * /1024(400h)
2153 6DA5 B6 6044 LDA WFSIZ+2 under 64k
2154 6DA8 44 LSRA
2155 6DA9 44 LSRA
2156 *disp dec
2157 6DAA 1F 89 TFR A,B
2158 6DAC 81 64 CMPA #100
2159 6DAE 23 10 BLS DSS13
2160 6DB0 86 30 LDA #'0
2161 6DB2 C1 64 DSLOP1 CMPB #100
2162 6DB4 25 05 BLO DSS12
2163 6DB6 C0 64 SUBB #100
2164 6DB8 4C INCA
2165 6DB9 20 F7 BRA DSLOP1
2166 6DBB BD FBBB DSS12 JSR OUTCHA
2167 6DBE 20 0B BRA DSS14
2168
2169 *under 100
2170 6DC0 86 20 DSS13 LDA #SPC
2171 6DC2 BD FBBB JSR OUTCHA
2172 6DC5 86 20 LDA #SPC
2173 6DC7 C1 0A CMPB #10
2174 6DC9 25 0B BLO DSS2
2175
2176 6DCB 86 30 DSS14 LDA #'0
2177 6DCD C1 0A DSLOP2 CMPB #10
2178 6DCF 25 05 BLO DSS2
2179 6DD1 C0 0A SUBB #10
2180 6DD3 4C INCA
2181 6DD4 20 F7 BRA DSLOP2
2182
2183 6DD6 BD FBBB DSS2 JSR OUTCHA 10's place
2184 *under 10
2185 6DD9 1F 98 DSS21 TFR B,A
2186 6DDB 8B 31 ADDA #$31 '1
2187 6DDD BD FBBB DSS3 JSR OUTCHA 1's place
2188 6DE0 86 6B LDA #'k
2189 6DE2 BD FBBB JSR OUTCHA
2190 6DE5 86 20 DSEND LDA #SPC
2191 6DE7 BD FBBB JSR OUTCHA
2192 6DEA 35 90 PULS X,PC
2193
2194 *----------
2195 *disp cluster
2196 *return:clusterH,spc,clusterL
2197 6DEC DSPCLS EQU *
2198 6DEC 34 10 PSHS X
2199 6DEE 86 20 LDA #SPC
2200 6DF0 BD FBBB JSR OUTCHA
2201 6DF3 8E 6048 LDX #CLSTH
2202 6DF6 C6 02 LDB #2
2203 6DF8 A6 80 DCLOP1 LDA ,X+
2204 6DFA 17 FF7F LBSR DB2ASC
2205 6DFD 5A DECB
2206 6DFE 26 F8 BNE DCLOP1
2207 6E00 86 20 LDA #SPC
2208 6E02 BD FBBB JSR OUTCHA
2209 6E05 C6 02 LDB #2
2210 6E07 A6 80 DCLOP2 LDA ,X+
2211 6E09 17 FF70 LBSR DB2ASC
2212 6E0C 5A DECB
2213 6E0D 26 F8 BNE DCLOP2
2214 6E0F 35 90 PULS X,PC
2215
2216 *----------
2217 6E11 FNMIN EQU *
2218 *clr buf
2219 6E11 8E 605A LDX #FNAME+11
2220 6E14 C6 0B LDB #8+3
2221 6E16 86 20 LDA #SPC
2222 6E18 A7 82 FNIN0 STA ,-X
2223 6E1A 5A DECB
2224 6E1B 26 FB BNE FNIN0
2225
2226 *fname in
2227 6E1D 34 24 PSHS B,Y
2228 6E1F 108E 604F LDY #FNAME
2229 6E23 C6 08 LDB #8
2230 6E25 8D 0D BSR LININ
2231 6E27 86 20 LDA #$20
2232 6E29 A7 3F STA -1,Y
2233 6E2B 35 A4 PULS B,Y,PC
2234
2235 *--------------------
2236 *
2237 6E2D BD FBB8 INOUTC JSR INCHA
2238 6E30 BD FBBB JSR OUTCHA
2239 6E33 39 RTS
2240
2241 *--------------------
2242 * line input
2243 * input: B:count, Y:buf
2244 * output: FILBUF (terminate $00)
2245 * temp buf $043D - $053C
2246 6E34 LININ EQU *
2247 6E34 0F BF CLR $BF
2248 6E36 BD D807 JSR LININP
2249
2250 6E39 8E 043D LDX #$043D
2251 6E3C A6 80 LINLOP LDA ,X+
2252 6E3E A7 A0 STA ,Y+
2253 6E40 5A DECB
2254 6E41 27 03 BEQ LEND
2255 6E43 4D TSTA
2256 6E44 26 F6 BNE LINLOP
2257 6E46 39 LEND RTS
2258
2259 *
2260 **************************************************
2261 *========== parameter ==========
2262 6E47 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
2263 6E4D 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
2264 6E53 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
2265 6E59 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
2266 6E5F 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
2267 6E65 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
2268 6E6B 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
2269 6E71 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
2270 6E77 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
2271 *
2272 6E7D 43 MCMD0 FCC /CMD0/,CR,LF
2273 6E83 04 FCB 4
2274 6E84 43 MCMD8 FCC /CMD8/,CR,LF
2275 6E8A 04 FCB 4
2276 6E8B 43 MCMD58 FCC /CMD58/,CR,LF
2277 6E92 04 FCB 4
2278 6E93 43 MCMD55 FCC /CMD55/,CR,LF
2279 6E9A 04 FCB 4
2280 6E9B 41 MCMD41 FCC /ACMD41/,CR,LF
2281 6EA3 04 FCB 4
2282 6EA4 43 MCMD9 FCC /CMD9/,CR,LF
2283 6EAA 04 FCB 4
2284 *
2285 6EAB 0D MSMENU1 FCC CR,LF,CR,LF,/Main MENU/
2286 6EB8 0D FCC CR,LF,/D)ir, L)oad, save B)asic, save M)code, K)ill, S)etSD, O)ption, Q)uit: /
2287 6F00 04 FCB 4
2288 6F01 0D MSMENU2 FCC CR,LF,CR,LF,/Option MENU/
2289 6F11 0D FCC CR,LF,/1:Read Sct, 2:Disp SD data, 3:Disp MBR, 4:Disp BPB, 5:Disp FAT, 0:Return: /
2290 6F5D 04 FCB 4
2291 6F5E 53 MSSCT FCC /SctNo: /
2292 6F65 04 FCB 4
2293 6F66 0D MSSD0 FCC CR,LF,/SD Card/
2294 6F6F 04 FCB 4
2295 6F70 0D MSSD1 FCC CR,LF,/SDHC Card/
2296 6F7B 04 FCB 4
2297 6F7C 0D MSINIT FCC CR,LF,CR,LF,/SD Card setting.../
2298 6F92 04 FCB 4
2299 6F93 53 MERR FCC /Setting error!/,CR,LF
2300 6FA3 04 FCB 4
2301 6FA4 49 MSERR FCC /Input error!/,CR,LF
2302 6FB2 04 FCB 4
2303 6FB3 0D MSOFS FCC CR,LF,/Sector no is:/
2304 6FC2 04 FCB 4
2305 6FC3 0D MSBPB FCC CR,LF,/ BPB: /
2306 6FCB 04 FCB 4
2307 6FCC 0D MSFAT FCC CR,LF,/ FAT: /
2308 6FD4 04 FCB 4
2309 6FD5 0D MSDIR FCC CR,LF,/ DIR: /
2310 6FDD 04 FCB 4
2311 6FDE 0D MSCL2 FCC CR,LF,/ 1stCLUSTER: /
2312 6FED 04 FCB 4
2313 6FEE 0D MSINFN FCC CR,LF,CR,LF,/ FileName: /
2314 6FFD 04 FCB 4
2315 6FFE 0D MSMSV FCC CR,LF,CR,LF,/ FileName & Param: /
2316 7015 04 FCB 4
2317 7016 0D MSLDNG FCC CR,LF,/ Loading /
2318 7021 04 FCB 4
2319 7022 0D MSWTNG FCC CR,LF,/ Writing /
2320 702D 04 FCB 4
2321 702E 0D MSLDED FCC CR,LF,/ Load end./
2322 703A 04 FCB 4
2323 703B 0D MSWTED FCC CR,LF,/ Write end./
2324 7048 04 FCB 4
2325 7049 0D MSNOFL FCC CR,LF,/ Not exist!/
2326 7056 04 FCB 4
2327 7057 0D MSNXTP FCC CR,LF,"Next page (SP:Next): "
2328 706E 04 FCB 4
2329 706F 3E MSOVR FCC />64k/
2330 7073 04 FCB 4
2331 7074 0D MSKILL FCC CR,LF," Kill OK?(Y/N): "
2332 7086 04 FCB 4
2333 7087 0D MSEXST FCC CR,LF," Exist! Over Write?(Y/N): "
2334 70A3 04 FCB 4
2335 70A4 0D MSMCOF FCC CR,LF," -$2000 Offset?(Y/N): "
2336 70BC 04 FCB 4
2337
2338 **************************************************
2339
2340 END START
0 error(s), 0 warning(s) is detected.
Label address
ABLOP 68D9 ACMD41 6E71 AD1 6CFB AD2 6D0C AD3 6D16
AD4 6D1C ADD0 6B52 ADD1 6B60 ADD2 6B68 ADD3 6B70
ADD40H 6B50 ADD42 6CF5 ADX0 6B41 ADX1 6B47 ADX2 6B4B
ADX3 6B4F APLUSB 690D ASC2BIN 679D ASC411 620D ASCMD41 6200
BASADP 0033 BASAEP 0035 BASEXP 605D BI21 6C5C BI22 6C62
BUSY 6AB9 CALCHC 6C28 CALCSD 6C1D CALLOP 6959 CKRS 6AAF
CL1 6CA2 CLEND 6CB2 CLLOP 6CAD CLOP 6C80 CLRDIR 6725
CLSTH 6048 CLSTL 604A CMD0 6E47 CMD1 6E4D CMD17 6E53
CMD24 6E59 CMD55 6E6B CMD58 6E65 CMD8 6E5F CMD9 6E77
CMPEND 65F4 CMPFN 65D9 CMPLOP 65E1 CNT 604C CNV1 67ED
CNV2 67F9 CNVBUF 6077 CNVSUB 67E5 CR 000D CSRON FBF7
CVBEND 6CEF CVBIN 6CDD CVERR 6CF2 CVT1 6CBB DB2 6D8B
DB2ASC 6D7C DBLOP 6D82 DCLOP1 6DF8 DCLOP2 6E07 DELMK 00E5
DEVNO 00BF DIRENT 601F DIRGET 6891 DIROFS 605B DLOP1 6873
DPGNO 605A DSEND 6DE5 DSLOP1 6DB2 DSLOP2 6DCD DSPB1 6BB5
DSPB2 6BB7 DSPB3 6BC8 DSPBIN 6C48 DSPBPB 63DB DSPBUF 6BAB
DSPC1 6474 DSPCKE 642C DSPCLS 6DEC DSPDIR 63FF DSPED 6890
DSPEND 64AC DSPFAT 63ED DSPFL0 640B DSPFL1 641C DSPFL2 6436
DSPFL3 6438 DSPFL4 6447 DSPFL5 6494 DSPFL6 64A0 DSPMBR 6387
DSPSDDAT 62F3 DSPSIZ 6D97 DSPYMD 6D36 DSS1 6DA5 DSS12 6DBB
DSS13 6DC0 DSS14 6DCB DSS2 6DD6 DSS21 6DD9 DSS3 6DDD
DYMD1 6D48 DYMD2 6D57 EEND 6CDC EREND0 6CD5 EREND1 6CD7
ESC 001B EXIST 6852 EXSTFL 6065 FILBUF 607B FILL 6B38
FILOP 6B3A FILSIZ 6046 FMDAT 02FA FNAME 604F FNIN0 6E18
FNMIN 6E11 GET1 6392 GET2 6394 GET8CH 6C7C GETBPB 63C2
GETD1 6BE9 GETDAT 6BE5 GETFDT 65F6 GETMBR 63A5 GR00 617A
GR2580 623A GR2581 6251 GR2582 6253 GR410 6215 GR550 61F6
GR580 61CC GR581 61D6 GR582 61D8 GR80 619C GR81 61AE
GR90 6306 GR91 6312 GTBLOP 63CD GTF1 6615 GTF2 6618
ILOP1 6276 INCHA FBB8 INCX4 6B41 INEND 6C8E INIT 60BF
INOUTC 6E2D INPBUF 606F INPFLDAT 6780 INSCT 6BFF ISTT 6160
KILEND 66C0 KILFILE 666C KILSUB 6685 KL1 66AA KL2 66B8
LD1 6648 LD2 665C LD3 64D2 LD41 64F7 LD5 6510
LD8 6552 LD80 6570 LD81 6574 LD9 6577 LDE0 6597
LDE1 659D LDEND 6587 LDFILE 64AD LDFL0 6624 LDFL1 6630
LDFL5 6654 LDFLE 666B LDLOP 6520 LDNEND 65A1 LEND 6E46
LF 000A LININ 6E34 LININP D807 LINLOP 6E3C MAIN 609B
MATCH 65EE MCADP 605F MCAEP 6061 MCEXP 6063 MCFLG 604D
MCMD0 6E7D MCMD41 6E9B MCMD55 6E93 MCMD58 6E8B MCMD8 6E84
MCMD9 6EA4 MEMSET 65A9 MENU 60C2 MENU1 60D9 MENU2 60E2
MENU3 60EB MENU4 60F4 MENU5 60FD MENU6 6105 MENU7 610D
MERR 6F93 MKF1 68B0 MKF2 68B4 MKFLDT 6897 MS0 65C0
MS1 65C4 MS3 65D3 MSBPB 6FC3 MSCL2 6FDE MSDIR 6FD5
MSERR 6FA4 MSEXST 7087 MSFAT 6FCC MSINFN 6FEE MSINIT 6F7C
MSKILL 7074 MSLDED 702E MSLDNG 7016 MSLOP 65C6 MSMCOF 70A4
MSMENU1 6EAB MSMENU2 6F01 MSMSV 6FFE MSNOFL 7049 MSNXTP 7057
MSOFS 6FB3 MSOVR 706F MSSCT 6F5E MSSD0 6F66 MSSD1 6F70
MSWTED 703B MSWTNG 7022 NOEXST 6855 NOFEND 66CE NOTM 65F2
OPMEN10 6144 OPMEN6 6124 OPMEN7 612C OPMEN8 6134 OPMEN9 613C
OPMENU 6115 OUTCHA FBBB PBCTL FD9F PBDAT FD9E PCRLF 6C71
PSEND 6D33 PSLOP 6D28 PSTRNG 6D26 RD1 6B88 RD1SCT 6B75
RD2 6B8F RD3 6B9F RDSCT 6374 RESDAT 6008 RPT41 61E1
RWBUF 5E00 SC01 6171 SC2581 6232 SC551 61EE SC581 61C4
SC80 6194 SC91 62FE SCLOP1 632F SCLOP2 6342 SCLOP3 6355
SCLOP4 6368 SCMD0 6169 SCMD258 6225 SCMD55 61E1 SCMD58 61B7
SCMD8 6187 SCTBPB 600A SCTCLT 601A SCTDIR 6012 SCTDSV 6016
SCTFAT 600E SCTN0 6004 SCTN1 6005 SCTN2 6006 SCTN3 6007
SCTPCL 601E SD1 6267 SDERR 614C SDHC 6009 SDINIT 6153
SDW1 6A7B SDW2 6A83 SETCKH 6C3F SETCKL 6C36 SETCL 683D
SETFNM 670D SETSCT 6C07 SETSNO 63B5 SETX 682C SFATED 6848
SFLOP 6C9B SKP1 62AD SKP2 62EA SKPDLM 6796 SNDD1 6BD0
SNDDAT 6BC9 SNDDT1 6A9E SPC 0020 SRC0 680C SRC00 6849
SRCDIR 6858 SRCDLM 678D SRCFAT 6800 SRCFL0 6867 SRCFL1 686A
SRCFL5 6885 SRCLOP 6815 SRDLM1 678F SRLOP1 67AE SRLOP2 67C6
START 6000 STDATE 68D0 STTADR 6000 TPGFLG 604E TRANS 6B2D
TRLOP 6B2F TXTADR 2000 VN 6003 WFSIZ 6042 WK1 6067
WK2 6069 WK3 606B WK4 606D WMDY 603F WR2 6995
WR3 69BA WR4 69F0 WR5 69F2 WR6 69F4 WRB0 66D5
WRB1 66F3 WRBEND 670C WRBFILE 66C1 WRDLOP 6AD7 WRDSKP 6ADC
WREND 69FF WRF1 6B10 WRF2 6B13 WRF3 6B29 WRFL1 671A
WRFL2 6724 WRFLP2 6715 WRLOP 69A5 WRLOP1 6A44 WRM1 674D
WRMEND 677F WRMFILE 6733 WRS0 6A25 WRS1 6A3A WRS2 6A63
WRSUB 6A06 WRT3 694C WRT4 6951 WRT5 6954 WRTDIR 6AC4
WRTF1 692C WRTF2 6930 WRTF3 6971 WRTF4 6973 WRTFAT 6AF1
WRTFIL 691F WRTSD 6A64 WRTSD1 6A67 WSPFL0 6ACF WWCLOP 6A10
</-temp></pre>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><div><br /></div><div><br /></div><div>作成したプログラム一式を<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmWO6go7KCFy6rd9b" target="_blank"><span style="color: #2b00fe;"><strike>OneDrive</strike></span></a>に上げておきます。内容は上記の4プログラム(SDRWFM, STARTUP, RTC_SET, SDTRS)に加えて、以前公開したRTCの読み書きプログラム(RTC_RD, RTC_WR)と簡単な使用法の説明です。</div><div><br /></div><div><div><br /></div></div><h4 style="text-align: left;">最後に</h4><div><br /></div><div>以前から6809のアセンブラのみでSDカードの読み書きを実現したいと思っていました。</div><div>ネット検索をすると、ArduinoなどのマイコンのFATライブラリを使用しているものがほとんどで、8ビットのレトロパソコンにマイコンを使うのは...と躊躇していました。</div><div>そんな時に中日電工の<a href="https://userweb.alles.or.jp/chunichidenko/sdif1.html" target="_blank"><span style="color: #2b00fe;">菱田さんのブログ</span></a>を見て、Z80でもできるのだから68でもできるはずと一歩を踏み出してみる決心がつきました。</div><div>さらに検索してみると、Z80系ではマイコンを使用せずにSDカードをコントロールしている実践例(<a href="https://twitter.com/chiqlappe" target="_blank"><span style="color: #2b00fe;">ちくらっぺさん</span></a>)を見つけましたが、68系では見つけることができませんでしたので、ちょっと残念でしたが、逆にそれならということでやる気を奮い立たせて、ここまで何とかやってきました。</div><div><br /></div><div>大前提がWindowsPCとFM-7との間でのファイル交換のためのシステムの実現でしたので、特別な保存形式などを用いずにWindows汎用のファイルシステムで実現する必要があり、例えばタイムスタンプのような、言わば周辺的な部分でも結構手間がかかりました。</div><div><br /></div><div>6809のアセンブラで4KBを超えており、もう少しで$71D5からのDISKコードとぶつかりそうですので、FM-7ではこれ以上の機能拡張は無理かとも思います。裏RAMを使う手もあるのでしょうが、常駐ソフトではなく、必要な時に起動するユーティリティソフトのつもりですので、ふさわしくないように思います。それよりも77AVに移植してAV系でも使用できる方が用途が拡がる気がしますので、いつか実現したいです。</div><div><br /></div><div>プログラム作成に当たって参考にしたブログ等を、前回も書きましたが、もう一度感謝を込めて期しておきます。ありがとうございました。</div><div><br /></div><div>◎中日電工の菱田さんのブログ ・・・SD,SDHCの読み書きの手法(Z80で)</div><div><p>◎ELM by ChaNさんのブログ ・・・SD,SDHCに関するマニュアル的資料(英文)</p><p>◎FM-7 F-BASIC解析マニュアル フェーズ II ・・・F-BASICの解析 (ネット版を参照しました。これがなければアスキーセーブされた F-BASICのプログラム読み込みは実現できませんでした。)</p><p><br /></p></div><div class="separator" style="clear: both;"><br /></div></div></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-9681056851650228702023-04-16T19:07:00.019+09:002023-04-16T22:14:07.998+09:00FM-7にRTCとSDを接続する試み(SDカード編 その3 ほぼ完成!)<h4 style="text-align: left;"><br /> ようやくSDカードに書き込むことができました。</h4><p>まだ制約事項はありますが、何とかSDカードにF-BASICファイルや機械語ファイルの読み出し・書き込みができるようになりました。</p><p><br /></p><p>改めて、使用したRTC-SDカード基板を示します。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJOTklfey-BwzIKcBl9fCWecvph1LZFNYZjCtxlSLvguKYq18VwjMpzd56Av96Zs6KI9WJ2ep3eM35h69uYg-aySsywVR7qJ5FMDf7-kq5OxADYCbbxgmhZ5XI_cSAgBsztt0RQeCCNRPVd_81wKu5nimw_c3_cqq5BM3Bm6k1xg24nF-mgehncQEl/s4032/IMG_3789.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJOTklfey-BwzIKcBl9fCWecvph1LZFNYZjCtxlSLvguKYq18VwjMpzd56Av96Zs6KI9WJ2ep3eM35h69uYg-aySsywVR7qJ5FMDf7-kq5OxADYCbbxgmhZ5XI_cSAgBsztt0RQeCCNRPVd_81wKu5nimw_c3_cqq5BM3Bm6k1xg24nF-mgehncQEl/w300-h400/IMG_3789.JPG" width="300" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RTC-SDカード</td></tr></tbody></table><p></p><p><br /></p><p>回路図は以下のようですが、LCD等も追加できるようにレベル変換ICを余分に搭載してあります。</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUmfR2Kl7bFinmoibh90bBRIfUvi2AmMUc_TurxnnibT8NG_A2d2q1XQAdRhqopzDP5RhuldNGIOlR0I_hC-D6DW44tk6bKwweyHVC1pkmnczO0eQwPGJbr2Kcf2gaRP7jAtj8xUAZ8TE_nWhV-Qk8HMChrpwpIqWKP2pBtG-FNbvzj9gu9_pBOell/s2339/RTC_SD.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUmfR2Kl7bFinmoibh90bBRIfUvi2AmMUc_TurxnnibT8NG_A2d2q1XQAdRhqopzDP5RhuldNGIOlR0I_hC-D6DW44tk6bKwweyHVC1pkmnczO0eQwPGJbr2Kcf2gaRP7jAtj8xUAZ8TE_nWhV-Qk8HMChrpwpIqWKP2pBtG-FNbvzj9gu9_pBOell/w400-h283/RTC_SD.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">回路図</td></tr></tbody></table><br /><p><br /></p><p>実現できた機能をメニューで示します。</p><h4 style="text-align: left;"><span>メインメニュー</span></h4><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmUMrPCJejBFjyrXlOe7sSTA6kHG6FjjH2rqGZyL-V0I_B-dhXzFnjIkd9J818mE0miezUw1aMw-6txBgZfrw8KCHT0C7WfI85CJUGspMn9XdRSJP7hLeTFv0KLzhweT9mZ3M55EHx2mWXzxfPPbmAeOAXwD_76D_NVyasyMTfH4pBdR0AWKopHyrH/s4032/IMG_3791.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmUMrPCJejBFjyrXlOe7sSTA6kHG6FjjH2rqGZyL-V0I_B-dhXzFnjIkd9J818mE0miezUw1aMw-6txBgZfrw8KCHT0C7WfI85CJUGspMn9XdRSJP7hLeTFv0KLzhweT9mZ3M55EHx2mWXzxfPPbmAeOAXwD_76D_NVyasyMTfH4pBdR0AWKopHyrH/w400-h300/IMG_3791.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">メインメニュー</td></tr></tbody></table><br /><div><span>1.ディレクトリの表示</span></div><div><span>2.ファイルのロード</span></div><div><span>3.Basicプログラムのセーブ</span></div><div><span>4.機械語ファイルのセーブ</span></div><div><span>5.SD中のファイルの削除</span></div><div><span>6.SDの使用開始</span></div><div><span>7.オプションメニューへ</span></div><div><span>8.終了</span></div><h4><br /></h4><div><h4><span>オプションメニュー</span></h4></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGYGq2M10b19fbvdK8xSiFpund2KDprFaCejXL3Hx_jTQLA5jQAvjaJDvL0czR5jdYnyi--m_X4uZ2GNs_SpSKvyb8Tn_8Yy1MBckTc5ey_xR7LXiyLit7Dt8t55ytUnfTIsR-anbYxQEmOpzv_feQkvWVjnBdhHzfVrYWX2NMmTDpNRCMifqvXi8r/s4032/IMG_3792.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGYGq2M10b19fbvdK8xSiFpund2KDprFaCejXL3Hx_jTQLA5jQAvjaJDvL0czR5jdYnyi--m_X4uZ2GNs_SpSKvyb8Tn_8Yy1MBckTc5ey_xR7LXiyLit7Dt8t55ytUnfTIsR-anbYxQEmOpzv_feQkvWVjnBdhHzfVrYWX2NMmTDpNRCMifqvXi8r/w400-h300/IMG_3792.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">オプションメニュー</td></tr></tbody></table><br /><div><div><span>1.指定セクタ内容の表示</span></div><div><span>2.SDの情報表示</span></div><div><span>3.MBRの表示</span></div><div><span>4.BPBの表示</span></div><div><span>5.FATの表示</span></div><div><span>0.メインメニューへ</span></div><div><span><br /></span></div><div><span><br /></span></div><div><span>機能の一部を画面で紹介します。</span></div><div><span><br /></span></div><div><span>BASICファイルを読み出して、その後リストさせています。もちろん実行もできます。</span></div><div><span><br /></span></div><div><span><br /></span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXISHcq2gxCbLMwO_chNK6XUWEPqox4JTwmM2PhJYSD_aHaMl8A5JVOLCuiX6QE9ZrOBY7qrbVIUjvPKoVPEJ5GARlHaNEsQae8CaVinGTyq6IGPPIZzlKUjsMFm5bxS5K8SYPlIg31-zxHIQN_MT3wvUpGa5Bfwm-GsIUTvv9Ur8uQNZ4tfYzo3Dn/s4032/BASIC%E3%83%AA%E3%83%BC%E3%83%89%E5%BE%8C.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXISHcq2gxCbLMwO_chNK6XUWEPqox4JTwmM2PhJYSD_aHaMl8A5JVOLCuiX6QE9ZrOBY7qrbVIUjvPKoVPEJ5GARlHaNEsQae8CaVinGTyq6IGPPIZzlKUjsMFm5bxS5K8SYPlIg31-zxHIQN_MT3wvUpGa5Bfwm-GsIUTvv9Ur8uQNZ4tfYzo3Dn/w400-h300/BASIC%E3%83%AA%E3%83%BC%E3%83%89%E5%BE%8C.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">BASICファイルの読み込み後にリスト</td></tr></tbody></table></div><div><span><br /></span></div><div><span><br /></span></div><div>BASICファイルを書き込んでいます。ファイル名の入力のみでOKです。</div><div><span><br /></span></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl0OEnacbT5CtuwoPNN6eyP7q1zguoiPdladWrPRPVD-8OsW4gHK5W-ksQrtrF5na32yJpt1CtGO3jNMnMr78VveJDPgxAsJq2kSyuyi9AIEdFhkJLcbVIt3XjOq9Vu5FZ5_nGqJiey8wGuGv3unfKo64ZzXllXIlo2d5_tFq9o9F8k85CuSpB4-hC/s4032/BASIC%E3%83%A9%E3%82%A4%E3%83%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl0OEnacbT5CtuwoPNN6eyP7q1zguoiPdladWrPRPVD-8OsW4gHK5W-ksQrtrF5na32yJpt1CtGO3jNMnMr78VveJDPgxAsJq2kSyuyi9AIEdFhkJLcbVIt3XjOq9Vu5FZ5_nGqJiey8wGuGv3unfKo64ZzXllXIlo2d5_tFq9o9F8k85CuSpB4-hC/w400-h300/BASIC%E3%83%A9%E3%82%A4%E3%83%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">BASICファイルの書き込み</td></tr></tbody></table><span><br /></span></div><div><span><br /></span></div><div><span>機械語ファイルを</span>書き込んでいます。ファイル名に続いて開始、終了、実行アドレスを入力します。</div><div><br /></div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirODjDGKuObFVoAlItYHkIFIJaI7fq2Lfca0AUw9APQRnE5YqOt8lDs-fVKtgyh-5TY_1FH7bfk_9ifuoexYtzkabRpFFRVVYEM_x9jkKcw16kZcJy0gTcNCJYI0oKVm3ZWJYs60R9OS8KNV71GJD9lHKb_l5g_atclOuGSjeEm18WFD0xN2KmXk6W/s4032/%E6%A9%9F%E6%A2%B0%E8%AA%9E%E3%83%A9%E3%82%A4%E3%83%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirODjDGKuObFVoAlItYHkIFIJaI7fq2Lfca0AUw9APQRnE5YqOt8lDs-fVKtgyh-5TY_1FH7bfk_9ifuoexYtzkabRpFFRVVYEM_x9jkKcw16kZcJy0gTcNCJYI0oKVm3ZWJYs60R9OS8KNV71GJD9lHKb_l5g_atclOuGSjeEm18WFD0xN2KmXk6W/w400-h300/%E6%A9%9F%E6%A2%B0%E8%AA%9E%E3%83%A9%E3%82%A4%E3%83%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">機械語ファイルの書き込み</td></tr></tbody></table><br /><br />書き込み時のファイル名が既に存在する場合は重ね書きの確認メッセージが出ます。<br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWFT-zlH3_8zfkZ4m-QRFQsBmXkVyjdNIQC4QeVK67-6Fea8ZsB-JG5dV5E-Lubda_iP4ieTT33EAZPJKoQJQxSo-yVEphS8TBh6UhvYkz4YRhBrULX0PO_Lj9weX-I0Ut9X6A48hIm8vzVm9R9wiwnCHxjaNOFaAP6S91hqrsorTJmobH08RZ9rVG/s4032/%E6%A9%9F%E6%A2%B0%E8%AA%9E%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%88.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWFT-zlH3_8zfkZ4m-QRFQsBmXkVyjdNIQC4QeVK67-6Fea8ZsB-JG5dV5E-Lubda_iP4ieTT33EAZPJKoQJQxSo-yVEphS8TBh6UhvYkz4YRhBrULX0PO_Lj9weX-I0Ut9X6A48hIm8vzVm9R9wiwnCHxjaNOFaAP6S91hqrsorTJmobH08RZ9rVG/w400-h300/%E6%A9%9F%E6%A2%B0%E8%AA%9E%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%88.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">機械語ファイルの書き込み2</td></tr></tbody></table><br /><br /><span>なお、確認メッセージはBASICファイルの書き込み時やファイルの削除時にも出ます。</span></div><div><span><br /></span></div><div><br /></div></div><h4>実現できた機能をまとめると</h4><p>1.SDカードとSDHCカードに対応している。</p><p>2.Windows上でSDカードに書き込んだファイルが読み込める。</p><p>3.FM-7上でプログラムファイル、機械語ファイルやデータファイルをSDカードに書き込める。</p><p>4.バイナリセーブされたF-BASICのプログラムファイルと機械語ファイルが扱える。</p><p>5.コマンドとしては F-BASICの FILES、LOAD、LOADM、SAVE、SAVEM、KILLに相当するものが実現できている。</p><p>6.オプション機能として、SDカード上のFAT、DIRなどのセクタ表示機能がある。</p><p><br /></p><p>使用上の注意点です</p><p>ファイル保存時のタイムスタンプはFM-7が保存しているデータに依存しているのですが、FM-7の時計機能はバッテリバックアップされていませんので、起動時にリセットされてしまいます。そのため、本プログラムを起動する前に、時刻設定プログラム RTC_WRを使用して時刻を設定する必要があります。</p><p>また、本プログラムを起動する前に CLEAR ,&H5DFF を実行しておく必要があります。</p><p><br /></p><h4>制約事項は</h4><p>F-BASICでの使用が前提なので下記の1,2,3,4はそれに合わせたものです。</p><p>1.20KBを超えるような大きなファイルには対応していない。</p><p>2.ディレクトリには対応していない。</p><p>3.F-BASICと同様、ファイル名には拡張子をつけない。</p><p>(あっても良いがチェックしていないので、本ソフトでは扱えない。)</p><p>4.機械語ファイルはF-BASICのディスク保存形式であること。</p><p>5.ファイル名に小文字は使えない。(ロングファイルネームには対応していないので。)</p><p>6.F-BASICのプログラムファイルは中間言語に変換されたもののみで、アスキーセーブされたファイルは扱えない。(プログラムエリアに直接書き込んでいるため)</p><p>7.SDHCカードは16GBまでしか動作確認できていない。(何故か手持ちの32GBは読めない...)</p><p><br /></p><div style="text-align: left;">作成したプログラムを下に示しておきます。</div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="SDRWFM">0001 *
0002 * SDRWFM.TXT
0003 *
0004 * SD Read/Write for FM-7
0005 *
0006 * use RTC & SD Card
0007 *
0008 * 6821(PIA) Port A -- RTC (I2C Mode)
0009 *
0010 * SBC RTC Ext IO
0011 * CA2 2 -- -- HV4 LV4 -- IO1
0012 * PA0 3 -- SCL -- HV1 LV1 -- IO4
0013 * PA1 4 -- -- HV2 LV2 -- IO3
0014 * PA7 10 -- SDA -- HV3 LV3 -- IO2
0015 * GND -- -- -- GND
0016 * -- -- -- 3V3
0017 *
0018 *
0019 * 6821(PIA) Port B -- SD (SPI Mode)
0020 *
0021 * SBC SD
0022 * CB2 12 -- HV4 LV4 -- SCK
0023 * PB0 13 -- HV1 LV1 -- CS
0024 * PB1 14 -- HV2 LV2 -- MISO
0025 * PB7 20 -- HV3 LV3 -- MOSI
0026 * GND 31 -- -- GND
0027 * VCC 33 -- -- VCC
0028 *
0029 * cf. all data line use level converter
0030 *
0031 * PB output mode
0032 * CB2 1bit output
0033 *
0034 * READ/WRITE BUFFER $5E00 - 5FFF
0035 *
0036 * Fix date routine '2023.04.12
0037 * Implement write cmd '2023.04.07
0038 * Add command '2023.03.14
0039 * Change use Port B '2023.03.07
0040 * Original version '2022.06.11
0041 * Copyright by Y.Yamamoto
0042 *
0043 6000 STTADR EQU $6000
0044
0045 FBB8 INCHA EQU $FBB8 for FM-7
0046 FBBB OUTCHA EQU $FBBB for FM-7
0047 FBF7 CSRON EQU $FBF7 for FM-7
0048 D807 LININP EQU $D807 for FM-7 (to $043D- )
0049 00BF DEVNO EQU $BF for FM-7
0050 000D CR EQU $0D
0051 000A LF EQU $0A
0052 0020 SPC EQU $20
0053 001B ESC EQU $1B
0054
0055 5E00 RWBUF EQU STTADR-$200
0056
0057 02FA FMDAT EQU $02FA date of FM-7
0058 FD9E PBDAT EQU $FD9E for FM-7
0059 FD9F PBCTL EQU PBDAT+1
0060 0033 BASADP EQU $33 (33,34) pointer for F-BASIC top
0061 0035 BASAEP EQU $35 (35,36) pointer for F-BASIC end
0062 2000 TXTADR EQU $2000 load adr for TEXT
0063 00E5 DELMK EQU $E5 delete mark
0064
0065 6000 ORG STTADR
0066
0067 6000 16 0098 START LBRA MAIN
0068 6003 01 VN FCB 1 version no
0069 6004 00 SCTN0 FCB 0 top adrs of sct
0070 6005 00 SCTN1 FCB 0
0071 6006 00 SCTN2 FCB 0
0072 6007 00 SCTN3 FCB 0
0073 6008 00 RESDAT FCB 0 response data
0074 6009 00 SDHC FCB 0 sd:0,sdhc:1
0075
0076 600A 0000 SCTBPB FDB 00 sct no of BPB(4bytes)
0077 600C 0000 FDB 00
0078 600E 0000 SCTFAT FDB 00 sct no of FAT#1(4bytes)
0079 6010 0000 FDB 00
0080 6012 0000 SCTDIR FDB 00 sct no of DIR(4bytes)
0081 6014 0000 FDB 00
0082 6016 0000 SCTDSV FDB 00 save sct no of DIR(4bytes)
0083 6018 0000 FDB 00
0084 601A 0000 SCTCLT FDB 00 sct no of top CLUSTER(4bytes)
0085 601C 0000 FDB 00 if SD:#2, SDHC:#3
0086 601E 00 SCTPCL FCB 0 sct per cluster
0087 601F FF DIRENT RMB 32 directory entry
0088 603F FF WMDY RMB 3 mon,day,year
0089 6042 FF WFSIZ RMB 4 file size(4bytes)
0090 6046 FF FILSIZ RMB 2 file size
0091 6048 0000 CLSTH FDB 00 cluster High
0092 604A 0000 CLSTL FDB 00 cluster Low
0093 604C 00 CNT FCB 0
0094 604D 00 MCFLG FCB 0 0:machine code, $FF,$FE:binary save 1:else
0095 604E 00 TPGFLG FCB 0 1:top page 0:else
0096 604F FF FNAME RMB 11 file name(8+3)
0097 605A 00 DPGNO FCB 0 page no of empty dir entry
0098 605B 0000 DIROFS FDB 00 offset of empty dir entry
0099 605D 0000 BASEXP FDB 00 basic exe adr
0100 605F 0000 MCADP FDB 00 machine code start adr
0101 6061 0000 MCAEP FDB 00 machine code end adr
0102 6063 0000 MCEXP FDB 00 machine dode exec adr
0103 6065 0000 EXSTFL FDB 00 ofset of exist dir entry
0104 6067 0000 WK1 FDB 00
0105 6069 0000 WK2 FDB 00
0106 606B 0000 WK3 FDB 00
0107 606D 0000 WK4 FDB 00
0108
0109 606F FF INPBUF RMB 8
0110 6077 FF CNVBUF RMB 4
0111 607B FF FILBUF RMB 32
0112
0113 609B MAIN EQU *
0114 *=====reset pia=====
0115 *portB:output
0116 609B 86 30 LDA #$30
0117 609D B7 FD9F STA PBCTL select ddra, cb2:0
0118 60A0 86 FD LDA #$FD pb0,7:out,pb1:in
0119 60A2 B7 FD9E STA PBDAT set output mode
0120 60A5 86 34 LDA #$34
0121 60A7 B7 FD9F STA PBCTL select peripheral,cb2:0
0122
0123 *for pia exist check
0124 60AA 86 55 LDA #$55 test data
0125 60AC B7 FD9E STA PBDAT
0126 60AF B6 FD9E LDA PBDAT
0127 60B2 84 FD ANDA #$FD pb1=0
0128 60B4 81 55 CMPA #$55
0129 60B6 27 07 BEQ INIT
0130 60B8 8E 6F93 LDX #MERR
0131 60BB 17 0C68 LBSR PSTRNG
0132 60BE 39 RTS Return F-BASIC
0133
0134 60BF INIT EQU *
0135 60BF 17 0091 LBSR SDINIT
0136
0137 ****************************************
0138 * MAIN MENU
0139 ****************************************
0140 60C2 MENU EQU *
0141 60C2 8E 6EAB LDX #MSMENU1
0142 60C5 17 0C5E LBSR PSTRNG
0143 60C8 BD FBF7 JSR CSRON cursor on
0144 60CB BD 6E2D JSR INOUTC
0145 60CE 84 DF ANDA #$DF to upper
0146
0147 60D0 81 44 CMPA #'D
0148 60D2 26 05 BNE MENU1
0149 60D4 17 0328 LBSR DSPDIR
0150 60D7 20 E9 BRA MENU
0151 60D9 81 4C MENU1 CMPA #'L
0152 60DB 26 05 BNE MENU2
0153 60DD 17 03CD LBSR LDFILE
0154 60E0 20 E0 BRA MENU
0155 60E2 81 42 MENU2 CMPA #'B
0156 60E4 26 05 BNE MENU3
0157 60E6 17 05D8 LBSR WRBFILE
0158 60E9 20 D7 BRA MENU
0159 60EB 81 4D MENU3 CMPA #'M
0160 60ED 26 05 BNE MENU4
0161 60EF 17 0641 LBSR WRMFILE
0162 60F2 20 CE BRA MENU
0163 60F4 81 4B MENU4 CMPA #'K
0164 60F6 26 05 BNE MENU5
0165 60F8 17 0571 LBSR KILFILE
0166 60FB 20 C5 BRA MENU
0167 60FD 81 53 MENU5 CMPA #'S
0168 60FF 26 04 BNE MENU6
0169 6101 20 50 BRA SDINIT
0170 6103 20 BD BRA MENU
0171 6105 81 4F MENU6 CMPA #'O
0172 6107 26 04 BNE MENU7
0173 6109 20 0A BRA OPMENU
0174 610B 20 B5 BRA MENU
0175 610D 81 51 MENU7 CMPA #'Q
0176 610F 26 B1 BNE MENU
0177 6111 17 0B5D LBSR PCRLF
0178 6114 39 RTS Return F-BASIC
0179
0180 *
0181 6115 OPMENU EQU *
0182 6115 8E 6F01 LDX #MSMENU2
0183 6118 17 0C0B LBSR PSTRNG
0184 611B BD 6E2D JSR INOUTC
0185 611E 80 30 SUBA #$30
0186 6120 26 02 BNE OPMEN6 0?
0187 6122 20 9E BRA MENU
0188
0189 6124 4A OPMEN6 DECA 1?
0190 6125 26 05 BNE OPMEN7
0191 6127 17 024A LBSR RDSCT
0192 612A 20 E9 BRA OPMENU
0193 612C 4A OPMEN7 DECA 2?
0194 612D 26 05 BNE OPMEN8
0195 612F 17 01C1 LBSR DSPSDDAT
0196 6132 20 E1 BRA OPMENU
0197 6134 4A OPMEN8 DECA 3?
0198 6135 26 05 BNE OPMEN9
0199 6137 17 024D LBSR DSPMBR
0200 613A 20 D9 BRA OPMENU
0201 613C 4A OPMEN9 DECA 4?
0202 613D 26 05 BNE OPMEN10
0203 613F 17 0299 LBSR DSPBPB
0204 6142 20 D1 BRA OPMENU
0205 6144 4A OPMEN10 DECA 5?
0206 6145 26 CE BNE OPMENU
0207 6147 17 02A3 LBSR DSPFAT
0208 614A 20 C9 BRA OPMENU
0209
0210 *
0211 614C SDERR EQU *
0212 614C 8E 6F93 LDX #MERR
0213 614F 17 0BD4 LBSR PSTRNG
0214 6152 39 RTS Return F-BASIC
0215
0216 ****************************************
0217 * SD Initialize routine
0218 ****************************************
0219 6153 SDINIT EQU *
0220 *---------- start ----------
0221 6153 8E 6F7C LDX #MSINIT
0222 6156 17 0BCD LBSR PSTRNG
0223 * cs:1,di:1,sck>74ms
0224 6159 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
0225 615B B7 FD9E STA PBDAT
0226 615E C6 50 LDB #80 80times
0227 6160 17 0AD3 ISTT LBSR SETCKL
0228 6163 17 0AD9 LBSR SETCKH
0229 6166 5A DECB
0230 6167 26 F7 BNE ISTT
0231 *
0232 *---------- cmd 0 ----------
0233 6169 SCMD0 EQU *
0234 6169 17 0ACA LBSR SETCKL
0235 616C C6 06 LDB #6
0236 616E 8E 6E47 LDX #CMD0
0237 6171 A6 80 SC01 LDA ,X+
0238 6173 17 0A53 LBSR SNDDAT
0239 6176 5A DECB
0240 6177 26 F8 BNE SC01
0241 *get response
0242 6179 5F CLRB
0243 617A GR00
0244 617A 5A DECB
0245 617B 27 CF BEQ SDERR
0246 617D 17 0A65 LBSR GETDAT
0247 6180 B6 6008 LDA RESDAT
0248 6183 81 01 CMPA #$01
0249 6185 26 F3 BNE GR00
0250 *
0251 *---------- cmd 8 ----------
0252 6187 SCMD8 EQU *
0253 6187 17 0AAC LBSR SETCKL
0254 618A 86 FF LDA #$FF dummy cmd
0255 618C 17 0A3A LBSR SNDDAT
0256 618F C6 06 LDB #6
0257 6191 8E 6E5F LDX #CMD8
0258 6194 A6 80 SC80 LDA ,X+
0259 6196 17 0A30 LBSR SNDDAT
0260 6199 5A DECB
0261 619A 26 F8 BNE SC80
0262 *get response
0263 619C GR80
0264 619C 17 0A46 LBSR GETDAT
0265 619F B6 6008 LDA RESDAT
0266
0267 61A2 17 0A40 LBSR GETDAT
0268 61A5 B6 6008 LDA RESDAT
0269 61A8 81 01 CMPA #$01
0270 61AA 26 F0 BNE GR80
0271 61AC C6 04 LDB #4
0272 61AE 17 0A34 GR81 LBSR GETDAT
0273 61B1 B6 6008 LDA RESDAT
0274 61B4 5A DECB
0275 61B5 26 F7 BNE GR81
0276 *
0277 *---------- cmd 58 ----------
0278 61B7 SCMD58 EQU *
0279 61B7 17 0A7C LBSR SETCKL
0280 61BA 86 FF LDA #$FF dummy cmd
0281 61BC 17 0A0A LBSR SNDDAT
0282 61BF C6 06 LDB #6
0283 61C1 8E 6E65 LDX #CMD58
0284 61C4 A6 80 SC581 LDA ,X+
0285 61C6 17 0A00 LBSR SNDDAT
0286 61C9 5A DECB
0287 61CA 26 F8 BNE SC581
0288 *get response
0289 61CC GR580
0290 61CC 17 0A16 LBSR GETDAT
0291 61CF B6 6008 LDA RESDAT
0292 61D2 81 01 CMPA #$01
0293 61D4 26 F6 BNE GR580
0294 61D6 C6 04 GR581 LDB #4
0295 61D8 17 0A0A GR582 LBSR GETDAT
0296 61DB B6 6008 LDA RESDAT
0297 61DE 5A DECB
0298 61DF 26 F7 BNE GR582
0299 61E1 RPT41 EQU *
0300 *---------- cmd 55 ----------
0301 61E1 SCMD55 EQU *
0302 61E1 17 0A52 LBSR SETCKL
0303 61E4 86 FF LDA #$FF dummy cmd
0304 61E6 17 09E0 LBSR SNDDAT
0305 61E9 C6 06 LDB #6
0306 61EB 8E 6E6B LDX #CMD55
0307 61EE A6 80 SC551 LDA ,X+
0308 61F0 17 09D6 LBSR SNDDAT
0309 61F3 5A DECB
0310 61F4 26 F8 BNE SC551
0311 *get response
0312 * CLRB
0313 61F6 GR550
0314 61F6 17 09EC LBSR GETDAT
0315 61F9 B6 6008 LDA RESDAT
0316 61FC 81 01 CMPA #$01
0317 61FE 26 F6 BNE GR550
0318
0319 *---------- acmd 41 ----------
0320 6200 ASCMD41 EQU *
0321 6200 17 0A33 LBSR SETCKL
0322 6203 86 FF LDA #$FF dummy cmd
0323 6205 17 09C1 LBSR SNDDAT
0324 6208 C6 06 LDB #6
0325 620A 8E 6E71 LDX #ACMD41
0326 620D A6 80 ASC411 LDA ,X+
0327 620F 17 09B7 LBSR SNDDAT
0328 6212 5A DECB
0329 6213 26 F8 BNE ASC411
0330 *get response
0331 6215 GR410
0332 6215 17 09CD LBSR GETDAT
0333 6218 B6 6008 LDA RESDAT
0334 621B 17 09C7 LBSR GETDAT
0335 621E B6 6008 LDA RESDAT
0336 6221 81 00 CMPA #$00
0337 6223 26 BC BNE RPT41
0338
0339 *---------- second cmd 58 ----------
0340 6225 SCMD258 EQU *
0341 6225 17 0A0E LBSR SETCKL
0342 6228 86 FF LDA #$FF dummy cmd
0343 622A 17 099C LBSR SNDDAT
0344 622D C6 06 LDB #6
0345 622F 8E 6E65 LDX #CMD58
0346 6232 A6 80 SC2581 LDA ,X+
0347 6234 17 0992 LBSR SNDDAT
0348 6237 5A DECB
0349 6238 26 F8 BNE SC2581
0350 *get response
0351 623A GR2580
0352 623A 17 09A8 LBSR GETDAT
0353 623D B6 6008 LDA RESDAT
0354 6240 81 00 CMPA #$00
0355 6242 26 F6 BNE GR2580
0356 6244 17 099E LBSR GETDAT
0357 6247 B6 6008 LDA RESDAT
0358 624A 48 LSLA
0359 624B 48 LSLA
0360 624C 24 03 BCC GR2581
0361 624E 7C 6009 INC SDHC if sdhc then 1
0362 6251 C6 03 GR2581 LDB #3
0363 6253 17 098F GR2582 LBSR GETDAT
0364 6256 B6 6008 LDA RESDAT
0365 6259 5A DECB
0366 625A 26 F7 BNE GR2582
0367
0368 625C 8E 6F66 LDX #MSSD0
0369 625F B6 6009 LDA SDHC
0370 6262 27 03 BEQ SD1
0371 6264 8E 6F70 LDX #MSSD1
0372 6267 17 0ABC SD1 LBSR PSTRNG
0373 *
0374 *set sct no of BPB
0375 626A 17 0138 LBSR GETMBR
0376 626D 8E 5FCA LDX #RWBUF+446+8+4
0377 6270 108E 600A LDY #SCTBPB
0378 6274 C6 04 LDB #4
0379 6276 A6 82 ILOP1 LDA ,-X
0380 6278 A7 A0 STA ,Y+
0381 627A 5A DECB
0382 627B 26 F9 BNE ILOP1
0383
0384 *set sct no of FAT#1
0385 627D 17 0142 LBSR GETBPB
0386 6280 8E 600A LDX #SCTBPB
0387 6283 108E 600E LDY #SCTFAT
0388 6287 C6 04 LDB #4
0389 6289 17 08A1 LBSR TRANS
0390 628C 8E 600E LDX #SCTFAT
0391 628F 108E 5E0E LDY #RWBUF+$0E for SD & SDHC
0392 6293 17 0A5F LBSR ADD42
0393
0394 *set sct no of DIR
0395 6296 8E 600E LDX #SCTFAT
0396 6299 108E 6012 LDY #SCTDIR
0397 629D C6 04 LDB #4
0398 629F 17 088B LBSR TRANS
0399 62A2 8E 5E16 LDX #RWBUF+$16 for SD
0400 62A5 7D 6009 TST SDHC 0:SD,1:SDHC
0401 62A8 27 03 BEQ SKP1
0402 62AA C6 0E LDB #$24-$16
0403 62AC 3A ABX for SDHC
0404 62AD 1F 12 SKP1 TFR X,Y
0405 62AF 8E 6012 LDX #SCTDIR
0406 62B2 17 0A40 LBSR ADD42
0407 62B5 17 0A3D LBSR ADD42 skip for FAT#2
0408
0409 *save no of directory
0410 62B8 8E 6012 LDX #SCTDIR
0411 62BB 108E 6016 LDY #SCTDSV
0412 62BF C6 04 LDB #4
0413 62C1 17 0869 LBSR TRANS
0414
0415 *set sct per cluster
0416 62C4 8E 5E0D LDX #RWBUF+$0D
0417 62C7 A6 84 LDA ,X
0418 62C9 B7 601E STA SCTPCL
0419
0420 *set sct no of CLUSTER#2
0421 62CC 8E 6012 LDX #SCTDIR
0422 62CF 108E 601A LDY #SCTCLT
0423 62D3 C6 04 LDB #4
0424 62D5 17 0855 LBSR TRANS
0425
0426 62D8 108E 6069 LDY #WK1+2
0427 62DC 86 00 LDA #$00
0428 62DE A7 A2 STA ,-Y
0429 62E0 86 20 LDA #$20 for SD
0430 62E2 7D 6009 TST SDHC
0431 62E5 27 03 BEQ SKP2
0432 62E7 B6 601E LDA SCTPCL for SDHC
0433 62EA A7 A2 SKP2 STA ,-Y
0434 62EC 8E 601A LDX #SCTCLT
0435 62EF 17 0A03 LBSR ADD42
0436 62F2 39 RTS
0437
0438 ****************************************
0439 * GET SD DATA ROUTINE
0440 * use CMD9
0441 ****************************************
0442 62F3 DSPSDDAT EQU *
0443 62F3 17 097B LBSR PCRLF
0444 62F6 17 093D LBSR SETCKL
0445 62F9 C6 06 LDB #6
0446 62FB 8E 6E77 LDX #CMD9
0447 62FE A6 80 SC91 LDA ,X+
0448 6300 17 08C6 LBSR SNDDAT
0449 6303 5A DECB
0450 6304 26 F8 BNE SC91
0451 *get response
0452 6306 GR90
0453 6306 17 08DC LBSR GETDAT
0454 6309 B6 6008 LDA RESDAT
0455 630C 81 00 CMPA #$00
0456 630E 26 F6 BNE GR90
0457
0458 6310 C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
0459 6312 17 08D0 GR91 LBSR GETDAT
0460 6315 B6 6008 LDA RESDAT
0461 6318 5A DECB
0462 6319 26 F7 BNE GR91
0463 631B 17 0953 LBSR PCRLF
0464
0465 *disp offset of MBR,FAT#1,DIR,CLUSTER#2
0466 631E 8E 6FB3 LDX #MSOFS
0467 6321 17 0A02 LBSR PSTRNG
0468 6324 8E 6FC3 LDX #MSBPB
0469 6327 17 09FC LBSR PSTRNG
0470 632A 8E 600A LDX #SCTBPB
0471 632D C6 04 LDB #4
0472 632F A6 80 SCLOP1 LDA ,X+
0473 6331 17 0914 LBSR DSPBIN
0474 6334 5A DECB
0475 6335 26 F8 BNE SCLOP1
0476
0477 6337 8E 6FCC LDX #MSFAT
0478 633A 17 09E9 LBSR PSTRNG
0479 633D 8E 600E LDX #SCTFAT
0480 6340 C6 04 LDB #4
0481 6342 A6 80 SCLOP2 LDA ,X+
0482 6344 17 0901 LBSR DSPBIN
0483 6347 5A DECB
0484 6348 26 F8 BNE SCLOP2
0485
0486 634A 8E 6FD5 LDX #MSDIR
0487 634D 17 09D6 LBSR PSTRNG
0488 6350 8E 6012 LDX #SCTDIR
0489 6353 C6 04 LDB #4
0490 6355 A6 80 SCLOP3 LDA ,X+
0491 6357 17 08EE LBSR DSPBIN
0492 635A 5A DECB
0493 635B 26 F8 BNE SCLOP3
0494
0495 635D 8E 6FDE LDX #MSCL2
0496 6360 17 09C3 LBSR PSTRNG
0497 6363 8E 601A LDX #SCTCLT
0498 6366 C6 04 LDB #4
0499 6368 A6 80 SCLOP4 LDA ,X+
0500 636A 17 08DB LBSR DSPBIN
0501 636D 5A DECB
0502 636E 26 F8 BNE SCLOP4
0503 6370 17 08FE LBSR PCRLF
0504 6373 39 RTS
0505
0506 *
0507 ****************************************
0508 * READ ROUTINE
0509 * use CMD17
0510 * set sctno to SCTN2,SCTN3
0511 * read data set to RWBUF
0512 ****************************************
0513 6374 RDSCT EQU *
0514 6374 17 08FA LBSR PCRLF
0515 6377 17 0885 LBSR INSCT input sct no
0516 637A 17 07F8 LBSR RD1SCT read 1 sct
0517
0518 *disp data
0519 637D 17 08F1 LBSR PCRLF
0520 6380 17 0828 LBSR DSPBUF
0521 6383 17 08EB LBSR PCRLF
0522 6386 39 RTS
0523
0524 ****************************************
0525 * Read MBR & Disp parameter of BPB
0526 ****************************************
0527 6387 DSPMBR EQU *
0528 6387 17 08E7 LBSR PCRLF
0529 638A 8D 19 BSR GETMBR
0530
0531 *disp BPB
0532 638C 17 08E2 LBSR PCRLF
0533 638F 8E 5FBE LDX #RWBUF+446 1st BPB point
0534 6392 C6 10 GET1 LDB #16
0535 6394 A6 80 GET2 LDA ,X+
0536 6396 17 08AF LBSR DSPBIN disp data
0537 6399 5A DECB
0538 639A 26 F8 BNE GET2
0539 639C 17 08D2 LBSR PCRLF
0540 639F 8C 5FFE CMPX #RWBUF+510 446+16*4
0541 63A2 25 EE BLO GET1
0542 63A4 39 RTS
0543
0544 *----------------------------------------
0545 *read MBR
0546 63A5 GETMBR EQU *
0547 63A5 8E 6004 LDX #SCTN0
0548 63A8 C6 04 LDB #4
0549 63AA 4F CLRA
0550 63AB 17 078A LBSR FILL set sct no is 0
0551 63AE 17 0856 LBSR SETSCT
0552 63B1 17 07C1 LBSR RD1SCT read 1 sct
0553 63B4 39 RTS
0554
0555 *----------------------------------------
0556 *set sector no to SCTN0
0557 *from X,X+1,X+2,X+3 to SCTN0-SCTN3
0558 63B5 SETSNO EQU *
0559 63B5 108E 6004 LDY #SCTN0
0560 63B9 C6 04 LDB #4
0561 63BB 17 076F LBSR TRANS
0562 63BE 17 0846 LBSR SETSCT
0563 63C1 39 RTS
0564
0565 *----------------------------------------
0566 *read BPB
0567 63C2 GETBPB EQU *
0568 63C2 8D E1 BSR GETMBR
0569 *set sct no of BPB
0570 63C4 8E 5FCA LDX #RWBUF+446+8+4
0571 63C7 108E 6004 LDY #SCTN0
0572 63CB C6 04 LDB #4
0573 63CD A6 82 GTBLOP LDA ,-X
0574 63CF A7 A0 STA ,Y+
0575 63D1 5A DECB
0576 63D2 26 F9 BNE GTBLOP
0577 63D4 17 0830 LBSR SETSCT
0578 63D7 17 079B LBSR RD1SCT read 1 sct
0579 63DA 39 RTS
0580
0581 ****************************************
0582 * Disp BPB(Bios Parameter Block)
0583 ****************************************
0584 63DB DSPBPB EQU *
0585 63DB 8E 600A LDX #SCTBPB
0586 63DE 8D D5 BSR SETSNO
0587 63E0 17 0792 LBSR RD1SCT read 1 sct
0588
0589 *disp BPB
0590 63E3 17 088B LBSR PCRLF
0591 63E6 17 07C2 LBSR DSPBUF
0592 63E9 17 0885 LBSR PCRLF
0593 63EC 39 RTS
0594
0595 ****************************************
0596 * Disp FAT#1
0597 ****************************************
0598 63ED DSPFAT EQU *
0599 63ED 8E 600E LDX #SCTFAT
0600 63F0 8D C3 BSR SETSNO
0601 63F2 17 0780 LBSR RD1SCT read 1 sct
0602
0603 *disp FAT
0604 63F5 17 0879 LBSR PCRLF
0605 63F8 17 07B0 LBSR DSPBUF
0606 63FB 17 0873 LBSR PCRLF
0607 63FE 39 RTS
0608
0609 ****************************************
0610 * Disp Directory
0611 ****************************************
0612 63FF DSPDIR EQU *
0613 *return no of DIR
0614 63FF 8E 6016 LDX #SCTDSV
0615 6402 108E 6012 LDY #SCTDIR
0616 6406 C6 04 LDB #4
0617 6408 17 0722 LBSR TRANS
0618 640B 8E 6012 DSPFL0 LDX #SCTDIR
0619 640E 8D A5 BSR SETSNO
0620 6410 17 0762 LBSR RD1SCT read 1 sct
0621
0622 *disp FILE name
0623 6413 17 085B LBSR PCRLF
0624 6416 17 0858 LBSR PCRLF
0625 6419 8E 5E00 LDX #RWBUF
0626
0627 641C A6 84 DSPFL1 LDA ,X
0628 641E 1027 008A LBEQ DSPEND if top of filename is 0 then end
0629 6422 81 E5 CMPA #$E5 delete mark?
0630 6424 27 06 BEQ DSPCKE
0631 6426 A6 0B LDA 11,X attr
0632 * CMPA #$0F long file name?
0633 * BEQ DSPCKE
0634 * CMPA #$10 directory?
0635 * BEQ DSPCKE
0636 6428 81 20 CMPA #$20
0637 642A 27 0A BEQ DSPFL2 archive file only
0638 642C 30 88 20 DSPCKE LEAX 32,X next directory entry
0639 642F 8C 6000 CMPX #RWBUF+512 over buf?
0640 6432 24 60 BHS DSPFL5
0641 6434 20 E6 BRA DSPFL1
0642
0643 6436 DSPFL2
0644 *disp filename
0645 6436 C6 08 LDB #8
0646 6438 A6 80 DSPFL3 LDA ,X+
0647 643A BD FBBB JSR OUTCHA
0648 643D 5A DECB
0649 643E 26 F8 BNE DSPFL3
0650 *disp ext
0651 6440 86 2E LDA #'.
0652 6442 BD FBBB JSR OUTCHA
0653 6445 C6 03 LDB #3
0654 6447 A6 80 DSPFL4 LDA ,X+
0655 6449 BD FBBB JSR OUTCHA
0656 644C 5A DECB
0657 644D 26 F8 BNE DSPFL4
0658 644F 86 20 LDA #SPC
0659 6451 BD FBBB JSR OUTCHA
0660 6454 BD FBBB JSR OUTCHA
0661
0662 *get FILE time data
0663 6457 30 07 LEAX 7,X
0664 6459 EC 81 LDD ,X++
0665 645B FD 6067 STD WK1
0666
0667 *get CLUSTER(H) data
0668 645E EC 81 LDD ,X++
0669 6460 1E 89 EXG A,B
0670 6462 FD 6048 STD CLSTH
0671 6465 30 04 LEAX 4,X
0672 6467 EC 81 LDD ,X++
0673 6469 1E 89 EXG A,B
0674 646B FD 604A STD CLSTL
0675
0676 *get FILE size data
0677 646E 108E 6046 LDY #WFSIZ+4
0678 6472 C6 04 LDB #4
0679 6474 A6 80 DSPC1 LDA ,X+
0680 6476 A7 A2 STA ,-Y
0681 6478 5A DECB
0682 6479 26 F9 BNE DSPC1
0683
0684 *disp FILE size
0685 647B 86 20 LDA #SPC
0686 647D BD FBBB JSR OUTCHA
0687 6480 17 0914 LBSR DSPSIZ disp FILE size
0688
0689 *disp FILE time
0690 6483 FC 6067 LDD WK1
0691 6486 17 08AD LBSR DSPYMD disp MM-DD-YY
0692
0693 *disp CLUSTER(H,L)
0694 6489 17 0960 LBSR DSPCLS
0695 648C 17 07E2 LBSR PCRLF
0696
0697 648F 8C 6000 CMPX #RWBUF+512
0698 6492 25 88 BLO DSPFL1
0699 6494 8E 6012 DSPFL5 LDX #SCTDIR
0700 6497 17 06A7 LBSR INCX4 sct no +1
0701 649A 8E 7057 LDX #MSNXTP
0702 649D 17 0886 LBSR PSTRNG
0703 64A0 BD 6E2D DSPFL6 JSR INOUTC
0704 64A3 81 20 CMPA #SPC
0705 64A5 1027 FF62 LBEQ DSPFL0
0706 64A9 BD 6C71 JSR PCRLF
0707 64AC 39 DSPEND RTS
0708
0709 ****************************************
0710 * Load FILE
0711 ****************************************
0712 64AD LDFILE EQU *
0713 64AD 17 0146 LBSR GETFDT
0714 64B0 BE 6065 LDX EXSTFL if 0 not exist
0715 64B3 1027 00EA LBEQ LDNEND
0716
0717 *get cluster no
0718 64B7 EC 88 14 LDD $14,X
0719 64BA 1E 89 EXG A,B
0720 64BC FD 6048 STD CLSTH high cluster no
0721 64BF EC 88 1A LDD $1A,X
0722 64C2 1E 89 EXG A,B
0723 64C4 FD 604A STD CLSTL low cluster no
0724 *sub start cluster no (SD:2,SDHC:3)
0725 64C7 83 0002 SUBD #2
0726 64CA 7D 6009 TST SDHC SD:0,SDHC:1
0727 64CD 27 03 BEQ LD3
0728 64CF 83 0001 SUBD #1 D:cluster no (start 0)
0729 * (A=0,cluster no is only B)
0730
0731 64D2 34 36 LD3 PSHS A,B,X,Y
0732 64D4 8E 601A LDX #SCTCLT top of cluster no
0733 64D7 108E 6067 LDY #WK1
0734 64DB C6 04 LDB #4
0735 64DD 17 064D LBSR TRANS
0736 64E0 35 36 PULS A,B,X,Y
0737
0738 *calc start cluster no of file
0739 *(B)x40h
0740 64E2 34 30 PSHS X,Y
0741 64E4 8E 6067 LDX #WK1
0742 64E7 17 0666 LBSR ADD40H
0743 64EA 35 30 PULS X,Y
0744
0745 *get file size
0746 64EC 34 30 PSHS X,Y
0747 64EE 30 88 20 LEAX 32,X
0748 64F1 108E 6042 LDY #WFSIZ
0749 64F5 C6 04 LDB #4
0750 64F7 A6 82 LD41 LDA ,-X
0751 64F9 A7 A0 STA ,Y+
0752 64FB 5A DECB
0753 64FC 26 F9 BNE LD41
0754 64FE 35 30 PULS X,Y
0755
0756 6500 EC 88 1D LDD $1D,X upper of file size
0757 6503 1E 89 EXG A,B
0758 6505 44 LSRA wfsiz/$200+1
0759 6506 56 RORB
0760 6507 C3 0001 ADDD #1
0761
0762 650A C1 40 CMPB #$40 40h page?
0763 650C 23 02 BLS LD5
0764 650E C6 40 LDB #$40
0765 6510 F7 604C LD5 STB CNT sct counter
0766 6513 F7 604E STB TPGFLG set top page
0767
0768 *set start sct no of file
0769 6516 34 12 PSHS A,X
0770 6518 8E 7016 LDX #MSLDNG
0771 651B 17 0808 LBSR PSTRNG
0772 651E 35 12 PULS A,X
0773 6520 LDLOP
0774 6520 86 2E LDA #'.
0775 6522 BD FBBB JSR OUTCHA
0776 6525 8E 6067 LDX #WK1
0777 6528 108E 6004 LDY #SCTN0
0778 652C C6 04 LDB #4
0779 652E 17 05FC LBSR TRANS
0780 6531 17 06D3 LBSR SETSCT
0781 6534 17 063E LBSR RD1SCT read 1 file data
0782
0783 6537 7D 604E TST TPGFLG top sector page?
0784 653A 27 3B BEQ LD9
0785
0786 *at top sector, ini set
0787 *offset 00 data is
0788 * $00 :machine code
0789 * $FF,$FE:BASIC PROGRAM (binary save)
0790 * else :general text
0791 653C 10BE 6044 LDY WFSIZ+2
0792 6540 10BF 6046 STY FILSIZ set file size
0793
0794 * LDX FILSIZ
0795 * LEAX 1,X
0796 * STX BASAEP
0797
0798 6544 8E 5E00 LDX #RWBUF
0799 6547 A6 84 LDA ,X
0800 6549 B7 604D STA MCFLG
0801 654C 27 04 BEQ LD8
0802 654E 2A 24 BPL LD81
0803 6550 2B 1E BMI LD80
0804 *at machine code, read header
0805 6552 10AE 01 LD8 LDY 1,X get file size
0806 6555 10BF 6046 STY FILSIZ
0807 6559 EE 03 LDU 3,X get store addr
0808 *offset?
0809 655B 8E 70A4 LDX #MSMCOF
0810 655E 17 07C5 LBSR PSTRNG
0811 6561 BD 6E2D JSR INOUTC
0812 6564 84 DF ANDA #$DF
0813 6566 81 59 CMPA #'Y
0814 6568 26 0D BNE LD9
0815 656A 33C9 E000 LEAU -$2000,U
0816 656E 20 07 BRA LD9
0817
0818 6570 DE 33 LD80 LDU BASADP basic file
0819 6572 20 03 BRA LD9
0820 6574 LD81
0821 6574 CE 2000 LDU #TXTADR (else) not basic file
0822 6577 LD9
0823 6577 8D 30 BSR MEMSET expand memory from rwbuf
0824
0825 6579 7F 604E CLR TPGFLG end of top page
0826 657C 8E 6067 LDX #WK1
0827 657F 17 05BF LBSR INCX4 sct no +1
0828 6582 7A 604C DEC CNT
0829 6585 26 99 BNE LDLOP
0830
0831 6587 LDEND
0832 6587 7D 604D TST MCFLG
0833 658A 27 0B BEQ LDE0
0834 658C 2A 09 BPL LDE0
0835 658E FC 6044 LDD WFSIZ+2
0836 6591 DB 34 ADDB BASADP+1
0837 6593 99 33 ADCA BASADP
0838 6595 DD 35 STD BASAEP end adrs
0839 6597 8E 702E LDE0 LDX #MSLDED
0840 659A 17 0789 LBSR PSTRNG
0841 659D 17 06D1 LDE1 LBSR PCRLF
0842 65A0 39 RTS
0843
0844 65A1 8E 7049 LDNEND LDX #MSNOFL
0845 65A4 17 077F LBSR PSTRNG
0846 65A7 20 F4 BRA LDE1
0847
0848 *expand memory from rwbuf
0849 *X:rwbuf, U:memory adr, Y:filesize
0850 65A9 MEMSET EQU *
0851 65A9 34 30 PSHS X,Y
0852 65AB 8E 5E00 LDX #RWBUF
0853 65AE 10BE 6046 LDY FILSIZ
0854 65B2 7D 604E TST TPGFLG top page?
0855 65B5 27 0F BEQ MSLOP
0856 65B7 7D 604D TST MCFLG 0,$FF($FE),etc
0857 65BA 27 04 BEQ MS0
0858 65BC 2A 08 BPL MSLOP etc
0859 65BE 2B 04 BMI MS1 basic file
0860 * machine code
0861 65C0 30 05 MS0 LEAX 5,X skip header
0862 * LEAY -5,Y
0863 65C2 20 02 BRA MSLOP
0864 65C4 30 03 MS1 LEAX 3,X skip 3 FFs
0865 * LEAY -3,Y
0866
0867 65C6 A6 80 MSLOP LDA ,X+
0868 65C8 A7 C0 STA ,U+
0869 65CA 31 3F LEAY -1,Y
0870 65CC 27 05 BEQ MS3
0871 65CE 8C 6000 CMPX #RWBUF+512
0872 65D1 25 F3 BLO MSLOP
0873 65D3 10BF 6046 MS3 STY FILSIZ
0874 65D7 35 B0 PULS X,Y,PC
0875
0876 *----------
0877 *X:top of FILE NAME
0878 *return C=1:match,C=0:not match
0879 65D9 CMPFN EQU *
0880 65D9 34 10 PSHS X
0881 65DB 108E 604F LDY #FNAME
0882 65DF C6 08 LDB #8
0883 65E1 A6 80 CMPLOP LDA ,X+
0884 65E3 81 E5 CMPA #$E5 delete mark?
0885 65E5 27 0B BEQ NOTM
0886 65E7 A1 A0 CMPA ,Y+
0887 65E9 26 07 BNE NOTM
0888 65EB 5A DECB
0889 65EC 26 F3 BNE CMPLOP
0890 65EE 1A 01 MATCH ORCC #$01 C=1
0891 65F0 20 02 BRA CMPEND
0892 65F2 1C FE NOTM ANDCC #$FE C=0
0893 65F4 35 90 CMPEND PULS X,PC
0894
0895 *------------------------------
0896 *input filename
0897 *output:
0898 * if exist EXSTFL(directory entry)
0899 * not exist EXSTFL(=0)
0900 65F6 GETFDT EQU *
0901 65F6 34 02 PSHS A
0902 65F8 8E 0000 LDX #0
0903 65FB BF 6065 STX EXSTFL
0904 *return no of DIR
0905 65FE 8E 6016 LDX #SCTDSV
0906 6601 108E 6012 LDY #SCTDIR
0907 6605 C6 04 LDB #4
0908 6607 17 0523 LBSR TRANS
0909
0910 660A 35 02 PULS A
0911 660C 81 4D CMPA #'M
0912 660E 26 05 BNE GTF1
0913 6610 8E 6FFE LDX #MSMSV
0914 6613 20 03 BRA GTF2
0915 6615 8E 6FEE GTF1 LDX #MSINFN
0916 6618 17 070B GTF2 LBSR PSTRNG
0917 661B 17 0162 LBSR INPFLDAT input file name
0918
0919 *set filename
0920 661E 8E 607B LDX #FILBUF
0921 6621 17 00E9 LBSR SETFNM
0922
0923 6624 8E 6012 LDFL0 LDX #SCTDIR
0924 6627 17 FD8B LBSR SETSNO
0925 662A 17 0548 LBSR RD1SCT read 1 sct
0926
0927 662D 8E 5E00 LDX #RWBUF
0928 6630 A6 84 LDFL1 LDA ,X
0929 6632 27 37 BEQ LDFLE if top of filename is 0 then end
0930 6634 81 E5 CMPA #$E5 delete mark?
0931 6636 26 10 BNE LD1
0932 6638 A6 0B LDA 11,X attr
0933 663A 81 20 CMPA #$20 archive file only
0934 663C 27 0A BEQ LD1
0935 663E 30 88 20 LEAX 32,X next directory entry
0936 6641 8C 6000 CMPX #RWBUF+512 over buf?
0937 6644 24 0E BHS LDFL5
0938 6646 20 E8 BRA LDFL1
0939
0940 *check file name
0941 6648 LD1
0942 6648 8D 8F BSR CMPFN C=1:match
0943 664A 25 10 BCS LD2
0944 664C 30 88 20 LEAX 32,X
0945 664F 8C 6000 CMPX #RWBUF+512
0946 6652 25 DC BLO LDFL1
0947
0948 6654 LDFL5
0949 6654 8E 6012 LDX #SCTDIR
0950 6657 17 04E7 LBSR INCX4 sct no +1
0951 665A 20 C8 BRA LDFL0
0952
0953 *hit file, get dirctory entry
0954 665C BF 6065 LD2 STX EXSTFL adr of dir entry
0955 665F 108E 601F LDY #DIRENT
0956 6663 C6 20 LDB #32
0957 6665 17 04C5 LBSR TRANS
0958 6668 8E 601F LDX #DIRENT
0959 666B 39 LDFLE RTS
0960
0961 *
0962 ****************************************
0963 * KILL FILE
0964 ****************************************
0965 666C KILFILE EQU *
0966 666C 8D 88 BSR GETFDT
0967 666E BE 6065 LDX EXSTFL if 0 not exist
0968 6671 27 5B BEQ NOFEND
0969
0970 6673 8E 7074 LDX #MSKILL
0971 6676 17 06AD LBSR PSTRNG
0972 6679 BD 6E2D JSR INOUTC
0973 667C 84 DF ANDA #$DF
0974 667E 81 59 CMPA #'Y
0975 6680 26 3E BNE KILEND
0976 6682 8D 01 BSR KILSUB
0977 6684 39 RTS
0978
0979 *----------
0980 6685 KILSUB EQU *
0981 *write dir
0982 6685 BE 6065 LDX EXSTFL top adr of dir entry
0983 6688 EC 88 1A LDD $1A,X get clstlD
0984 668B 1E 89 EXG A,B B:cluster
0985 668D FD 604A STD CLSTL
0986 6690 86 E5 LDA #$E5 delete mark
0987 6692 A7 84 STA ,X
0988 6694 17 03D0 LBSR WRTSD1
0989
0990 *get fat sct & write
0991 6697 8E 600E LDX #SCTFAT
0992 669A 17 FD18 LBSR SETSNO
0993 669D 17 04D5 LBSR RD1SCT read 1 sct
0994
0995 66A0 FC 604A LDD CLSTL B:cluster
0996 66A3 58 LSLB
0997 66A4 7D 6009 TST SDHC sd:0,sdhc:1
0998 66A7 27 01 BEQ KL1
0999 66A9 58 LSLB
1000 66AA 8E 5E00 KL1 LDX #RWBUF
1001 66AD 30 85 LEAX B,X
1002 66AF C6 02 LDB #2
1003 66B1 7D 6009 TST SDHC sd:0,sdhc:1
1004 66B4 27 02 BEQ KL2
1005 66B6 C6 04 LDB #4
1006 66B8 6F 80 KL2 CLR ,X+
1007 66BA 5A DECB
1008 66BB 26 FB BNE KL2
1009 66BD 17 03A7 LBSR WRTSD1
1010 66C0 KILEND
1011 66C0 39 RTS
1012
1013 *
1014 ****************************************
1015 * Write BASIC FILE
1016 ****************************************
1017 66C1 WRBFILE EQU *
1018 *basic file exist check
1019 66C1 DC 35 LDD BASAEP
1020 66C3 93 33 SUBD BASADP
1021 66C5 1083 0002 CMPD #2
1022 66C9 22 0A BHI WRB0 exist
1023 66CB 17 05A3 LBSR PCRLF
1024 66CE 8E 7049 NOFEND LDX #MSNOFL
1025 66D1 17 0652 LBSR PSTRNG
1026 66D4 39 RTS
1027
1028 *save BASIC program file(binary saved)
1029 66D5 86 FF WRB0 LDA #$FF
1030 66D7 B7 604D STA MCFLG set basic file
1031 *input file name
1032 66DA 17 FF19 LBSR GETFDT
1033 66DD BE 6065 LDX EXSTFL if 0 not exist
1034 66E0 27 11 BEQ WRB1
1035
1036 *confirm over write
1037 66E2 8E 7087 LDX #MSEXST
1038 66E5 17 063E LBSR PSTRNG
1039 66E8 BD 6E2D JSR INOUTC
1040 66EB 84 DF ANDA #$DF
1041 66ED 81 59 CMPA #'Y
1042 66EF 26 1B BNE WRBEND
1043 *delete exist file
1044 66F1 8D 92 BSR KILSUB
1045
1046 66F3 WRB1
1047 *set filename
1048 66F3 8E 607B LDX #FILBUF
1049 66F6 8D 15 BSR SETFNM
1050
1051 *adrs
1052 * BASADP start adr
1053 * BASAEP end adr
1054 * BASEXP exec adr
1055
1056 *main of write routine
1057 *clear dir entry
1058 66F8 8D 2B BSR CLRDIR
1059
1060 66FA 17 0103 LBSR SRCFAT search empty cluster on FAT
1061 66FD 17 0158 LBSR SRCDIR search empty DIR entry
1062 6700 17 0194 LBSR MKFLDT make file data
1063 6703 17 0219 LBSR WRTFIL write file
1064 6706 17 03BB LBSR WRTDIR write DIR entry
1065 6709 17 03E5 LBSR WRTFAT set FAT
1066 670C WRBEND
1067 670C 39 RTS
1068
1069 *------------------------------
1070 *set filename
1071 670D SETFNM EQU *
1072 *clear buf
1073 670D 108E 605A LDY #FNAME+11
1074 6711 C6 0B LDB #11
1075 6713 86 20 LDA #$20
1076 6715 A7 A2 WRFLP2 STA ,-Y
1077 6717 5A DECB
1078 6718 26 FB BNE WRFLP2
1079
1080 *store filename
1081 671A A6 80 WRFL1 LDA ,X+
1082 671C 81 30 CMPA #$30
1083 671E 25 04 BLO WRFL2 until delimiter
1084 6720 A7 A0 STA ,Y+
1085 6722 20 F6 BRA WRFL1
1086 6724 WRFL2
1087 6724 39 RTS
1088
1089 *------------------------------
1090 *clear dir entry
1091 6725 CLRDIR EQU *
1092 6725 8E 601F LDX #DIRENT
1093 6728 C6 20 LDB #32
1094 672A 4F CLRA
1095 672B 17 040A LBSR FILL
1096 672E 86 20 LDA #$20 set attr
1097 6730 A7 0B STA $0B,X
1098 6732 39 RTS
1099
1100 *
1101 ****************************************
1102 * Write MACHINE FILE
1103 ****************************************
1104 6733 WRMFILE EQU *
1105 *save machine code
1106 *filename,topadr,endadr,exeadr ...machine file
1107 6733 17 FEC0 LBSR GETFDT
1108 6736 BE 6065 LDX EXSTFL if 0 not exist
1109 6739 27 12 BEQ WRM1
1110
1111 *confirm over write
1112 673B 8E 7087 LDX #MSEXST
1113 673E 17 05E5 LBSR PSTRNG
1114 6741 BD 6E2D JSR INOUTC
1115 6744 84 DF ANDA #$DF
1116 6746 81 59 CMPA #'Y
1117 6748 26 35 BNE WRMEND
1118 *delete exist file
1119 674A 17 FF38 LBSR KILSUB
1120
1121 674D WRM1
1122 674D 7F 604D CLR MCFLG set machine code
1123
1124 *set filename
1125 6750 8E 607B LDX #FILBUF
1126 6753 8D B8 BSR SETFNM
1127
1128 *set top adr
1129 6755 8D 46 BSR ASC2BIN
1130 6757 10BF 605F STY MCADP start adr
1131 675B 8D 30 BSR SRCDLM
1132 675D 8D 3E BSR ASC2BIN
1133 675F 10BF 6061 STY MCAEP end adr
1134 6763 8D 28 BSR SRCDLM
1135 6765 8D 36 BSR ASC2BIN
1136 6767 10BF 6063 STY MCEXP exec adr
1137
1138 *main of write routine
1139 *clear dir entry
1140 676B 8D B8 BSR CLRDIR
1141
1142 676D 17 0090 LBSR SRCFAT search empty cluster on FAT
1143 6770 17 00E5 LBSR SRCDIR search empty DIR entry
1144 6773 17 0121 LBSR MKFLDT make file data
1145 6776 17 01A6 LBSR WRTFIL write file
1146 6779 17 0348 LBSR WRTDIR write DIR entry
1147 677C 17 0372 LBSR WRTFAT set FAT
1148 677F WRMEND
1149 677F 39 RTS
1150
1151 *--------------------
1152 *input filename & parameter to filbuf
1153 6780 INPFLDAT EQU *
1154 6780 34 24 PSHS B,Y
1155 6782 108E 607B LDY #FILBUF
1156 6786 C6 1E LDB #30
1157 6788 17 06A9 LBSR LININ
1158 678B 35 A4 PULS B,Y,PC
1159
1160 *--------------------
1161 *search delimiter
1162 *return X:point next char of delimiter
1163 678D SRCDLM EQU *
1164 678D 30 1F LEAX -1,X
1165 678F A6 80 SRDLM1 LDA ,X+
1166 6791 81 30 CMPA #$30
1167 6793 24 FA BHS SRDLM1
1168 6795 39 RTS
1169
1170 *--------------------
1171 *skip delimiter
1172 *return X:point next char of delimiter
1173 6796 SKPDLM EQU *
1174 6796 A6 80 LDA ,X+
1175 6798 81 30 CMPA #$30
1176 679A 25 FA BLO SKPDLM
1177 679C 39 RTS
1178
1179 *--------------------
1180 *X - X+3, return Y
1181 679D ASC2BIN EQU *
1182 *clr buf
1183 679D 34 10 PSHS X
1184 679F 8E 6077 LDX #CNVBUF
1185 67A2 86 30 LDA #$30
1186 67A4 C6 04 LDB #4
1187 67A6 17 038F LBSR FILL
1188 67A9 35 10 PULS X
1189
1190 *search next delimiter
1191 *return B:char count
1192 67AB 34 10 PSHS X
1193 67AD 5F CLRB
1194 67AE 5C SRLOP1 INCB
1195 67AF A6 80 LDA ,X+
1196 67B1 81 30 CMPA #$30 count over $30
1197 67B3 24 F9 BHS SRLOP1
1198 67B5 5A DECB
1199 67B6 35 10 PULS X
1200
1201 *trans
1202 67B8 108E 6077 LDY #CNVBUF
1203 67BC 34 04 PSHS B
1204 67BE C6 04 LDB #4
1205 67C0 E0 E4 SUBB ,S
1206 67C2 31 A5 LEAY B,Y
1207 67C4 35 04 PULS B
1208 67C6 A6 80 SRLOP2 LDA ,X+
1209 67C8 A7 A0 STA ,Y+
1210 67CA 5A DECB
1211 67CB 26 F9 BNE SRLOP2
1212
1213 *convert to bin
1214 67CD 34 10 PSHS X
1215 67CF 8E 6077 LDX #CNVBUF
1216 67D2 EC 81 LDD ,X++
1217 67D4 8D 0F BSR CNVSUB
1218 67D6 34 02 PSHS A
1219 67D8 EC 81 LDD ,X++
1220 67DA 8D 09 BSR CNVSUB
1221 67DC 1F 89 TFR A,B
1222 67DE 35 02 PULS A
1223 67E0 1F 02 TFR D,Y
1224 67E2 35 10 PULS X
1225 67E4 39 RTS
1226
1227 *cnv sub
1228 *return A
1229 67E5 CNVSUB EQU *
1230 67E5 80 30 SUBA #$30
1231 67E7 81 11 CMPA #$11
1232 67E9 25 02 BLO CNV1
1233 67EB 80 07 SUBA #7
1234 67ED 48 CNV1 LSLA
1235 67EE 48 LSLA
1236 67EF 48 LSLA
1237 67F0 48 LSLA
1238 67F1 C0 30 SUBB #$30
1239 67F3 C1 11 CMPB #$11
1240 67F5 25 02 BLO CNV2
1241 67F7 C0 07 SUBB #7
1242 67F9 C4 0F CNV2 ANDB #$0F
1243 67FB 34 04 PSHS B
1244 67FD AB E0 ADDA ,S+
1245 67FF 39 RTS
1246
1247 *--------------------
1248 * search empty area in FAT
1249 6800 SRCFAT EQU *
1250 6800 8E 600E LDX #SCTFAT
1251 6803 17 FBAF LBSR SETSNO
1252 6806 17 036C LBSR RD1SCT read 1 sct
1253
1254 6809 8E 5E00 LDX #RWBUF
1255 *search $00
1256 680C SRC0
1257 680C C6 02 LDB #2 SD
1258 680E 7D 6009 TST SDHC 0:SD,1:SDHC
1259 6811 27 02 BEQ SRCLOP
1260 6813 C6 04 LDB #4 SDHC
1261 6815 8D 32 SRCLOP BSR SRC00 search 1st 00 ...1st 00
1262 6817 24 2F BCC SFATED not exist empty area
1263 6819 A6 80 LDA ,X+ next is 00? ..2nd 00
1264 681B 26 EF BNE SRC0 restart
1265 681D 7D 6009 TST SDHC 0:SD,1:SDHC
1266 6820 27 0A BEQ SETX
1267 6822 A6 80 LDA ,X+ next is 00? ..3rd 00
1268 6824 26 E6 BNE SRC0 restart
1269 6826 A6 80 LDA ,X+ next is 00? ..4th 00
1270 6828 26 E2 BNE SRC0 restart
1271 682A 30 1E LEAX -2,X
1272 682C SETX
1273 682C 30 1E LEAX -2,X pos in RWBUF
1274 682E 3089 A200 LEAX -RWBUF,X relative pos
1275 6832 1F 10 TFR X,D
1276 6834 44 LSRA
1277 6835 56 RORB 1/2
1278 6836 7D 6009 TST SDHC 0:SD,1:SDHC
1279 6839 27 02 BEQ SETCL
1280 683B 44 LSRA
1281 683C 56 RORB 1/2
1282 683D FD 604A SETCL STD CLSTL
1283 6840 1E 89 EXG A,B
1284 6842 8E 601F LDX #DIRENT
1285 6845 ED 88 1A STD $1A,X set cluster L to dirent
1286 6848 39 SFATED RTS
1287
1288 *search 00 in FAT
1289 6849 8C 6000 SRC00 CMPX #RWBUF+512
1290 684C 24 07 BHS NOEXST
1291 684E A6 80 LDA ,X+
1292 6850 26 F7 BNE SRC00
1293 6852 1A 01 EXIST ORCC #$01 set C
1294 6854 39 RTS
1295 6855 1C FE NOEXST ANDCC #$FE reset C
1296 6857 39 RTS
1297
1298 *--------------------
1299 * search empty DIR entry
1300 * return:DPGNO,DIROFS
1301 6858 SRCDIR EQU *
1302 6858 7F 605A CLR DPGNO
1303 *return no of DIR
1304 685B 8E 6016 LDX #SCTDSV
1305 685E 108E 6012 LDY #SCTDIR
1306 6862 C6 04 LDB #4
1307 6864 17 02C6 LBSR TRANS
1308 6867 8E 6012 SRCFL0 LDX #SCTDIR
1309 686A 17 FB48 SRCFL1 LBSR SETSNO
1310 686D 17 0305 LBSR RD1SCT read 1 sct
1311
1312 6870 8E 5E00 LDX #RWBUF
1313 6873 8C 6000 DLOP1 CMPX #RWBUF+512
1314 6876 24 0D BHS SRCFL5
1315 6878 A6 80 LDA ,X+
1316 687A 27 15 BEQ DIRGET
1317 687C 81 E5 CMPA #$E5 delete mark?
1318 687E 27 11 BEQ DIRGET
1319 6880 30 88 1F LEAX 32-1,X
1320 6883 20 EE BRA DLOP1
1321
1322 6885 7C 605A SRCFL5 INC DPGNO
1323 6888 8E 6012 LDX #SCTDIR
1324 688B 17 02B3 LBSR INCX4 sct no +1
1325 688E 20 DA BRA SRCFL1
1326 6890 DSPED
1327 6890 39 RTS
1328
1329 6891 30 1F DIRGET LEAX -1,X
1330 6893 BF 605B STX DIROFS
1331 6896 39 RTS
1332
1333 *--------------------
1334 6897 MKFLDT EQU *
1335 *cluster no & attr already set
1336 *file name input&set
1337 6897 8E 604F LDX #FNAME
1338 689A 108E 601F LDY #DIRENT
1339 689E C6 0B LDB #11
1340 68A0 17 028A LBSR TRANS set file name
1341
1342 *cal file size
1343 68A3 7D 604D TST MCFLG 00,FF(FE),else
1344 68A6 2B 08 BMI MKF1
1345 68A8 FC 6061 LDD MCAEP
1346 68AB B3 605F SUBD MCADP
1347 68AE 20 04 BRA MKF2
1348 68B0 MKF1
1349 68B0 DC 35 LDD BASAEP
1350 68B2 93 33 SUBD BASADP
1351 68B4 1E 89 MKF2 EXG A,B
1352 68B6 8E 601F LDX #DIRENT
1353 68B9 ED 88 1C STD $1C,X
1354
1355 *set date (for FM-7)
1356 68BC 8D 12 BSR STDATE
1357 68BE FC 603F LDD WMDY
1358 68C1 1E 89 EXG A,B
1359
1360 *year,month,day
1361 68C3 8E 601F LDX #DIRENT
1362 68C6 ED 88 18 STD $18,X
1363 68C9 ED 88 10 STD $10,X
1364 68CC ED 88 12 STD $12,X
1365 68CF 39 RTS
1366
1367 *----------
1368 *FM day to SD
1369 *retuen WMDY,WMDY+1
1370 68D0 STDATE EQU *
1371 68D0 8E 02FA LDX #FMDAT date of FM-7
1372 68D3 108E 603F LDY #WMDY
1373 68D7 C6 03 LDB #3
1374 68D9 34 04 ABLOP PSHS B
1375 68DB EC 81 LDD ,X++
1376 68DD 8D 2E BSR APLUSB
1377 68DF A7 A0 STA ,Y+
1378 68E1 35 04 PULS B
1379 68E3 26 F4 BNE ABLOP
1380 *year
1381 68E5 B6 603F LDA WMDY
1382 68E8 8B 14 ADDA #20 ---2000-1980
1383 68EA 48 LSLA
1384 68EB B7 603F STA WMDY
1385 *month
1386 68EE B6 6040 LDA WMDY+1
1387 68F1 48 LSLA
1388 68F2 48 LSLA
1389 68F3 48 LSLA
1390 68F4 48 LSLA
1391 68F5 48 ASLA
1392 68F6 B7 6040 STA WMDY+1
1393 68F9 F6 603F LDB WMDY
1394 68FC C9 00 ADCB #0 plus C
1395 68FE F7 603F STB WMDY
1396 *day
1397 6901 B6 6041 LDA WMDY+2
1398 6904 84 1F ANDA #$1F
1399 6906 BB 6040 ADDA WMDY+1
1400 6909 B7 6040 STA WMDY+1
1401 690C 39 RTS
1402
1403 *lower nibble of A,B to A+B
1404 690D APLUSB EQU *
1405 690D 34 10 PSHS X
1406 690F 34 04 PSHS B
1407 6911 C6 0A LDB #10
1408 6913 3D MUL
1409 6914 1F 01 TFR D,X
1410 6916 35 04 PULS B
1411 6918 3A ABX
1412 6919 1F 10 TFR X,D
1413 691B 1E 89 EXG A,B A:data
1414 691D 35 90 PULS X,PC
1415 *
1416 *--------------------
1417 691F WRTFIL EQU *
1418 *calc file size
1419 691F 7D 604D TST MCFLG 0,FF(FE),else
1420 6922 2B 08 BMI WRTF1
1421 6924 FC 6061 LDD MCAEP
1422 6927 B3 605F SUBD MCADP
1423 692A 20 04 BRA WRTF2
1424 692C WRTF1
1425 692C DC 35 LDD BASAEP
1426 692E 93 33 SUBD BASADP
1427 6930 FD 6046 WRTF2 STD FILSIZ
1428 6933 1F 02 TFR D,Y file size
1429 6935 10BF 606B STY WK3
1430 6939 1E 89 EXG A,B
1431 693B 8E 601F LDX #DIRENT
1432 693E ED 88 1C STD $1C,X
1433 6941 1E 89 EXG A,B
1434
1435 *add header&footer
1436 6943 7D 604D TST MCFLG 0,FF(FE),else
1437 6946 27 04 BEQ WRT3
1438 6948 2B 07 BMI WRT4
1439 694A 2A 08 BPL WRT5
1440
1441 694C C3 000A WRT3 ADDD #10 header&footer
1442 694F 20 03 BRA WRT5
1443 6951 C3 0003 WRT4 ADDD #3 header
1444 6954 1F 02 WRT5 TFR D,Y
1445
1446 *calc counter (CNT:512byte units)
1447 6956 7F 604C CLR CNT
1448 6959 7C 604C CALLOP INC CNT
1449 695C 83 0200 SUBD #512
1450 695F 22 F8 BHI CALLOP
1451 6961 B6 604C LDA CNT
1452 6964 B7 604E STA TPGFLG set top page
1453
1454 6967 7D 604D TST MCFLG
1455 696A 2B 05 BMI WRTF3
1456 696C BE 605F LDX MCADP saved top adr
1457 696F 20 02 BRA WRTF4
1458
1459 6971 9E 33 WRTF3 LDX BASADP saved top adr
1460 6973 BF 6067 WRTF4 STX WK1 src topadr
1461 6976 CE 5E00 LDU #RWBUF
1462
1463 *get clusterL
1464 6979 8E 601F LDX #DIRENT
1465 697C EC 88 1A LDD $1A,X
1466 697F 1E 89 EXG A,B B:clusterL
1467
1468 6981 BE 601A LDX SCTCLT sct no of top cluster
1469 6984 BF 6069 STX WK2
1470 6987 BE 601C LDX SCTCLT+2
1471 698A BF 606B STX WK2+2
1472
1473 698D C0 02 SUBB #2 for SD
1474 698F 7D 6009 TST SDHC 0:SD,1:SDHC
1475 6992 27 01 BEQ WR2
1476 6994 5A DECB
1477 6995 WR2
1478
1479 *(X)..(X+3)+(B)x40h
1480 6995 8E 6069 LDX #WK2
1481 6998 17 01B5 LBSR ADD40H cal of sct no
1482
1483 *set start sct no of file
1484 699B 34 10 PSHS X
1485 699D 8E 7022 LDX #MSWTNG
1486 69A0 17 0383 LBSR PSTRNG
1487 69A3 35 10 PULS X
1488
1489 69A5 WRLOP
1490 69A5 86 2E LDA #'.
1491 69A7 BD FBBB JSR OUTCHA
1492 69AA 10BE 606B LDY WK3
1493 69AE 1F 20 TFR Y,D
1494 69B0 1083 0200 CMPD #512
1495 69B4 23 04 BLS WR3
1496 69B6 108E 0200 LDY #512
1497 69BA WR3
1498
1499 *write data to rwbuf
1500 * (X)->(U:RWBUF)
1501 * (Y):SIZE 512bytes or Less
1502 69BA BE 6067 LDX WK1
1503 69BD CE 5E00 LDU #RWBUF
1504 69C0 8D 44 BSR WRSUB
1505
1506 *set to sctn0-3
1507 69C2 34 30 PSHS X,Y
1508 69C4 8E 6069 LDX #WK2
1509 69C7 108E 6004 LDY #SCTN0
1510 69CB C6 04 LDB #4
1511 69CD 17 015D LBSR TRANS
1512 69D0 35 30 PULS X,Y
1513
1514 *write data to sd
1515 69D2 17 008F LBSR WRTSD ...not wrtsd1
1516
1517 *inc sctn0-3
1518 69D5 8E 6069 LDX #WK2
1519 69D8 17 0166 LBSR INCX4
1520 69DB BE 6067 LDX WK1 src topadr
1521 69DE 3089 0200 LEAX 512,X
1522 *check top page
1523 69E2 7D 604E TST TPGFLG top page?
1524 69E5 27 0D BEQ WR6
1525 69E7 7D 604D TST MCFLG
1526 69EA 27 04 BEQ WR4
1527 69EC 2B 04 BMI WR5
1528 69EE 2A 04 BPL WR6
1529 69F0 30 1E WR4 LEAX -2,X rewind 3or5
1530 69F2 30 1D WR5 LEAX -3,X
1531 69F4 WR6
1532 69F4 7F 604E CLR TPGFLG
1533 69F7 BF 6067 STX WK1
1534 69FA 7A 604C DEC CNT
1535 * BEQ WREND
1536 * BRA WRLOP
1537 69FD 2A A6 BPL WRLOP
1538
1539 69FF 8E 703B WREND LDX #MSWTED
1540 6A02 17 0321 LBSR PSTRNG
1541 6A05 39 RTS
1542
1543 *----------
1544 *write data to rwbuf
1545 * (X)->(U:RWBUF)
1546 * (Y):SIZE 512bytes or Less
1547 *clear rwbuf
1548 6A06 WRSUB EQU *
1549 6A06 34 30 PSHS X,Y
1550 6A08 4F CLRA
1551 6A09 8E 5E00 LDX #RWBUF
1552 6A0C 108E 0200 LDY #512
1553 6A10 A7 80 WWCLOP STA ,X+
1554 6A12 31 3F LEAY -1,Y
1555 6A14 26 FA BNE WWCLOP
1556 6A16 35 30 PULS X,Y
1557
1558 *set data to rwbuf
1559 6A18 CE 5E00 LDU #RWBUF
1560
1561 6A1B 7D 604E TST TPGFLG top page?
1562 6A1E 27 24 BEQ WRLOP1
1563
1564 6A20 7D 604D TST MCFLG 0,$FF($FE),etc
1565 6A23 2B 15 BMI WRS1
1566 6A25 WRS0
1567 * add header of machine code
1568 6A25 34 10 PSHS X
1569 6A27 4F CLRA
1570 6A28 A7 C0 STA ,U+ 00
1571 6A2A BE 6046 LDX FILSIZ
1572 6A2D AF C1 STX ,U++ file size
1573 6A2F BE 605F LDX MCADP
1574 6A32 AF C1 STX ,U++ save adr
1575 6A34 31 3B LEAY -5,Y
1576 6A36 35 10 PULS X
1577 6A38 20 0A BRA WRLOP1
1578
1579 6A3A WRS1
1580 * add header of basic file
1581 6A3A 86 FF LDA #$FF
1582 6A3C A7 C0 STA ,U+
1583 6A3E A7 C0 STA ,U+
1584 6A40 A7 C0 STA ,U+
1585 6A42 31 3D LEAY -3,Y
1586
1587 6A44 A6 80 WRLOP1 LDA ,X+
1588 6A46 A7 C0 STA ,U+
1589 6A48 31 3F LEAY -1,Y
1590 6A4A 26 F8 BNE WRLOP1
1591
1592 *check last page
1593 6A4C B6 604C LDA CNT
1594 6A4F 81 01 CMPA #1
1595 6A51 26 10 BNE WRS2
1596 *add footer
1597 6A53 86 FF LDA #$FF
1598 6A55 A7 C0 STA ,U+
1599 6A57 4F CLRA
1600 6A58 A7 C0 STA ,U+
1601 6A5A A7 C0 STA ,U+
1602 6A5C BE 6063 LDX MCEXP
1603 6A5F AF C1 STX ,U++
1604 6A61 31 3B LEAY -5,Y
1605 6A63 39 WRS2 RTS
1606
1607 *write data to sd
1608 6A64 WRTSD EQU *
1609 6A64 17 01A0 LBSR SETSCT *set SCT No
1610 *copy sct no to cmd param
1611 6A67 8E 6004 WRTSD1 LDX #SCTN0
1612 6A6A 108E 6E5A LDY #CMD24+1
1613 6A6E C6 04 LDB #4
1614 6A70 17 00BA LBSR TRANS
1615 *send cmd
1616 6A73 17 01C0 LBSR SETCKL
1617 6A76 C6 06 LDB #6
1618 6A78 8E 6E59 LDX #CMD24
1619 6A7B A6 80 SDW1 LDA ,X+
1620 6A7D 17 0149 LBSR SNDDAT
1621 6A80 5A DECB
1622 6A81 26 F8 BNE SDW1
1623 *get cmd response
1624 6A83 SDW2
1625 6A83 17 015F LBSR GETDAT
1626 6A86 B6 6008 LDA RESDAT
1627 6A89 81 00 CMPA #$00
1628 6A8B 26 F6 BNE SDW2
1629 *1byte skip
1630 6A8D 86 FF LDA #$FF
1631 6A8F 17 0137 LBSR SNDDAT 1byte skip
1632
1633 *send data packet
1634 6A92 8E 5E00 LDX #RWBUF <-temp -1="" 008c="" 0093="" 00ab="" 00b3="" 00c3="" 011a="" 011d="" 0126="" 0129="" 012b="" 0133="" 01="" 0200="" 02="" 03="" 04="" 05="" 06="" 08="" 0:sd="" 0f="" 108e="" 10be="" 12="" 1635="" 1636="" 1637="" 1638="" 1639="" 1640="" 1641="" 1642="" 1643="" 1644="" 1645="" 1646="" 1647="" 1648="" 1649="" 1650="" 1651="" 1652="" 1653="" 1654="" 1655="" 1656="" 1657="" 1658="" 1659="" 1660="" 1661="" 1662="" 1663="" 1664="" 1665="" 1666="" 1667="" 1668="" 1669="" 1670="" 1671="" 1672="" 1673="" 1674="" 1675="" 1676="" 1677="" 1678="" 1679="" 1680="" 1681="" 1682="" 1683="" 1684="" 1685="" 1686="" 1687="" 1688="" 1689="" 1690="" 1691="" 1692="" 1693="" 1694="" 1695="" 1696="" 1697="" 1698="" 1699="" 16="" 1700="" 1701="" 1702="" 1703="" 1704="" 1705="" 1706="" 1707="" 1708="" 1709="" 1710="" 1711="" 1712="" 1713="" 1714="" 1715="" 1716="" 1717="" 1718="" 1719="" 1720="" 1721="" 1722="" 1723="" 1724="" 1725="" 1726="" 1727="" 1728="" 1729="" 1730="" 1731="" 1732="" 1733="" 1734="" 1735="" 1736="" 1737="" 1738="" 1739="" 1740="" 1741="" 1742="" 1743="" 1744="" 1745="" 1746="" 1747="" 1748="" 1749="" 1750="" 1751="" 1752="" 1753="" 1754="" 1755="" 1756="" 1757="" 1758="" 1759="" 1760="" 1761="" 1762="" 1763="" 1764="" 1765="" 1766="" 1767="" 1768="" 1769="" 1770="" 1771="" 1772="" 1773="" 1774="" 1775="" 1776="" 1777="" 1778="" 1779="" 1780="" 1781="" 1782="" 1783="" 1784="" 1785="" 1786="" 1787="" 1788="" 1789="" 1790="" 1791="" 1792="" 1793="" 1794="" 1795="" 1796="" 1797="" 1798="" 1799="" 17="" 1800="" 1801="" 1802="" 1803="" 1804="" 1805="" 1806="" 1807="" 1808="" 1809="" 1810="" 1811="" 1812="" 1813="" 1814="" 1815="" 1816="" 1817="" 1818="" 1819="" 1820="" 1821="" 1822="" 1823="" 1824="" 1825="" 1826="" 1827="" 1828="" 1829="" 1830="" 1831="" 1832="" 1833="" 1834="" 1835="" 1836="" 1837="" 1838="" 1839="" 1840="" 1841="" 1842="" 1843="" 1844="" 1845="" 1846="" 1847="" 1848="" 1849="" 1850="" 1851="" 1852="" 1853="" 1854="" 1855="" 1856="" 1857="" 1858="" 1859="" 1="" 1a="" 1e="" 1f="" 20="" 24="" 26="" 27="" 2="" 31="" 34="" 35="" 36="" 39="" 3="" 3a="" 3d="" 3f="" 40="" 44="" 48="" 4b="" 4f="" 54="" 5a="" 5b="" 5e00="" 5e="" 5f="" 6004="" 6008="" 6009="" 600e="" 6012="" 6016="" 601f="" 605a="" 605b="" 68="" 6a95="" 6a99="" 6a9b="" 6a9e="" 6aa0="" 6aa3="" 6aa5="" 6aa7="" 6aa9="" 6aac="" 6aaf="" 6ab2="" 6ab5="" 6ab7="" 6ab9="" 6abc="" 6abf="" 6ac1="" 6ac3="" 6ac4="" 6ac7="" 6acb="" 6acd="" 6acf="" 6ad2="" 6ad5="" 6ad7="" 6ad9="" 6ada="" 6adc="" 6adf="" 6ae2="" 6ae5="" 6ae9="" 6aeb="" 6aed="" 6af0="" 6af1="" 6af4="" 6af7="" 6af9="" 6afb="" 6afd="" 6b00="" 6b03="" 6b05="" 6b07="" 6b09="" 6b0c="" 6b0e="" 6b10="" 6b13="" 6b14="" 6b16="" 6b18="" 6b1a="" 6b1c="" 6b1e="" 6b21="" 6b23="" 6b25="" 6b27="" 6b29="" 6b2c="" 6b2d="" 6b2f="" 6b31="" 6b33="" 6b34="" 6b36="" 6b38="" 6b3a="" 6b3c="" 6b3d="" 6b3f="" 6b41="" 6b43="" 6b45="" 6b47="" 6b49="" 6b4b="" 6b4d="" 6b4f="" 6b50="" 6b52="" 6b54="" 6b56="" 6b58="" 6b5a="" 6b5c="" 6b5e="" 6b60="" 6b62="" 6b64="" 6b66="" 6b68="" 6b6a="" 6b6c="" 6b6e="" 6b70="" 6b71="" 6b73="" 6b75="" 6b78="" 6b7c="" 6b7e="" 6b80="" 6b83="" 6b85="" 6b88="" 6b8a="" 6b8c="" 6b8d="" 6b8f="" 6b91="" 6b94="" 6b96="" 6b98="" 6b9b="" 6b9f="" 6ba1="" 6ba4="" 6ba6="" 6ba8="" 6baa="" 6bab="" 6bae="" 6bb1="" 6bb5="" 6bb7="" 6bb9="" 6bbc="" 6bbe="" 6bc0="" 6bc1="" 6bc3="" 6bc6="" 6bc8="" 6bc9="" 6bcb="" 6bce="" 6bd0="" 6bd2="" 6bd4="" 6bd6="" 6bd9="" 6bdb="" 6bdd="" 6bde="" 6be0="" 6be1="" 6be3="" 6be5="" 6be7="" 6be9="" 6beb="" 6bec="" 6bed="" 6bee="" 6bf0="" 6bf3="" 6bf4="" 6c="" 6e53="" 6e54="" 70="" 7d="" 7f="" 80="" 81="" 84="" 86="" 88="" 89="" 8a="" 8b="" 8d="" 8e="" 96="" a0="" a6="" a7="" a:fill="" a="" abx="" ad="" add0="" add1="" add2="" add3="" add40h="" adda="" addb="" adr="" adx0="" adx1="" adx2="" adx3="" anda="" b1-="" b6="" b7="" b:cnt="" bcc="" beq="" bne="" bra="" bsr="" buf="" busy="" c6="" cb="" ckrs="" clr="" cluster="" cmd="" cmpa="" copy="" crch="" crcl="" cs:b0="L" d="" data="" decb="" df="" dir="" dirofs="" disp="" dpgno="" dspb1="" dspb2="" dspb3="" dspbin="" dspbuf="" e5="" ec="" ed="" equ="" exg="" f4="" f5="" f6="" f7="" f8b2="" f8d6="" f9="" fb="" fc="" fd9e="" fe="" ff3b="" ff77="" ff="" fill="" filop="" get="" getd1="" getdat="" inc="" incx4="" lbsr="" lda="" ldb="" ldd="" ldx="" ldy="" leay="" lsla="" lsra="" miso:b1="H(for" no="" nop="" of="" ora="" param="" pbdat="" pcrlf="" pia="" pshs="" puls="" rd1="" rd1sct="" rd2="" rd3="" read="" resdat="" response="" return="" rts="" save="" sct="" sd:2="" sdhc:4="" sdhc="" send="" setckh="" setckl="" setsno="" sndd1="" snddat="" snddt1="" src="" sta="" temp="" tfr="" to="" token="" trans="" trlop="" tst="" until="" wait="" wrdlop="" wrdskp="" wrf1="" wrf2="" wrf3="" wrtdir="" wrtfat="" wrtsd1="" wspfl0="" x40h="" y:dst="" y="">C
1860 6BF5 79 6008 ROL RESDAT C->b0
1861 6BF8 5A DECB
1862 6BF9 26 EE BNE GETD1
1863 6BFB 8D 39 BSR SETCKL
1864 6BFD 35 86 PULS A,B,PC
1865 *
1866 *------------------------------
1867 *input SCT No
1868 6BFF INSCT EQU *
1869 6BFF 8E 6F5E LDX #MSSCT
1870 6C02 17 0121 LBSR PSTRNG
1871 6C05 8D 75 BSR GET8CH get 8chr, convert 4bin
1872
1873 6C07 SETSCT EQU *
1874 6C07 34 32 PSHS A,X,Y
1875 6C09 7D 6009 TST SDHC 0:SD,1:SDHC
1876 6C0C 26 1A BNE CALCHC
1877 *SD card
1878 6C0E 8E 6005 LDX #SCTN1
1879 6C11 108E 6004 LDY #SCTN0
1880 6C15 C6 03 LDB #3
1881 6C17 17 FF13 LBSR TRANS
1882 6C1A 7F 6007 CLR SCTN3
1883 *calc top adrs of sct
1884 6C1D CALCSD EQU *
1885 6C1D 78 6007 LSL SCTN3
1886 6C20 79 6006 ROL SCTN2
1887 6C23 79 6005 ROL SCTN1
1888 6C26 35 B2 PULS A,X,Y,PC
1889
1890 *SDHC card
1891 *calc top adrs of sct
1892 6C28 CALCHC EQU *
1893 6C28 8E 6004 LDX #SCTN0
1894 6C2B 108E 6E54 LDY #CMD17+1
1895 6C2F C6 04 LDB #4
1896 6C31 17 FEF9 LBSR TRANS
1897 6C34 35 B2 PULS A,X,Y,PC
1898
1899 *
1900 *set sck:L
1901 6C36 SETCKL EQU *
1902 6C36 34 02 PSHS A
1903 6C38 86 34 LDA #$34 ca2=L
1904 6C3A B7 FD9F STA PBCTL
1905 6C3D 35 82 PULS A,PC
1906
1907 *set sck:H
1908 6C3F SETCKH EQU *
1909 6C3F 34 02 PSHS A
1910 6C41 86 3C LDA #$3C ca2=H
1911 6C43 B7 FD9F STA PBCTL
1912 6C46 35 82 PULS A,PC
1913
1914 *binary(A)->ascii(A)(B)
1915 6C48 DSPBIN EQU *
1916 6C48 34 06 PSHS A,B
1917 6C4A 1F 89 TFR A,B
1918 6C4C 44 LSRA
1919 6C4D 44 LSRA
1920 6C4E 44 LSRA
1921 6C4F 44 LSRA
1922 6C50 8A 30 ORA #$30
1923 6C52 C4 0F ANDB #$0F
1924 6C54 CA 30 ORB #$30
1925 6C56 81 39 CMPA #$39
1926 6C58 23 02 BLS BI21
1927 6C5A 8B 07 ADDA #$07
1928 6C5C C1 39 BI21 CMPB #$39
1929 6C5E 23 02 BLS BI22
1930 6C60 CB 07 ADDB #$07
1931 6C62 BD FBBB BI22 JSR OUTCHA
1932 6C65 1F 98 TFR B,A
1933 6C67 BD FBBB JSR OUTCHA
1934 6C6A 86 20 LDA #$20
1935 6C6C BD FBBB JSR OUTCHA
1936 6C6F 35 86 PULS A,B,PC
1937
1938 *crlf
1939 6C71 PCRLF EQU *
1940 6C71 86 0D LDA #CR
1941 6C73 BD FBBB JSR OUTCHA
1942 6C76 86 0A LDA #LF
1943 6C78 BD FBBB JSR OUTCHA
1944 6C7B 39 RTS
1945
1946 *
1947 6C7C GET8CH EQU *
1948 *input chr
1949 6C7C 8E 606F LDX #INPBUF
1950 6C7F 5F CLRB
1951 6C80 BD 6E2D CLOP JSR INOUTC
1952 6C83 81 0D CMPA #CR
1953 6C85 27 07 BEQ INEND
1954 6C87 A7 85 STA B,X
1955 6C89 5C INCB
1956 6C8A C1 08 CMPB #8
1957 6C8C 25 F2 BLO CLOP
1958
1959 6C8E INEND
1960 *shift
1961 6C8E 5D TSTB
1962 6C8F 27 21 BEQ CLEND
1963 6C91 8E 606F LDX #INPBUF
1964 6C94 3A ABX
1965 6C95 108E 6077 LDY #INPBUF+8
1966 6C99 34 04 PSHS B
1967 6C9B A6 82 SFLOP LDA ,-X
1968 6C9D A7 A2 STA ,-Y
1969 6C9F 5A DECB
1970 6CA0 26 F9 BNE SFLOP
1971 *clr
1972 6CA2 C6 08 CL1 LDB #8
1973 6CA4 E0 E0 SUBB ,S+
1974 6CA6 27 0A BEQ CLEND
1975 6CA8 8E 606F LDX #INPBUF
1976 6CAB 86 30 LDA #'0
1977 6CAD A7 80 CLLOP STA ,X+
1978 6CAF 5A DECB
1979 6CB0 26 FB BNE CLLOP
1980 6CB2 CLEND
1981
1982 *convert to bin
1983 6CB2 C6 04 LDB #4
1984 6CB4 8E 606F LDX #INPBUF
1985 6CB7 108E 6004 LDY #SCTN0
1986 6CBB CVT1
1987 6CBB A6 80 LDA ,X+
1988 6CBD 8D 1E BSR CVBIN
1989 6CBF 25 16 BCS EREND1
1990 6CC1 48 LSLA
1991 6CC2 48 LSLA
1992 6CC3 48 LSLA
1993 6CC4 48 LSLA
1994 6CC5 34 02 PSHS A
1995 6CC7 A6 80 LDA ,X+
1996 6CC9 8D 12 BSR CVBIN
1997 6CCB 25 08 BCS EREND0
1998 6CCD AB E0 ADDA ,S+
1999 6CCF A7 A0 STA ,Y+
2000 6CD1 5A DECB
2001 6CD2 26 E7 BNE CVT1
2002 6CD4 39 RTS
2003
2004 6CD5 35 02 EREND0 PULS A
2005 6CD7 8E 6FA4 EREND1 LDX #MSERR
2006 6CDA 8D 4A BSR PSTRNG
2007 6CDC 39 EEND RTS
2008
2009 *--------------------
2010 *ascii -> bin
2011 6CDD CVBIN EQU *
2012 6CDD 80 30 SUBA #'0
2013 6CDF 2B 11 BMI CVERR
2014 6CE1 81 09 CMPA #9
2015 6CE3 23 0A BLS CVBEND
2016 6CE5 81 11 CMPA #$11
2017 6CE7 25 09 BLO CVERR
2018 6CE9 81 16 CMPA #$16
2019 6CEB 22 05 BHI CVERR
2020 6CED 80 07 SUBA #7
2021 6CEF CVBEND
2022 6CEF 1C FE ANDCC #$FE reset C
2023 6CF1 39 RTS
2024 6CF2 1A 01 CVERR ORCC #$01 set C
2025 6CF4 39 RTS
2026
2027 *--------------------
2028 *add 2bytes to 4bytes
2029 * X,X+1,X+2,X+3 + Y,Y+1
2030 * data X is big endian
2031 * data Y is little endian
2032 6CF5 ADD42 EQU *
2033 6CF5 34 36 PSHS A,B,X,Y
2034 6CF7 32 7C LEAS -4,S
2035 6CF9 C6 04 LDB #4
2036 6CFB A6 80 AD1 LDA ,X+
2037 6CFD A7 E0 STA ,S+
2038 6CFF 5A DECB
2039 6D00 26 F9 BNE AD1
2040
2041 *add (lower)
2042 6D02 A6 A0 LDA ,Y+
2043 6D04 AB E2 ADDA ,-S
2044 6D06 A7 E4 STA ,S
2045 6D08 24 02 BCC AD2
2046 6D0A 6C 7F INC -1,S
2047 *add (upper)
2048 6D0C A6 A4 AD2 LDA ,Y
2049 6D0E AB E2 ADDA ,-S
2050 6D10 A7 E4 STA ,S
2051 6D12 24 02 BCC AD3
2052 6D14 6C 7F INC -1,S
2053 6D16 30 1C AD3 LEAX -4,X
2054 6D18 32 7E LEAS -2,S
2055 6D1A C6 04 LDB #4
2056 6D1C A6 E0 AD4 LDA ,S+
2057 6D1E A7 80 STA ,X+
2058 6D20 5A DECB
2059 6D21 26 F9 BNE AD4
2060 6D23 35 36 PULS A,B,X,Y
2061 6D25 39 RTS
2062
2063 *--------------------
2064 * pstring
2065 6D26 PSTRNG EQU *
2066 6D26 34 02 PSHS A
2067 6D28 A6 80 PSLOP LDA ,X+
2068 6D2A 81 04 CMPA #4
2069 6D2C 27 05 BEQ PSEND
2070 6D2E BD FBBB JSR OUTCHA
2071 6D31 20 F5 BRA PSLOP
2072 6D33 35 02 PSEND PULS A
2073 6D35 39 RTS
2074
2075 *--------------------
2076 *disp MM-DD-YY
2077 *indata A(Low),B(High)
2078 6D36 DSPYMD EQU *
2079 6D36 1E 89 EXG A,B
2080 6D38 34 10 PSHS X
2081 6D3A 34 06 PSHS A,B
2082 6D3C C4 E0 ANDB #$E0
2083 6D3E 54 LSRB
2084 6D3F 54 LSRB
2085 6D40 54 LSRB
2086 6D41 54 LSRB
2087 6D42 54 LSRB
2088 6D43 47 ASRA
2089 6D44 24 02 BCC DYMD1
2090 6D46 CB 08 ADDB #8
2091 6D48 F7 603F DYMD1 STB WMDY MM
2092 6D4B 35 06 PULS A,B
2093 6D4D 34 04 PSHS B
2094 6D4F C4 1F ANDB #$1F
2095 6D51 F7 6040 STB WMDY+1 DD
2096 6D54 35 04 PULS B
2097
2098 6D56 44 LSRA
2099 * ASLB
2100 * BCC DYMD2
2101 * INCA
2102 6D57 DYMD2
2103 6D57 80 14 SUBA #20 A+1980-2000
2104 6D59 B7 6041 STA WMDY+2 YY
2105
2106 *disp MM-DD-YY
2107 6D5C 86 20 LDA #SPC
2108 6D5E BD FBBB JSR OUTCHA
2109 6D61 8E 603F LDX #WMDY
2110 6D64 A6 80 LDA ,X+
2111 6D66 8D 14 BSR DB2ASC MM
2112 6D68 86 2D LDA #'-
2113 6D6A BD FBBB JSR OUTCHA
2114 6D6D A6 80 LDA ,X+
2115 6D6F 8D 0B BSR DB2ASC DD
2116 6D71 86 2D LDA #'-
2117 6D73 BD FBBB JSR OUTCHA
2118 6D76 A6 80 LDA ,X+
2119 6D78 8D 02 BSR DB2ASC YY
2120 6D7A 35 90 PULS X,PC
2121 *
2122 *----------
2123 *convert decimal value to ascii code
2124 *(A:BIN)->ASCII
2125 6D7C DB2ASC EQU *
2126 6D7C 34 06 PSHS A,B
2127 6D7E 1F 89 TFR A,B
2128 6D80 86 30 LDA #$30
2129 6D82 C1 0A DBLOP CMPB #10
2130 6D84 25 05 BLO DB2
2131 6D86 C0 0A SUBB #10
2132 6D88 4C INCA
2133 6D89 20 F7 BRA DBLOP
2134 6D8B BD FBBB DB2 JSR OUTCHA
2135 6D8E 1F 98 TFR B,A
2136 6D90 8B 30 ADDA #$30
2137 6D92 BD FBBB JSR OUTCHA
2138 6D95 35 86 PULS A,B,PC
2139
2140 *disp FILE size
2141 6D97 DSPSIZ EQU *
2142 6D97 34 10 PSHS X
2143 6D99 BE 6042 LDX WFSIZ
2144 6D9C 27 07 BEQ DSS1 if 64k over?
2145 6D9E 8E 706F LDX #MSOVR
2146 6DA1 8D 83 BSR PSTRNG
2147 6DA3 20 40 BRA DSEND
2148
2149 6DA5 DSS1
2150 * LDA #SPC
2151 * JSR OUTCHA
2152 * /1024(400h)
2153 6DA5 B6 6044 LDA WFSIZ+2 under 64k
2154 6DA8 44 LSRA
2155 6DA9 44 LSRA
2156 *disp dec
2157 6DAA 1F 89 TFR A,B
2158 6DAC 81 64 CMPA #100
2159 6DAE 23 10 BLS DSS13
2160 6DB0 86 30 LDA #'0
2161 6DB2 C1 64 DSLOP1 CMPB #100
2162 6DB4 25 05 BLO DSS12
2163 6DB6 C0 64 SUBB #100
2164 6DB8 4C INCA
2165 6DB9 20 F7 BRA DSLOP1
2166 6DBB BD FBBB DSS12 JSR OUTCHA
2167 6DBE 20 0B BRA DSS14
2168
2169 *under 100
2170 6DC0 86 20 DSS13 LDA #SPC
2171 6DC2 BD FBBB JSR OUTCHA
2172 6DC5 86 20 LDA #SPC
2173 6DC7 C1 0A CMPB #10
2174 6DC9 25 0B BLO DSS2
2175
2176 6DCB 86 30 DSS14 LDA #'0
2177 6DCD C1 0A DSLOP2 CMPB #10
2178 6DCF 25 05 BLO DSS2
2179 6DD1 C0 0A SUBB #10
2180 6DD3 4C INCA
2181 6DD4 20 F7 BRA DSLOP2
2182
2183 6DD6 BD FBBB DSS2 JSR OUTCHA 10's place
2184 *under 10
2185 6DD9 1F 98 DSS21 TFR B,A
2186 6DDB 8B 31 ADDA #$31 '1
2187 6DDD BD FBBB DSS3 JSR OUTCHA 1's place
2188 6DE0 86 6B LDA #'k
2189 6DE2 BD FBBB JSR OUTCHA
2190 6DE5 86 20 DSEND LDA #SPC
2191 6DE7 BD FBBB JSR OUTCHA
2192 6DEA 35 90 PULS X,PC
2193
2194 *----------
2195 *disp cluster
2196 *return:clusterH,spc,clusterL
2197 6DEC DSPCLS EQU *
2198 6DEC 34 10 PSHS X
2199 6DEE 86 20 LDA #SPC
2200 6DF0 BD FBBB JSR OUTCHA
2201 6DF3 8E 6048 LDX #CLSTH
2202 6DF6 C6 02 LDB #2
2203 6DF8 A6 80 DCLOP1 LDA ,X+
2204 6DFA 17 FF7F LBSR DB2ASC
2205 6DFD 5A DECB
2206 6DFE 26 F8 BNE DCLOP1
2207 6E00 86 20 LDA #SPC
2208 6E02 BD FBBB JSR OUTCHA
2209 6E05 C6 02 LDB #2
2210 6E07 A6 80 DCLOP2 LDA ,X+
2211 6E09 17 FF70 LBSR DB2ASC
2212 6E0C 5A DECB
2213 6E0D 26 F8 BNE DCLOP2
2214 6E0F 35 90 PULS X,PC
2215
2216 *----------
2217 6E11 FNMIN EQU *
2218 *clr buf
2219 6E11 8E 605A LDX #FNAME+11
2220 6E14 C6 0B LDB #8+3
2221 6E16 86 20 LDA #SPC
2222 6E18 A7 82 FNIN0 STA ,-X
2223 6E1A 5A DECB
2224 6E1B 26 FB BNE FNIN0
2225
2226 *fname in
2227 6E1D 34 24 PSHS B,Y
2228 6E1F 108E 604F LDY #FNAME
2229 6E23 C6 08 LDB #8
2230 6E25 8D 0D BSR LININ
2231 6E27 86 20 LDA #$20
2232 6E29 A7 3F STA -1,Y
2233 6E2B 35 A4 PULS B,Y,PC
2234
2235 *--------------------
2236 *
2237 6E2D BD FBB8 INOUTC JSR INCHA
2238 6E30 BD FBBB JSR OUTCHA
2239 6E33 39 RTS
2240
2241 *--------------------
2242 * line input
2243 * input: B:count, Y:buf
2244 * output: FILBUF (terminate $00)
2245 * temp buf $043D - $053C
2246 6E34 LININ EQU *
2247 6E34 0F BF CLR $BF
2248 6E36 BD D807 JSR LININP
2249
2250 6E39 8E 043D LDX #$043D
2251 6E3C A6 80 LINLOP LDA ,X+
2252 6E3E A7 A0 STA ,Y+
2253 6E40 5A DECB
2254 6E41 27 03 BEQ LEND
2255 6E43 4D TSTA
2256 6E44 26 F6 BNE LINLOP
2257 6E46 39 LEND RTS
2258
2259 *
2260 **************************************************
2261 *========== parameter ==========
2262 6E47 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
2263 6E4D 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
2264 6E53 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
2265 6E59 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
2266 6E5F 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
2267 6E65 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
2268 6E6B 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
2269 6E71 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
2270 6E77 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
2271 *
2272 6E7D 43 MCMD0 FCC /CMD0/,CR,LF
2273 6E83 04 FCB 4
2274 6E84 43 MCMD8 FCC /CMD8/,CR,LF
2275 6E8A 04 FCB 4
2276 6E8B 43 MCMD58 FCC /CMD58/,CR,LF
2277 6E92 04 FCB 4
2278 6E93 43 MCMD55 FCC /CMD55/,CR,LF
2279 6E9A 04 FCB 4
2280 6E9B 41 MCMD41 FCC /ACMD41/,CR,LF
2281 6EA3 04 FCB 4
2282 6EA4 43 MCMD9 FCC /CMD9/,CR,LF
2283 6EAA 04 FCB 4
2284 *
2285 6EAB 0D MSMENU1 FCC CR,LF,CR,LF,/Main MENU/
2286 6EB8 0D FCC CR,LF,/D)ir, L)oad, save B)asic, save M)code, K)ill, S)etSD, O)ption, Q)uit: /
2287 6F00 04 FCB 4
2288 6F01 0D MSMENU2 FCC CR,LF,CR,LF,/Option MENU/
2289 6F11 0D FCC CR,LF,/1:Read Sct, 2:Disp SD data, 3:Disp MBR, 4:Disp BPB, 5:Disp FAT, 0:Return: /
2290 6F5D 04 FCB 4
2291 6F5E 53 MSSCT FCC /SctNo: /
2292 6F65 04 FCB 4
2293 6F66 0D MSSD0 FCC CR,LF,/SD Card/
2294 6F6F 04 FCB 4
2295 6F70 0D MSSD1 FCC CR,LF,/SDHC Card/
2296 6F7B 04 FCB 4
2297 6F7C 0D MSINIT FCC CR,LF,CR,LF,/SD Card setting.../
2298 6F92 04 FCB 4
2299 6F93 53 MERR FCC /Setting error!/,CR,LF
2300 6FA3 04 FCB 4
2301 6FA4 49 MSERR FCC /Input error!/,CR,LF
2302 6FB2 04 FCB 4
2303 6FB3 0D MSOFS FCC CR,LF,/Sector no is:/
2304 6FC2 04 FCB 4
2305 6FC3 0D MSBPB FCC CR,LF,/ BPB: /
2306 6FCB 04 FCB 4
2307 6FCC 0D MSFAT FCC CR,LF,/ FAT: /
2308 6FD4 04 FCB 4
2309 6FD5 0D MSDIR FCC CR,LF,/ DIR: /
2310 6FDD 04 FCB 4
2311 6FDE 0D MSCL2 FCC CR,LF,/ 1stCLUSTER: /
2312 6FED 04 FCB 4
2313 6FEE 0D MSINFN FCC CR,LF,CR,LF,/ FileName: /
2314 6FFD 04 FCB 4
2315 6FFE 0D MSMSV FCC CR,LF,CR,LF,/ FileName & Param: /
2316 7015 04 FCB 4
2317 7016 0D MSLDNG FCC CR,LF,/ Loading /
2318 7021 04 FCB 4
2319 7022 0D MSWTNG FCC CR,LF,/ Writing /
2320 702D 04 FCB 4
2321 702E 0D MSLDED FCC CR,LF,/ Load end./
2322 703A 04 FCB 4
2323 703B 0D MSWTED FCC CR,LF,/ Write end./
2324 7048 04 FCB 4
2325 7049 0D MSNOFL FCC CR,LF,/ Not exist!/
2326 7056 04 FCB 4
2327 7057 0D MSNXTP FCC CR,LF,"Next page (SP:Next): "
2328 706E 04 FCB 4
2329 706F 3E MSOVR FCC />64k/
2330 7073 04 FCB 4
2331 7074 0D MSKILL FCC CR,LF," Kill OK?(Y/N): "
2332 7086 04 FCB 4
2333 7087 0D MSEXST FCC CR,LF," Exist! Over Write?(Y/N): "
2334 70A3 04 FCB 4
2335 70A4 0D MSMCOF FCC CR,LF," -$2000 Offset?(Y/N): "
2336 70BC 04 FCB 4
2337
2338 **************************************************
2339
2340 END START
0 error(s), 0 warning(s) is detected.
Label address
ABLOP 68D9 ACMD41 6E71 AD1 6CFB AD2 6D0C AD3 6D16
AD4 6D1C ADD0 6B52 ADD1 6B60 ADD2 6B68 ADD3 6B70
ADD40H 6B50 ADD42 6CF5 ADX0 6B41 ADX1 6B47 ADX2 6B4B
ADX3 6B4F APLUSB 690D ASC2BIN 679D ASC411 620D ASCMD41 6200
BASADP 0033 BASAEP 0035 BASEXP 605D BI21 6C5C BI22 6C62
BUSY 6AB9 CALCHC 6C28 CALCSD 6C1D CALLOP 6959 CKRS 6AAF
CL1 6CA2 CLEND 6CB2 CLLOP 6CAD CLOP 6C80 CLRDIR 6725
CLSTH 6048 CLSTL 604A CMD0 6E47 CMD1 6E4D CMD17 6E53
CMD24 6E59 CMD55 6E6B CMD58 6E65 CMD8 6E5F CMD9 6E77
CMPEND 65F4 CMPFN 65D9 CMPLOP 65E1 CNT 604C CNV1 67ED
CNV2 67F9 CNVBUF 6077 CNVSUB 67E5 CR 000D CSRON FBF7
CVBEND 6CEF CVBIN 6CDD CVERR 6CF2 CVT1 6CBB DB2 6D8B
DB2ASC 6D7C DBLOP 6D82 DCLOP1 6DF8 DCLOP2 6E07 DELMK 00E5
DEVNO 00BF DIRENT 601F DIRGET 6891 DIROFS 605B DLOP1 6873
DPGNO 605A DSEND 6DE5 DSLOP1 6DB2 DSLOP2 6DCD DSPB1 6BB5
DSPB2 6BB7 DSPB3 6BC8 DSPBIN 6C48 DSPBPB 63DB DSPBUF 6BAB
DSPC1 6474 DSPCKE 642C DSPCLS 6DEC DSPDIR 63FF DSPED 6890
DSPEND 64AC DSPFAT 63ED DSPFL0 640B DSPFL1 641C DSPFL2 6436
DSPFL3 6438 DSPFL4 6447 DSPFL5 6494 DSPFL6 64A0 DSPMBR 6387
DSPSDDAT 62F3 DSPSIZ 6D97 DSPYMD 6D36 DSS1 6DA5 DSS12 6DBB
DSS13 6DC0 DSS14 6DCB DSS2 6DD6 DSS21 6DD9 DSS3 6DDD
DYMD1 6D48 DYMD2 6D57 EEND 6CDC EREND0 6CD5 EREND1 6CD7
ESC 001B EXIST 6852 EXSTFL 6065 FILBUF 607B FILL 6B38
FILOP 6B3A FILSIZ 6046 FMDAT 02FA FNAME 604F FNIN0 6E18
FNMIN 6E11 GET1 6392 GET2 6394 GET8CH 6C7C GETBPB 63C2
GETD1 6BE9 GETDAT 6BE5 GETFDT 65F6 GETMBR 63A5 GR00 617A
GR2580 623A GR2581 6251 GR2582 6253 GR410 6215 GR550 61F6
GR580 61CC GR581 61D6 GR582 61D8 GR80 619C GR81 61AE
GR90 6306 GR91 6312 GTBLOP 63CD GTF1 6615 GTF2 6618
ILOP1 6276 INCHA FBB8 INCX4 6B41 INEND 6C8E INIT 60BF
INOUTC 6E2D INPBUF 606F INPFLDAT 6780 INSCT 6BFF ISTT 6160
KILEND 66C0 KILFILE 666C KILSUB 6685 KL1 66AA KL2 66B8
LD1 6648 LD2 665C LD3 64D2 LD41 64F7 LD5 6510
LD8 6552 LD80 6570 LD81 6574 LD9 6577 LDE0 6597
LDE1 659D LDEND 6587 LDFILE 64AD LDFL0 6624 LDFL1 6630
LDFL5 6654 LDFLE 666B LDLOP 6520 LDNEND 65A1 LEND 6E46
LF 000A LININ 6E34 LININP D807 LINLOP 6E3C MAIN 609B
MATCH 65EE MCADP 605F MCAEP 6061 MCEXP 6063 MCFLG 604D
MCMD0 6E7D MCMD41 6E9B MCMD55 6E93 MCMD58 6E8B MCMD8 6E84
MCMD9 6EA4 MEMSET 65A9 MENU 60C2 MENU1 60D9 MENU2 60E2
MENU3 60EB MENU4 60F4 MENU5 60FD MENU6 6105 MENU7 610D
MERR 6F93 MKF1 68B0 MKF2 68B4 MKFLDT 6897 MS0 65C0
MS1 65C4 MS3 65D3 MSBPB 6FC3 MSCL2 6FDE MSDIR 6FD5
MSERR 6FA4 MSEXST 7087 MSFAT 6FCC MSINFN 6FEE MSINIT 6F7C
MSKILL 7074 MSLDED 702E MSLDNG 7016 MSLOP 65C6 MSMCOF 70A4
MSMENU1 6EAB MSMENU2 6F01 MSMSV 6FFE MSNOFL 7049 MSNXTP 7057
MSOFS 6FB3 MSOVR 706F MSSCT 6F5E MSSD0 6F66 MSSD1 6F70
MSWTED 703B MSWTNG 7022 NOEXST 6855 NOFEND 66CE NOTM 65F2
OPMEN10 6144 OPMEN6 6124 OPMEN7 612C OPMEN8 6134 OPMEN9 613C
OPMENU 6115 OUTCHA FBBB PBCTL FD9F PBDAT FD9E PCRLF 6C71
PSEND 6D33 PSLOP 6D28 PSTRNG 6D26 RD1 6B88 RD1SCT 6B75
RD2 6B8F RD3 6B9F RDSCT 6374 RESDAT 6008 RPT41 61E1
RWBUF 5E00 SC01 6171 SC2581 6232 SC551 61EE SC581 61C4
SC80 6194 SC91 62FE SCLOP1 632F SCLOP2 6342 SCLOP3 6355
SCLOP4 6368 SCMD0 6169 SCMD258 6225 SCMD55 61E1 SCMD58 61B7
SCMD8 6187 SCTBPB 600A SCTCLT 601A SCTDIR 6012 SCTDSV 6016
SCTFAT 600E SCTN0 6004 SCTN1 6005 SCTN2 6006 SCTN3 6007
SCTPCL 601E SD1 6267 SDERR 614C SDHC 6009 SDINIT 6153
SDW1 6A7B SDW2 6A83 SETCKH 6C3F SETCKL 6C36 SETCL 683D
SETFNM 670D SETSCT 6C07 SETSNO 63B5 SETX 682C SFATED 6848
SFLOP 6C9B SKP1 62AD SKP2 62EA SKPDLM 6796 SNDD1 6BD0
SNDDAT 6BC9 SNDDT1 6A9E SPC 0020 SRC0 680C SRC00 6849
SRCDIR 6858 SRCDLM 678D SRCFAT 6800 SRCFL0 6867 SRCFL1 686A
SRCFL5 6885 SRCLOP 6815 SRDLM1 678F SRLOP1 67AE SRLOP2 67C6
START 6000 STDATE 68D0 STTADR 6000 TPGFLG 604E TRANS 6B2D
TRLOP 6B2F TXTADR 2000 VN 6003 WFSIZ 6042 WK1 6067
WK2 6069 WK3 606B WK4 606D WMDY 603F WR2 6995
WR3 69BA WR4 69F0 WR5 69F2 WR6 69F4 WRB0 66D5
WRB1 66F3 WRBEND 670C WRBFILE 66C1 WRDLOP 6AD7 WRDSKP 6ADC
WREND 69FF WRF1 6B10 WRF2 6B13 WRF3 6B29 WRFL1 671A
WRFL2 6724 WRFLP2 6715 WRLOP 69A5 WRLOP1 6A44 WRM1 674D
WRMEND 677F WRMFILE 6733 WRS0 6A25 WRS1 6A3A WRS2 6A63
WRSUB 6A06 WRT3 694C WRT4 6951 WRT5 6954 WRTDIR 6AC4
WRTF1 692C WRTF2 6930 WRTF3 6971 WRTF4 6973 WRTFAT 6AF1
WRTFIL 691F WRTSD 6A64 WRTSD1 6A67 WSPFL0 6ACF WWCLOP 6A10
</-temp></pre>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;">制約事項も多々ありますが、とりあえず、Windows PCとFM-7との間でSDカードを介してBASICプログラムファイルや機械語ファイルを転送するツールとして使用できるのではと考えています。</div><p><br /></p><h4 style="text-align: left;">プログラム作成に関する多少の情報</h4><p>1.ファイルサイズを20KBまでに限定</p><p>SDカードの1クラスタは40セクタですのでクラスタサイズは40x512で20KBとなります。ということでファイルサイズを20KBまでに限定すれば1クラスタに収まりますので、FATの処理が簡単になりました。</p><p>2.FATテーブルを512バイトに限定</p><p>SDカードのFAT16では2バイトで1クラスタ、SDHCカードのFAT32では4バイトで1クラスタですので、512バイトあれば256や128ファイル(実際にはシステムが数クラスタを使用しているのでこれよりは少ないですが)が書き込めるのでこれで十分と割り切ることでFATテーブルが1セクタのみとなり処理が簡単になりました。</p><p>3.使用しているFM-7のルーチン</p><p>1文字入出力(INCHA, OUTCHA)、カーソル表示(CSRON)と一行入力(LININP)を使用しています。</p><p>4.プログラムの開発手順</p><p>プログラムはWindows上のエディタで作成し、自作のクロスアセンブラ6809AsmWin.exeでアセンブルし、それを仮想ドライブ作成ソフトFlexDrvWin.exeに放り込んで、6809ボードマイコンのFLEX9上で走らせてデバッグしました。</p><p>デバッグが済んだところで、INCHA,OUTCHA,一行入力ルーチンをFM-7用に書き換えてアセンブルし直してからF-Basic用の仮想ドライブ作成ソフトFbasDrvWin.exeに入れて、できたディスクイメージファイルをFT245を用いた高速転送カードを使用してFM-7に送り込み、実機デバッグを行って完成させました。</p><div><br /></div><h4>さらに実現したいことなど</h4><p>実現できていない機能としては、アスキーセーブされたF-BASICのプログラムファイルの読み書き機能があります。これが実現できれば、WindowsPC上のエディタでプログラムを作成し、それをFM-7に持ち込んで実行することができるのですが...</p><p>しかし、今のところ、キーボードからの入力の代わりにテキストファイルを読み込んでBASICのプログラムファイルにする手法が分かっていません。</p><p>現在のプログラムで既に4KBを超えていますので、これ以上の機能拡張は難しいかもしれません。(プログラムが$6000~$70BC、バッファが$5E00~$5FFFを占めていますので、この範囲と重なるような機械語ファイルはそのままでは読み込めません。とりあえずの対応ですが、$2000バイトのオフセットを付けてロードできるようにしてあります。裏RAMを使用すれば何とかなるのでしょうが...)</p><p><br /></p><h4 style="text-align: left;"><b>最後に</b></h4><p>以上、FM-7に6821(PIA)のみを増設し、6809のアセンブラでSDカードからのファイルの読み込み、ファイルの書き込みまで実現できたという報告でした。</p><p>なお、使用しているFM-7本体のルーチンはINCHA, OUTCHA, CSRONと一行入力ルーチンの4つのみです。</p><p>Windows PCでは普通にSDカードを使用されている方が多いと思いますので、FM-7側にRTC-SDカードを増設するだけで、Windows - FM-7間でファイルの交換ができるのはそれなりに便利なのではないかと思いますがどうでしょうか。</p><p>ネットで検索すると、Arduinoなどのマイコンのライブラリを用いてSDカードを扱うという記事は多々ありますが、マイコン等を使用せずに68系の8ビットパソコン本体のみで、しかもアセンブラでSDカードを読み書きするという情報は見つけることができませんでしたので、同様なことを考えられている方への参考になれば幸いです。</p><p>完成したばかりで、まだ冗長な個所などがあるものですが、どなたかの参考になればということで、作成したプログラムを<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmVgtwL840D-wIVfW?e=F1D3Bj" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。</p><p><br /></p><p>今回、プログラム開発にあたっては、下記の方々のブログ等を参考にさせていただきました。心から感謝いたします。</p><p>◎中日電工の菱田さんのブログ ・・・SD,SDHCの読み書きの手法(Z80で)</p><p>◎ELM by ChaNさんのブログ ・・・SD,SDHCに関するマニュアル的資料(英文)</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-34103322622439063802023-03-25T09:06:00.008+09:002023-03-25T13:31:13.300+09:00FM-7にRTCとSDを接続する試み(SDカード編 その2)<h4 style="text-align: left;">SDカード中のBASICプログラムファイルと機械語ファイルを読み込んで実行することができました</h4><p>SDカードへの書き込みはまだ実現していませんが、とりあえず、読み込みはできるようになりました。</p><p>F-BASICのコマンド(FILES, LOAD, LOADM)でフロッピィディスクと同様にSDカードを扱えるのが理想なのでしょうが、1セクタのサイズが512バイトであることもあり実現するのは私には難しいようです。</p><p>とりあえず、SDカードを用いてWindowsPCからFM-7へファイルを移動させるツールとして使用する前提で、常駐ソフトではなくその都度起動してSDカードを読むという形の専用プログラムにしました。</p><p>使用法のイメージは下図のようです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0k8SWVCX9EaWcduEL3oHFiHbsklU8oM6M2WifAwae-8np_KkhytUSyU5korMEkdxxRIfkJ_InpGvRcaDdEs7M7RKQiwIkXt96ERa4NThMNi0QkO1eNYS22Z5WeJl_Y5Ecnj8c-j7oGFLxURxzuCKNX0us31rMjmQkZcLR-a15Az6P_5aUGAobJQ1/s1448/SD%E6%A7%8B%E6%88%90%E5%9B%B3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="745" data-original-width="1448" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY0k8SWVCX9EaWcduEL3oHFiHbsklU8oM6M2WifAwae-8np_KkhytUSyU5korMEkdxxRIfkJ_InpGvRcaDdEs7M7RKQiwIkXt96ERa4NThMNi0QkO1eNYS22Z5WeJl_Y5Ecnj8c-j7oGFLxURxzuCKNX0us31rMjmQkZcLR-a15Az6P_5aUGAobJQ1/w400-h206/SD%E6%A7%8B%E6%88%90%E5%9B%B3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用イメージ</td></tr></tbody></table><br /><p>通常使用しているFT245高速通信カードでは、ディスクイメージを丸ごとコピーするのですが、このSDカード使用の場合は特定のファイルを選択してFM-7に移すことができます。</p><p>プログラムの起動画面です</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPbckHEsIA164OZm61iwJFvnCKaH5do6jCtT8C-Y48FnyeXiWq_6SFJt6C_W1IpePeM8lgsw7KM1efhoOhs6VdefHlGorALfSm3RGDNffE3PWofL0Ix3GBEWkw8Z3nEQdLwcukuk3nfurFk2bR2ua6aRisHmHq7wziHYQeup6vQqFQDefCtRd0aFFh/s4032/SD%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPbckHEsIA164OZm61iwJFvnCKaH5do6jCtT8C-Y48FnyeXiWq_6SFJt6C_W1IpePeM8lgsw7KM1efhoOhs6VdefHlGorALfSm3RGDNffE3PWofL0Ix3GBEWkw8Z3nEQdLwcukuk3nfurFk2bR2ua6aRisHmHq7wziHYQeup6vQqFQDefCtRd0aFFh/w400-h300/SD%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">起動画面</td></tr></tbody></table><br /><p></p><p>メニュー項目は</p><div>1.指定したセクタのリード</div><div>2.SDカードのデータ取得・表示</div><div>3.SDカードの初期化</div><div>4.MBR(Master Boot Record)内容の表示</div><div>5.BPB(Boot Parameter Block)内容の表示</div><div>6.FAT(File Allocation Table)内容の表示</div><div>7.DIR(Directory)内容の表示</div><div>8.指定ファイルの読み込み<br />で、前回との違いは、</div><div>・セクタへの書き込みを省いた。</div><div>・ディレクトリの表示形式を変更したことと、全ページを表示できるようにした。</div><div>・ファイルの読み込みを画面表示ではなく、メモリに展開してF-BASICと連携した。</div><div>の3つです。</div><div><br /></div><div>その様子を下に示します。</div><div>ファイルのロードは前回のような番号ではなく、ファイル名の入力で選択します。</div><div><br /></div><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygy0QkopBDyoNQ0FjzbjYmTOmvX7kV8OcS2ilXKaEFU4x_n4ClhYGC0vOPIdbHnIix0luuC70YaTHKVMaKjZGJclMTLy9ogOyWzQwKvjvrWV27Zp_rTNlHqb3N8umcsW-BrNawkMuv2eXAmC4CJIOeIQkDdSko0C6R0ywH3WbjWqYirFoosF5SrAo/s4032/SD_Load.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygy0QkopBDyoNQ0FjzbjYmTOmvX7kV8OcS2ilXKaEFU4x_n4ClhYGC0vOPIdbHnIix0luuC70YaTHKVMaKjZGJclMTLy9ogOyWzQwKvjvrWV27Zp_rTNlHqb3N8umcsW-BrNawkMuv2eXAmC4CJIOeIQkDdSko0C6R0ywH3WbjWqYirFoosF5SrAo/w400-h300/SD_Load.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ディレクトリ表示とファイルのロード</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div>メモリにロードしたBASICのプログラムは、下画面のように普通に表示できて実行もできます。<br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBZYUewMh89L3mewM0zXG4A-jsWAviDAEQ0oDaJVmWS1j7KP9Ro7I8h1bv4Htcb6SuZKwpBoBJbM707RTqDbDLW907k-kTa04DQ68Gg9QFiTn5sWVjlus4STzdDDEyKu24gtPgPLpeh94U6vXgEz8A4mNcqwqGB2E-xj1IO5O6awS1o9ftL27GOnjH/s4032/SD_BASIC.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBZYUewMh89L3mewM0zXG4A-jsWAviDAEQ0oDaJVmWS1j7KP9Ro7I8h1bv4Htcb6SuZKwpBoBJbM707RTqDbDLW907k-kTa04DQ68Gg9QFiTn5sWVjlus4STzdDDEyKu24gtPgPLpeh94U6vXgEz8A4mNcqwqGB2E-xj1IO5O6awS1o9ftL27GOnjH/w400-h300/SD_BASIC.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ロードしたBASICファイルをリスト表示</td></tr></tbody></table><br /><p>ここには示しませんでしたが、機械語ファイルも指定したアドレスに読み込まれます。</p><p><br /></p><h4 style="text-align: left;">現在までに実現できた機能をまとめると</h4><p>1.SDカードとSDHCカードに対応している。</p><p>2.普通にWindows上でSDカードに書き込んだファイルが読み込める。</p><p>3.F-BASICのプログラムファイルと機械語ファイルが扱える。</p><p><br /></p><h4 style="text-align: left;">制限事項は</h4><p>1.FM-7で使用することを前提としているので、32KBを超えるような大きなファイルには対応していない。</p><p>2.ファイル名には拡張子をつけてはいけない。(拡張子はチェックしていない)</p><p>3.ファイル名に小文字は使えない。(大文字に変換されてしまう)</p><p>4.F-BASICのプログラムファイルは中間言語に変換されたもののみで、アスキーセーブされたファイルは扱えない。(テキストエリアに直接書き込んでいるため)</p><p>5.機械語ファイルはF-BASICのディスク保存形式であること。</p><p><br /></p><p>制約事項も多々ありますが、とりあえず、Windows上に保存してあったBASICプログラムファイルや機械語ファイルを、SDカードを介してFM-7に持ち込むツールとして使用できるのではと考えています。</p><p><br /></p><h4 style="text-align: left;">さらに実現したいこと</h4><p>残る課題は、当然、FM-7上でSDカードにプログラムなどを書き込んで、それをWindows上で読み込むという機能を実現することです。これができれば完成といえます。</p><p>しかし、これはFATを書き換えるということになりますので、FMS(ファイルマネージメントシステム)が絡んできますし、プログラムサイズも既に3KB近くになっていますので、さらに大きくなるとどこに配置するかも問題になってきます。</p><p>以上、6809のアセンブラでSDカードからのファイルの読み込みまで実現できたという報告でした。なお、使用しているFM-7本体のルーチンはINCHA, OUTCHA, CSRONの3つのみです。</p><p>作成したプログラムを下に示しておきます。</p><p><br /></p>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="SDHC9FM">0001 *
0002 * SDHC9.TXT
0003 *
0004 * SD Read/Write for FM-7
0005 *
0006 * use RTC & SD Card
0007 *
0008 * 6821(PIA) Port A <--> RTC (I2C Mode)
0009 *
0010 * SBC RTC Ext IO
0011 * CA2 2 --> --> HV4 LV4 --> IO1
0012 * PA0 3 --> SCL --> HV1 LV1 --> IO4
0013 * PA1 4 <-- --="" 0014="" 10="" hv2="" io3="" lv2="" pa7=""> SDA --> HV3 LV3 --> IO2
0015 * GND -- -- -- GND
0016 * -- -- -- 3V3
0017 *
0018 *
0019 * 6821(PIA) Port B <--> SD (SPI Mode)
0020 *
0021 * SBC SD
0022 * CB2 12 --> HV4 LV4 --> SCK
0023 * PB0 13 --> HV1 LV1 --> CS
0024 * PB1 14 <-- --="" 0025="" 20="" hv2="" lv2="" miso="" pb7=""> HV3 LV3 --> MOSI
0026 * GND 31 -- -- GND
0027 * VCC 33 -- -- VCC
0028 *
0029 * cf. all data line use level converter
0030 *
0031 * PB output mode
0032 * CB2 1bit output
0033 *
0034 * READ/WRITE BUFFER $6D00 - 6EFF
0035 *
0036 * Load data to F-BASIC '2023.03.23
0037 * Add command '2023.03.14
0038 * Change use Port B '2023.03.07
0039 * Original version '2022.06.11
0040 * Copyright by Y.Yamamoto
0041 *
0042 6000 STTADR EQU $6000
0043
0044 FBB8 INCHA EQU $FBB8
0045 FBBB OUTCHA EQU $FBBB
0046 FBF7 CSRON EQU $FBF7
0047
0048 6D00 RWBUF EQU STTADR+$0D00
0049
0050 FD9E PBDAT EQU $FD9E
0051 FD9F PBCTL EQU PBDAT+1
0052 0033 BASADRP EQU $33 pointer of adrs for F-BASIC
0053 2000 TXTADR EQU $2000 for TEXT
0054
0055 6000 ORG STTADR
0056
0057 6000 20 58 START BRA MAIN
0058 6002 01 VN FCB 1
0059 6003 00 SCTN0 FCB 0 top adrs of sct
0060 6004 00 SCTN1 FCB 0
0061 6005 00 SCTN2 FCB 0
0062 6006 00 SCTN3 FCB 0
0063 6007 00 RESDAT FCB 0 response data
0064 6008 00 SDHC FCB 0 sd:0,sdhc:1
0065
0066 6009 0000 SCTBPB FDB 00 sct no of BPB(4bytes)
0067 600B 0000 FDB 00
0068 600D 0000 SCTFAT FDB 00 sct no of FAT#1(4bytes)
0069 600F 0000 FDB 00
0070 6011 0000 SCTDIR FDB 00 sct no of DIR(4bytes)
0071 6013 0000 FDB 00
0072 6015 0000 SCTDSV FDB 00 save sct no of DIR
0073 6017 0000 FDB 00
0074 6019 0000 SCTCLT FDB 00 sct no of top CLUSTER(4bytes)
0075 601B 0000 FDB 00 if SD:#2, SDHC:#3
0076 601D 00 SCTPCL FCB 0 sct per cluster
0077 601E FF DIRENT RMB 32
0078 603E FF WMDY RMB 3
0079 6041 FF WFSIZ RMB 4
0080 6045 FF FILSIZ RMB 2
0081 6047 0000 CLSTH FDB 00
0082 6049 0000 CLSTL FDB 00
0083 604B 00 CNT FCB 0
0084 604C 00 CNTSV FCB 0
0085 604D 00 MCFLG FCB 0 1:machine code, 0:else
0086 604E 00 DPGFLG FCB 0 1:1st page of DIR, 0:else
0087 604F FF FNAME RMB 9
0088 6058 0000 WK1 FDB 00
0089
0090 605A MAIN EQU *
0091 *=====reset pia=====
0092 *portB:output
0093 605A 86 30 LDA #$30
0094 605C B7 FD9F STA PBCTL select ddra, cb2:0
0095 605F 86 FD LDA #$FD pb0,7:out,pb1:in
0096 6061 B7 FD9E STA PBDAT set output mode
0097 6064 86 34 LDA #$34
0098 6066 B7 FD9F STA PBCTL select peripheral,cb2:0
0099
0100 *for pia exist check
0101 6069 86 55 LDA #$55 test data
0102 606B B7 FD9E STA PBDAT
0103 606E B6 FD9E LDA PBDAT
0104 6071 84 FD ANDA #$FD pb1=0
0105 6073 81 55 CMPA #$55
0106 6075 27 07 BEQ INIT
0107 6077 8E 6A30 LDX #MERR
0108 607A 17 075F LBSR PSTRNG
0109 607D 39 RTS return to BASIC
0110
0111 607E INIT EQU *
0112 607E 8D 59 BSR SDINIT
0113
0114 ****************************************
0115 * MAIN MENU
0116 ****************************************
0117 6080 MENU EQU *
0118 6080 8E 6976 LDX #MSMENU1
0119 6083 17 0756 LBSR PSTRNG
0120 6086 8E 69B6 LDX #MSMENU2
0121 6089 17 0750 LBSR PSTRNG
0122 608C 17 9B68 LBSR CSRON cursor on
0123
0124 608F BD 690B JSR INOUTC
0125 6092 80 30 SUBA #$30
0126 6094 26 04 BNE MEN1 0?
0127 6096 17 068E LBSR CRLF
0128 6099 39 RTS return to BASIC
0129
0130 609A 4A MEN1 DECA 1?
0131 609B 26 05 BNE MEN2
0132 609D 17 0279 LBSR SDRD
0133 60A0 20 DE BRA MENU
0134 60A2 4A MEN2 DECA 2?
0135 60A3 26 05 BNE MEN3
0136 60A5 17 01E3 LBSR GETSD
0137 60A8 20 D6 BRA MENU
0138 60AA 4A MEN3 DECA 3?
0139 60AB 26 04 BNE MEN4
0140 60AD 8D 2A BSR SDINIT
0141 60AF 20 CF BRA MENU
0142 60B1 4A MEN4 DECA 4?
0143 60B2 26 05 BNE MEN5
0144 60B4 17 0275 LBSR DSPMBR
0145 60B7 20 C7 BRA MENU
0146 60B9 4A MEN5 DECA 5?
0147 60BA 26 05 BNE MEN6
0148 60BC 17 02C7 LBSR DSPBPB
0149 60BF 20 BF BRA MENU
0150 60C1 4A MEN6 DECA 6?
0151 60C2 26 05 BNE MEN7
0152 60C4 17 02D1 LBSR DSPFAT
0153 60C7 20 B7 BRA MENU
0154 60C9 4A MEN7 DECA 7?
0155 60CA 26 05 BNE MEN8
0156 60CC 17 02DB LBSR DSPDIR
0157 60CF 20 AF BRA MENU
0158 60D1 4A MEN8 DECA 8?
0159 60D2 26 AC BNE MENU
0160 60D4 17 0398 LBSR LDFILE
0161 60D7 20 A7 BRA MENU
0162 *
0163 ****************************************
0164 * SD Initialize routine
0165 ****************************************
0166 60D9 SDINIT EQU *
0167 *---------- start ----------
0168 60D9 8E 6A14 LDX #MSINIT
0169 60DC 17 06FD LBSR PSTRNG
0170 * cs:1,di:1,sck>74ms
0171 60DF 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
0172 60E1 B7 FD9E STA PBDAT
0173 60E4 C6 50 LDB #80 80times
0174 60E6 17 0603 ISTT LBSR SETCKL
0175 60E9 17 0609 LBSR SETCKH
0176 60EC 5A DECB
0177 60ED 26 F7 BNE ISTT
0178 *
0179 *---------- cmd 0 ----------
0180 60EF SCMD0 EQU *
0181 * LDX #MCMD0
0182 * LBSR PSTRNG
0183
0184 60EF 17 05FA LBSR SETCKL
0185 60F2 C6 06 LDB #6
0186 60F4 8E 6912 LDX #CMD0
0187 60F7 A6 80 SC01 LDA ,X+
0188 60F9 17 057B LBSR SNDDAT
0189 60FC 5A DECB
0190 60FD 26 F8 BNE SC01
0191 *get response
0192 60FF 5F CLRB
0193 6100 GR00
0194 6100 5A DECB
0195 6101 1027 020D LBEQ SDERR
0196 6105 17 058B LBSR GETDAT
0197 6108 B6 6007 LDA RESDAT
0198 * LBSR DSPBIN disp response
0199 610B 81 01 CMPA #$01
0200 610D 26 F1 BNE GR00
0201 * LBSR CRLF
0202 *
0203 *---------- cmd 8 ----------
0204 610F SCMD8 EQU *
0205 * LDX #MCMD8
0206 * LBSR PSTRNG
0207
0208 610F 17 05DA LBSR SETCKL
0209 6112 86 FF LDA #$FF dummy cmd
0210 6114 17 0560 LBSR SNDDAT
0211 6117 C6 06 LDB #6
0212 6119 8E 692A LDX #CMD8
0213 611C A6 80 SC80 LDA ,X+
0214 611E 17 0556 LBSR SNDDAT
0215 6121 5A DECB
0216 6122 26 F8 BNE SC80
0217 *get response
0218 6124 GR80
0219 6124 17 056C LBSR GETDAT
0220 6127 B6 6007 LDA RESDAT
0221
0222 612A 17 0566 LBSR GETDAT
0223 612D B6 6007 LDA RESDAT
0224 * LBSR DSPBIN disp response
0225 6130 81 01 CMPA #$01
0226 6132 26 F0 BNE GR80
0227 6134 C6 04 LDB #4
0228 6136 17 055A GR81 LBSR GETDAT
0229 6139 B6 6007 LDA RESDAT
0230 * LBSR DSPBIN disp response
0231 613C 5A DECB
0232 613D 26 F7 BNE GR81
0233 * LBSR CRLF
0234 *
0235 *---------- cmd 58 ----------
0236 613F SCMD58 EQU *
0237 * LDX #MCMD58
0238 * LBSR PSTRNG
0239
0240 613F 17 05AA LBSR SETCKL
0241 6142 86 FF LDA #$FF dummy cmd
0242 6144 17 0530 LBSR SNDDAT
0243 6147 C6 06 LDB #6
0244 6149 8E 6930 LDX #CMD58
0245 614C A6 80 SC581 LDA ,X+
0246 614E 17 0526 LBSR SNDDAT
0247 6151 5A DECB
0248 6152 26 F8 BNE SC581
0249 *get response
0250 6154 GR580
0251 6154 17 053C LBSR GETDAT
0252 6157 B6 6007 LDA RESDAT
0253 * LBSR DSPBIN disp response
0254 615A 81 01 CMPA #$01
0255 615C 26 F6 BNE GR580
0256 615E C6 04 GR581 LDB #4
0257 6160 17 0530 GR582 LBSR GETDAT
0258 6163 B6 6007 LDA RESDAT
0259 * LBSR DSPBIN disp response
0260 6166 5A DECB
0261 6167 26 F7 BNE GR582
0262 6169 RPT41 EQU *
0263 *---------- cmd 55 ----------
0264 6169 SCMD55 EQU *
0265 * LDX #MCMD55
0266 * LBSR PSTRNG
0267
0268 6169 17 0580 LBSR SETCKL
0269 616C 86 FF LDA #$FF dummy cmd
0270 616E 17 0506 LBSR SNDDAT
0271 6171 C6 06 LDB #6
0272 6173 8E 6936 LDX #CMD55
0273 6176 A6 80 SC551 LDA ,X+
0274 6178 17 04FC LBSR SNDDAT
0275 617B 5A DECB
0276 617C 26 F8 BNE SC551
0277 *get response
0278 * CLRB
0279 617E GR550
0280 * DECB
0281 * BEQ SDERR
0282 617E 17 0512 LBSR GETDAT
0283 6181 B6 6007 LDA RESDAT
0284 * LBSR DSPBIN disp response
0285 6184 81 01 CMPA #$01
0286 6186 26 F6 BNE GR550
0287
0288 * LBSR CRLF
0289 *---------- acmd 41 ----------
0290 6188 ASCMD41 EQU *
0291 * LDX #MCMD41
0292 * LBSR PSTRNG
0293
0294 6188 17 0561 LBSR SETCKL
0295 618B 86 FF LDA #$FF dummy cmd
0296 618D 17 04E7 LBSR SNDDAT
0297 6190 C6 06 LDB #6
0298 6192 8E 693C LDX #ACMD41
0299 6195 A6 80 ASC411 LDA ,X+
0300 6197 17 04DD LBSR SNDDAT
0301 619A 5A DECB
0302 619B 26 F8 BNE ASC411
0303 *get response
0304 619D GR410
0305 619D 17 04F3 LBSR GETDAT
0306 61A0 B6 6007 LDA RESDAT
0307 * LBSR DSPBIN disp response
0308 61A3 17 04ED LBSR GETDAT
0309 61A6 B6 6007 LDA RESDAT
0310 * LBSR DSPBIN disp response
0311 61A9 81 00 CMPA #$00
0312 61AB 26 BC BNE RPT41
0313 * LBSR CRLF
0314
0315 *---------- second cmd 58 ----------
0316 61AD SCMD258 EQU *
0317 * LDX #MCMD58
0318 * LBSR PSTRNG
0319
0320 61AD 17 053C LBSR SETCKL
0321 61B0 86 FF LDA #$FF dummy cmd
0322 61B2 17 04C2 LBSR SNDDAT
0323 61B5 C6 06 LDB #6
0324 61B7 8E 6930 LDX #CMD58
0325 61BA A6 80 SC2581 LDA ,X+
0326 61BC 17 04B8 LBSR SNDDAT
0327 61BF 5A DECB
0328 61C0 26 F8 BNE SC2581
0329 *get response
0330 61C2 GR2580
0331 61C2 17 04CE LBSR GETDAT
0332 61C5 B6 6007 LDA RESDAT
0333 * LBSR DSPBIN disp response
0334 61C8 81 00 CMPA #$00
0335 61CA 26 F6 BNE GR2580
0336 61CC 17 04C4 LBSR GETDAT
0337 61CF B6 6007 LDA RESDAT
0338 * LBSR DSPBIN disp response
0339 61D2 48 LSLA
0340 61D3 48 LSLA
0341 61D4 24 03 BCC GR2581
0342 61D6 7C 6008 INC SDHC if sdhc then 1
0343 61D9 C6 03 GR2581 LDB #3
0344 61DB 17 04B5 GR2582 LBSR GETDAT
0345 61DE B6 6007 LDA RESDAT
0346 * LBSR DSPBIN disp response
0347 61E1 5A DECB
0348 61E2 26 F7 BNE GR2582
0349
0350 61E4 8E 69FA LDX #MSSD0
0351 61E7 B6 6008 LDA SDHC
0352 61EA 27 03 BEQ SD1
0353 61EC 8E 6A06 LDX #MSSD1
0354 61EF 17 05EA SD1 LBSR PSTRNG
0355 *----------
0356 *set sct no of BPB
0357 61F2 17 0155 LBSR GETMBR
0358 61F5 8E 6ECA LDX #RWBUF+446+8+4
0359 61F8 108E 6009 LDY #SCTBPB
0360 61FC C6 04 LDB #4
0361 61FE A6 82 ILOP1 LDA ,-X
0362 6200 A7 A0 STA ,Y+
0363 6202 5A DECB
0364 6203 26 F9 BNE ILOP1
0365
0366 *set sct no of FAT#1
0367 6205 17 0165 LBSR GETBPB
0368 6208 8E 6009 LDX #SCTBPB
0369 620B 108E 600D LDY #SCTFAT
0370 620F C6 04 LDB #4
0371 6211 A6 80 ILOP2 LDA ,X+
0372 6213 A7 A0 STA ,Y+
0373 6215 5A DECB
0374 6216 26 F9 BNE ILOP2
0375
0376 6218 8E 600D LDX #SCTFAT
0377 621B 108E 6D0E LDY #RWBUF+$0E for SD & SDHC
0378 621F 17 0589 LBSR ADD42
0379
0380 *set sct no of DIR
0381 6222 8E 600D LDX #SCTFAT
0382 6225 108E 6011 LDY #SCTDIR
0383 6229 C6 04 LDB #4
0384 622B A6 80 ILOP3 LDA ,X+
0385 622D A7 A0 STA ,Y+
0386 622F 5A DECB
0387 6230 26 F9 BNE ILOP3
0388
0389 6232 8E 6D16 LDX #RWBUF+$16 for SD
0390 6235 7D 6008 TST SDHC
0391 6238 27 03 BEQ SKP1
0392 623A C6 0E LDB #$24-$16
0393 623C 3A ABX for SDHC
0394 623D 1F 12 SKP1 TFR X,Y
0395 623F 8E 6011 LDX #SCTDIR
0396 6242 17 0566 LBSR ADD42
0397 6245 17 0563 LBSR ADD42 skip for FAT#2
0398
0399 *save no of directory
0400 6248 8E 6011 LDX #SCTDIR
0401 624B 108E 6015 LDY #SCTDSV
0402 624F C6 04 LDB #4
0403 6251 A6 80 SCPY1 LDA ,X+
0404 6253 A7 A0 STA ,Y+
0405 6255 5A DECB
0406 6256 26 F9 BNE SCPY1
0407
0408 *set sct per cluster
0409 6258 8E 6D0D LDX #RWBUF+$0D
0410 625B A6 84 LDA ,X
0411 625D B7 601D STA SCTPCL
0412
0413 *set sct no of CLUSTER#2
0414 6260 8E 6011 LDX #SCTDIR
0415 6263 108E 6019 LDY #SCTCLT
0416 6267 C6 04 LDB #4
0417 6269 A6 80 ILOP4 LDA ,X+
0418 626B A7 A0 STA ,Y+
0419 626D 5A DECB
0420 626E 26 F9 BNE ILOP4
0421
0422 6270 108E 605A LDY #WK1+2
0423 6274 86 00 LDA #$00
0424 6276 A7 A2 STA ,-Y
0425 6278 86 20 LDA #$20 for SD
0426 627A 7D 6008 TST SDHC
0427 627D 27 03 BEQ SKP2
0428 627F B6 601D LDA SCTPCL for SDHC
0429 6282 A7 A2 SKP2 STA ,-Y
0430 6284 8E 6019 LDX #SCTCLT
0431 6287 17 0521 LBSR ADD42
0432 *----------
0433 628A 39 RTS
0434
0435 ****************************************
0436 * GET SD DATA ROUTINE
0437 * use CMD9
0438 ****************************************
0439 628B GETSD EQU *
0440 628B 17 0499 LBSR CRLF
0441 628E 17 045B LBSR SETCKL
0442 6291 C6 06 LDB #6
0443 6293 8E 6942 LDX #CMD9
0444 6296 A6 80 SC91 LDA ,X+
0445 6298 17 03DC LBSR SNDDAT
0446 629B 5A DECB
0447 629C 26 F8 BNE SC91
0448 * LBSR CRLF
0449 *get response
0450 629E GR90
0451 629E 17 03F2 LBSR GETDAT
0452 62A1 B6 6007 LDA RESDAT
0453 * LBSR DSPBIN disp response
0454 62A4 81 00 CMPA #$00
0455 62A6 26 F6 BNE GR90
0456
0457 * LBSR CRLF
0458 62A8 17 047C LBSR CRLF
0459 62AB C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
0460 62AD 17 03E3 GR91 LBSR GETDAT
0461 62B0 B6 6007 LDA RESDAT
0462 62B3 17 0448 LBSR DSPBIN disp response
0463 62B6 5A DECB
0464 62B7 26 F4 BNE GR91
0465 62B9 17 046B LBSR CRLF
0466
0467 *disp offset of MBR,FAT#1,DIR,CLUSTER#2
0468 62BC 8E 6A56 LDX #MSOFS
0469 62BF 17 051A LBSR PSTRNG
0470 62C2 8E 6A66 LDX #MSBPB
0471 62C5 17 0514 LBSR PSTRNG
0472 62C8 8E 6009 LDX #SCTBPB
0473 62CB C6 04 LDB #4
0474 62CD A6 80 SCLOP1 LDA ,X+
0475 62CF 17 042C LBSR DSPBIN
0476 62D2 5A DECB
0477 62D3 26 F8 BNE SCLOP1
0478
0479 62D5 8E 6A6F LDX #MSFAT
0480 62D8 17 0501 LBSR PSTRNG
0481 62DB 8E 600D LDX #SCTFAT
0482 62DE C6 04 LDB #4
0483 62E0 A6 80 SCLOP2 LDA ,X+
0484 62E2 17 0419 LBSR DSPBIN
0485 62E5 5A DECB
0486 62E6 26 F8 BNE SCLOP2
0487
0488 62E8 8E 6A78 LDX #MSDIR
0489 62EB 17 04EE LBSR PSTRNG
0490 62EE 8E 6011 LDX #SCTDIR
0491 62F1 C6 04 LDB #4
0492 62F3 A6 80 SCLOP3 LDA ,X+
0493 62F5 17 0406 LBSR DSPBIN
0494 62F8 5A DECB
0495 62F9 26 F8 BNE SCLOP3
0496
0497 62FB 8E 6A81 LDX #MSCL2
0498 62FE 17 04DB LBSR PSTRNG
0499 6301 8E 6019 LDX #SCTCLT
0500 6304 C6 04 LDB #4
0501 6306 A6 80 SCLOP4 LDA ,X+
0502 6308 17 03F3 LBSR DSPBIN
0503 630B 5A DECB
0504 630C 26 F8 BNE SCLOP4
0505 630E 17 0416 LBSR CRLF
0506 6311 39 RTS
0507
0508 *
0509 6312 SDERR EQU *
0510 6312 8E 6A30 LDX #MERR
0511 6315 17 04C4 LBSR PSTRNG
0512 6318 OKEND
0513 6318 39 RTS return to BASIC
0514 *
0515 ****************************************
0516 * READ ROUTINE
0517 * use CMD17
0518 * set sctno to $6005,6006
0519 * read data set to $6800-69FF
0520 ****************************************
0521 6319 SDRD EQU *
0522 6319 17 040B LBSR CRLF
0523 631C 17 038E LBSR INSCT
0524 631F 17 02FC LBSR RD1SCT read 1 sct
0525
0526 *disp data
0527 6322 17 0402 LBSR CRLF
0528 6325 17 0331 LBSR DSPBUF
0529 6328 17 03FC LBSR CRLF
0530 632B 39 RTS
0531
0532 ****************************************
0533 * Read MBR & Disp parameter of BPB
0534 ****************************************
0535 632C DSPMBR EQU *
0536 632C 17 03F8 LBSR CRLF
0537 632F 8D 19 BSR GETMBR
0538
0539 *disp BPB
0540 6331 17 03F3 LBSR CRLF
0541 6334 8E 6EBE LDX #RWBUF+446
0542 6337 C6 10 GET1 LDB #16
0543 6339 A6 80 GET2 LDA ,X+
0544 633B 17 03C0 LBSR DSPBIN disp data
0545 633E 5A DECB
0546 633F 26 F8 BNE GET2
0547 6341 17 03E3 LBSR CRLF
0548 6344 8C 6EFE CMPX #RWBUF+510 446+16*4
0549 6347 25 EE BLO GET1
0550 6349 39 RTS
0551
0552 *----------------------------------------
0553 *read MBR
0554 634A GETMBR EQU *
0555 634A 8E 6003 LDX #SCTN0
0556 634D C6 04 LDB #4
0557 634F 4F CLRA
0558 6350 A7 80 GPLOP STA ,X+
0559 6352 5A DECB
0560 6353 26 FB BNE GPLOP
0561 6355 17 035D LBSR SETSCT
0562
0563 6358 17 02C3 LBSR RD1SCT read 1 sct
0564 635B 39 RTS
0565
0566 *----------------------------------------
0567 *set sector no to SCTN0
0568 *from X,X+1,X+2,X+3 to SCTN0-SCTN3
0569 635C SETSNO EQU *
0570 635C 108E 6003 LDY #SCTN0
0571 6360 C6 04 LDB #4
0572 6362 A6 80 SELOP LDA ,X+
0573 6364 A7 A0 STA ,Y+
0574 6366 5A DECB
0575 6367 26 F9 BNE SELOP
0576 6369 17 0349 LBSR SETSCT
0577 636C 39 RTS
0578
0579 *----------------------------------------
0580 *read BPB
0581 636D GETBPB EQU *
0582 636D 8D DB BSR GETMBR
0583 *set sct no of BPB
0584 636F 8E 6ECA LDX #RWBUF+446+8+4
0585 6372 108E 6003 LDY #SCTN0
0586 6376 C6 04 LDB #4
0587 6378 A6 82 GPLOP2 LDA ,-X
0588 637A A7 A0 STA ,Y+
0589 637C 5A DECB
0590 637D 26 F9 BNE GPLOP2
0591 637F 17 0333 LBSR SETSCT
0592
0593 6382 17 0299 LBSR RD1SCT read 1 sct
0594 6385 39 RTS
0595
0596 ****************************************
0597 * Disp BPB(Bios Parameter Block)
0598 ****************************************
0599 6386 DSPBPB EQU *
0600 6386 8E 6009 LDX #SCTBPB
0601 6389 8D D1 BSR SETSNO
0602 638B 17 0290 LBSR RD1SCT read 1 sct
0603
0604 *disp BPB
0605 638E 17 0396 LBSR CRLF
0606 6391 17 02C5 LBSR DSPBUF
0607 6394 17 0390 LBSR CRLF
0608 6397 39 RTS
0609
0610 ****************************************
0611 * Disp FAT#1
0612 ****************************************
0613 6398 DSPFAT EQU *
0614 6398 8E 600D LDX #SCTFAT
0615 639B 8D BF BSR SETSNO
0616 639D 17 027E LBSR RD1SCT read 1 sct
0617
0618 *disp FAT
0619 63A0 17 0384 LBSR CRLF
0620 63A3 17 02B3 LBSR DSPBUF
0621 63A6 17 037E LBSR CRLF
0622 63A9 39 RTS
0623
0624 ****************************************
0625 * Disp Directory
0626 ****************************************
0627 63AA DSPDIR EQU *
0628 63AA 7C 604E INC DPGFLG set 1st page of DIR flag
0629 *return no of DIR
0630 63AD 108E 6019 LDY #SCTDSV+4
0631 63B1 8E 6015 LDX #SCTDIR+4
0632 63B4 C6 04 LDB #4
0633 63B6 A6 A2 DRET0 LDA ,-Y
0634 63B8 A7 82 STA ,-X
0635 63BA 5A DECB
0636 63BB 26 F9 BNE DRET0
0637
0638 63BD 8E 6011 DSPFL0 LDX #SCTDIR
0639 63C0 8D 9A BSR SETSNO
0640 63C2 17 0259 LBSR RD1SCT read 1 sct
0641
0642 *disp FILE name
0643 63C5 17 035F LBSR CRLF
0644 63C8 17 035C LBSR CRLF
0645 63CB 8E 6D00 LDX #RWBUF
0646 63CE 7D 604E TST DPGFLG 1st page of DIR?
0647 63D1 27 03 BEQ DSKP1
0648 63D3 30 88 60 LEAX 96,X skip top data
0649 63D6 DSKP1
0650
0651 63D6 A6 84 DSPFL1 LDA ,X
0652 63D8 1027 008F LBEQ DSPEND if top of filename is 0 then end
0653 63DC 81 E5 CMPA #$E5 delete mark?
0654 63DE 27 0A BEQ DSPCKE
0655 63E0 A6 0B LDA 11,X attr
0656 63E2 81 0F CMPA #$0F long file name?
0657 63E4 27 04 BEQ DSPCKE
0658 63E6 81 10 CMPA #$10 directory?
0659 63E8 26 0A BNE DSPFL2
0660 63EA 30 88 20 DSPCKE LEAX 32,X next directory entry
0661 63ED 8C 6EE0 CMPX #RWBUF+512-32
0662 63F0 24 60 BHS DSPFL5
0663 63F2 20 E2 BRA DSPFL1
0664
0665 63F4 DSPFL2
0666 *disp filename
0667 63F4 C6 08 LDB #8
0668 63F6 A6 80 DSPFL3 LDA ,X+
0669 63F8 BD FBBB JSR OUTCHA
0670 63FB 5A DECB
0671 63FC 26 F8 BNE DSPFL3
0672 *disp ext
0673 63FE 86 2E LDA #'.
0674 6400 BD FBBB JSR OUTCHA
0675 6403 C6 03 LDB #3
0676 6405 A6 80 DSPFL4 LDA ,X+
0677 6407 BD FBBB JSR OUTCHA
0678 640A 5A DECB
0679 640B 26 F8 BNE DSPFL4
0680 640D 86 20 LDA #'
0681 640F BD FBBB JSR OUTCHA
0682 6412 BD FBBB JSR OUTCHA
0683
0684 *get FILE time data
0685 6415 30 07 LEAX 7,X
0686 6417 EC 81 LDD ,X++
0687 6419 FD 6058 STD WK1
0688
0689 *get CLUSTER(H) data
0690 641C EC 81 LDD ,X++
0691 641E 1E 89 EXG A,B
0692 6420 FD 6047 STD CLSTH
0693 6423 30 04 LEAX 4,X
0694 6425 EC 81 LDD ,X++
0695 6427 1E 89 EXG A,B
0696 6429 FD 6049 STD CLSTL
0697
0698 *get FILE size data
0699 642C 108E 6045 LDY #WFSIZ+4
0700 6430 C6 04 LDB #4
0701 6432 A6 80 DSPC1 LDA ,X+
0702 6434 A7 A2 STA ,-Y
0703 6436 5A DECB
0704 6437 26 F9 BNE DSPC1
0705
0706 *disp FILE size
0707 6439 86 20 LDA #'
0708 643B BD FBBB JSR OUTCHA
0709 643E 17 040C LBSR DSPSIZ disp FILE size
0710
0711 *disp FILE time
0712 6441 FC 6058 LDD WK1
0713 6444 17 03A5 LBSR DSPYMD disp MM-DD-YY
0714
0715 *disp CLUSTER(H,L)
0716 6447 17 0462 LBSR DSPCLS
0717 644A 17 02DA LBSR CRLF
0718
0719 644D 8C 6F00 CMPX #RWBUF+512
0720 6450 25 84 BLO DSPFL1
0721 6452 8E 6011 DSPFL5 LDX #SCTDIR
0722 6455 17 0192 LBSR INCX4 sct no +1
0723 6458 7F 604E CLR DPGFLG clear 1st page of DIR
0724 645B 8E 6AC1 LDX #MSNXTP
0725 645E 17 037B LBSR PSTRNG
0726 6461 BD 690B JSR INOUTC
0727 6464 81 20 CMPA #'
0728 6466 26 03 BNE DSPEND
0729 6468 16 FF52 LBRA DSPFL0
0730 646B 17 02B9 DSPEND LBSR CRLF
0731 646E 39 RTS
0732
0733 ****************************************
0734 * Load FILE
0735 ****************************************
0736 646F LDFILE EQU *
0737 * LBSR DSPDIR
0738 646F 7C 604E INC DPGFLG set 1st page of DIR flag
0739 *return no of DIR
0740 6472 108E 6019 LDY #SCTDSV+4
0741 6476 8E 6015 LDX #SCTDIR+4
0742 6479 C6 04 LDB #4
0743 647B A6 A2 DRET1 LDA ,-Y
0744 647D A7 82 STA ,-X
0745 647F 5A DECB
0746 6480 26 F9 BNE DRET1
0747
0748 6482 8E 6A91 LDX #MSINFN
0749 6485 17 0354 LBSR PSTRNG
0750 6488 17 0467 LBSR FNMIN
0751
0752 648B 8E 6011 LDFL0 LDX #SCTDIR
0753 648E 17 FECB LBSR SETSNO
0754 6491 17 018A LBSR RD1SCT read 1 sct
0755
0756 6494 8E 6D00 LDX #RWBUF
0757 6497 7D 604E TST DPGFLG 1st page of DIR?
0758 649A 27 03 BEQ LDFL1
0759 649C 30 88 60 LEAX 96,X skip top data
0760
0761 649F A6 84 LDFL1 LDA ,X
0762 64A1 1027 00FA LBEQ LDNEND if top of filename is 0 then end
0763 64A5 81 E5 CMPA #$E5 delete mark?
0764 64A7 26 0A BNE LD1
0765 64A9 30 88 20 LEAX 32,X next directory entry
0766 64AC 8C 6F00 CMPX #RWBUF+512 over buf?
0767 64AF 24 0F BHS LDFL5
0768 64B1 20 EC BRA LDFL1
0769
0770 *check file name
0771 64B3 LD1
0772 64B3 17 041B LBSR CMPFN C=1:match
0773 64B6 25 13 BCS LD2
0774 64B8 30 88 20 LEAX 32,X
0775 64BB 8C 6F00 CMPX #RWBUF+512
0776 64BE 25 DF BLO LDFL1
0777
0778 64C0 LDFL5
0779 64C0 8E 6011 LDX #SCTDIR
0780 64C3 17 0124 LBSR INCX4 sct no +1
0781 64C6 7F 604E CLR DPGFLG clear 1st page of DIR
0782 64C9 20 C0 BRA LDFL0
0783
0784 *hit file, get dirctory entry
0785 64CB C6 20 LD2 LDB #32
0786 64CD 108E 601E LDY #DIRENT
0787 64D1 A6 80 DCPY LDA ,X+
0788 64D3 A7 A0 STA ,Y+
0789 64D5 5A DECB
0790 64D6 26 F9 BNE DCPY
0791 64D8 8E 601E LDX #DIRENT
0792
0793 *get cluster no
0794 64DB EC 88 14 LDD $14,X
0795 64DE 1E 89 EXG A,B
0796 64E0 FD 6047 STD CLSTH high cluster no
0797 64E3 EC 88 1A LDD $1A,X
0798 64E6 1E 89 EXG A,B
0799 64E8 FD 6049 STD CLSTL low cluster no
0800 *sub start cluster no (SD:2,SDHC:3)
0801 64EB 83 0002 SUBD #2
0802 64EE 7D 6008 TST SDHC SD:0,SDHC:1
0803 64F1 27 03 BEQ LD3
0804 64F3 83 0001 SUBD #1 D:cluster no (start 0)
0805
0806 64F6 34 36 LD3 PSHS A,B,X,Y
0807 64F8 8E 6019 LDX #SCTCLT
0808 64FB 108E 6058 LDY #WK1
0809 64FF C6 04 LDB #4
0810 6501 A6 80 LD4 LDA ,X+
0811 6503 A7 A0 STA ,Y+
0812 6505 5A DECB
0813 6506 26 F9 BNE LD4
0814 6508 35 36 PULS A,B,X,Y
0815
0816 *(B)x40h
0817 650A 34 30 PSHS X,Y
0818 650C 8E 6058 LDX #WK1
0819 650F 17 00E7 LBSR ADD40H
0820 6512 35 30 PULS X,Y
0821
0822 *get file size
0823 6514 34 30 PSHS X,Y
0824 6516 30 88 20 LEAX 32,X
0825 6519 108E 6041 LDY #WFSIZ
0826 651D C6 04 LDB #4
0827 651F A6 82 LD41 LDA ,-X
0828 6521 A7 A0 STA ,Y+
0829 6523 5A DECB
0830 6524 26 F9 BNE LD41
0831 6526 35 30 PULS X,Y
0832
0833 6528 EC 88 1D LDD $1D,X upper of file size
0834 652B 1E 89 EXG A,B
0835 652D 44 LSRA wfsiz/$200+1
0836 652E 56 RORB
0837 652F C3 0001 ADDD #1
0838
0839 6532 C1 40 CMPB #$40 40h page?
0840 6534 23 02 BLS LD5
0841 6536 C6 40 LDB #$40
0842 6538 F7 604B LD5 STB CNT sct counter
0843 653B F7 604C STB CNTSV
0844
0845 *set start sct no
0846 653E LD6
0847 653E 34 30 PSHS X,Y
0848 6540 8E 6058 LDX #WK1
0849 6543 108E 6003 LDY #SCTN0
0850 6547 C6 04 LDB #4
0851 6549 A6 80 LD7 LDA ,X+
0852 654B A7 A0 STA ,Y+
0853 654D 5A DECB
0854 654E 26 F9 BNE LD7
0855 6550 35 30 PULS X,Y
0856
0857 6552 17 0160 LBSR SETSCT
0858 6555 17 00C6 LBSR RD1SCT read 1 file data
0859
0860 6558 7F 604D CLR MCFLG set not machine code
0861 655B B6 604C LDA CNTSV
0862 655E B1 604B CMPA CNT top sector read?
0863 6561 26 1B BNE LD8
0864
0865 *at top sector, ini set
0866 *offset 00 data is
0867 * $00 :machine code (MCFLG=0)
0868 * $FF,$FE:BASIC PROGRAM (binary save) (MCFLG=$FF,$FE)
0869 * else :general text (MCFLG=1)
0870 6563 10BE 6043 LDY WFSIZ+2
0871 6567 10BF 6045 STY FILSIZ set file size
0872
0873 656B 8E 6D00 LDX #RWBUF
0874 656E A6 84 LDA ,X 00?(machine code?)
0875 6570 B7 604D STA MCFLG
0876 6573 26 09 BNE LD8
0877 *at machine code, read header
0878 * INC MCFLG set machine code
0879 6575 10AE 01 LDY 1,X get file size
0880 6578 10BF 6045 STY FILSIZ
0881 657C EE 03 LDU 3,X get store addr
0882
0883 657E DE 33 LD8 LDU BASADRP get text buffer adr
0884 6580 4D TSTA
0885 6581 2B 03 BMI LD9 $FFor$FE (basic code?)
0886 6583 CE 2000 LDU #TXTADR (else)
0887 6586 LD9
0888 6586 8D 1F BSR MEMSET
0889
0890 6588 8E 6058 LDX #WK1
0891 658B 8D 5D BSR INCX4 sct no +1
0892 658D 7F 604E CLR DPGFLG clear 1st page of DIR
0893 6590 7A 604B DEC CNT
0894 6593 26 A9 BNE LD6
0895
0896 6595 8E 6AA7 LDEND LDX #MSLDED
0897 6598 17 0241 LBSR PSTRNG
0898 659B 17 0189 LDE1 LBSR CRLF
0899 659E 39 RTS
0900 659F 8E 6AB3 LDNEND LDX #MSNOFL
0901 65A2 17 0237 LBSR PSTRNG
0902 65A5 20 F4 BRA LDE1
0903
0904 *
0905 *data to memory
0906 *U:memory adr
0907
0908 65A7 MEMSET EQU *
0909 65A7 34 30 PSHS X,Y
0910 65A9 8E 6D00 LDX #RWBUF
0911 65AC B6 604D LDA MCFLG 0,1,$FF($FE)
0912 65AF 27 07 BEQ MS1
0913 65B1 2B 12 BMI MS2
0914 *text file
0915 65B3 CE 2000 LDU #TXTADR (else)
0916 65B6 20 1B BRA MSLOP0
0917 *machine code
0918 65B8 MS1
0919 65B8 10AE 01 LDY 1,X get file size
0920 65BB 10BF 6045 STY FILSIZ
0921 65BF EE 03 LDU 3,X get store addr
0922 65C1 30 05 LEAX 5,X skip header
0923 65C3 20 0E BRA MSLOP0
0924 *basic program(binary save)
0925 65C5 MS2
0926 65C5 30 03 LEAX 3,X skip 3 $FFs
0927 65C7 10BE 6045 LDY FILSIZ
0928 65CB 31 3D LEAY -3,Y
0929 65CD 10BF 6045 STY FILSIZ
0930 65D1 DE 33 LDU BASADRP get text buffer adrs
0931
0932 65D3 10BE 6045 MSLOP0 LDY FILSIZ
0933 65D7 A6 80 MSLOP LDA ,X+
0934 65D9 A7 C0 STA ,U+
0935 65DB 31 3F LEAY -1,Y
0936 65DD 27 05 BEQ MS3
0937 65DF 8C 6F00 CMPX #RWBUF+512
0938 65E2 25 F3 BLO MSLOP
0939 65E4 10BF 6045 MS3 STY FILSIZ
0940 65E8 35 B0 PULS X,Y,PC
0941
0942 *--------------------
0943 *(X)..(X+3)+1
0944 65EA INCX4 EQU *
0945 65EA 6C 03 ADX0 INC 3,X
0946 65EC 24 02 BCC ADX1
0947 65EE 6C 02 INC 2,X
0948 65F0 24 02 ADX1 BCC ADX2
0949 65F2 6C 01 INC 1,X
0950 65F4 24 02 ADX2 BCC ADX3
0951 65F6 6C 84 INC ,X
0952 65F8 39 ADX3 RTS
0953 *
0954 *(X)..(X+3)+(B)x40h
0955 65F9 ADD40H EQU *
0956 65F9 34 06 PSHS A,B
0957 65FB A6 03 ADD0 LDA 3,X
0958 65FD 8B 40 ADDA #$40
0959 65FF A7 03 STA 3,X
0960 6601 24 06 BCC ADD1
0961 6603 A6 02 LDA 2,X
0962 6605 8B 01 ADDA #1
0963 6607 A7 02 STA 2,X
0964 6609 24 06 ADD1 BCC ADD2
0965 660B A6 01 LDA 1,X
0966 660D 8B 01 ADDA #1
0967 660F A7 01 STA 1,X
0968 6611 24 06 ADD2 BCC ADD3
0969 6613 A6 84 LDA ,X
0970 6615 8B 01 ADDA #1
0971 6617 A7 84 STA ,X
0972 6619 5A ADD3 DECB
0973 661A 26 DF BNE ADD0
0974 661C 35 86 PULS A,B,PC
0975
0976 *
0977 *------------------------------
0978 *read 1 sct
0979 *------------------------------
0980 661E RD1SCT EQU *
0981 *copy sct no to cmd param
0982 661E 8E 6003 LDX #SCTN0
0983 6621 108E 691F LDY #CMD17+1
0984 6625 C6 04 LDB #4
0985 6627 A6 80 CPY1 LDA ,X+
0986 6629 A7 A0 STA ,Y+
0987 662B 5A DECB
0988 662C 26 F9 BNE CPY1
0989 *send cmd
0990 662E 17 00BB LBSR SETCKL
0991 6631 C6 06 LDB #6
0992 6633 8E 691E LDX #CMD17
0993 6636 A6 80 RD1 LDA ,X+
0994 6638 8D 3D BSR SNDDAT
0995 663A 5A DECB
0996 663B 26 F9 BNE RD1
0997 *get response
0998 663D RD2
0999 663D 8D 54 BSR GETDAT
1000 663F B6 6007 LDA RESDAT
1001 6642 81 FE CMPA #$FE token?
1002 6644 26 F7 BNE RD2
1003
1004 *get data
1005 * LBSR CRLF
1006 6646 8E 6D00 LDX #RWBUF <-temp -1="" 0094="" 00b3="" 00cb="" 0200="" 02="" 06="" 08="" 1007="" 1008="" 1009="" 1010="" 1011="" 1012="" 1013="" 1014="" 1015="" 1016="" 1017="" 1018="" 1019="" 1020="" 1021="" 1022="" 1023="" 1024="" 1025="" 1026="" 1027="" 1028="" 1029="" 1030="" 1031="" 1032="" 1033="" 1034="" 1035="" 1036="" 1037="" 1038="" 1039="" 1040="" 1041="" 1042="" 1043="" 1044="" 1045="" 1046="" 1047="" 1048="" 1049="" 1050="" 1051="" 1052="" 1053="" 1054="" 1055="" 1056="" 1057="" 1058="" 1059="" 1060="" 1061="" 1062="" 1063="" 108e="" 12="" 17="" 20="" 26="" 27="" 31="" 34="" 35="" 39="" 3f="" 44="" 48="" 53="" 57="" 5a="" 6007="" 63="" 6649="" 664d="" 664f="" 6652="" 6654="" 6656="" 6658="" 6659="" 665c="" 665f="" 6663="" 6665="" 6667="" 666a="" 666c="" 666e="" 666f="" 6671="" 6674="" 6676="" 6677="" 6679="" 667c="" 667e="" 6680="" 6682="" 6684="" 6687="" 6689="" 668b="" 668c="" 668e="" 668f="" 6691="" 6693="" 6695="" 6697="" 6699="" 669a="" 669b="" 669c="" 669e="" 66a1="" 66a2="" 67="" 6d00="" 7f="" 80="" 84="" 86="" 8a="" 8d="" 8e="" a6="" a7="" a="" anda="" b1-="" b6="" b7="" beq="" bne="" bra="" bsr="" buf="" c6="" clr="" crlf="" cs:b0="L" data="" decb="" disp="" dspb1="" dspb2="" dspb3="" dspbin="" dspbuf="" ed="" equ="" f4="" f5="" fc="" fd9e="" get="" getd1="" getdat="" lbsr="" lda="" ldb="" ldx="" ldy="" leay="" lsla="" lsra="" miso:b1="H(for" nop="" ora="" pbdat="" pia="" pshs="" puls="" rd3="" resdat="" response="" rts="" save="" send="" setckh="" setckl="" sndd1="" snddat="" sta="" temp="">C
1064 66A3 79 6007 ROL RESDAT C->b0
1065 66A6 5A DECB
1066 66A7 26 EE BNE GETD1
1067 66A9 8D 41 BSR SETCKL
1068 66AB 35 86 PULS A,B,PC
1069 *
1070 *------------------------------
1071 *input SCT No
1072 66AD INSCT EQU *
1073 66AD 8E 69E6 LDX #MSSCT
1074 66B0 17 0129 LBSR PSTRNG
1075 66B3 8D 7D BSR GET8CH get 8chr, convert 4bin
1076
1077 66B5 SETSCT EQU *
1078 66B5 34 32 PSHS A,X,Y
1079 66B7 7D 6008 TST SDHC
1080 66BA 26 1E BNE CALCHC
1081 *SD card
1082 66BC C6 03 LDB #3
1083 66BE 8E 6004 LDX #SCTN1
1084 66C1 108E 6003 LDY #SCTN0
1085 66C5 A6 80 SFT1 LDA ,X+
1086 66C7 A7 A0 STA ,Y+
1087 66C9 5A DECB
1088 66CA 26 F9 BNE SFT1
1089 66CC 7F 6006 CLR SCTN3
1090 *calc top adrs of sct
1091 66CF CALCSD EQU *
1092 66CF 78 6006 LSL SCTN3
1093 66D2 79 6005 ROL SCTN2
1094 66D5 79 6004 ROL SCTN1
1095 66D8 35 B2 PULS A,X,Y,PC
1096
1097 *SDHC card
1098 *calc top adrs of sct
1099 66DA CALCHC EQU *
1100 66DA 8E 6003 LDX #SCTN0
1101 66DD 108E 691F LDY #CMD17+1
1102 66E1 C6 04 LDB #4
1103 66E3 A6 80 CALCH1 LDA ,X+
1104 66E5 A7 A0 STA ,Y+
1105 66E7 5A DECB
1106 66E8 26 F9 BNE CALCH1
1107 66EA 35 B2 PULS A,X,Y,PC
1108
1109 *
1110 *set sck:L
1111 66EC SETCKL EQU *
1112 66EC 34 02 PSHS A
1113 66EE 86 34 LDA #$34 ca2=L
1114 66F0 B7 FD9F STA PBCTL
1115 66F3 35 82 PULS A,PC
1116
1117 *set sck:H
1118 66F5 SETCKH EQU *
1119 66F5 34 02 PSHS A
1120 66F7 86 3C LDA #$3C ca2=H
1121 66F9 B7 FD9F STA PBCTL
1122 66FC 35 82 PULS A,PC
1123
1124 *binary(A)->ascii(A)(B)
1125 66FE DSPBIN EQU *
1126 66FE 34 06 PSHS A,B
1127 6700 1F 89 TFR A,B
1128 6702 44 LSRA
1129 6703 44 LSRA
1130 6704 44 LSRA
1131 6705 44 LSRA
1132 6706 8A 30 ORA #$30
1133 6708 C4 0F ANDB #$0F
1134 670A CA 30 ORB #$30
1135 670C 81 39 CMPA #$39
1136 670E 23 02 BLS BI21
1137 6710 8B 07 ADDA #$07
1138 6712 C1 39 BI21 CMPB #$39
1139 6714 23 02 BLS BI22
1140 6716 CB 07 ADDB #$07
1141 6718 BD FBBB BI22 JSR OUTCHA
1142 671B 1F 98 TFR B,A
1143 671D BD FBBB JSR OUTCHA
1144 6720 86 20 LDA #$20
1145 6722 BD FBBB JSR OUTCHA
1146 6725 35 86 PULS A,B,PC
1147
1148 *crlf
1149 6727 CRLF EQU *
1150 6727 86 0D LDA #$0D
1151 6729 BD FBBB JSR OUTCHA
1152 672C 86 0A LDA #$0A
1153 672E BD FBBB JSR OUTCHA
1154 6731 39 RTS
1155
1156 *
1157 6732 GET8CH EQU *
1158 *input chr
1159 6732 8E 6ADA LDX #INPBUF
1160 6735 5F CLRB
1161 6736 BD 690B CLOP JSR INOUTC
1162 6739 81 0D CMPA #$0D
1163 673B 27 07 BEQ INEND
1164 673D A7 85 STA B,X
1165 673F 5C INCB
1166 6740 C1 08 CMPB #8
1167 6742 25 F2 BLO CLOP
1168
1169 6744 INEND
1170 *shift
1171 6744 5D TSTB
1172 6745 27 11 BEQ CL1
1173 6747 8E 6ADA LDX #INPBUF
1174 674A 3A ABX
1175 674B 108E 6AE2 LDY #INPBUF+8
1176 674F 34 04 PSHS B
1177 6751 A6 82 SFLOP LDA ,-X
1178 6753 A7 A2 STA ,-Y
1179 6755 5A DECB
1180 6756 26 F9 BNE SFLOP
1181 *clr
1182 6758 C6 08 CL1 LDB #8
1183 675A E0 E0 SUBB ,S+
1184 675C 27 0A BEQ CLEND
1185 675E 8E 6ADA LDX #INPBUF
1186 6761 86 30 LDA #'0
1187 6763 A7 80 CLLOP STA ,X+
1188 6765 5A DECB
1189 6766 26 FB BNE CLLOP
1190 6768 CLEND
1191
1192 *convert to bin
1193 6768 C6 04 LDB #4
1194 676A 8E 6ADA LDX #INPBUF
1195 676D 108E 6003 LDY #SCTN0
1196 6771 CVT1
1197 6771 A6 80 LDA ,X+
1198 6773 8D 1E BSR CVBIN
1199 6775 25 16 BCS EREND1
1200 6777 48 LSLA
1201 6778 48 LSLA
1202 6779 48 LSLA
1203 677A 48 LSLA
1204 677B 34 02 PSHS A
1205 677D A6 80 LDA ,X+
1206 677F 8D 12 BSR CVBIN
1207 6781 25 08 BCS EREND0
1208 6783 AB E0 ADDA ,S+
1209 6785 A7 A0 STA ,Y+
1210 6787 5A DECB
1211 6788 26 E7 BNE CVT1
1212 678A 39 RTS
1213
1214 678B 35 02 EREND0 PULS A
1215 678D 8E 6A47 EREND1 LDX #MSERR
1216 6790 8D 4A BSR PSTRNG
1217 6792 39 EEND RTS
1218
1219 *--------------------
1220 *ascii -> bin
1221 6793 CVBIN EQU *
1222 6793 80 30 SUBA #'0
1223 6795 2B 11 BMI CVERR
1224 6797 81 09 CMPA #9
1225 6799 23 0A BLS CVBEND
1226 679B 81 11 CMPA #$11
1227 679D 25 09 BLO CVERR
1228 679F 81 16 CMPA #$16
1229 67A1 22 05 BHI CVERR
1230 67A3 80 07 SUBA #7
1231 67A5 CVBEND
1232 67A5 1C FE ANDCC #$FE reset C
1233 67A7 39 RTS
1234 67A8 1A 01 CVERR ORCC #$01 set C
1235 67AA 39 RTS
1236
1237 *--------------------
1238 *add 2bytes to 4bytes
1239 * X,X+1,X+2,X+3 + Y,Y+1
1240 * data X is big endian
1241 * data Y is little endian
1242 67AB ADD42 EQU *
1243 67AB 34 36 PSHS A,B,X,Y
1244 67AD 32 7C LEAS -4,S
1245 67AF C6 04 LDB #4
1246 67B1 A6 80 AD1 LDA ,X+
1247 67B3 A7 E0 STA ,S+
1248 67B5 5A DECB
1249 67B6 26 F9 BNE AD1
1250
1251 *add (lower)
1252 67B8 A6 A0 LDA ,Y+
1253 67BA AB E2 ADDA ,-S
1254 67BC A7 E4 STA ,S
1255 67BE 24 02 BCC AD2
1256 67C0 6C 7F INC -1,S
1257 *add (upper)
1258 67C2 A6 A4 AD2 LDA ,Y
1259 67C4 AB E2 ADDA ,-S
1260 67C6 A7 E4 STA ,S
1261 67C8 24 02 BCC AD3
1262 67CA 6C 7F INC -1,S
1263 67CC 30 1C AD3 LEAX -4,X
1264 67CE 32 7E LEAS -2,S
1265 67D0 C6 04 LDB #4
1266 67D2 A6 E0 AD4 LDA ,S+
1267 67D4 A7 80 STA ,X+
1268 67D6 5A DECB
1269 67D7 26 F9 BNE AD4
1270 67D9 35 36 PULS A,B,X,Y
1271 67DB 39 RTS
1272
1273 *--------------------
1274 * pstring
1275 67DC PSTRNG EQU *
1276 67DC 34 02 PSHS A
1277 67DE A6 80 PSLOP LDA ,X+
1278 67E0 81 04 CMPA #4
1279 67E2 27 05 BEQ PSEND
1280 67E4 BD FBBB JSR OUTCHA
1281 67E7 20 F5 BRA PSLOP
1282 67E9 35 02 PSEND PULS A
1283 67EB 39 RTS
1284
1285 *--------------------
1286 *disp MM-DD-YY
1287 *indata A(Low),B(High)
1288 67EC DSPYMD EQU *
1289 67EC 1E 89 EXG A,B
1290 67EE 34 10 PSHS X
1291 67F0 34 06 PSHS A,B
1292 67F2 C4 E0 ANDB #$E0
1293 67F4 54 LSRB
1294 67F5 54 LSRB
1295 67F6 54 LSRB
1296 67F7 54 LSRB
1297 67F8 54 LSRB
1298 67F9 47 ASRA
1299 67FA 24 02 BCC DYMD1
1300 67FC CB 08 ADDB #8
1301 67FE F7 603E DYMD1 STB WMDY MM
1302 6801 35 06 PULS A,B
1303 6803 34 04 PSHS B
1304 6805 C4 1F ANDB #$1F
1305 6807 F7 603F STB WMDY+1 DD
1306 680A 35 04 PULS B
1307
1308 680C 44 LSRA
1309 * ASLB
1310 * BCC DYMD2
1311 * INCA
1312 680D DYMD2
1313 680D 80 14 SUBA #20 A+1980-2000
1314 680F B7 6040 STA WMDY+2 YY
1315
1316 *disp MM-DD-YY
1317 6812 86 20 LDA #'
1318 6814 BD FBBB JSR OUTCHA
1319 6817 8E 603E LDX #WMDY
1320 681A A6 80 LDA ,X+
1321 681C 8D 14 BSR DB2ASC MM
1322 681E 86 2D LDA #'-
1323 6820 BD FBBB JSR OUTCHA
1324 6823 A6 80 LDA ,X+
1325 6825 8D 0B BSR DB2ASC DD
1326 6827 86 2D LDA #'-
1327 6829 BD FBBB JSR OUTCHA
1328 682C A6 80 LDA ,X+
1329 682E 8D 02 BSR DB2ASC YY
1330 6830 35 90 PULS X,PC
1331 *
1332 *----------
1333 *(A:BIN)->ASCII
1334 6832 DB2ASC EQU *
1335 6832 34 06 PSHS A,B
1336 6834 1F 89 TFR A,B
1337 6836 86 30 LDA #$30
1338 6838 C1 0A DBLOP CMPB #10
1339 683A 25 05 BLO DB2
1340 683C C0 0A SUBB #10
1341 683E 4C INCA
1342 683F 20 F7 BRA DBLOP
1343 6841 BD FBBB DB2 JSR OUTCHA
1344 6844 1F 98 TFR B,A
1345 6846 8B 30 ADDA #$30
1346 6848 BD FBBB JSR OUTCHA
1347 684B 35 86 PULS A,B,PC
1348
1349 *disp FILE size
1350 684D DSPSIZ EQU *
1351 684D 34 10 PSHS X
1352 684F BE 6041 LDX WFSIZ
1353 6852 27 16 BEQ DSS1 if 64k over?
1354 6854 86 3E LDA #'>
1355 6856 BD FBBB JSR OUTCHA
1356 6859 86 36 LDA #'6
1357 685B BD FBBB JSR OUTCHA
1358 685E 86 34 LDA #'4
1359 6860 BD FBBB JSR OUTCHA
1360 6863 86 6B LDA #'k
1361 6865 BD FBBB JSR OUTCHA
1362 6868 20 3B BRA DSEND
1363 686A 86 20 DSS1 LDA #'
1364 686C BD FBBB JSR OUTCHA
1365 686F B6 6043 LDA WFSIZ+2 under 64k
1366 *disp dec
1367 6872 81 64 CMPA #100
1368 6874 23 12 BLS DSS13
1369 6876 1F 89 TFR A,B
1370 6878 86 30 LDA #$30
1371 687A C1 64 DSLOP1 CMPB #100
1372 687C 25 05 BLO DSS12
1373 687E C0 64 SUBB #100
1374 6880 4C INCA
1375 6881 20 F7 BRA DSLOP1
1376 6883 BD FBBB DSS12 JSR OUTCHA
1377 6886 20 05 BRA DSS14
1378 *under 100
1379 6888 86 20 DSS13 LDA #'
1380 688A BD FBBB JSR OUTCHA
1381 688D 86 30 DSS14 LDA #$30
1382 688F C1 0A DSLOP2 CMPB #10
1383 6891 25 05 BLO DSS2
1384 6893 C0 0A SUBB #10
1385 6895 4C INCA
1386 6896 20 F7 BRA DSLOP2
1387 6898 81 30 DSS2 CMPA #$30
1388 689A 26 01 BNE DSS3
1389 689C 4C INCA
1390 689D BD FBBB DSS3 JSR OUTCHA
1391 68A0 86 6B LDA #'k
1392 68A2 BD FBBB JSR OUTCHA
1393 68A5 86 20 DSEND LDA #'
1394 68A7 BD FBBB JSR OUTCHA
1395 68AA 35 90 PULS X,PC
1396
1397 *----------
1398 68AC DSPCLS EQU *
1399 68AC 34 10 PSHS X
1400 68AE 86 20 LDA #'
1401 68B0 BD FBBB JSR OUTCHA
1402 68B3 8E 6047 LDX #CLSTH
1403 68B6 C6 02 LDB #2
1404 68B8 A6 80 DCLOP1 LDA ,X+
1405 68BA 17 FF75 LBSR DB2ASC
1406 68BD 5A DECB
1407 68BE 26 F8 BNE DCLOP1
1408 68C0 86 20 LDA #'
1409 68C2 BD FBBB JSR OUTCHA
1410 68C5 C6 02 LDB #2
1411 68C7 A6 80 DCLOP2 LDA ,X+
1412 68C9 17 FF66 LBSR DB2ASC
1413 68CC 5A DECB
1414 68CD 26 F8 BNE DCLOP2
1415 68CF 35 90 PULS X,PC
1416
1417 *----------
1418 *X:top of FILE NAME
1419 *return C=1:match,C=0:not match
1420 68D1 CMPFN EQU *
1421 68D1 34 10 PSHS X
1422 68D3 108E 604F LDY #FNAME
1423 68D7 C6 08 LDB #8
1424 68D9 A6 80 CMPLOP LDA ,X+
1425 68DB 81 E5 CMPA #$E5 delete mark?
1426 68DD 27 0F BEQ NOTM
1427 68DF 81 20 CMPA #'
1428 68E1 27 07 BEQ MATCH
1429 68E3 A1 A0 CMPA ,Y+
1430 68E5 26 07 BNE NOTM
1431 68E7 5A DECB
1432 68E8 26 EF BNE CMPLOP
1433 68EA 1A 01 MATCH ORCC #$01 C=1
1434 68EC 20 02 BRA CMPEND
1435 68EE 1C FE NOTM ANDCC #$FE C=0
1436 68F0 35 90 CMPEND PULS X,PC
1437
1438 *----------
1439 68F2 FNMIN EQU *
1440 *clr buf
1441 68F2 8E 605A LDX #FNAME+11
1442 68F5 C6 0B LDB #8+3
1443 68F7 86 20 LDA #'
1444 68F9 A7 82 FNIN0 STA ,-X
1445 68FB 5A DECB
1446 68FC 26 FB BNE FNIN0
1447 *fname in
1448 68FE BD 690B FNIN1 JSR INOUTC
1449 6901 A7 80 STA ,X+
1450 6903 81 0D CMPA #$0D
1451 6905 27 03 BEQ FNIEND
1452 6907 5A DECB
1453 6908 26 F4 BNE FNIN1
1454 690A 39 FNIEND RTS
1455
1456 690B BD FBB8 INOUTC JSR INCHA
1457 690E BD FBBB JSR OUTCHA
1458 6911 39 RTS
1459
1460 **************************************************
1461 *========== parameter ==========
1462 6912 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
1463 6918 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
1464 691E 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
1465 6924 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
1466 692A 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
1467 6930 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
1468 6936 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
1469 693C 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
1470 6942 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
1471 *
1472 6948 43 MCMD0 FCC /CMD0/,$D,$A
1473 694E 04 FCB 4
1474 694F 43 MCMD8 FCC /CMD8/,$D,$A
1475 6955 04 FCB 4
1476 6956 43 MCMD58 FCC /CMD58/,$D,$A
1477 695D 04 FCB 4
1478 695E 43 MCMD55 FCC /CMD55/,$D,$A
1479 6965 04 FCB 4
1480 6966 41 MCMD41 FCC /ACMD41/,$D,$A
1481 696E 04 FCB 4
1482 696F 43 MCMD9 FCC /CMD9/,$D,$A
1483 6975 04 FCB 4
1484 *
1485 6976 0D MSMENU1 FCC $0D,$0A,/1:Read Sct, 2:Get SD data, 3:SD Init, 4:Disp MBR, 5:Disp BPB,/
1486 69B5 04 FCB 4
1487 69B6 0D MSMENU2 FCC $0D,$0A,/6:Disp FAT, 7:Disp DIR, 8:Load FILE, 0:End : /
1488 69E5 04 FCB 4
1489 69E6 53 MSSCT FCC /SctNo: /
1490 69ED 04 FCB 4
1491 69EE 57 MSWROK FCC /Write OK?: /
1492 69F9 04 FCB 4
1493 69FA 0D MSSD0 FCC $0D,$0A,/SD Card/,$0D,$0A
1494 6A05 04 FCB 4
1495 6A06 0D MSSD1 FCC $0D,$0A,/SDHC Card/,$0D,$0A
1496 6A13 04 FCB 4
1497 6A14 0D MSINIT FCC $0D,$0A,$0D,$0A,/SD Card initializing.../
1498 6A2F 04 FCB 4
1499 6A30 53 MERR FCC /SD Initialize error!/,$0D,$0A
1500 6A46 04 FCB 4
1501 6A47 49 MSERR FCC /Input error!/,$0D,$0A
1502 6A55 04 FCB 4
1503 6A56 0D MSOFS FCC $0D,$0A,/Sector no is:/
1504 6A65 04 FCB 4
1505 6A66 0D MSBPB FCC $0D,$0A,/ BPB: /
1506 6A6E 04 FCB 4
1507 6A6F 0D MSFAT FCC $0D,$0A,/ FAT: /
1508 6A77 04 FCB 4
1509 6A78 0D MSDIR FCC $0D,$0A,/ DIR: /
1510 6A80 04 FCB 4
1511 6A81 0D MSCL2 FCC $0D,$0A,/ 1stCLUSTER: /
1512 6A90 04 FCB 4
1513 6A91 0D MSINFN FCC $0D,$0A,$0D,$0A,/Input File Name: /
1514 6AA6 04 FCB 4
1515 6AA7 0D MSLDED FCC $0D,$0A,/ Load end/
1516 6AB2 04 FCB 4
1517 6AB3 0D MSNOFL FCC $0D,$0A,/ Not exist!/
1518 6AC0 04 FCB 4
1519 6AC1 0D MSNXTP FCC $0D,$0A,"Next page (SPC/else): "
1520 6AD9 04 FCB 4
1521
1522 **************************************************
1523 6ADA FF INPBUF RMB 8
1524
1525 END START
0 error(s), 0 warning(s) is detected.
Label address
ACMD41 693C AD1 67B1 AD2 67C2 AD3 67CC AD4 67D2
ADD0 65FB ADD1 6609 ADD2 6611 ADD3 6619 ADD40H 65F9
ADD42 67AB ADX0 65EA ADX1 65F0 ADX2 65F4 ADX3 65F8
ASC411 6195 ASCMD41 6188 BASADRP 0033 BI21 6712 BI22 6718
CALCH1 66E3 CALCHC 66DA CALCSD 66CF CL1 6758 CLEND 6768
CLLOP 6763 CLOP 6736 CLSTH 6047 CLSTL 6049 CMD0 6912
CMD1 6918 CMD17 691E CMD24 6924 CMD55 6936 CMD58 6930
CMD8 692A CMD9 6942 CMPEND 68F0 CMPFN 68D1 CMPLOP 68D9
CNT 604B CNTSV 604C CPY1 6627 CRLF 6727 CSRON FBF7
CVBEND 67A5 CVBIN 6793 CVERR 67A8 CVT1 6771 DB2 6841
DB2ASC 6832 DBLOP 6838 DCLOP1 68B8 DCLOP2 68C7 DCPY 64D1
DIRENT 601E DPGFLG 604E DRET0 63B6 DRET1 647B DSEND 68A5
DSKP1 63D6 DSLOP1 687A DSLOP2 688F DSPB1 6663 DSPB2 6665
DSPB3 6676 DSPBIN 66FE DSPBPB 6386 DSPBUF 6659 DSPC1 6432
DSPCKE 63EA DSPCLS 68AC DSPDIR 63AA DSPEND 646B DSPFAT 6398
DSPFL0 63BD DSPFL1 63D6 DSPFL2 63F4 DSPFL3 63F6 DSPFL4 6405
DSPFL5 6452 DSPMBR 632C DSPSIZ 684D DSPYMD 67EC DSS1 686A
DSS12 6883 DSS13 6888 DSS14 688D DSS2 6898 DSS3 689D
DYMD1 67FE DYMD2 680D EEND 6792 EREND0 678B EREND1 678D
FILSIZ 6045 FNAME 604F FNIEND 690A FNIN0 68F9 FNIN1 68FE
FNMIN 68F2 GET1 6337 GET2 6339 GET8CH 6732 GETBPB 636D
GETD1 6697 GETDAT 6693 GETMBR 634A GETSD 628B GPLOP 6350
GPLOP2 6378 GR00 6100 GR2580 61C2 GR2581 61D9 GR2582 61DB
GR410 619D GR550 617E GR580 6154 GR581 615E GR582 6160
GR80 6124 GR81 6136 GR90 629E GR91 62AD ILOP1 61FE
ILOP2 6211 ILOP3 622B ILOP4 6269 INCHA FBB8 INCX4 65EA
INEND 6744 INIT 607E INOUTC 690B INPBUF 6ADA INSCT 66AD
ISTT 60E6 LD1 64B3 LD2 64CB LD3 64F6 LD4 6501
LD41 651F LD5 6538 LD6 653E LD7 6549 LD8 657E
LD9 6586 LDE1 659B LDEND 6595 LDFILE 646F LDFL0 648B
LDFL1 649F LDFL5 64C0 LDNEND 659F MAIN 605A MATCH 68EA
MCFLG 604D MCMD0 6948 MCMD41 6966 MCMD55 695E MCMD58 6956
MCMD8 694F MCMD9 696F MEMSET 65A7 MEN1 609A MEN2 60A2
MEN3 60AA MEN4 60B1 MEN5 60B9 MEN6 60C1 MEN7 60C9
MEN8 60D1 MENU 6080 MERR 6A30 MS1 65B8 MS2 65C5
MS3 65E4 MSBPB 6A66 MSCL2 6A81 MSDIR 6A78 MSERR 6A47
MSFAT 6A6F MSINFN 6A91 MSINIT 6A14 MSLDED 6AA7 MSLOP 65D7
MSLOP0 65D3 MSMENU1 6976 MSMENU2 69B6 MSNOFL 6AB3 MSNXTP 6AC1
MSOFS 6A56 MSSCT 69E6 MSSD0 69FA MSSD1 6A06 MSWROK 69EE
NOTM 68EE OKEND 6318 OUTCHA FBBB PBCTL FD9F PBDAT FD9E
PSEND 67E9 PSLOP 67DE PSTRNG 67DC RD1 6636 RD1SCT 661E
RD2 663D RD3 664D RESDAT 6007 RPT41 6169 RWBUF 6D00
SC01 60F7 SC2581 61BA SC551 6176 SC581 614C SC80 611C
SC91 6296 SCLOP1 62CD SCLOP2 62E0 SCLOP3 62F3 SCLOP4 6306
SCMD0 60EF SCMD258 61AD SCMD55 6169 SCMD58 613F SCMD8 610F
SCPY1 6251 SCTBPB 6009 SCTCLT 6019 SCTDIR 6011 SCTDSV 6015
SCTFAT 600D SCTN0 6003 SCTN1 6004 SCTN2 6005 SCTN3 6006
SCTPCL 601D SD1 61EF SDERR 6312 SDHC 6008 SDINIT 60D9
SDRD 6319 SELOP 6362 SETCKH 66F5 SETCKL 66EC SETSCT 66B5
SETSNO 635C SFLOP 6751 SFT1 66C5 SKP1 623D SKP2 6282
SNDD1 667E SNDDAT 6677 START 6000 STTADR 6000 TXTADR 2000
VN 6002 WFSIZ 6041 WK1 6058 WMDY 603E
</-temp></--></--></--></--></pre>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><p>前々回の報告「FM-7にRTCとSDを接続する試み(RTC編)(2023年3月9日)」で回路図も公開してありますが、FM-7に6821PIAを1個追加するだけでRTCやSDカードが使用できるのはそれなりにお値打ち(!)なのではないでしょうか。</p><p><br /></p><p><br /></p></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-66975333539492512242023-03-16T23:06:00.000+09:002023-03-16T23:06:09.667+09:00FM-7にRTCとSDを接続する試み(SDカード編 その1)<h4 style="text-align: left;">ようやくSDカード(SDHCカードも)のセクタの読み書きができました</h4><p>まだ完成途上なのですが、一応、必要なセクタを読み書きできるようになりました。</p><p>任意のセクタの読み書きに加えて、MBR(マスタブートレコード)、BPB(ブートパラメータブロック)、FAT(ファイルアロケーションテーブル)、DIR(ディレクトリ)と指定したファイルの最初のセクタを読むことができます。もちろん、SDカードのみでなくSDHCカードもOKです。</p><p><br /></p><p>まずはFM-7との接続の様子です。前回の報告ではFM-7本体に装着していましたが、今回は拡張基板上に装着しています。後ろにFDCカードとFT245カードが並んでおり、50Pフラットケーブルで本体の拡張コネクタに接続しています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_yJZYneVUu8r6Ml1CtI0i4rFf_eWnGBk3Krt0Hk8Tg9tq8PjrHJwlkqaO-Kg6O4IY2HHLtCYO6R7AwuOeRGBxMgZw0cDcptaGnLFGJRcN-4FulF5JYqZtsUr2IDyWwcS5779IvIP76_OqOAlRSMT6KmHy5hBzsnxfGlHUMP7O1Lacu2VABfODfcUA/s4032/%E3%82%AB%E3%83%BC%E3%83%89%E4%BD%BF%E7%94%A8%E7%8A%B6%E6%B3%81.JPG" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" data-original-height="4032" data-original-width="3024" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_yJZYneVUu8r6Ml1CtI0i4rFf_eWnGBk3Krt0Hk8Tg9tq8PjrHJwlkqaO-Kg6O4IY2HHLtCYO6R7AwuOeRGBxMgZw0cDcptaGnLFGJRcN-4FulF5JYqZtsUr2IDyWwcS5779IvIP76_OqOAlRSMT6KmHy5hBzsnxfGlHUMP7O1Lacu2VABfODfcUA/w300-h400/%E3%82%AB%E3%83%BC%E3%83%89%E4%BD%BF%E7%94%A8%E7%8A%B6%E6%B3%81.JPG" width="300" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">設置状態</td></tr></tbody></table><br /><br />SDカードでの起動画面です。<div>SDカードの初期化とカード種別の判別の終了後にメニューが表示されます。<br /><br /><br /><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIEjQG-jIjG0Gz-3Fy1Eyg2zX19VHBRc2Pq6xcx5VM8ESmerfI6mxew8CA845d5AGeKYSzZfx6cDL4qLM4hz8gzAbpPBQS8hlsQ9s5CT6VG05v9iXCNoJvumUpEBBzODJZnhLfCBVYo0FzCIpgRmqPtqJkPpTvvZ157tLMjkqSRjgOGeoMkXgIOBgH/s4032/SD%E3%81%A7%E8%B5%B7%E5%8B%95.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIEjQG-jIjG0Gz-3Fy1Eyg2zX19VHBRc2Pq6xcx5VM8ESmerfI6mxew8CA845d5AGeKYSzZfx6cDL4qLM4hz8gzAbpPBQS8hlsQ9s5CT6VG05v9iXCNoJvumUpEBBzODJZnhLfCBVYo0FzCIpgRmqPtqJkPpTvvZ157tLMjkqSRjgOGeoMkXgIOBgH/w400-h300/SD%E3%81%A7%E8%B5%B7%E5%8B%95.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">SDカードの起動画面</td></tr></tbody></table><br /><div><br /></div><div>SDHCカードでの起動画面です。</div><div><br /></div><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oQH7nytSZawaY-UMqJptnj9zW3TqhyomhzNF8MO8pvB8Pl_R5nNEZ_ZSSFUqrMHQW3Qt1zKotwOYr70ibj569DttKIgaoK-AdghD3Hy_fN9T-KjC6OUK48LgWXQbpJjvh9uGH_vChkomoHLDmaOQZCuGhEwNtywKxbvtRw3c6LD9dhwZwwKJTEkf/s4032/SDHC%E3%81%A7%E8%B5%B7%E5%8B%95.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8oQH7nytSZawaY-UMqJptnj9zW3TqhyomhzNF8MO8pvB8Pl_R5nNEZ_ZSSFUqrMHQW3Qt1zKotwOYr70ibj569DttKIgaoK-AdghD3Hy_fN9T-KjC6OUK48LgWXQbpJjvh9uGH_vChkomoHLDmaOQZCuGhEwNtywKxbvtRw3c6LD9dhwZwwKJTEkf/w400-h300/SDHC%E3%81%A7%E8%B5%B7%E5%8B%95.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">SDHCカードの起動画面</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div style="text-align: left;"><br /></div><div style="text-align: left;">メニュー項目は</div><div style="text-align: left;">1.指定したセクタのリード</div><div style="text-align: left;">2.指定したセクタのライト<br />3.SDカードのデータ取得・表示</div><div style="text-align: left;">4.SDカードの初期化</div><div style="text-align: left;">5.MBR(Master Boot Record)内容の表示</div><div style="text-align: left;">6.BPB(Boot Parameter Block)内容の表示</div><div style="text-align: left;">7.FAT(File Allocation Table)内容の表示</div><div style="text-align: left;">8.DIR(Directory)内容の表示...(先頭セクタのみです)</div><div style="text-align: left;">9.ファイル内容の表示...(先頭セクタのみです)<br />です。<br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">メニュー実行の例として、DIR内容を表示させてみます。</div><div style="text-align: left;">ファイル名、サイズ、作成日、クラスタ上位、クラスタ下位を表示させています。</div><div style="text-align: left;">先頭の番号は、9.ファイル内容の表示で使用します。</div></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK43XCkfRZQiI_Q0GMYjmCcGYyKeenzCKXiOq1pJ48qNee1AZa42bqztc4VkJrtdRG1Z78GWXS_bo2tYBq2ER-TgLppLgMmRiYxw33dGTTvjm-7Fw5scq2fANcQBfzsYAZDC1Zkfn_ZeKC6rbnH4uI7_WVqkklmXO84-ONqp3ENPWh8uU5qCBkdzWe/s4032/SD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK43XCkfRZQiI_Q0GMYjmCcGYyKeenzCKXiOq1pJ48qNee1AZa42bqztc4VkJrtdRG1Z78GWXS_bo2tYBq2ER-TgLppLgMmRiYxw33dGTTvjm-7Fw5scq2fANcQBfzsYAZDC1Zkfn_ZeKC6rbnH4uI7_WVqkklmXO84-ONqp3ENPWh8uU5qCBkdzWe/w400-h300/SD%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">SDカードのディレクトリ表示</td></tr></tbody></table><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">メニュー9です。</div><div class="separator" style="clear: both; text-align: left;">ファイル番号を入力するとそのファイルの内容が表示されます。(現在はテストプログラムですので、先頭セクタのみの表示です。)</div><div class="separator" style="clear: both; text-align: left;">この画面はSDHCカードの場合で、3行目のような意味不明の表示がありますが、これは4行目のファイル名中に小文字が使用されているためです。(拡張子が.Lstでした)</div><div class="separator" style="clear: both; text-align: left;">ということで、FAT32も使用できますが、ファイル名に小文字は使用できないという制限があります。</div><div class="separator" style="clear: both; text-align: left;"><br /></div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi5sdSOdrSlZpYVuM_0KIsqhHI1gxNBOPujkTSdtTeUpL-5Tw_Bav5QYEQHANMH0p1ESGRbkl1Nk1hkv8h_kiMjq_Xk02WuC6enklb4ptBGp7VDXsNFDwWO4MGDSiDcOQB07qCAlN_2U1UdREvbbYRzU6nlhqh9MUC887d5qwANTaJuOg9T51_sZRU/s4032/SDHC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi5sdSOdrSlZpYVuM_0KIsqhHI1gxNBOPujkTSdtTeUpL-5Tw_Bav5QYEQHANMH0p1ESGRbkl1Nk1hkv8h_kiMjq_Xk02WuC6enklb4ptBGp7VDXsNFDwWO4MGDSiDcOQB07qCAlN_2U1UdREvbbYRzU6nlhqh9MUC887d5qwANTaJuOg9T51_sZRU/w400-h300/SDHC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ファイル番号入力待ち</td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div style="text-align: left;">FM-7では一行が80文字までという制限があるために1セクタのデータの512バイトがうまく一画面に収まらないので、表示結果の画像はありません。代わりに、開発に使用しているFLEX9上での画面を示します。<br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><div class="separator" style="clear: both; text-align: center;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6DQxABe3KvujUhu8bF9AaGKN4dU3FZV4WcQpfNJikqWEKjhdYelTUPPDKW6o3lWIZEUzYFzCiRMnbuhjK8U4Fw4hhEa6iZqec6K_bCMBUlQPIV0wgpyT643nupT90NQqyeFZ2NQL-ZhHIqYLXmcP-z9Dal01uXSX5skJ1B67x65eNOJcfDiWbodEZ/s918/CMD9_FLEX9.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="918" data-original-width="867" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6DQxABe3KvujUhu8bF9AaGKN4dU3FZV4WcQpfNJikqWEKjhdYelTUPPDKW6o3lWIZEUzYFzCiRMnbuhjK8U4Fw4hhEa6iZqec6K_bCMBUlQPIV0wgpyT643nupT90NQqyeFZ2NQL-ZhHIqYLXmcP-z9Dal01uXSX5skJ1B67x65eNOJcfDiWbodEZ/w378-h400/CMD9_FLEX9.JPG" width="378" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FLEX9での動作の様子<br /><br /></td></tr></tbody></table></div></div><div class="separator" style="clear: both;"><br /><br />以上、現在実現できていることのうち、読み込み機能について紹介しました。</div><div class="separator" style="clear: both;">ファイル名に小文字が使えませんし、もちろんフォルダも使用できませんが、目的がFM-7への実装ですので、どちらも問題にはなりません。</div><div class="separator" style="clear: both;">問題は、WindowsPC等でSDカードに保存したテキスト等のデータをFM-7で読み出せたとして、それをFM-7のシステムでどのようにして利用するかです。</div><div class="separator" style="clear: both;">最も簡単な方法としては、読み込んだデータをメモリ上に展開しておいてF-BASICからそれを読み込んでファイル化するという方法が考えられます。小さなデータならこれでも間に合いそうですが...</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">SDカードをドライブ2に割り付けることができて、FILES, LOAD, SAVEなどが使用できればベストなのですが、実現するにはなかなか敷居が高そうです...</div><div class="separator" style="clear: both;">また、プログラムサイズも結構大きくなりそうですので、どう組み込むかも課題です。</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">まだまだ完成には遠いですが、今回作成したサブルーチン等をベースにして仕上げていくことになると思いますので、雑な作りのものですが、作成したプログラムを紹介しておきます。</div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<pre class="brush:text" title="SDHC8FM">0001 *
0002 * SDHC8FM.TXT
0003 *
0004 * SD Read/Write on SBC for FM-7
0005 *
0006 * use RTC & SD Card
0007 *
0008 * 6821(PIA) Port A ---- RTC (I2C Mode)
0009 *
0010 * SBC RTC Ext IO
0011 * CA2 2 --- --- HV4 LV4 --- IO1
0012 * PA0 3 --- SCL --- HV1 LV1 --- IO4
0013 * PA1 4 --- --- HV2 LV2 --- IO3
0014 * PA7 10 --- SDA --- HV3 LV3 --- IO2
0015 * GND -- -- -- GND
0016 * -- -- -- 3V3
0017 *
0018 *
0019 * 6821(PIA) Port B ---- SD (SPI Mode)
0020 *
0021 * SBC SD
0022 * CB2 12 --- HV4 LV4 --- SCK
0023 * PB0 13 --- HV1 LV1 --- CS
0024 * PB1 14 --- HV2 LV2 --- MISO
0025 * PB7 20 --- HV3 LV3 --- MOSI
0026 * GND 31 -- -- GND
0027 * VCC 33 -- -- VCC
0028 *
0029 * cf. all data line use level converter
0030 *
0031 * PB output mode
0032 * CB2 1bit output
0033 *
0034 * READ/WRITE BUFFER $6E00 - 6FFF
0035 *
0036 * Add command '2023.03.14
0037 * Change use Port B '2023.03.07
0038 * Original version '2022.06.11
0039 * Copyright by Y.Yamamoto
0040 *
0041 6000 STTADR EQU $6000
0042 FBB8 INCHA EQU $FBB8
0043 FBBB OUTCHA EQU $FBBB
0044
0045 6E00 RWBUF EQU STTADR+$E00
0046
0047 FD9E PBDAT EQU $FD9E
0048 FD9F PBCTL EQU PBDAT+1
0049
0050 6000 ORG STTADR
0051
0052 6000 20 27 START BRA MAIN
0053 6002 01 VN FCB 1
0054 6003 00 SCTN0 FCB 0 top adrs of sct
0055 6004 00 SCTN1 FCB 0
0056 6005 00 SCTN2 FCB 0
0057 6006 00 SCTN3 FCB 0
0058 6007 00 RESDAT FCB 0 response data
0059 6008 00 SDHC FCB 0 sd:0,sdhc:1
0060
0061 6009 0000 SCTBPB FDB 00 sct no of BPB(4bytes)
0062 600B 0000 FDB 00
0063 600D 0000 SCTFAT FDB 00 sct no of FAT#1(4bytes)
0064 600F 0000 FDB 00
0065 6011 0000 SCTDIR FDB 00 sct no of DIR(4bytes)
0066 6013 0000 FDB 00
0067 6015 0000 SCTCLT FDB 00 sct no of top CLUSTER(4bytes)
0068 6017 0000 FDB 00 if SD:#2, SDHC:#3
0069 6019 00 SCTPCL FCB 0 sct per cluster
0070 601A FF WMDY RMB 3
0071 601D FF WFSIZ RMB 4
0072 6021 0000 CLSTH FDB 00
0073 6023 0000 CLSTL FDB 00
0074 6025 0000 WK1 FDB 00
0075 6027 0000 WK2 FDB 00
0076
0077 6029 MAIN EQU *
0078 *=====reset pia=====
0079 *portB:output
0080 6029 86 30 LDA #$30
0081 602B B7 FD9F STA PBCTL select ddra, cb2:0
0082 602E 86 FD LDA #$FD pb0,7:out,pb1:in
0083 6030 B7 FD9E STA PBDAT set output mode
0084 6033 86 34 LDA #$34
0085 6035 B7 FD9F STA PBCTL select peripheral,cb2:0
0086
0087 *for pia exist check
0088 6038 86 55 LDA #$55 test data
0089 603A B7 FD9E STA PBDAT
0090 603D B6 FD9E LDA PBDAT
0091 6040 84 FD ANDA #$FD pb1=0
0092 6042 81 55 CMPA #$55
0093 6044 27 07 BEQ INIT
0094 6046 8E 68DF LDX #MERR
0095 6049 17 067B LBSR PSTRNG
0096 604C 39 RTS return FM-7
0097
0098 604D INIT EQU *
0099 604D 8D 5E BSR SDINIT
0100
0101 ****************************************
0102 * MAIN MENU
0103 ****************************************
0104 604F MENU EQU *
0105 604F 8E 6817 LDX #MSMENU1
0106 6052 17 0672 LBSR PSTRNG
0107 6055 8E 6859 LDX #MSMENU2
0108 6058 17 066C LBSR PSTRNG
0109
0110 605B BD FBB8 JSR INCHA
0111 605E 80 30 SUBA #$30
0112 6060 26 04 BNE MEN1 0?
0113 6062 BD 6612 JSR CRLF
0114 6065 39 RTS return FM-7
0115 6066 4A MEN1 DECA
0116 6067 26 05 BNE MEN2 1?
0117 6069 17 0271 LBSR SDRD
0118 606C 20 E1 BRA MENU
0119 606E 4A MEN2 DECA
0120 606F 26 05 BNE MEN3 2?
0121 6071 17 0416 LBSR SDWRT
0122 6074 20 D9 BRA MENU
0123 6076 4A MEN3 DECA
0124 6077 26 05 BNE MEN4 3?
0125 6079 17 01D3 LBSR GETSD
0126 607C 20 D1 BRA MENU
0127 607E 4A MEN4 DECA
0128 607F 26 04 BNE MEN5 4?
0129 6081 8D 2A BSR SDINIT
0130 6083 20 CA BRA MENU
0131 6085 4A MEN5 DECA 5?
0132 6086 26 05 BNE MEN6
0133 6088 17 0265 LBSR DSPMBR
0134 608B 20 C2 BRA MENU
0135 608D 4A MEN6 DECA 6?
0136 608E 26 05 BNE MEN7
0137 6090 17 02B7 LBSR DSPBPB
0138 6093 20 BA BRA MENU
0139 6095 4A MEN7 DECA 7?
0140 6096 26 05 BNE MEN8
0141 6098 17 02C1 LBSR DSPFAT
0142 609B 20 B2 BRA MENU
0143 609D 4A MEN8 DECA 8?
0144 609E 26 05 BNE MEN9
0145 60A0 17 02CB LBSR DSPDIR
0146 60A3 20 AA BRA MENU
0147 60A5 4A MEN9 DECA 9?
0148 60A6 26 A7 BNE MENU
0149 60A8 17 0349 LBSR LDFILE
0150 60AB 20 A2 BRA MENU
0151 *
0152 ****************************************
0153 * SD Initialize routine
0154 ****************************************
0155 60AD SDINIT EQU *
0156 *---------- start ----------
0157 60AD 8E 68C3 LDX #MSINIT
0158 60B0 BD 66C7 JSR PSTRNG
0159 * cs:1,di:1,sck-74ms
0160 60B3 86 FF LDA #$FF mosi:b7=H,miso:b1=H(for PIA),cs:b0=H
0161 60B5 B7 FD9E STA PBDAT
0162 60B8 C6 50 LDB #80 80times
0163 60BA 17 051A ISTT LBSR SETCKL
0164 60BD 17 0520 LBSR SETCKH
0165 60C0 5A DECB
0166 60C1 26 F7 BNE ISTT
0167 *
0168 *---------- cmd 0 ----------
0169 60C3 SCMD0 EQU *
0170 * LDX #MCMD0
0171 * LBSR PSTRNG
0172
0173 60C3 17 0511 LBSR SETCKL
0174 60C6 C6 06 LDB #6
0175 60C8 8E 67B3 LDX #CMD0
0176 60CB A6 80 SC01 LDA ,X+
0177 60CD 17 0496 LBSR SNDDAT
0178 60D0 5A DECB
0179 60D1 26 F8 BNE SC01
0180 *get response
0181 60D3 5F CLRB
0182 60D4 GR00
0183 60D4 5A DECB
0184 60D5 1027 01FD LBEQ SDERR
0185 60D9 17 04A6 LBSR GETDAT
0186 60DC B6 6007 LDA RESDAT
0187 * LBSR DSPBIN disp response
0188 60DF 81 01 CMPA #$01
0189 60E1 26 F1 BNE GR00
0190 * JSR CRLF
0191 *
0192 *---------- cmd 8 ----------
0193 60E3 SCMD8 EQU *
0194 * LDX #MCMD8
0195 * LBSR PSTRNG
0196
0197 60E3 17 04F1 LBSR SETCKL
0198 60E6 86 FF LDA #$FF dummy cmd
0199 60E8 17 047B LBSR SNDDAT
0200 60EB C6 06 LDB #6
0201 60ED 8E 67CB LDX #CMD8
0202 60F0 A6 80 SC80 LDA ,X+
0203 60F2 17 0471 LBSR SNDDAT
0204 60F5 5A DECB
0205 60F6 26 F8 BNE SC80
0206 *get response
0207 60F8 GR80
0208 60F8 17 0487 LBSR GETDAT
0209 60FB B6 6007 LDA RESDAT
0210
0211 60FE 17 0481 LBSR GETDAT
0212 6101 B6 6007 LDA RESDAT
0213 * LBSR DSPBIN disp response
0214 6104 81 01 CMPA #$01
0215 6106 26 F0 BNE GR80
0216 6108 C6 04 LDB #4
0217 610A 17 0475 GR81 LBSR GETDAT
0218 610D B6 6007 LDA RESDAT
0219 * LBSR DSPBIN disp response
0220 6110 5A DECB
0221 6111 26 F7 BNE GR81
0222 * JSR CRLF
0223 *
0224 *---------- cmd 58 ----------
0225 6113 SCMD58 EQU *
0226 * LDX #MCMD58
0227 * LBSR PSTRNG
0228
0229 6113 17 04C1 LBSR SETCKL
0230 6116 86 FF LDA #$FF dummy cmd
0231 6118 17 044B LBSR SNDDAT
0232 611B C6 06 LDB #6
0233 611D 8E 67D1 LDX #CMD58
0234 6120 A6 80 SC581 LDA ,X+
0235 6122 17 0441 LBSR SNDDAT
0236 6125 5A DECB
0237 6126 26 F8 BNE SC581
0238 *get response
0239 6128 GR580
0240 6128 17 0457 LBSR GETDAT
0241 612B B6 6007 LDA RESDAT
0242 * LBSR DSPBIN disp response
0243 612E 81 01 CMPA #$01
0244 6130 26 F6 BNE GR580
0245 6132 C6 04 GR581 LDB #4
0246 6134 17 044B GR582 LBSR GETDAT
0247 6137 B6 6007 LDA RESDAT
0248 * LBSR DSPBIN disp response
0249 613A 5A DECB
0250 613B 26 F7 BNE GR582
0251 613D RPT41 EQU *
0252 *---------- cmd 55 ----------
0253 613D SCMD55 EQU *
0254 * LDX #MCMD55
0255 * LBSR PSTRNG
0256
0257 613D 17 0497 LBSR SETCKL
0258 6140 86 FF LDA #$FF dummy cmd
0259 6142 17 0421 LBSR SNDDAT
0260 6145 C6 06 LDB #6
0261 6147 8E 67D7 LDX #CMD55
0262 614A A6 80 SC551 LDA ,X+
0263 614C 17 0417 LBSR SNDDAT
0264 614F 5A DECB
0265 6150 26 F8 BNE SC551
0266 *get response
0267 * CLRB
0268 6152 GR550
0269 * DECB
0270 * BEQ SDERR
0271 6152 17 042D LBSR GETDAT
0272 6155 B6 6007 LDA RESDAT
0273 * LBSR DSPBIN disp response
0274 6158 81 01 CMPA #$01
0275 615A 26 F6 BNE GR550
0276
0277 * JSR CRLF
0278 *---------- acmd 41 ----------
0279 615C ASCMD41 EQU *
0280 * LDX #MCMD41
0281 * LBSR PSTRNG
0282
0283 615C 17 0478 LBSR SETCKL
0284 615F 86 FF LDA #$FF dummy cmd
0285 6161 17 0402 LBSR SNDDAT
0286 6164 C6 06 LDB #6
0287 6166 8E 67DD LDX #ACMD41
0288 6169 A6 80 ASC411 LDA ,X+
0289 616B 17 03F8 LBSR SNDDAT
0290 616E 5A DECB
0291 616F 26 F8 BNE ASC411
0292 *get response
0293 6171 GR410
0294 6171 17 040E LBSR GETDAT
0295 6174 B6 6007 LDA RESDAT
0296 * LBSR DSPBIN disp response
0297 6177 17 0408 LBSR GETDAT
0298 617A B6 6007 LDA RESDAT
0299 * LBSR DSPBIN disp response
0300 617D 81 00 CMPA #$00
0301 617F 26 BC BNE RPT41
0302 * JSR CRLF
0303
0304 *---------- second cmd 58 ----------
0305 6181 SCMD258 EQU *
0306 * LDX #MCMD58
0307 * LBSR PSTRNG
0308
0309 6181 17 0453 LBSR SETCKL
0310 6184 86 FF LDA #$FF dummy cmd
0311 6186 17 03DD LBSR SNDDAT
0312 6189 C6 06 LDB #6
0313 618B 8E 67D1 LDX #CMD58
0314 618E A6 80 SC2581 LDA ,X+
0315 6190 17 03D3 LBSR SNDDAT
0316 6193 5A DECB
0317 6194 26 F8 BNE SC2581
0318 *get response
0319 6196 GR2580
0320 6196 17 03E9 LBSR GETDAT
0321 6199 B6 6007 LDA RESDAT
0322 * LBSR DSPBIN disp response
0323 619C 81 00 CMPA #$00
0324 619E 26 F6 BNE GR2580
0325 61A0 17 03DF LBSR GETDAT
0326 61A3 B6 6007 LDA RESDAT
0327 * LBSR DSPBIN disp response
0328 61A6 48 LSLA
0329 61A7 48 LSLA
0330 61A8 24 03 BCC GR2581
0331 61AA 7C 6008 INC SDHC if sdhc then 1
0332 61AD C6 03 GR2581 LDB #3
0333 61AF 17 03D0 GR2582 LBSR GETDAT
0334 61B2 B6 6007 LDA RESDAT
0335 * LBSR DSPBIN disp response
0336 61B5 5A DECB
0337 61B6 26 F7 BNE GR2582
0338
0339 61B8 8E 68A9 LDX #MSSD0
0340 61BB B6 6008 LDA SDHC
0341 61BE 27 03 BEQ SD1
0342 61C0 8E 68B5 LDX #MSSD1
0343 61C3 17 0501 SD1 LBSR PSTRNG
0344
0345 *----------
0346 *set sct no of BPB
0347 61C6 17 0145 LBSR GETMBR
0348 61C9 8E 6FCA LDX #RWBUF+446+8+4
0349 61CC 108E 6009 LDY #SCTBPB
0350 61D0 C6 04 LDB #4
0351 61D2 A6 82 ILOP1 LDA ,-X
0352 61D4 A7 A0 STA ,Y+
0353 61D6 5A DECB
0354 61D7 26 F9 BNE ILOP1
0355
0356 *set sct no of FAT#1
0357 61D9 17 0155 LBSR GETBPB
0358 61DC 8E 6009 LDX #SCTBPB
0359 61DF 108E 600D LDY #SCTFAT
0360 61E3 C6 04 LDB #4
0361 61E5 A6 80 ILOP2 LDA ,X+
0362 61E7 A7 A0 STA ,Y+
0363 61E9 5A DECB
0364 61EA 26 F9 BNE ILOP2
0365
0366 61EC 8E 600D LDX #SCTFAT
0367 61EF 108E 6E0E LDY #RWBUF+$0E for SD & SDHC
0368 61F3 17 04A0 LBSR ADD42
0369
0370 *set sct no of DIR
0371 61F6 8E 600D LDX #SCTFAT
0372 61F9 108E 6011 LDY #SCTDIR
0373 61FD C6 04 LDB #4
0374 61FF A6 80 ILOP3 LDA ,X+
0375 6201 A7 A0 STA ,Y+
0376 6203 5A DECB
0377 6204 26 F9 BNE ILOP3
0378
0379 6206 8E 6E16 LDX #RWBUF+$16 for SD
0380 6209 7D 6008 TST SDHC
0381 620C 27 03 BEQ SKP1
0382 620E C6 0E LDB #$24-$16
0383 6210 3A ABX for SDHC
0384 6211 1F 12 SKP1 TFR X,Y
0385 6213 8E 6011 LDX #SCTDIR
0386 6216 17 047D LBSR ADD42
0387 6219 17 047A LBSR ADD42 skip for FAT#2
0388
0389 *set sct per cluster
0390 621C 8E 6E0D LDX #RWBUF+$0D
0391 621F A6 84 LDA ,X
0392 6221 B7 6019 STA SCTPCL
0393
0394 *set sct no of CLUSTER#2
0395 6224 8E 6011 LDX #SCTDIR
0396 6227 108E 6015 LDY #SCTCLT
0397 622B C6 04 LDB #4
0398 622D A6 80 ILOP4 LDA ,X+
0399 622F A7 A0 STA ,Y+
0400 6231 5A DECB
0401 6232 26 F9 BNE ILOP4
0402
0403 6234 108E 6027 LDY #WK1+2
0404 6238 86 00 LDA #$00
0405 623A A7 A2 STA ,-Y
0406 623C 86 20 LDA #$20 for SD
0407 623E 7D 6008 TST SDHC
0408 6241 27 03 BEQ SKP2
0409 6243 B6 6019 LDA SCTPCL for SDHC
0410 6246 A7 A2 SKP2 STA ,-Y
0411 6248 8E 6015 LDX #SCTCLT
0412 624B 17 0448 LBSR ADD42
0413 *----------
0414 624E 39 RTS
0415
0416 ****************************************
0417 * GET SD DATA ROUTINE
0418 * use CMD9
0419 ****************************************
0420 624F GETSD EQU *
0421 624F BD 6612 JSR CRLF
0422 6252 17 0382 LBSR SETCKL
0423 6255 C6 06 LDB #6
0424 6257 8E 67E3 LDX #CMD9
0425 625A A6 80 SC91 LDA ,X+
0426 625C 17 0307 LBSR SNDDAT
0427 625F 5A DECB
0428 6260 26 F8 BNE SC91
0429 * JSR CRLF
0430 *get response
0431 6262 GR90
0432 6262 17 031D LBSR GETDAT
0433 6265 B6 6007 LDA RESDAT
0434 * LBSR DSPBIN disp response
0435 6268 81 00 CMPA #$00
0436 626A 26 F6 BNE GR90
0437
0438 * JSR CRLF
0439 626C BD 6612 JSR CRLF
0440 626F C6 14 LDB #16+1+2+1 fe,crcH,crcL,ff
0441 6271 17 030E GR91 LBSR GETDAT
0442 6274 B6 6007 LDA RESDAT
0443 6277 17 036F LBSR DSPBIN disp response
0444 627A 5A DECB
0445 627B 26 F4 BNE GR91
0446 627D BD 6612 JSR CRLF
0447
0448 *disp offset of MBR,FAT#1,DIR,CLUSTER#2
0449 6280 8E 6905 LDX #MSOFS
0450 6283 BD 66C7 JSR PSTRNG
0451 6286 8E 6917 LDX #MSBPB
0452 6289 BD 66C7 JSR PSTRNG
0453 628C 8E 6009 LDX #SCTBPB
0454 628F C6 04 LDB #4
0455 6291 A6 80 SCLOP1 LDA ,X+
0456 6293 17 0353 LBSR DSPBIN
0457 6296 5A DECB
0458 6297 26 F8 BNE SCLOP1
0459
0460 6299 8E 6920 LDX #MSFAT
0461 629C BD 66C7 JSR PSTRNG
0462 629F 8E 600D LDX #SCTFAT
0463 62A2 C6 04 LDB #4
0464 62A4 A6 80 SCLOP2 LDA ,X+
0465 62A6 17 0340 LBSR DSPBIN
0466 62A9 5A DECB
0467 62AA 26 F8 BNE SCLOP2
0468
0469 62AC 8E 6929 LDX #MSDIR
0470 62AF BD 66C7 JSR PSTRNG
0471 62B2 8E 6011 LDX #SCTDIR
0472 62B5 C6 04 LDB #4
0473 62B7 A6 80 SCLOP3 LDA ,X+
0474 62B9 17 032D LBSR DSPBIN
0475 62BC 5A DECB
0476 62BD 26 F8 BNE SCLOP3
0477
0478 62BF 8E 6932 LDX #MSCL2
0479 62C2 BD 66C7 JSR PSTRNG
0480 62C5 8E 6015 LDX #SCTCLT
0481 62C8 C6 04 LDB #4
0482 62CA A6 80 SCLOP4 LDA ,X+
0483 62CC 17 031A LBSR DSPBIN
0484 62CF 5A DECB
0485 62D0 26 F8 BNE SCLOP4
0486 62D2 BD 6612 JSR CRLF
0487 62D5 39 RTS
0488
0489 *
0490 62D6 SDERR EQU *
0491 62D6 8E 68DF LDX #MERR
0492 62D9 17 03EB LBSR PSTRNG
0493 62DC OKEND
0494 62DC 39 RTS return FM-7
0495 *
0496 ****************************************
0497 * READ ROUTINE
0498 * use CMD17
0499 * set sctno to $6005,6006
0500 * read data set to $6800-69FF
0501 ****************************************
0502 62DD SDRD EQU *
0503 62DD BD 6612 JSR CRLF
0504 62E0 17 02B9 LBSR INSCT
0505 62E3 17 0227 LBSR RD1SCT read 1 sct
0506
0507 *disp data
0508 62E6 BD 6612 JSR CRLF
0509 62E9 17 025C LBSR DSPBUF
0510 62EC BD 6612 JSR CRLF
0511 62EF 39 RTS
0512
0513 ****************************************
0514 * Read MBR & Disp parameter of BPB
0515 ****************************************
0516 62F0 DSPMBR EQU *
0517 62F0 BD 6612 JSR CRLF
0518 62F3 8D 19 BSR GETMBR
0519
0520 *disp BPB
0521 62F5 BD 6612 JSR CRLF
0522 62F8 8E 6FBE LDX #RWBUF+446
0523 62FB C6 10 GET1 LDB #16
0524 62FD A6 80 GET2 LDA ,X+
0525 62FF 17 02E7 LBSR DSPBIN disp data
0526 6302 5A DECB
0527 6303 26 F8 BNE GET2
0528 6305 BD 6612 JSR CRLF
0529 6308 8C 6FFE CMPX #RWBUF+510 446+16*4
0530 630B 25 EE BLO GET1
0531 630D 39 RTS
0532
0533 *----------------------------------------
0534 *read MBR
0535 630E GETMBR EQU *
0536 630E 8E 6003 LDX #SCTN0
0537 6311 C6 04 LDB #4
0538 6313 4F CLRA
0539 6314 A7 80 GPLOP STA ,X+
0540 6316 5A DECB
0541 6317 26 FB BNE GPLOP
0542 6319 17 0288 LBSR SETSCT
0543
0544 631C 17 01EE LBSR RD1SCT read 1 sct
0545 631F 39 RTS
0546
0547 *----------------------------------------
0548 *set sector no to SCTN0
0549 *from X,X+1,X+2,X+3 to SCTN0-SCTN3
0550 6320 SETSNO EQU *
0551 6320 108E 6003 LDY #SCTN0
0552 6324 C6 04 LDB #4
0553 6326 A6 80 SELOP LDA ,X+
0554 6328 A7 A0 STA ,Y+
0555 632A 5A DECB
0556 632B 26 F9 BNE SELOP
0557 632D 17 0274 LBSR SETSCT
0558 6330 39 RTS
0559
0560 *----------------------------------------
0561 *read BPB
0562 6331 GETBPB EQU *
0563 6331 8D DB BSR GETMBR
0564 *set sct no of BPB
0565 6333 8E 6FCA LDX #RWBUF+446+8+4
0566 6336 108E 6003 LDY #SCTN0
0567 633A C6 04 LDB #4
0568 633C A6 82 GPLOP2 LDA ,-X
0569 633E A7 A0 STA ,Y+
0570 6340 5A DECB
0571 6341 26 F9 BNE GPLOP2
0572 6343 17 025E LBSR SETSCT
0573
0574 6346 17 01C4 LBSR RD1SCT read 1 sct
0575 6349 39 RTS
0576
0577 ****************************************
0578 * Disp BPB(Bios Parameter Block)
0579 ****************************************
0580 634A DSPBPB EQU *
0581 634A 8E 6009 LDX #SCTBPB
0582 634D 8D D1 BSR SETSNO
0583 634F 17 01BB LBSR RD1SCT read 1 sct
0584
0585 *disp BPB
0586 6352 BD 6612 JSR CRLF
0587 6355 17 01F0 LBSR DSPBUF
0588 6358 BD 6612 JSR CRLF
0589 635B 39 RTS
0590
0591 ****************************************
0592 * Disp FAT#1
0593 ****************************************
0594 635C DSPFAT EQU *
0595 635C 8E 600D LDX #SCTFAT
0596 635F 8D BF BSR SETSNO
0597 6361 17 01A9 LBSR RD1SCT read 1 sct
0598
0599 *disp FAT
0600 6364 BD 6612 JSR CRLF
0601 6367 17 01DE LBSR DSPBUF
0602 636A BD 6612 JSR CRLF
0603 636D 39 RTS
0604
0605 ****************************************
0606 * Disp Directory
0607 ****************************************
0608 636E DSPDIR EQU *
0609 636E 8E 6011 LDX #SCTDIR
0610 6371 8D AD BSR SETSNO
0611 6373 17 0197 LBSR RD1SCT read 1 sct
0612
0613 **disp DIR
0614 * JSR CRLF
0615 * LBSR DSPBUF
0616 * JSR CRLF
0617 *
0618 *disp FILE name
0619 6376 BD 6612 JSR CRLF
0620 6379 BD 6612 JSR CRLF
0621 637C 8E 6E60 LDX #RWBUF+96 skip top data
0622 637F 7F 6027 CLR WK2 counter
0623 6382 A6 84 DSPFL1 LDA ,X
0624 6384 27 6D BEQ DSPEND
0625 6386 81 E5 CMPA #$E5 delete mark?
0626 6388 26 05 BNE DSPFL2
0627 638A 30 88 20 LEAX 32,X
0628 638D 20 F3 BRA DSPFL1
0629
0630 638F 7C 6027 DSPFL2 INC WK2
0631 6392 B6 6027 LDA WK2
0632 6395 17 0251 LBSR DSPBIN disp counter
0633 6398 C6 08 LDB #8
0634 639A A6 80 DSPFL3 LDA ,X+
0635 639C BD FBBB JSR OUTCHA
0636 639F 5A DECB
0637 63A0 26 F8 BNE DSPFL3
0638 63A2 86 2E LDA #'.
0639 63A4 BD FBBB JSR OUTCHA
0640 63A7 C6 03 LDB #3
0641 63A9 A6 80 DSPFL4 LDA ,X+
0642 63AB BD FBBB JSR OUTCHA
0643 63AE 5A DECB
0644 63AF 26 F8 BNE DSPFL4
0645 63B1 86 20 LDA #'
0646 63B3 BD FBBB JSR OUTCHA
0647 63B6 BD FBBB JSR OUTCHA
0648
0649 *get FILE time data
0650 63B9 30 07 LEAX 7,X
0651 63BB EC 81 LDD ,X++
0652 63BD FD 6025 STD WK1
0653
0654 *get CLUSTER(H) data
0655 63C0 EC 81 LDD ,X++
0656 63C2 1E 89 EXG A,B
0657 63C4 FD 6021 STD CLSTH
0658 63C7 30 04 LEAX 4,X
0659 63C9 EC 81 LDD ,X++
0660 63CB 1E 89 EXG A,B
0661 63CD FD 6023 STD CLSTL
0662
0663 *get FILE size data
0664 63D0 108E 6021 LDY #WFSIZ+4
0665 63D4 C6 04 LDB #4
0666 63D6 A6 80 DSPC1 LDA ,X+
0667 63D8 A7 A2 STA ,-Y
0668 63DA 5A DECB
0669 63DB 26 F9 BNE DSPC1
0670
0671 *disp FILE size
0672 63DD 86 20 LDA #'
0673 63DF BD FBBB JSR OUTCHA
0674 63E2 17 0353 LBSR DSPSIZ disp FILE size
0675
0676
0677 *disp FILE time
0678 63E5 FC 6025 LDD WK1
0679 63E8 17 02EC LBSR DSPYMD disp MM-DD-YY
0680
0681 *disp CLUSTER(H,L)
0682 63EB 17 03A0 LBSR DSPCLS
0683
0684 63EE BD 6612 JSR CRLF
0685 63F1 20 8F BRA DSPFL1
0686 *
0687 63F3 39 DSPEND RTS
0688
0689 ****************************************
0690 * Load FILE
0691 ****************************************
0692 63F4 LDFILE EQU *
0693 63F4 17 FF77 LBSR DSPDIR
0694 63F7 8E 6942 LDX #MSINFL
0695 63FA BD 66C7 JSR PSTRNG
0696 63FD BD FBB8 JSR INCHA file no
0697 6400 80 30 SUBA #$30 to binary
0698
0699 6402 8E 6E60 LDX #RWBUF+96 skip top data
0700 6405 1F 89 TFR A,B
0701
0702 6407 A6 84 LDLOP LDA ,X
0703 6409 81 E5 CMPA #$E5 delete mark?
0704 640B 26 05 BNE LD1
0705 640D 30 88 20 LEAX 32,X skip
0706 6410 20 F5 BRA LDLOP
0707 6412 5A LD1 DECB
0708 6413 27 05 BEQ LD2
0709 6415 30 88 20 LEAX 32,X
0710 6418 20 ED BRA LDLOP
0711 *hit file, get cluster no
0712 641A EC 88 14 LD2 LDD $14,X
0713 641D 1E 89 EXG A,B
0714 641F FD 6021 STD CLSTH
0715 6422 EC 88 1A LDD $1A,X
0716 6425 1E 89 EXG A,B
0717 6427 FD 6023 STD CLSTL
0718 *get sct no
0719 642A C0 02 SUBB #2 sub top cluseter no
0720 642C 7D 6008 TST SDHC SD:0,SDHC:1
0721 642F 27 01 BEQ LD3
0722 6431 5A DECB
0723
0724 6432 34 04 LD3 PSHS B
0725 6434 8E 6015 LDX #SCTCLT
0726 6437 108E 6025 LDY #WK1
0727 643B C6 04 LDB #4
0728 643D A6 80 LD4 LDA ,X+
0729 643F A7 A0 STA ,Y+
0730 6441 5A DECB
0731 6442 26 F9 BNE LD4
0732 6444 35 04 PULS B
0733
0734 6446 8E 6025 LDX #WK1
0735 6449 A6 03 LD5 LDA 3,X
0736 644B 8B 40 ADDA #$40
0737 644D A7 03 STA 3,X
0738 644F 24 06 BCC LD51
0739 6451 A6 02 LDA 2,X
0740 6453 8B 01 ADDA #1
0741 6455 A7 02 STA 2,X
0742 6457 24 06 LD51 BCC LD52
0743 6459 A6 01 LDA 1,X
0744 645B 8B 01 ADDA #1
0745 645D A7 01 STA 1,X
0746 645F 24 06 LD52 BCC LD53
0747 6461 A6 84 LDA ,X
0748 6463 8B 01 ADDA #1
0749 6465 A7 84 STA ,X
0750 6467 5A LD53 DECB
0751 6468 26 DF BNE LD5
0752
0753 646A 8E 6025 LDX #WK1
0754 646D 108E 6003 LDY #SCTN0
0755 6471 C6 04 LDB #4
0756 6473 A6 80 LD6 LDA ,X+
0757 6475 A7 A0 STA ,Y+
0758 6477 5A DECB
0759 6478 26 F9 BNE LD6
0760 647A 17 0127 LBSR SETSCT
0761 647D 17 008D LBSR RD1SCT read 1 sct
0762
0763 * LDX #SCTCLT
0764 * LBSR SETSNO
0765 * LBSR RD1SCT read 1 sct
0766 *
0767 **disp CLUSTER#2
0768 6480 BD 6612 JSR CRLF
0769 6483 17 00C2 LBSR DSPBUF
0770 6486 BD 6612 JSR CRLF
0771 6489 39 RTS
0772
0773 ****************************************
0774 * WRITE ROUTINE
0775 * use CMD24
0776 * set sctno to $6005,6006
0777 * write data from $6A00-6BFF
0778 ****************************************
0779 648A SDWRT EQU *
0780 648A 8E 689D LDX #MSWROK
0781 648D 17 0237 LBSR PSTRNG
0782 6490 BD FBB8 JSR INCHA
0783 6493 84 DF ANDA #$DF
0784 6495 81 59 CMPA #'Y
0785 6497 27 01 BEQ SDWR1
0786 6499 39 RTS
0787 649A BD 6612 SDWR1 JSR CRLF
0788 649D 17 00FC LBSR INSCT *input SCT No
0789 *copy sct no to cmd param
0790 64A0 8E 6003 LDX #SCTN0
0791 64A3 108E 67C6 LDY #CMD24+1
0792 64A7 C6 04 LDB #4
0793 64A9 A6 80 CPY2 LDA ,X+
0794 64AB A7 A0 STA ,Y+
0795 64AD 5A DECB
0796 64AE 26 F9 BNE CPY2
0797 *send cmd
0798 64B0 17 0124 LBSR SETCKL
0799 64B3 C6 06 LDB #6
0800 64B5 8E 67C5 LDX #CMD24
0801 64B8 A6 80 SDW1 LDA ,X+
0802 64BA 17 012C LBSR DSPBIN disp response
0803 64BD 17 00A6 LBSR SNDDAT
0804 64C0 5A DECB
0805 64C1 26 F5 BNE SDW1
0806 *get cmd response
0807 64C3 SDW2
0808 64C3 17 00BC LBSR GETDAT
0809 64C6 B6 6007 LDA RESDAT
0810 64C9 17 011D LBSR DSPBIN disp response
0811 64CC 81 00 CMPA #$00
0812 64CE 26 F3 BNE SDW2
0813 *1byte skip
0814 64D0 86 FF LDA #$FF
0815 64D2 17 0091 LBSR SNDDAT 1byte skip
0816 64D5 BD 6612 JSR CRLF
0817
0818 *send data packet
0819 64D8 8E 6E00 LDX #RWBUF --temp buf
0820 64DB 108E 0200 LDY #512
0821 *send data token
0822 64DF 86 FE LDA #$FE
0823 64E1 17 0082 LBSR SNDDAT data token
0824 64E4 A6 80 SNDDT1 LDA ,X+
0825 64E6 8D 7E BSR SNDDAT
0826 64E8 31 3F LEAY -1,Y
0827 64EA 26 F8 BNE SNDDT1
0828
0829 64EC 86 FF LDA #$FF
0830 64EE 8D 76 BSR SNDDAT crcH
0831 64F0 8D 74 BSR SNDDAT crcL
0832 *get data response
0833 64F2 CKRS
0834 64F2 17 008D LBSR GETDAT
0835 64F5 B6 6007 LDA RESDAT
0836 64F8 17 00EE LBSR DSPBIN disp response
0837 64FB 81 E5 CMPA #$E5 data response?
0838 64FD 26 F3 BNE CKRS
0839 *wait until busy
0840 64FF BUSY
0841 64FF 17 0080 LBSR GETDAT
0842 6502 B6 6007 LDA RESDAT
0843 6505 17 00E1 LBSR DSPBIN disp response
0844 6508 81 FF CMPA #$FF
0845 650A 26 F3 BNE BUSY
0846 650C 39 RTS
0847
0848 *------------------------------
0849 *read 1 sct
0850 *------------------------------
0851 650D RD1SCT EQU *
0852 *copy sct no to cmd param
0853 650D 8E 6003 LDX #SCTN0
0854 6510 108E 67C0 LDY #CMD17+1
0855 6514 C6 04 LDB #4
0856 6516 A6 80 CPY1 LDA ,X+
0857 6518 A7 A0 STA ,Y+
0858 651A 5A DECB
0859 651B 26 F9 BNE CPY1
0860 *send cmd
0861 651D 17 00B7 LBSR SETCKL
0862 6520 C6 06 LDB #6
0863 6522 8E 67BF LDX #CMD17
0864 6525 A6 80 RD1 LDA ,X+
0865 6527 8D 3D BSR SNDDAT
0866 6529 5A DECB
0867 652A 26 F9 BNE RD1
0868 *get response
0869 652C RD2
0870 652C 8D 54 BSR GETDAT
0871 652E B6 6007 LDA RESDAT
0872 6531 81 FE CMPA #$FE token?
0873 6533 26 F7 BNE RD2
0874
0875 *get data
0876 * JSR CRLF
0877 6535 8E 6E00 LDX #RWBUF --temp buf
0878 6538 108E 0200 LDY #512
0879 653C RD3
0880 653C 8D 44 BSR GETDAT
0881 653E B6 6007 LDA RESDAT
0882 6541 A7 80 STA ,X+ save buf
0883 6543 31 3F LEAY -1,Y
0884 6545 26 F5 BNE RD3
0885 6547 39 RTS
0886
0887 *------------------------------
0888 *disp data
0889 6548 DSPBUF EQU *
0890 6548 BD 6612 JSR CRLF
0891 654B 8E 6E00 LDX #RWBUF --temp buf
0892 654E 108E 0200 LDY #512
0893 6552 C6 20 DSPB1 LDB #32
0894 6554 DSPB2
0895 6554 A6 80 LDA ,X+ save buf
0896 6556 17 0090 LBSR DSPBIN disp data
0897 6559 31 3F LEAY -1,Y
0898 655B 27 08 BEQ DSPB3
0899 655D 5A DECB
0900 655E 26 F4 BNE DSPB2
0901 6560 BD 6612 JSR CRLF
0902 6563 20 ED BRA DSPB1
0903 6565 39 DSPB3 RTS
0904
0905 *------------------------------
0906 *send data
0907 6566 SNDDAT EQU *
0908 6566 34 06 PSHS A,B
0909 6568 7F 6007 CLR RESDAT
0910 656B C6 08 LDB #8
0911 656D 34 02 SNDD1 PSHS A
0912 656F 84 FC ANDA #$FC
0913 6571 8A 02 ORA #$02 miso:b1=H(for PIA),cs:b0=L
0914 6573 B7 FD9E STA PBDAT send data
0915 6576 8D 5F BSR SETCKL
0916 6578 35 02 PULS A
0917 657A 48 LSLA
0918 657B 8D 63 BSR SETCKH
0919 657D 5A DECB
0920 657E 26 ED BNE SNDD1
0921 6580 35 86 PULS A,B,PC
0922
0923 *get data
0924 6582 GETDAT EQU *
0925 6582 34 06 PSHS A,B
0926 6584 C6 08 LDB #8
0927 6586 8D 4F GETD1 BSR SETCKL
0928 6588 12 NOP
0929 6589 12 NOP
0930 658A 12 NOP
0931 658B 8D 53 BSR SETCKH
0932 658D B6 FD9E LDA PBDAT get response
0933 6590 44 LSRA
0934 6591 44 LSRA b1--C
0935 6592 79 6007 ROL RESDAT C--b0
0936 6595 5A DECB
0937 6596 26 EE BNE GETD1
0938 6598 8D 3D BSR SETCKL
0939 659A 35 86 PULS A,B,PC
0940 *
0941 *------------------------------
0942 *input SCT No
0943 659C INSCT EQU *
0944 659C 8E 6895 LDX #MSSCT
0945 659F 17 0125 LBSR PSTRNG
0946 65A2 8D 79 BSR GET8CH get 8chr, convert 4bin
0947
0948 65A4 SETSCT EQU *
0949 65A4 7D 6008 TST SDHC
0950 65A7 26 1D BNE CALCHC
0951 *SD card
0952 65A9 C6 03 LDB #3
0953 65AB 8E 6004 LDX #SCTN1
0954 65AE 108E 6003 LDY #SCTN0
0955 65B2 A6 80 SFT1 LDA ,X+
0956 65B4 A7 A0 STA ,Y+
0957 65B6 5A DECB
0958 65B7 26 F9 BNE SFT1
0959 65B9 7F 6006 CLR SCTN3
0960 *calc top adrs of sct
0961 65BC CALCSD EQU *
0962 65BC 78 6006 LSL SCTN3
0963 65BF 79 6005 ROL SCTN2
0964 65C2 79 6004 ROL SCTN1
0965 65C5 39 RTS
0966
0967 *SDHC card
0968 *calc top adrs of sct
0969 65C6 CALCHC EQU *
0970 65C6 8E 6003 LDX #SCTN0
0971 65C9 108E 67C0 LDY #CMD17+1
0972 65CD C6 04 LDB #4
0973 65CF A6 80 CALCH1 LDA ,X+
0974 65D1 A7 A0 STA ,Y+
0975 65D3 5A DECB
0976 65D4 26 F9 BNE CALCH1
0977 65D6 39 RTS
0978
0979 *
0980 *set sck:L
0981 65D7 SETCKL EQU *
0982 65D7 34 02 PSHS A
0983 65D9 86 34 LDA #$34 ca2=L
0984 65DB B7 FD9F STA PBCTL
0985 65DE 35 82 PULS A,PC
0986
0987 *set sck:H
0988 65E0 SETCKH EQU *
0989 65E0 34 02 PSHS A
0990 65E2 86 3C LDA #$3C ca2=H
0991 65E4 B7 FD9F STA PBCTL
0992 65E7 35 82 PULS A,PC
0993
0994 *binary(A)--ascii(A)(B)
0995 65E9 DSPBIN EQU *
0996 65E9 34 06 PSHS A,B
0997 65EB 1F 89 TFR A,B
0998 65ED 44 LSRA
0999 65EE 44 LSRA
1000 65EF 44 LSRA
1001 65F0 44 LSRA
1002 65F1 8A 30 ORA #$30
1003 65F3 C4 0F ANDB #$0F
1004 65F5 CA 30 ORB #$30
1005 65F7 81 39 CMPA #$39
1006 65F9 23 02 BLS BI21
1007 65FB 8B 07 ADDA #$07
1008 65FD C1 39 BI21 CMPB #$39
1009 65FF 23 02 BLS BI22
1010 6601 CB 07 ADDB #$07
1011 6603 BD FBBB BI22 JSR OUTCHA
1012 6606 1F 98 TFR B,A
1013 6608 BD FBBB JSR OUTCHA
1014 660B 86 20 LDA #$20
1015 660D BD FBBB JSR OUTCHA
1016 6610 35 86 PULS A,B,PC
1017
1018 *crlf
1019 6612 CRLF EQU *
1020 6612 86 0D LDA #$0D
1021 6614 BD FBBB JSR OUTCHA
1022 6617 86 0A LDA #$0A
1023 6619 BD FBBB JSR OUTCHA
1024 661C 39 RTS
1025
1026 *
1027 661D GET8CH EQU *
1028 *input chr
1029 661D 8E 6956 LDX #INPBUF
1030 6620 5F CLRB
1031 6621 BD FBB8 CLOP JSR INCHA
1032 6624 81 0D CMPA #$0D
1033 6626 27 07 BEQ INEND
1034 6628 A7 85 STA B,X
1035 662A 5C INCB
1036 662B C1 08 CMPB #8
1037 662D 25 F2 BLO CLOP
1038
1039 662F INEND
1040 *shift
1041 662F 5D TSTB
1042 6630 27 11 BEQ CL1
1043 6632 8E 6956 LDX #INPBUF
1044 6635 3A ABX
1045 6636 108E 695E LDY #INPBUF+8
1046 663A 34 04 PSHS B
1047 663C A6 82 SFLOP LDA ,-X
1048 663E A7 A2 STA ,-Y
1049 6640 5A DECB
1050 6641 26 F9 BNE SFLOP
1051 *clr
1052 6643 C6 08 CL1 LDB #8
1053 6645 E0 E0 SUBB ,S+
1054 6647 27 0A BEQ CLEND
1055 6649 8E 6956 LDX #INPBUF
1056 664C 86 30 LDA #'0
1057 664E A7 80 CLLOP STA ,X+
1058 6650 5A DECB
1059 6651 26 FB BNE CLLOP
1060 6653 CLEND
1061
1062 *convert to bin
1063 6653 C6 04 LDB #4
1064 6655 8E 6956 LDX #INPBUF
1065 6658 108E 6003 LDY #SCTN0
1066 665C CVT1
1067 665C A6 80 LDA ,X+
1068 665E 8D 1E BSR CVBIN
1069 6660 25 16 BCS EREND1
1070 6662 48 LSLA
1071 6663 48 LSLA
1072 6664 48 LSLA
1073 6665 48 LSLA
1074 6666 34 02 PSHS A
1075 6668 A6 80 LDA ,X+
1076 666A 8D 12 BSR CVBIN
1077 666C 25 08 BCS EREND0
1078 666E AB E0 ADDA ,S+
1079 6670 A7 A0 STA ,Y+
1080 6672 5A DECB
1081 6673 26 E7 BNE CVT1
1082 6675 39 RTS
1083
1084 6676 35 02 EREND0 PULS A
1085 6678 8E 68F6 EREND1 LDX #MSERR
1086 667B 8D 4A BSR PSTRNG
1087 667D 39 EEND RTS
1088
1089 *--------------------
1090 *ascii -- bin
1091 667E CVBIN EQU *
1092 667E 80 30 SUBA #'0
1093 6680 2B 11 BMI CVERR
1094 6682 81 09 CMPA #9
1095 6684 23 0A BLS CVBEND
1096 6686 81 11 CMPA #$11
1097 6688 25 09 BLO CVERR
1098 668A 81 16 CMPA #$16
1099 668C 22 05 BHI CVERR
1100 668E 80 07 SUBA #7
1101 6690 CVBEND
1102 6690 1C FE ANDCC #$FE reset C
1103 6692 39 RTS
1104 6693 1A 01 CVERR ORCC #$01 set C
1105 6695 39 RTS
1106
1107 *--------------------
1108 *add 2bytes to 4bytes
1109 * X,X+1,X+2,X+3 + Y,Y+1
1110 * data X is big endian
1111 * data Y is little endian
1112 6696 ADD42 EQU *
1113 6696 34 36 PSHS A,B,X,Y
1114 6698 32 7C LEAS -4,S
1115 669A C6 04 LDB #4
1116 669C A6 80 AD1 LDA ,X+
1117 669E A7 E0 STA ,S+
1118 66A0 5A DECB
1119 66A1 26 F9 BNE AD1
1120
1121 *add (lower)
1122 66A3 A6 A0 LDA ,Y+
1123 66A5 AB E2 ADDA ,-S
1124 66A7 A7 E4 STA ,S
1125 66A9 24 02 BCC AD2
1126 66AB 6C 7F INC -1,S
1127 *add (upper)
1128 66AD A6 A4 AD2 LDA ,Y
1129 66AF AB E2 ADDA ,-S
1130 66B1 A7 E4 STA ,S
1131 66B3 24 02 BCC AD3
1132 66B5 6C 7F INC -1,S
1133 66B7 30 1C AD3 LEAX -4,X
1134 66B9 32 7E LEAS -2,S
1135 66BB C6 04 LDB #4
1136 66BD A6 E0 AD4 LDA ,S+
1137 66BF A7 80 STA ,X+
1138 66C1 5A DECB
1139 66C2 26 F9 BNE AD4
1140 66C4 35 36 PULS A,B,X,Y
1141 66C6 39 RTS
1142
1143 *--------------------
1144 * pstring
1145 66C7 PSTRNG EQU *
1146 66C7 34 02 PSHS A
1147 66C9 A6 80 PSLOP LDA ,X+
1148 66CB 81 04 CMPA #4
1149 66CD 27 05 BEQ PSEND
1150 66CF BD FBBB JSR OUTCHA
1151 66D2 20 F5 BRA PSLOP
1152 66D4 35 02 PSEND PULS A
1153 66D6 39 RTS
1154
1155 *--------------------
1156 *disp MM-DD-YY
1157 *indata A(Low),B(High)
1158 66D7 DSPYMD EQU *
1159 66D7 1E 89 EXG A,B
1160 66D9 34 10 PSHS X
1161 66DB 34 06 PSHS A,B
1162 66DD C4 E0 ANDB #$E0
1163 66DF 54 LSRB
1164 66E0 54 LSRB
1165 66E1 54 LSRB
1166 66E2 54 LSRB
1167 66E3 54 LSRB
1168 66E4 47 ASRA
1169 66E5 24 02 BCC DYMD1
1170 66E7 CB 08 ADDB #8
1171 66E9 F7 601A DYMD1 STB WMDY MM
1172 66EC 35 06 PULS A,B
1173 66EE 34 04 PSHS B
1174 66F0 C4 1F ANDB #$1F
1175 66F2 F7 601B STB WMDY+1 DD
1176 66F5 35 04 PULS B
1177
1178 66F7 44 LSRA
1179 * ASLB
1180 * BCC DYMD2
1181 * INCA
1182 66F8 DYMD2
1183 66F8 80 14 SUBA #20 A+1980-2000
1184 66FA B7 601C STA WMDY+2 YY
1185
1186 *disp MM-DD-YY
1187 66FD 86 20 LDA #'
1188 66FF BD FBBB JSR OUTCHA
1189 6702 8E 601A LDX #WMDY
1190 6705 A6 80 LDA ,X+
1191 6707 8D 14 BSR DB2ASC MM
1192 6709 86 2D LDA #'-
1193 670B BD FBBB JSR OUTCHA
1194 670E A6 80 LDA ,X+
1195 6710 8D 0B BSR DB2ASC DD
1196 6712 86 2D LDA #'-
1197 6714 BD FBBB JSR OUTCHA
1198 6717 A6 80 LDA ,X+
1199 6719 8D 02 BSR DB2ASC YY
1200 671B 35 90 PULS X,PC
1201
1202 *
1203 *----------
1204 *(A:BIN)--ASCII
1205 671D DB2ASC EQU *
1206 671D 34 06 PSHS A,B
1207 671F 1F 89 TFR A,B
1208 6721 86 30 LDA #$30
1209 6723 C1 0A DBLOP CMPB #10
1210 6725 25 05 BLO DB2
1211 6727 C0 0A SUBB #10
1212 6729 4C INCA
1213 672A 20 F7 BRA DBLOP
1214 672C BD FBBB DB2 JSR OUTCHA
1215 672F 1F 98 TFR B,A
1216 6731 8B 30 ADDA #$30
1217 6733 BD FBBB JSR OUTCHA
1218 6736 35 86 PULS A,B,PC
1219
1220 *disp FILE size
1221 6738 DSPSIZ EQU *
1222 6738 34 10 PSHS X
1223 673A BE 601D LDX WFSIZ
1224 673D 27 12 BEQ DSS1 if 64k over?
1225 673F 86 2D LDA #'-
1226 6741 BD FBBB JSR OUTCHA
1227 6744 BD FBBB JSR OUTCHA
1228 6747 BD FBBB JSR OUTCHA
1229 674A 86 6B LDA #'k
1230 674C BD FBBB JSR OUTCHA
1231 674F 20 3B BRA DSEND
1232 6751 DSS1
1233 6751 B6 601F LDA WFSIZ+2
1234 6754 81 64 CMPA #100
1235 6756 23 12 BLS DSS13
1236 6758 1F 89 TFR A,B
1237 675A 86 30 LDA #$30
1238 675C C1 64 DSLOP1 CMPB #100
1239 675E 25 05 BLO DSS12
1240 6760 C0 64 SUBB #100
1241 6762 4C INCA
1242 6763 20 F7 BRA DSLOP1
1243 6765 BD FBBB DSS12 JSR OUTCHA
1244 6768 20 05 BRA DSS14
1245
1246 676A 86 20 DSS13 LDA #'
1247 676C BD FBBB JSR OUTCHA
1248 676F 86 30 DSS14 LDA #$30
1249 6771 C1 0A DSLOP2 CMPB #10
1250 6773 25 05 BLO DSS2
1251 6775 C0 0A SUBB #10
1252 6777 4C INCA
1253 6778 20 F7 BRA DSLOP2
1254 677A 81 30 DSS2 CMPA #$30
1255 677C 26 01 BNE DSS3
1256 677E 4C INCA
1257 677F BD FBBB DSS3 JSR OUTCHA
1258 6782 86 6B LDA #'k
1259 6784 BD FBBB JSR OUTCHA
1260 6787 86 20 LDA #'
1261 6789 BD FBBB JSR OUTCHA
1262 678C 35 90 DSEND PULS X,PC
1263
1264 *----------
1265 678E DSPCLS EQU *
1266 678E 34 10 PSHS X
1267 6790 86 20 LDA #'
1268 6792 BD FBBB JSR OUTCHA
1269 6795 8E 6021 LDX #CLSTH
1270 6798 C6 02 LDB #2
1271 679A A6 80 DCLOP1 LDA ,X+
1272 679C 17 FF7E LBSR DB2ASC
1273 679F 5A DECB
1274 67A0 26 F8 BNE DCLOP1
1275 67A2 86 20 LDA #'
1276 67A4 BD FBBB JSR OUTCHA
1277 67A7 C6 02 LDB #2
1278 67A9 A6 80 DCLOP2 LDA ,X+
1279 67AB 17 FF6F LBSR DB2ASC
1280 67AE 5A DECB
1281 67AF 26 F8 BNE DCLOP2
1282 67B1 35 90 PULS X,PC
1283
1284 **************************************************
1285 *========== parameter ==========
1286 67B3 40 CMD0 FCB $40,$00,$00,$00,$00,$95 '@
1287 67B9 41 CMD1 FCB $41,$00,$00,$00,$00,$FF 'A
1288 67BF 51 CMD17 FCB $51,$00,$00,$00,$00,$FF 'Q
1289 67C5 58 CMD24 FCB $58,$00,$00,$00,$00,$FF 'X
1290 67CB 48 CMD8 FCB $48,$00,$00,$01,$AA,$87 'H
1291 67D1 7A CMD58 FCB $7A,$00,$00,$00,$00,$FF 'z
1292 67D7 77 CMD55 FCB $77,$00,$00,$00,$00,$FF 'w
1293 67DD 69 ACMD41 FCB $69,$40,$FF,$80,$00,$FF 'i
1294 67E3 49 CMD9 FCB $49,$00,$00,$00,$00,$FF 'I
1295 *
1296 67E9 43 MCMD0 FCC /CMD0/,$D,$A
1297 67EF 04 FCB 4
1298 67F0 43 MCMD8 FCC /CMD8/,$D,$A
1299 67F6 04 FCB 4
1300 67F7 43 MCMD58 FCC /CMD58/,$D,$A
1301 67FE 04 FCB 4
1302 67FF 43 MCMD55 FCC /CMD55/,$D,$A
1303 6806 04 FCB 4
1304 6807 41 MCMD41 FCC /ACMD41/,$D,$A
1305 680F 04 FCB 4
1306 6810 43 MCMD9 FCC /CMD9/,$D,$A
1307 6816 04 FCB 4
1308 *
1309 6817 0D MSMENU1 FCC $0D,$0A,/1:Read Sct, 2:Write Sct, 3:Get SD data, 4:SD Init, 5:Disp MBR, /
1310 6858 04 FCB 4
1311 6859 0D MSMENU2 FCC $0D,$0A,/6:Disp BPB, 7:Disp FAT, 8:Disp DIR, 9:Load FILE, 0:End : /
1312 6894 04 FCB 4
1313 6895 53 MSSCT FCC /SctNo: /
1314 689C 04 FCB 4
1315 689D 57 MSWROK FCC /Write OK?: /
1316 68A8 04 FCB 4
1317 68A9 0D MSSD0 FCC $0D,$0A,/SD Card/,$0D,$0A
1318 68B4 04 FCB 4
1319 68B5 0D MSSD1 FCC $0D,$0A,/SDHC Card/,$0D,$0A
1320 68C2 04 FCB 4
1321 68C3 0D MSINIT FCC $0D,$0A,$0D,$0A,/SD Card initializing.../
1322 68DE 04 FCB 4
1323 68DF 53 MERR FCC /SD Initialize error!/,$0D,$0A
1324 68F5 04 FCB 4
1325 68F6 49 MSERR FCC /Input error!/,$0D,$0A
1326 6904 04 FCB 4
1327 6905 0D MSOFS FCC $0D,$0A,/Sector no is:/,$0D,$0A
1328 6916 04 FCB 4
1329 6917 0D MSBPB FCC $0D,$0A,/ BPB: /
1330 691F 04 FCB 4
1331 6920 0D MSFAT FCC $0D,$0A,/ FAT: /
1332 6928 04 FCB 4
1333 6929 0D MSDIR FCC $0D,$0A,/ DIR: /
1334 6931 04 FCB 4
1335 6932 0D MSCL2 FCC $0D,$0A,/ 1stCLUSTER: /
1336 6941 04 FCB 4
1337 6942 0D MSINFL FCC $0D,$0A,/Select File No : /
1338 6955 04 FCB 4
1339
1340 **************************************************
1341 6956 FF INPBUF RMB 8
1342
1343 END START
0 error(s), 0 warning(s) is detected.
Label address
ACMD41 67DD AD1 669C AD2 66AD AD3 66B7 AD4 66BD
ADD42 6696 ASC411 6169 ASCMD41 615C BI21 65FD BI22 6603
BUSY 64FF CALCH1 65CF CALCHC 65C6 CALCSD 65BC CKRS 64F2
CL1 6643 CLEND 6653 CLLOP 664E CLOP 6621 CLSTH 6021
CLSTL 6023 CMD0 67B3 CMD1 67B9 CMD17 67BF CMD24 67C5
CMD55 67D7 CMD58 67D1 CMD8 67CB CMD9 67E3 CPY1 6516
CPY2 64A9 CRLF 6612 CVBEND 6690 CVBIN 667E CVERR 6693
CVT1 665C DB2 672C DB2ASC 671D DBLOP 6723 DCLOP1 679A
DCLOP2 67A9 DSEND 678C DSLOP1 675C DSLOP2 6771 DSPB1 6552
DSPB2 6554 DSPB3 6565 DSPBIN 65E9 DSPBPB 634A DSPBUF 6548
DSPC1 63D6 DSPCLS 678E DSPDIR 636E DSPEND 63F3 DSPFAT 635C
DSPFL1 6382 DSPFL2 638F DSPFL3 639A DSPFL4 63A9 DSPMBR 62F0
DSPSIZ 6738 DSPYMD 66D7 DSS1 6751 DSS12 6765 DSS13 676A
DSS14 676F DSS2 677A DSS3 677F DYMD1 66E9 DYMD2 66F8
EEND 667D EREND0 6676 EREND1 6678 GET1 62FB GET2 62FD
GET8CH 661D GETBPB 6331 GETD1 6586 GETDAT 6582 GETMBR 630E
GETSD 624F GPLOP 6314 GPLOP2 633C GR00 60D4 GR2580 6196
GR2581 61AD GR2582 61AF GR410 6171 GR550 6152 GR580 6128
GR581 6132 GR582 6134 GR80 60F8 GR81 610A GR90 6262
GR91 6271 ILOP1 61D2 ILOP2 61E5 ILOP3 61FF ILOP4 622D
INCHA FBB8 INEND 662F INIT 604D INPBUF 6956 INSCT 659C
ISTT 60BA LD1 6412 LD2 641A LD3 6432 LD4 643D
LD5 6449 LD51 6457 LD52 645F LD53 6467 LD6 6473
LDFILE 63F4 LDLOP 6407 MAIN 6029 MCMD0 67E9 MCMD41 6807
MCMD55 67FF MCMD58 67F7 MCMD8 67F0 MCMD9 6810 MEN1 6066
MEN2 606E MEN3 6076 MEN4 607E MEN5 6085 MEN6 608D
MEN7 6095 MEN8 609D MEN9 60A5 MENU 604F MERR 68DF
MSBPB 6917 MSCL2 6932 MSDIR 6929 MSERR 68F6 MSFAT 6920
MSINFL 6942 MSINIT 68C3 MSMENU1 6817 MSMENU2 6859 MSOFS 6905
MSSCT 6895 MSSD0 68A9 MSSD1 68B5 MSWROK 689D OKEND 62DC
OUTCHA FBBB PBCTL FD9F PBDAT FD9E PSEND 66D4 PSLOP 66C9
PSTRNG 66C7 RD1 6525 RD1SCT 650D RD2 652C RD3 653C
RESDAT 6007 RPT41 613D RWBUF 6E00 SC01 60CB SC2581 618E
SC551 614A SC581 6120 SC80 60F0 SC91 625A SCLOP1 6291
SCLOP2 62A4 SCLOP3 62B7 SCLOP4 62CA SCMD0 60C3 SCMD258 6181
SCMD55 613D SCMD58 6113 SCMD8 60E3 SCTBPB 6009 SCTCLT 6015
SCTDIR 6011 SCTFAT 600D SCTN0 6003 SCTN1 6004 SCTN2 6005
SCTN3 6006 SCTPCL 6019 SD1 61C3 SDERR 62D6 SDHC 6008
SDINIT 60AD SDRD 62DD SDW1 64B8 SDW2 64C3 SDWR1 649A
SDWRT 648A SELOP 6326 SETCKH 65E0 SETCKL 65D7 SETSCT 65A4
SETSNO 6320 SFLOP 663C SFT1 65B2 SKP1 6211 SKP2 6246
SNDD1 656D SNDDAT 6566 SNDDT1 64E4 START 6000 STTADR 6000
VN 6002 WFSIZ 601D WK1 6025 WK2 6027 WMDY 601A
</pre>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;"><br /></div>
<div class="separator" style="clear: both;">リストが長いので今回は縦スクロール付きにしてみました。「全選択」ボタンがありませんが、リスト中でダブルクリックしておいてCtrl-Cでコピーできます。</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;"><br /></div>
Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-3276691701329798682023-03-09T16:01:00.007+09:002023-03-09T20:21:12.991+09:00FM-7にRTCとSDを接続する試み(RTC編)<h4 style="text-align: left;"> FM-7用のRTC&SDカード基板を製作してみました</h4><p>【修正】OneDriveのリンク先が間違っていましたので、正しいリンク先に変更しました。</p><p>以前、6821PIAを用いてI2CでRTCを、SPIでSDカードを読み書きする試みを紹介しました。</p><div style="background-color: white; color: #222222; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px; min-height: 0px; position: relative; text-align: left;"><span style="font-family: inherit; font-size: small;">「アセンブラでのPIAとRTCの間のI2C通信に成功しました(2018年10月27日)」<br /></span><span style="background-color: transparent; font-family: inherit; font-size: small;">(<span style="font-weight: normal;">https://flexonsbd.blogspot.com/2018/10/piartci2c.html)</span></span></div><div style="text-align: left;"><span style="background-color: transparent; font-family: inherit;">「SDカードを6809のアセンブラで読み書きしてみる(2022年6月12日)」<br /></span><span style="font-family: inherit;">(https://flexonsbd.blogspot.com/2022/06/sd6809.html)</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">最終の目的は、FM-7にRTC(リアルタイムクロック)とSDカードを実装することなのですが、RTCはともかく、SDカードを実装するのはそれ程簡単ではありません。</span></div><div style="text-align: left;"><span style="font-family: inherit;">しかし、あれこれ考えているだけでは進まないので、とりあえず基板を作成してみることにしました。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">作成した基板です。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYCLJvuGL72e8f9oMztk2zFCm2p1Buyh9PLAHoSfd_WvhDnbCYSbZ9uo6pIsV5eaHvCgBOc6EnqQyvXqC8HNswHDUatEOqNtgmgMDG2RrbAuLj-5s-SZ6MEP3P4khy6Aj4zMdua8B9seMxF3YgiTt-XINRLWJKimnNlKsUWwtC7RKdpRG8lZoyR4U2/s4032/IMG_3672.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYCLJvuGL72e8f9oMztk2zFCm2p1Buyh9PLAHoSfd_WvhDnbCYSbZ9uo6pIsV5eaHvCgBOc6EnqQyvXqC8HNswHDUatEOqNtgmgMDG2RrbAuLj-5s-SZ6MEP3P4khy6Aj4zMdua8B9seMxF3YgiTt-XINRLWJKimnNlKsUWwtC7RKdpRG8lZoyR4U2/w400-h300/IMG_3672.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">製作したRTC&SDカード基板</td></tr></tbody></table><br /><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">その回路図を示します。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirup2KZVbXhNF8MLIaKqtTMNrt2pTAo9EpIxjJU4ldRWYX21Ea1SzB08v6wlE-WhBf0WAWcPEhOB2oQy2z0Pfzmws4bOGXexm6C7v3--7VVkIuHDEMjUWRomy8Ri8VlPXjPMuIPpKaMkJWjVAKCKigvXFcxYKDcFt314PB855Q93iWSAfB4YFHqh12/s2339/FM7_RTC_SD.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1654" data-original-width="2339" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirup2KZVbXhNF8MLIaKqtTMNrt2pTAo9EpIxjJU4ldRWYX21Ea1SzB08v6wlE-WhBf0WAWcPEhOB2oQy2z0Pfzmws4bOGXexm6C7v3--7VVkIuHDEMjUWRomy8Ri8VlPXjPMuIPpKaMkJWjVAKCKigvXFcxYKDcFt314PB855Q93iWSAfB4YFHqh12/w400-h283/FM7_RTC_SD.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">回路図</td></tr></tbody></table><br /><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">基本的には以前紹介したものと同じで、68B21のAポートを使用してI2Cで</span>RTCを<span style="font-family: inherit;">、Bポートを使用してSPIで</span>SDカードを<span style="font-family: inherit;">制御しています。なお、RTCは5V駆動ですので68B21と直結していますが、SDカードは3.3V駆動ですので、レベル変換モジュールを通しており、その3.3V電源はSDカードから供給しています。</span></div><div style="text-align: left;"><span style="font-family: inherit;">使用しているRTC基板はDS3231チップを使用しているZS-042で、</span>バッテリを充電しないようにパターンカットを施しています。またSDカード基板は画像のものの他に、以前秋月電子で販売されていた基板も使えるように両方のパターンを用意してあります。(下のマイコン用基板に装着されています。)</div><div style="text-align: left;"><br /></div><div style="text-align: left;">同時に、自作6809/6802ボードマイコン用の基板も製作しました。</div><div style="text-align: left;">この基板はFlex9の起動時に自動的に日付を読み込むために使用しています。</div><div style="text-align: left;"><br /></div><br /><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Lgn67pkkJX9rqsoB9pORi1u-Gzs5uHEdcT-sUZG1C0XNEgvSAJ6uYsWUx3VbKd2aH3UXq-tmcQJ65afn2RyiijQzU-XIdNE7SXc468aHoELLyN58Gf6cQilfc9n5oHFrs07vNkeC2uL1_bn3cjdD3zME--YO_lWtIqrRPylsDcoOTfQlUGZaUWwG/s4032/IMG_3675.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Lgn67pkkJX9rqsoB9pORi1u-Gzs5uHEdcT-sUZG1C0XNEgvSAJ6uYsWUx3VbKd2aH3UXq-tmcQJ65afn2RyiijQzU-XIdNE7SXc468aHoELLyN58Gf6cQilfc9n5oHFrs07vNkeC2uL1_bn3cjdD3zME--YO_lWtIqrRPylsDcoOTfQlUGZaUWwG/w400-h300/IMG_3675.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">マイコン用基板</td></tr></tbody></table><br /></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><h4 style="text-align: left;">今回は、RTC部分についてのみ紹介します。</h4><div><br /></div><div style="text-align: left;"><span style="font-family: inherit;">FM-7に装着した状態です。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_iIdrJs024k8EHOVo_OI57BOrGUkNLU3nuCnVxjUdAjmO_uM4dbNpVGCTFCvVkMzBhCOa2mBBPjloIdin75w34bqqXLLI5LUoeZLQDjAi0uCNpYmedPEEqodpSXghqB6RAv2WhnB7lMSpIEuLqs7aUsnN8c5J9vgq5ltHxnaJ7Rxy66HzjiQO-56y/s4032/IMG_3667.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_iIdrJs024k8EHOVo_OI57BOrGUkNLU3nuCnVxjUdAjmO_uM4dbNpVGCTFCvVkMzBhCOa2mBBPjloIdin75w34bqqXLLI5LUoeZLQDjAi0uCNpYmedPEEqodpSXghqB6RAv2WhnB7lMSpIEuLqs7aUsnN8c5J9vgq5ltHxnaJ7Rxy66HzjiQO-56y/w400-h300/IMG_3667.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">動作風景</td></tr></tbody></table><br /><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">実行中の様子です。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ4C-T-ymKap2Ns53QAOCF7tbuc0T-8kJtPjWQEgqrY0VhZw6HF1MW78O2tnujl4yKC2fydrN3-JU2tyb6dlL4zrExqjRJImxUX2noSUaMNBqleYXRownM9lX2C8N7TsW28j5SRxKbIK_cBIploR_kWZsXooLZSLmvhAmpmfNHRo2ac4F3XQnNxte5/s4032/IMG_3670.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJ4C-T-ymKap2Ns53QAOCF7tbuc0T-8kJtPjWQEgqrY0VhZw6HF1MW78O2tnujl4yKC2fydrN3-JU2tyb6dlL4zrExqjRJImxUX2noSUaMNBqleYXRownM9lX2C8N7TsW28j5SRxKbIK_cBIploR_kWZsXooLZSLmvhAmpmfNHRo2ac4F3XQnNxte5/w400-h300/IMG_3670.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">実行画面</td></tr></tbody></table><br /><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">FM-7のF-BASIC V3.0用に制作したソフトは、RTCから読み出すRTC_RDと書き込むRTC_WRの2本です。</span></div><div style="text-align: left;"><span style="font-family: inherit;">RTC_WRでは日付と時刻をF-BASICのワークエリアに直接書き込んでいますので、RTC_WRはV3.0専用です。</span></div><div style="text-align: left;"><span style="font-family: inherit;">画像にありますように、書き込んだデータがPRINT文で表示できており、正しく設定されていることが確認できます。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">参考までに、RTC_WRのリストを示します。</span></div><div style="text-align: left;"><span style="font-family: inherit;"><br /></span></div><div style="text-align: left;"><span style="font-family: inherit;">
<textarea class="code" data-ex-code-prettify-param="{codeType:''}" style="height: 300px; margin: 0px; width: 600px;">
0001 *
0002 * RTC_WR.CMD for F-BASIC V3.0
0003 *
0004 * WRITE DATE to RTC3231 by I2C on F-BASIC
0005 *
0006 * 6821(PIA) Port A <--> RTC3231
0007 *
0008 * Applied to F-BASIC '2023.03.09
0009 * Original version '2018.11.03
0010 * Copyright by Y.Yamamoto
0011 *
0012 FBB8 INCHA EQU $FBB8
0013 FBBB OUTCHA EQU $FBBB
0014 E2E9 SETIME EQU $E2E9 set time data routine
0015 02FA WKDATE EQU $02FA work area for date
0016
0017 FD9C PADAT EQU $FD9C
0018 FD9D PACTL EQU PADAT+1
0019
0020 000D CR EQU $0D
0021 000A LF EQU $0A
0022
0023 00D0 SADRW EQU $D0 (01101000+0)
0024 00D1 SADRR EQU $D1 (01101000+1)
0025
0026 6000 ORG $6000
0027
0028 6000 20 03 START BRA MAIN
0029 6002 01 VN FCB 1
0030 6003 FF ODAT FCB $FF
0031 6004 00 WK FCB 00
0032
0033 6005 MAIN EQU *
0034 6005 BD 619A JSR PCRLF
0035 *get date data
0036 6008 8E 61CC LDX #MDAT
0037 600B BD 618A JSR PSTRNG
0038
0039 600E 8E 621F LDX #INBUF+20
0040 6011 4F CLRA
0041 6012 C6 14 LDB #20
0042 6014 A7 82 CLLOP STA ,-X
0043 6016 5A DECB
0044 6017 26 FB BNE CLLOP
0045 6019 BD FBB8 INDLOP JSR INCHA
0046 601C BD FBBB JSR OUTCHA
0047 601F A7 80 STA ,X+
0048 6021 81 0D CMPA #CR
0049 6023 26 F4 BNE INDLOP
0050 6025 6F 1F CLR -1,X
0051 6027 8E 620B LDX #INBUF
0052
0053 602A C6 07 LDB #7
0054 602C 108E 61FE LDY #WRDATA
0055 6030 34 04 INLOP PSHS B
0056 6032 EC 81 LDD ,X++
0057 *if B is sep. not 2dec
0058 6034 C1 30 CMPB #'0
0059 6036 25 04 BLO INL1
0060 6038 C1 39 CMPB #'9
0061 603A 23 06 BLS INL2
0062 603C 1F 89 INL1 TFR A,B
0063 603E 86 30 LDA #'0
0064 6040 30 1F LEAX -1,X
0065 6042 48 INL2 ASLA
0066 6043 48 ASLA
0067 6044 48 ASLA
0068 6045 48 ASLA
0069 6046 C4 0F ANDB #$0F
0070 6048 F7 6004 STB WK
0071 604B BB 6004 ADDA WK
0072 604E A7 A0 STA ,Y+
0073 6050 30 01 LEAX 1,X skip separator
0074 6052 35 04 PULS B
0075 6054 5A DECB
0076 6055 27 0A BEQ INEND
0077 6057 C1 04 CMPB #4
0078 6059 26 D5 BNE INLOP
0079 605B 86 01 LDA #$01 add week data
0080 605D A7 A0 STA ,Y+
0081 605F 20 CF BRA INLOP
0082 6061 INEND EQU *
0083
0084 *reset pia
0085 *port A,B:output, data $ff:out
0086 6061 4F CLRA
0087 6062 B7 FD9D STA PACTL select ddra
0088 6065 86 FF LDA #$FF
0089 6067 B7 FD9C STA PADAT set output mode
0090 606A 86 36 LDA #$36
0091 606C B7 FD9D STA PACTL select peripheral
0092 *out High = bus release (set input mode)
0093 606F 86 FF LDA #$FF
0094 6071 B7 6003 STA ODAT save out data
0095 6074 B7 FD9C STA PADAT
0096
0097 *start cond. (scl=H,sda=H->L)
0098 6077 17 00B7 LBSR SETDTL
0099 607A 17 0096 LBSR SETCKL
0100
0101 *send slave adr+W ($D0)
0102 607D 86 D0 LDA #SADRW
0103 607F 17 00CD LBSR WRDAT
0104
0105 *wait ACK
0106 6082 17 00E5 LBSR WACK
0107
0108 *send reg top adr ($00)
0109 6085 86 00 LDA #$00 reg adr:00-06
0110 6087 17 00C5 LBSR WRDAT
0111
0112 *wait ACK
0113 608A 17 00DD LBSR WACK
0114
0115 *write data
0116 608D 8E 6205 LDX #WRDATA+7
0117 6090 C6 07 LDB #7
0118 6092 34 04 WRLOP PSHS B
0119 6094 A6 82 LDA ,-X
0120 6096 17 00B6 LBSR WRDAT
0121 6099 17 00CE LBSR WACK
0122 609C 35 04 PULS B
0123 609E 5A DECB
0124 609F 26 F1 BNE WRLOP
0125
0126 *stop
0127 *scl=H,sda=L->H
0128 60A1 8D 7F BSR SETCKH
0129 60A3 17 009A LBSR SETDTH
0130
0131 *display data
0132 60A6 BD 619A JSR PCRLF
0133 60A9 8E 61ED LDX #MDATE
0134 60AC 17 00D1 LBSR DSPMSG
0135 60AF 108E 61F7 LDY #MDELM
0136 60B3 8E 61FE LDX #WRDATA year month day week hour min sec
0137 60B6 8C 6201 DLOP CMPX #WRDATA+3
0138 60B9 27 08 BEQ DLOP2
0139 60BB BD 61A9 JSR OUTHEX
0140 60BE A6 A4 LDA ,Y
0141 60C0 BD FBBB JSR OUTCHA
0142 60C3 31 21 DLOP2 LEAY 1,Y
0143 60C5 30 01 LEAX 1,X
0144 60C7 8C 6205 CMPX #WRDATA+7
0145 60CA 26 EA BNE DLOP
0146 60CC BD 619A JSR PCRLF
0147
0148 *set time to F-BASIC
0149 *set to work area using F-BASIC routine
0150 60CF CE 6205 LDU #WKTIME
0151 60D2 8E 6202 LDX #WRDATA+4
0152 60D5 C6 03 LDB #3
0153 60D7 34 04 STLOP PSHS B
0154 60D9 A6 80 LDA ,X+
0155 60DB 1F 89 TFR A,B
0156 60DD 44 LSRA
0157 60DE 44 LSRA
0158 60DF 44 LSRA
0159 60E0 44 LSRA
0160 60E1 A7 C0 STA ,U+
0161 60E3 1F 98 TFR B,A
0162 60E5 84 0F ANDA #$0F
0163 60E7 A7 C0 STA ,U+
0164 60E9 35 04 PULS B
0165 60EB 5A DECB
0166 60EC 26 E9 BNE STLOP
0167 60EE 33 5A LEAU -6,U
0168 60F0 BD E2E9 JSR SETIME
0169 *set date to F-BASIC
0170 *set to work area directly
0171 60F3 CE 02FA LDU #WKDATE
0172 60F6 8E 61FE LDX #WRDATA
0173 60F9 C6 03 LDB #3
0174 60FB 34 04 SDLOP PSHS B
0175 60FD A6 80 LDA ,X+
0176 60FF 1F 89 TFR A,B
0177 6101 44 LSRA
0178 6102 44 LSRA
0179 6103 44 LSRA
0180 6104 44 LSRA
0181 6105 A7 C0 STA ,U+
0182 6107 1F 98 TFR B,A
0183 6109 84 0F ANDA #$0F
0184 610B A7 C0 STA ,U+
0185 610D 35 04 PULS B
0186 610F 5A DECB
0187 6110 26 E9 BNE SDLOP
0188 6112 39 RTS
0189
0190 ***************************************
0191 *set clk low(out b0=0)
0192 6113 SETCKL EQU *
0193 6113 34 04 PSHS B
0194 6115 F6 6003 LDB ODAT
0195 6118 C4 FE ANDB #$FE b0=0
0196 611A F7 FD9C STB PADAT
0197 611D F7 6003 STB ODAT
0198 6120 35 84 PULS B,PC
0199
0200 *set clk Hi = bus release (set input mode)
0201 6122 SETCKH EQU *
0202 6122 34 04 PSHS B
0203 6124 F6 6003 LDB ODAT
0204 6127 CA 01 ORB #$01 b0=1
0205 6129 F7 FD9C STB PADAT
0206 612C F7 6003 STB ODAT
0207 612F 35 84 PULS B,PC
0208
0209 *set data low(out b7=0)
0210 6131 SETDTL EQU *
0211 6131 34 04 PSHS B
0212 6133 F6 6003 LDB ODAT
0213 6136 C4 7F ANDB #$7F b7=0
0214 6138 F7 FD9C STB PADAT
0215 613B F7 6003 STB ODAT
0216 613E 35 84 PULS B,PC
0217
0218 *set data Hi = bus release (set input mode)
0219 6140 SETDTH EQU *
0220 6140 34 04 PSHS B
0221 6142 F6 6003 LDB ODAT
0222 6145 CA 80 ORB #$80 b7=1
0223 6147 F7 FD9C STB PADAT
0224 614A F7 6003 STB ODAT
0225 614D 35 84 PULS B,PC
0226
0227 *write data or adr
0228 *A:data or adr
0229 614F WRDAT EQU *
0230 614F C6 08 LDB #8
0231 6151 8D C0 WLOP BSR SETCKL
0232 6153 34 04 PSHS B
0233 6155 48 ASLA b7->C
0234 6156 24 04 BCC WL1
0235 6158 8D E6 BSR SETDTH
0236 615A 20 02 BRA WL2
0237 615C 8D D3 WL1 BSR SETDTL
0238 615E 8D C2 WL2 BSR SETCKH
0239 6160 8D B1 BSR SETCKL
0240 6162 8D CD BSR SETDTL
0241 6164 35 04 PULS B
0242 6166 5A DECB
0243 6167 26 E8 BNE WLOP
0244 6169 39 RTS
0245
0246 *wait ACK
0247 *ACK:sda=L
0248 616A WACK EQU *
0249 616A 8D B6 BSR SETCKH
0250 616C F6 FD9C WALOP LDB PADAT
0251 616F 58 ASLB data->C
0252 6170 25 FA BCS WALOP
0253 6172 8D 9F BSR SETCKL
0254 6174 8D CA BSR SETDTH sda release
0255 6176 39 RTS
0256
0257 *set ACK
0258 6177 SACK EQU *
0259 6177 8D B8 BSR SETDTL
0260 6179 8D A7 BSR SETCKH
0261 617B 8D 96 BSR SETCKL
0262 617D 8D C1 BSR SETDTH sda release
0263 617F 39 RTS
0264
0265 *disp message
0266 6180 DSPMSG EQU *
0267 6180 A6 80 DSPLOP LDA ,X+
0268 6182 27 05 BEQ DSPEND
0269 6184 BD FBBB JSR OUTCHA
0270 6187 20 F7 BRA DSPLOP
0271 6189 39 DSPEND RTS
0272
0273 *pstring
0274 618A PSTRNG EQU *
0275 618A 34 02 PSHS A
0276 618C A6 80 PSLOP LDA ,X+
0277 618E 81 04 CMPA #4
0278 6190 27 05 BEQ PSEND
0279 6192 BD FBBB JSR OUTCHA
0280 6195 20 F5 BRA PSLOP
0281 6197 35 02 PSEND PULS A
0282 6199 39 RTS
0283
0284 *print CR,LF
0285 619A PCRLF EQU *
0286 619A 34 02 PSHS A
0287 619C 86 0D LDA #CR
0288 619E BD FBBB JSR OUTCHA
0289 61A1 86 0A LDA #LF
0290 61A3 BD FBBB JSR OUTCHA
0291 61A6 35 02 PULS A
0292 61A8 39 RTS
0293
0294 *print hex
0295 61A9 OUTHEX EQU *
0296 61A9 34 06 PSHS A,B
0297 61AB A6 84 LDA ,X
0298 61AD 1F 89 TFR A,B
0299 61AF 44 LSRA
0300 61B0 44 LSRA
0301 61B1 44 LSRA
0302 61B2 44 LSRA
0303 61B3 8D 0E BSR OUTS
0304 61B5 BD FBBB JSR OUTCHA
0305 61B8 1F 98 TFR B,A
0306 61BA 84 0F ANDA #$0F
0307 61BC 8D 05 BSR OUTS
0308 61BE BD FBBB JSR OUTCHA
0309 61C1 35 86 PULS A,B,PC
0310
0311 61C3 8B 30 OUTS ADDA #$30
0312 61C5 81 39 CMPA #$39
0313 61C7 23 02 BLS OUTSE
0314 61C9 8B 07 ADDA #$7
0315 61CB 39 OUTSE RTS
0316
0317 *
0318 61CC 69 MDAT FCC "input date (YY/MM/DD HH:MM:SS): "
0319 61EC 04 FCB 4
0320 61ED 54 MDATE FCC /Time : 20/
0321 61F6 00 FCB 0
0322 61F7 2F MDELM FCC "// ::."
0323 ***************************************
0324 *
0325 61FE FF WRDATA RMB 7
0326 6205 FF WKTIME RMB 6
0327
0328 620B INBUF EQU *
0329
0330 END START
0 error(s), 0 warning(s) is detected.
Label address
CLLOP 6014 CR 000D DLOP 60B6 DLOP2 60C3 DSPEND 6189
DSPLOP 6180 DSPMSG 6180 INBUF 620B INCHA FBB8 INDLOP 6019
INEND 6061 INL1 603C INL2 6042 INLOP 6030 LF 000A
MAIN 6005 MDAT 61CC MDATE 61ED MDELM 61F7 ODAT 6003
OUTCHA FBBB OUTHEX 61A9 OUTS 61C3 OUTSE 61CB PACTL FD9D
PADAT FD9C PCRLF 619A PSEND 6197 PSLOP 618C PSTRNG 618A
SACK 6177 SADRR 00D1 SADRW 00D0 SDLOP 60FB SETCKH 6122
SETCKL 6113 SETDTH 6140 SETDTL 6131 SETIME E2E9 START 6000
STLOP 60D7 VN 6002 WACK 616A WALOP 616C WK 6004
WKDATE 02FA WKTIME 6205 WL1 615C WL2 615E WLOP 6151
WRDAT 614F WRDATA 61FE WRLOP 6092
</textarea> <div><br /></div><div>F-BASICの起動時にRTC_WRを実行して日付・時刻を設定することで、以降はF-BASICから日付・時刻を参照することができます。</div><div><br /></div><div>以上でFM-7にRTCを搭載することができましたが、問題はSDカードです。</div><div>独自のフォーマットでSDカードにファイルを保存・読み出しをするのであれば、今回作成した基板でも可能かと思いますが、Windows PCと共通のフォーマット(FAT16/32)でと考えると、FM-7と6821の機械語だけでは無理があるようです。</div><div>ネット検索をしても、ほとんどがマイコン用に用意されているFATライブラリを使用しているようです。</div><div>しかし、困難かもしれませんが、マイコンを使用せずにやれるところまでやってみようと思います。</div><div>うまくファイルの読み書きができましたら紹介させていただきます。</div><div>(ネット検索をしても、FM系にSDカードを装着した記事が見当たらないようですが、私が見つけられないだけでしょうか? 見つかるのは80系ばかりのような。。。)</div><div><br /></div><div>紹介しましたRTC用に制作した2本のソフト(RTC_WRとRTC_RD)のソースとバイナリを<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmT_j2cmBxK5522c8?e=hSfnPB" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。なお、これらのソースのアセンブリには以前紹介した自作のクロスアセンブラ6809AsmWin.exeを使用しています。</div><div><br /></div></span></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-29162783776032859162023-02-28T20:54:00.000+09:002023-02-28T20:54:50.333+09:00GOTEKの修理に挑戦<h4 style="text-align: left;"> 故障したGOTEKを修理してみました</h4><p>私にとってのGOTEKの第1号ですが、以前紹介しました(https://flexonsbd.blogspot.com/2020/08/fm-777gotek.htmlとhttps://flexonsbd.blogspot.com/2021/05/fm-777gotek.html)ようにPC用のフロッピィドライブケースに、フロッピィドライブとともに収めて使用していました。しかしある時に突然電源が故障して5Vのはずが8Vになってしまい、フロッピィドライブの方は無事だったのですが、GOTEKに刺してあったUSBメモリは破損し、GOTEK本体も動作がおかしくなってしまいました。</p><p>そのためしばらく使用を中止していたのですが、不思議なことに電源を交換して試してみたら正常に動作しているようにみえました。ということで、しばらく使用していたのですが、やはりダメージを受けていたようで、読み出しはできるのですが書き込みができません。</p><p>やはり故障品として処分するしかないかと思ったのですが、考えてみるとメインのマイコンのSTM32F105は5Vを降圧した3.3Vで動作しているはずなので、5Vが8Vになっても大した影響はないはずです。だとすると、ダメージを受けそうなのは残るゲートIC(74HC04D)だけです。試しに電源をつないで74HC04Dの端子電圧を測定してみると、ゲートのINが3.25VでOUTが4.04Vだったりして明らかに異常です。</p><p>ということで74HC04D(SOICタイプ)を入手して交換することにしました。</p><p>これが交換前の状態です。最近のものとは多分異なっています。SFRC922Dという刻印があり、使用されているマイコンはSTM32F105でした。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVQX421RTZKbJoqVI0i04fxNk0EnQ5Fh6zWtUmhBltyVwRoGcr5AiSXclvVsN3tj5UMDqPBmlOZv_Uo_zn42dR4dUj6rB0nmx5P3BYgvkIWPNftHHIu0GKSFucsdTEU6n_ghGwn-kr_YQcEMBle38omr0z7Z55t7QeKP-0LC2k-mDxQusbRXoRsIW/s4032/%E4%BA%A4%E6%8F%9B%E5%89%8D.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVQX421RTZKbJoqVI0i04fxNk0EnQ5Fh6zWtUmhBltyVwRoGcr5AiSXclvVsN3tj5UMDqPBmlOZv_Uo_zn42dR4dUj6rB0nmx5P3BYgvkIWPNftHHIu0GKSFucsdTEU6n_ghGwn-kr_YQcEMBle38omr0z7Z55t7QeKP-0LC2k-mDxQusbRXoRsIW/s320/%E4%BA%A4%E6%8F%9B%E5%89%8D.JPG" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">交換前</td></tr></tbody></table><br /><p>交換すべきICはこれです。SOICタイプの74HC04Dです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhChR8daiqBrMHdbNZNSCccxgWgl-anUM4Oerkyq76t9VbTfz3SS4xnvmEexOSToF7uH08ewxu9zSV116Ep8PPTPrXaQr4CqtpMrIxoIPB8Vl1iU6vZqhl_KCwx0NteDl7QQ284i_bixQnJYnmGmEV5OY_cBnaNFQKm9pgQ3u1h2_HY_EYf689DqaxF/s1500/%E4%BA%A4%E6%8F%9B%E5%89%8D%EF%BC%92.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1125" data-original-width="1500" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhChR8daiqBrMHdbNZNSCccxgWgl-anUM4Oerkyq76t9VbTfz3SS4xnvmEexOSToF7uH08ewxu9zSV116Ep8PPTPrXaQr4CqtpMrIxoIPB8Vl1iU6vZqhl_KCwx0NteDl7QQ284i_bixQnJYnmGmEV5OY_cBnaNFQKm9pgQ3u1h2_HY_EYf689DqaxF/s320/%E4%BA%A4%E6%8F%9B%E5%89%8D%EF%BC%92.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">該当のIC(74HC04D)</td></tr></tbody></table><br /><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">ブロワーで加熱して外す方法は以前失敗したことがあるのと、14ピンの小さなICですので、今回はICの足をニッパーで切り取って除去しました。</div><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV0coqy4OzZ-6Pi8kNeBq9jWsJKrSu_mHTBvfBhTP864kdjUmg48UaXhCkeQIAn0bmJ9fAoMfumS_Ml9tVMxGSTtWm94awZSaDgijQufkhk4API5eE90-pl4o2o6UtJEIB_LjhbT5DcQGQ4KMerUfejl-2oZ4R-WklUWsIr35kz_LZfer2xTPx3go9/s1500/IC%E3%82%92%E9%99%A4%E5%8E%BB%EF%BC%92.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1125" data-original-width="1500" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV0coqy4OzZ-6Pi8kNeBq9jWsJKrSu_mHTBvfBhTP864kdjUmg48UaXhCkeQIAn0bmJ9fAoMfumS_Ml9tVMxGSTtWm94awZSaDgijQufkhk4API5eE90-pl4o2o6UtJEIB_LjhbT5DcQGQ4KMerUfejl-2oZ4R-WklUWsIr35kz_LZfer2xTPx3go9/s320/IC%E3%82%92%E9%99%A4%E5%8E%BB%EF%BC%92.jpg" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ICを除去<br /></td></tr></tbody></table><br /><p>フラックスを塗ってはんだ付けしました。SOPタイプよりも小さいのですが、それほど大変な作業ではありませんでした。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFotK3Wt1Rrs_dWks99KBuaqzPUIR6i7tjo11BsZHQ97mgyomZFe5n0OSC7No--M_M6zvb6mfATBpzE2_AANeWkwydvV4iOezj6hvYTeWDCNNfNkgNxrD7R58gVFlstJtV93cj5hAc--EVIuHuwNRKEameMiniXlpHMbWC_kMKnKAX8cGIX9ep7beG/s4032/%E4%BA%A4%E6%8F%9B%E5%BE%8C%EF%BC%92.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFotK3Wt1Rrs_dWks99KBuaqzPUIR6i7tjo11BsZHQ97mgyomZFe5n0OSC7No--M_M6zvb6mfATBpzE2_AANeWkwydvV4iOezj6hvYTeWDCNNfNkgNxrD7R58gVFlstJtV93cj5hAc--EVIuHuwNRKEameMiniXlpHMbWC_kMKnKAX8cGIX9ep7beG/s320/%E4%BA%A4%E6%8F%9B%E5%BE%8C%EF%BC%92.JPG" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">交換後</td></tr></tbody></table><br /><p>FM-7に載せた自作のFDCカードにFDDとともに接続して動作テストをしました。</p><p>GOTEKで起動しておいて、まずFDを初期化してからVOLCOPYでGOTEK中のシステムをFDにコピーしました。次にFDからGOTEK中に用意したブランクファイルにVOLCOPYで書き戻してみました。その結果、どちらのVOLCOPYも正常に行えて、書き戻したファイルからも正常に起動しました。以上より、GOTEKは正常に動作していると思われます。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg21cqtzuhOv4vQYvzRivcq7mcy9WcH2lgwAWqagduVYxahIJkl6l_Xn1E2cRCbY2hVO4hP7e6vPJz7baHDXLN_-E4nBLzkOiC114zrxeAYhIs2nVsDkUqfsnKdUa6WcrihhQ24NgSgAfylgtHI5IOKjZt-s-_vFvVWGVJKPOQWyv6qftYrEq0o9Frd/s4032/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E4%B8%AD.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="4032" data-original-width="3024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg21cqtzuhOv4vQYvzRivcq7mcy9WcH2lgwAWqagduVYxahIJkl6l_Xn1E2cRCbY2hVO4hP7e6vPJz7baHDXLN_-E4nBLzkOiC114zrxeAYhIs2nVsDkUqfsnKdUa6WcrihhQ24NgSgAfylgtHI5IOKjZt-s-_vFvVWGVJKPOQWyv6qftYrEq0o9Frd/s320/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E4%B8%AD.JPG" width="240" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">チェック中</td></tr></tbody></table><br /><p>私のようにGOTEKを故障させた方はまずおられないとは思いますが、電源不良によるTTL IC破損による故障の場合は100円程度のICを交換することで修理可能だという一例のつもりで紹介しました。</p><p><br /></p>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com4tag:blogger.com,1999:blog-1662007451717538019.post-69842135556702259552023-02-18T18:41:00.009+09:002023-02-18T18:45:22.593+09:00FM-7/77用F-BASIC,OS-9,CP/M,FLEX9のディスクイメージを操作する<h4 style="text-align: left;"> Windows上でFM-7/77用F-BASIC,OS-9,CP/M,FLEX9のディスクイメージを操作するソフトの紹介</h4><p>FM用のエミュレータであるXM7を使用されている方も多いと思います。私も使わせていただいています。素晴らしいソフトを作成された開発者に敬意を表します。</p><p>XM7を使用していると、しばしばD77形式のディスクイメージ中のファイルを操作したいことがあります。つまり、ディスクイメージ中にWindowsからファイルを書き込んだり、逆にディスクイメージからWindowsへファイルを読み出したりしたいということです。</p><p>今までにそのためのソフトを制作してきました。当然のことですが、各OS(?)によってディスク中への保存形式が異なりますので、ソフトも各OSで異なるものとなりました。</p><p>制作したソフトについてはその都度紹介してきましたが、扱えるファイル形式を今までのD77(D88)、DSKに加えて、FT245高速通信カードで用いられているDAT形式に対応するように拡張しましたので、ここでまとめて紹介します。</p><p>今までに制作したソフトは以下の4本です。</p><p>(1)F-BASIC用 FbasDrvWin.exe</p><p>(2)OS-9用 Os9DrvWin.exe</p><p>(3)CP/M用 CpmDrvWin.exe</p><p>(4)FLEX9用 FlexDrvWin.exe (DAT形式には対応しない)</p><p>それぞれ対応するOSが異なりますが、操作性は全て同じにしてあります。</p><p>(ただし、FLEX9用のみはディスク形式が異なるためにFT245通信カードを使用する転送ソフトは使用できませんので、DAT形式に対応する必要がありません。)</p><p>それぞれの画面イメージは次のようです。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdj-pgy1BZLjagoLMfbn_IjE4Dh6CvTECZmMXO-22ZjsPKVMPp3IB15KFn_o0ZSDxCbokXxsUL-C3Obys4yKuIx7nnOz3smKuqV0dnCzWk3TVKo0w1mmFzTbGIas8RdOSNBh8mXysLr5gYejXOmiFaYyOhJ_KJWVPJIBpbZHevrzifld-kQSXjGWxb/s770/FBASIC%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B82.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="609" data-original-width="770" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdj-pgy1BZLjagoLMfbn_IjE4Dh6CvTECZmMXO-22ZjsPKVMPp3IB15KFn_o0ZSDxCbokXxsUL-C3Obys4yKuIx7nnOz3smKuqV0dnCzWk3TVKo0w1mmFzTbGIas8RdOSNBh8mXysLr5gYejXOmiFaYyOhJ_KJWVPJIBpbZHevrzifld-kQSXjGWxb/w400-h316/FBASIC%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B82.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FbasDrvWin.exe</td></tr></tbody></table><br /><br /><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhh-u1YryLelhB_EbbL39ycCzd9vTwUSedFnxp_Y-VXDJZmJrEvfptpthnNnw_KY2YthNFw56ddea4wcIlG9FTnEabnEFFQKL1l5nhmDSokp4TBCMOua-ymt8JuZAwjoIA8EighBNkjvgljJlZwHYi6__bY1FC6V1w76YyxdCtNCt1z4QycTkzinNw/s770/OS9%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%92.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="632" data-original-width="770" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhh-u1YryLelhB_EbbL39ycCzd9vTwUSedFnxp_Y-VXDJZmJrEvfptpthnNnw_KY2YthNFw56ddea4wcIlG9FTnEabnEFFQKL1l5nhmDSokp4TBCMOua-ymt8JuZAwjoIA8EighBNkjvgljJlZwHYi6__bY1FC6V1w76YyxdCtNCt1z4QycTkzinNw/w400-h329/OS9%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%92.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Os9DrvWin.exe</td></tr></tbody></table><br /><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJtOrEFGptEODo4kL02c60b_ZvOTyph5M89DWTa7m1Dy70hgxZfC1-8sbiqRnigiiFdPo_QdXwbjKKPSo1cBDTCHKBOxZGxkEUTaxjKy1rj8XSGdIGBwURckONM2OHdz7f1GuM2kab6p4LG7_dTOxOIfR2FbGhHpE1leltdXxbyWOSPbsXHS8EaVj/s764/CPM%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%92.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="606" data-original-width="764" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJtOrEFGptEODo4kL02c60b_ZvOTyph5M89DWTa7m1Dy70hgxZfC1-8sbiqRnigiiFdPo_QdXwbjKKPSo1cBDTCHKBOxZGxkEUTaxjKy1rj8XSGdIGBwURckONM2OHdz7f1GuM2kab6p4LG7_dTOxOIfR2FbGhHpE1leltdXxbyWOSPbsXHS8EaVj/w400-h318/CPM%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%92.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">CpmDrvWin.exe</td></tr></tbody></table><br /><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnYxKPODODKMoRvtTV3oGH_KhgzC429RROSRboEfykdOhQBxlbTQYA_psZbrxNZXDVIxAMg-HG--5g9GQnQuaIOn-zt1M3FE60PgY2HdyAiXFiI8BR9L7XhcbywFEwlPdzqR3FhGRxYUlayIK49IvpZGrk6Xc6gdcIALE9L8NOQEDwjrMV8jNhvfRx/s770/Flex%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B82.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="609" data-original-width="770" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnYxKPODODKMoRvtTV3oGH_KhgzC429RROSRboEfykdOhQBxlbTQYA_psZbrxNZXDVIxAMg-HG--5g9GQnQuaIOn-zt1M3FE60PgY2HdyAiXFiI8BR9L7XhcbywFEwlPdzqR3FhGRxYUlayIK49IvpZGrk6Xc6gdcIALE9L8NOQEDwjrMV8jNhvfRx/w400-h316/Flex%E7%94%BB%E9%9D%A2%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B82.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FlexDrvWin.exe</td></tr></tbody></table><br /><p><br /></p><br /><h4 style="text-align: left;">イメージファイル処理ソフトとしての使い方</h4><div><br /></div><div>(1)処理したいイメージファイルをドライブ名ボックス(Drive 0~4)にドラッグ&ドロップすると、下のボックスにそのイメージファイル中のファイルが一覧表示される。</div><div>どのボックスに入れても構わない。また、いくつでも重ねて入れることができる。</div><div>(2)読み出し</div><div>読み出したいファイルをマウスの左ボタンで選択しておいて、右ボタンを押すと現れるメニューから「読み出し」を選択する。</div><div>(3)書き込み<br /><div>書き込みたいWindows上のファイルをこのボックス中にドラッグ&ドロップする。</div><div>(4)全ファイルの一括読み出し</div><div>メインメニュー「編集」中の「全ファイル読み出し」を選択する。</div></div><div>(5)他の機能</div><div>右ボタンメニューには他のコマンドとして「削除」、「ファイル名変更」がある。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">仮想ドライブ構築ソフトとして使用する</h4><div><br /></div><div>イメージファイル処理ソフトとしての使い方は上記のようですが、実はこれらのソフトは本来、Windows上の仮想ドライブ構築ソフトとして制作したものです。</div><div>(上の画面イメージ中のFlexDrvWin.exeで右側のボックス中にFM機がアクセスしたトラック/セクタが表示されています。)</div><div>ということで、FM機に各OSに対応するドライバをインストールすることで、FM機本体のドライブ(通常0と1)に加えて、これらのxxxxDrvWin.exeのDrive2と3が拡張ドライブとして使用できるようになります。</div><div>OS-9用以外の3つの仮想ドライブ構築ソフトについては以前紹介し、ドライバも公開しています。</div><div><br /></div><h4 style="text-align: left;">RS-232C用のドライバをFT245通信カード用に書き換える</h4><div><br /></div><div>今までに、Flex用、F-BASIC用、CP/M用のドライバを紹介してきましたが、それらはいずれもFM機とWindows機との間の通信手段としてRS-232Cを使用していました。</div><div>しかし、最近はRS-232C機能を使用することはほとんどなくなり、もっぱら「思い付きハードでソフトに七転八倒」さん(ブログは下記)が製作されたFT-245高速通信カード(本ブログでも何回か紹介しています)を使用していますので、現在、各ドライバをFT-245通信カード用に書き換えているところです。完成し次第公開する予定ですが、残念ながら、私は80系は全くと言ってよいほど経験がないので、CpmDrvWin.exe用のドライバが作成できません。F-BASIC用、OS-9用の2つのみを作成中です。</div><div><br /></div><div>「思い付きハードでソフトに七転八倒」さんのブログ</div><div><span lang="EN-US">(1)FM-7</span>用データ転送基板を使った新ユーティリティの紹介<a href="https://vehwk3yxv7hw.blog.fc2.com/blog-entry-39.html">https://vehwk3yxv7hw.blog.fc2.com/blog-entry-39.html</a></div><div><span lang="EN-US"> </span><span lang="EN-US">(2)FDD</span>イメージをバックアップする<span lang="EN-US">FM-7</span>専用ソフトの説明<a href="https://vehwk3yxv7hw.blog.fc2.com/blog-entry-31.html">https://vehwk3yxv7hw.blog.fc2.com/blog-entry-31.html</a></div><div><br /></div><div>以上、各OS用のイメージファイル処理ソフト(実は仮想ドライブ構築ソフト)の紹介でした。</div><div>これらの4ソフトと、共に使用することが多いD77,DSK,DATファイル間で形式を変換するソフト CvtDskD77.exeを<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmTFuXcNpbwQ_cebd?e=lmcciU" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。</div><div><br /></div><div>【注意】これらのソフトの制作にあたっては、それぞれのOSのFMS(ファイルマネージメントシステム)に相当するものの実装が必要ですが、OSの中身を知っているわけではないので、XM7上で読み書き、追加、削除などの操作をして、操作前後でイメージファイルのどの個所がどのように変化したかを確認することによってOS内の動作を推定し、それをもとにして実装しました。</div><div>従って実装が不完全、不十分なための誤動作が予想されますので、使用される場合はその点にご注意ください。特に、操作を何回も繰り返すとイメージファイルがおかしくなる可能性がありますので、何回か操作を繰り返したらXM7で別ファイルにコピーし直したり、転送ソフトを用いてフロッピーディスクにコピーしておくと安心です。(使用した感覚ですが、FlexDrvWin.exe以外は比較的安定しているようです。)</div><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0tag:blogger.com,1999:blog-1662007451717538019.post-66141394831493286092023-01-29T20:51:00.003+09:002023-01-31T08:35:06.355+09:00FT245通信カード用のディスクイメージ転送専用ソフト<h4 style="text-align: left;"> FT245通信カード用のディスクイメージ転送専用ソフトの紹介</h4><p>FT245を用いた通信カードは非常に高速ですので、もうRS232Cカードを使うことはなくなり、もっぱらこればかり使用しています。</p><p>このカードを使用するためのドライバソフトとしては、カードを考案された「<a href="https://vehwk3yxv7hw.blog.fc2.com/blog-category-2.html" target="_blank"><span style="color: #2b00fe;">思い付きハードでソフトに七転八倒</span></a>」さんが作成された専用ソフト FDDIMG_RW77.exe があります。(https://vehwk3yxv7hw.blog.fc2.com/blog-entry-73.htmlで入手できます。)</p><p>これは特定のセクタの読み書きができたり、ディスクの検査ができるなどの機能を持ち、さらにRAMディスクのドライバも内蔵しているという多機能のものですが、私の用途ではFMとWindowsPCの間でFDのディスクイメージを丸ごと転送することがほとんどです。</p><p>ということで、FMとWindowsPC間での転送専用のソフトを作成しました。常用機がFM77AV40SXですので、2Dのみでなく2DDディスクにも対応させました。</p><p>使用しているFT245通信カードです。私は通常、このようにFT245通信カードと自作のFDCカードを32Pスロット拡張基板に装着して使用しています。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlKafZkZwIUqOmP6TocTOuHtAm_uUwuUa8I2t0AIBPl4ffCwFYBk5QIdorfE_0_u2vDWq7tQ-aLggUGEDdv2ANUTW_z6KNAgfRkpWT_-K1bShA6MyNhrLPvy86O_pUPfO14d1P7AEgsKIJFvTNfRyPE7vxMUNMmPpMNvyy_knS-DasyOEEvCbhTUpF/s4032/FT245%E9%80%9A%E4%BF%A1%E3%82%AB%E3%83%BC%E3%83%89.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlKafZkZwIUqOmP6TocTOuHtAm_uUwuUa8I2t0AIBPl4ffCwFYBk5QIdorfE_0_u2vDWq7tQ-aLggUGEDdv2ANUTW_z6KNAgfRkpWT_-K1bShA6MyNhrLPvy86O_pUPfO14d1P7AEgsKIJFvTNfRyPE7vxMUNMmPpMNvyy_knS-DasyOEEvCbhTUpF/w400-h300/FT245%E9%80%9A%E4%BF%A1%E3%82%AB%E3%83%BC%E3%83%89.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用しているFT245通信カード</td></tr></tbody></table><br /><p>作成したソフトの構成図です。</p><p>なお、転送時のデータの処理方法が異なるため、FDDIMG_RW77.exeとは互換性がありませんので混用はできません。FM側FT245DRV(とFTDRV11o)、Windows側 ft245drv.exe のペアで使用することになります。</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_UjfzziOLuT0cuPnkq1c86MVK23mVtABK7OGjUijvG2TNtC-pBv_fdsh9OZseydJpCL1b3jHivGwE8-8NvxW30CMeo4bnEDwKMD8ctp8MQFUJ6jzMmj-utJMv24peu-VQQGQiDb3tqDGhFkRRaUcFBlxo_OlfESMWYBae2vtGCeD_Ult2O_yLX1G/s1402/FT245%E6%A7%8B%E6%88%90%E5%9B%B3.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="711" data-original-width="1402" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_UjfzziOLuT0cuPnkq1c86MVK23mVtABK7OGjUijvG2TNtC-pBv_fdsh9OZseydJpCL1b3jHivGwE8-8NvxW30CMeo4bnEDwKMD8ctp8MQFUJ6jzMmj-utJMv24peu-VQQGQiDb3tqDGhFkRRaUcFBlxo_OlfESMWYBae2vtGCeD_Ult2O_yLX1G/w400-h203/FT245%E6%A7%8B%E6%88%90%E5%9B%B3.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br />構成図</td></tr></tbody></table><br /><p>FM側の機械語サブルーチンをロードする間の起動画面です。</p><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnf06t8qAX5MKXA0TJookc8aXYCWw_sFF8Np-GXOicNvg2C-DhlqoDQa9eCFNUs3ShzPWkWc0Ew27F5cch3cMq9m3KWxoqRTDu7IsfgBgG4f56nGcDKo_EOhlIEb_SVeUoHygWxKZro6acvS2WHZ0ODk_OMXLbQW8KMScfZRQClj0s_eHXrHjaAWcL/s4032/%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnf06t8qAX5MKXA0TJookc8aXYCWw_sFF8Np-GXOicNvg2C-DhlqoDQa9eCFNUs3ShzPWkWc0Ew27F5cch3cMq9m3KWxoqRTDu7IsfgBgG4f56nGcDKo_EOhlIEb_SVeUoHygWxKZro6acvS2WHZ0ODk_OMXLbQW8KMScfZRQClj0s_eHXrHjaAWcL/w400-h300/%E8%B5%B7%E5%8B%95%E7%94%BB%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FM側の起動画面</td></tr></tbody></table><br /><p>FM側のメインメニュー画面です。</p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAiycXhZwA97fmTCrSqkkWUovl48vS-W0nwzjAcMOdg4MuW5waNbUKnQXTQJwcmyzkkQvmjQ61PGa6q0DMKKGtgttYDuUDNkffJMYEw1Q8-4mZtkSOf4wiktjorHMwf-ohNQNKmEL7y60QYqxH8TEDBwisN6Q2wzzbDlUVbQKFFCeqwOvHMIst1jpZ/s4032/%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E7%94%BB%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="4032" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAiycXhZwA97fmTCrSqkkWUovl48vS-W0nwzjAcMOdg4MuW5waNbUKnQXTQJwcmyzkkQvmjQ61PGa6q0DMKKGtgttYDuUDNkffJMYEw1Q8-4mZtkSOf4wiktjorHMwf-ohNQNKmEL7y60QYqxH8TEDBwisN6Q2wzzbDlUVbQKFFCeqwOvHMIst1jpZ/w400-h300/%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E7%94%BB%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">FM側のメインメニュー画面</td></tr></tbody></table><br /><p></p><p>メニューの1と2で転送方向を選択します。</p><p>3,4,5はオプション設定で、3でドライブ番号の選択(0~3の範囲)、4でディスクのタイプの選択(2Dか2DD)、5でFMからWindowsへの転送時にFT245RLのTXE(TX Enable)機能を使用するかしないかを選択します。使用する場合はFT245通信カード上のスライドスイッチを右(USBコネクタ側)に、使用しない場合は左(バッテリ側)にセットします。このスライドスイッチがないカードの場合にはTXE機能をOFFにします。</p><p><br /></p><p>WindowsPC側のメニュー画面を示します。</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpDIeBfi8FtjP7hcqkK3esxxOL6ShxciXSA4gfDiNPn8BqXAZ8MH_ONvWEhrqtTuyEVTxSh1qV26wG6ZRPyrm3yEY4Z_LMguoADTqyvMZvFZAKasvigH9qDG3n8Aq5fJTb6-BixEohafSi9zm72cRtCYOlQPrEo7VxE2mbvvvErJmAS-um2tMBRoA/s562/Windows%E5%81%B4.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="332" data-original-width="562" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpDIeBfi8FtjP7hcqkK3esxxOL6ShxciXSA4gfDiNPn8BqXAZ8MH_ONvWEhrqtTuyEVTxSh1qV26wG6ZRPyrm3yEY4Z_LMguoADTqyvMZvFZAKasvigH9qDG3n8Aq5fJTb6-BixEohafSi9zm72cRtCYOlQPrEo7VxE2mbvvvErJmAS-um2tMBRoA/w400-h236/Windows%E5%81%B4.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Windows PC側のメニュー画面</td></tr></tbody></table><p><br />起動後にまず、COMポート番号を選択します。使用可能な番号のみが表示されますのでその中から選択します。もし希望の番号が表示されていない場合は「COMポートスキャン」ボタンを押してから選択します。</p><div>次に読み書きするファイル名を選択します。直接入力もできますがディレクトリまで入力するのは面倒ですので、「ファイル選択」ボタンを押して希望のディレクトリを表示させれば既存のDATファイルが一覧表示されます。ファイルを選択した後でそのファイル名を直接修正することもできます。</div><div>最後にディスクの種別(2D,2DD)を選択します。もちろん、FM側の設定と同じでなければなりません。</div><div>以上で、FMからの読み込み、FMへの書き込みが実行できます。</div><div>オプション機能として、転送で使用されるDAT形式のファイル(各セクタの先頭に16バイトのヘッダがついた形式)を通常のDSK形式やD77(D88)形式に変換する機能もあります。</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-10RL7BnGBahmL3TojHscp9Als9VuX5YnETZCAzWR2rTDLAeyQCC8YJ-ycdB9LWYCmwfhKTtqxsKhI3AWEnxC-QdpXwoJpUyh08DGUcNU3-T402yWUyA6YJ4cqCftSCFolIExvvxvkQAEMroXrtMBOrcAS5jC4xtzeHxIaPde3896RxkYxh0Mj8YO/s562/%E5%8B%95%E4%BD%9C%E4%B8%AD%E3%81%AE%E7%94%BB%E9%9D%A2.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="332" data-original-width="562" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-10RL7BnGBahmL3TojHscp9Als9VuX5YnETZCAzWR2rTDLAeyQCC8YJ-ycdB9LWYCmwfhKTtqxsKhI3AWEnxC-QdpXwoJpUyh08DGUcNU3-T402yWUyA6YJ4cqCftSCFolIExvvxvkQAEMroXrtMBOrcAS5jC4xtzeHxIaPde3896RxkYxh0Mj8YO/w400-h236/%E5%8B%95%E4%BD%9C%E4%B8%AD%E3%81%AE%E7%94%BB%E9%9D%A2.JPG" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">動作中の画面</td></tr></tbody></table><br /><div><br /></div><div>画像のように、転送動作中にはプログレスバーと処理したトラック番号が表示されますので進行状態が分かります。</div><div>蛇足ですが、この表示部分が最も苦労したところで、この表示のためにスレッドとタイマー機能を用いることになりましたが、結果、転送中に他の操作をしても表示が止まることがなくなりました。</div><div>作成にあたっては下記の書籍に大変お世話になりました。感謝いたします。</div><div> 参考にした書籍 「かんたん Visual C++(堀義博著)技術評論社」</div><div><br /></div><div>もしディスクに不良セクタがあると、正常に読み書きできるまで繰り返すため、最悪の場合にはそこでハングアップしてしまいます。この場合には、USBケーブルを抜いて止めることになります。(エラーが生じた場合には、不正なデータを転送するよりも中断した方が良いと考えて、このような仕様にしています。)</div><div><br /></div><div>なお、転送時間は2Dで1分、2DDで2分ぐらいですが、不良セクタがあるディスクの場合にはこれ以上の時間がかかることがあります。</div><div><br /></div><div>参考までに、FM側の機械語サブルーチンを示しておきます。</div><div><br /></div>
<textarea class="code" data-ex-code-prettify-param="{codeType:''}" style="height: 300px; margin: 0px; width: 600px;">
0001 *
0002 * FTDRV for 2D/2DD DISK COPY PROGRAM
0003 *
0004 * FT245 :RD# : read data (L:data enable, L->H:data fetch)
0005 * WR : write data (H->L:write data to buffer)
0006 * RXF# : Rx fill (L:received data in buffer, H:read data prohibited)
0007 * TXE# : Tx enable (L:enable data send, H:inhibited data send)
0008 *
0009 * $FDFE bit7:RXF, bit6:TXE
0010 * $FDFD bit1:WR, bit0:RD
0011 *
0012 6000 STTADR EQU $6000
0013
0014 FDFE RGDAT EQU $FDFE
0015 FDFE RGSTS EQU $FDFE
0016 FDFD RGCMD EQU $FDFD
0017 FBFA BIOS EQU $FBFA
0018 FD1E CHGFDD EQU $FD1E bit6:0-2DD(default), 1-2D
0019
0020 6000 ORG STTADR
0021
0022 6000 16 0071 RDFM LBRA RDFM0
0023 6003 16 00D8 WRFM LBRA WRFM0
0024
0025 6006 00 DPSV FCB 0 ;save DP
0026 6007 00 TRK FCB 0
0027 6008 01 SCT FCB 1
0028 6009 01 DRV FCB 1
0029 600A 00 DRVTYP FCB 0 0:2D,1:2DD
0030 600B 01 TXEMOD FCB 1 0:OFF,1:ON
0031 600C 28 MAXTRK FCB 40 2D:40,2DD:80
0032
0033 * RCB for Read/Write
0034 600D 00 RCBRW FCB $00,$00,$00,$00,$00,$00,$00,$00
0035 6015 08 RCBRST FCB $08,$00,$00,$00,$00,$00,$00,$00
0036 *
0037 *--------------------------------------------------
0038 *initialize for read FM
0039 601D INIRD EQU *
0040 601D 86 0A LDA #$0A DREAD
0041 601F 20 02 BRA INI2
0042
0043 *initialize for write FM
0044 6021 INIWR EQU *
0045 6021 86 09 LDA #$09 DWRITE
0046 6023 INI2
0047 6023 34 02 PSHS A
0048 6025 1F B8 TFR DP,A
0049 6027 A78D FFDB STA >DPSV,PCR
0050 602B 1F 50 TFR PC,D
0051 602D 1F 8B TFR A,DP
0052 60 SETDP $60
0053 602F 35 02 PULS A
0054
0055 6031 30 8C D9 LEAX RCBRW,PCR
0056 6034 A7 84 STA ,X
0057 6036 318D 01C6 LEAY BUFF,PCR
0058 603A 10AF 02 STY 2,X
0059 603D CC 0001 LDD #$0001 TRK:0,SCT:1
0060 6040 ED 8C C4 STD TRK,PCR
0061 6043 ED 04 STD 4,X
0062 6045 4F CLRA
0063 6046 A7 06 STA 6,X SIDE:0
0064 6048 A6 8C BE LDA DRV,PCR
0065 604B A7 07 STA 7,X DRV for DREAD/DWRITE
0066 604D A7 0F STA 15,X DRV for RESTORE
0067
0068 *change to 320KB/640KB FDD
0069 604F B6 FD1E LDA CHGFDD
0070 6052 E6 8C B5 LDB DRVTYP,PCR
0071 6055 26 04 BNE INI3
0072 6057 8A 40 ORA #$40 bit6=1 set 320KB
0073 6059 20 02 BRA INI4
0074 605B 84 BF INI3 ANDA #$BF bit6=0 set 640KB
0075 605D B7 FD1E INI4 STA CHGFDD
0076 *set MAXTRK
0077 6060 5D TSTB
0078 6061 26 04 BNE INI5
0079 6063 86 28 LDA #40
0080 6065 20 02 BRA INI6
0081 6067 86 50 INI5 LDA #80
0082 6069 A7 8C A0 INI6 STA MAXTRK,PCR
0083
0084 606C 30 8C A6 LEAX RCBRST,PCR RESTORE
0085 606F AD9F FBFA JSR [BIOS]
0086 6073 39 RTS
0087
0088 *--------------------------------------------------
0089 * read sct data from FM, write to WindowsPC
0090 *
0091 6074 RDFM0 EQU *
0092 *set init for read
0093 6074 8D A7 BSR INIRD
0094
0095 *write to PC from FM
0096 6076 SND1 EQU *
0097 6076 6F 8C 98 CLR RCBRW+4,PCR trk:0
0098 6079 SND11 EQU *
0099 6079 8D 1A BSR SND12
0100 607B 6C 8C 93 INC RCBRW+4,PCR trk+1
0101 607E A6 8C 8B LDA MAXTRK,PCR
0102 6081 A1 8C 8D CMPA RCBRW+4,PCR end trk?
0103 6084 22 F3 BHI SND11
0104 *dp return
0105 6086 A68D FF7C LDA DPSV,PCR
0106 608A 1F 8B TFR A,DP
0107 *reset to 640KB FDD
0108 608C B6 FD1E LDA CHGFDD
0109 608F 84 BF ANDA #$BF bit6=0
0110 6091 B7 FD1E STA CHGFDD
0111 6094 39 RTS
0112
0113 *read 16scts data from FM, write to PC (for side 0)
0114 6095 SND12 EQU *
0115 6095 CC 0100 LDD #$0100 sct:1,side:0
0116 6098 ED8D FF76 STD RCBRW+5,PCR
0117 609C SND13 EQU *
0118 609C 8D 22 BSR RFMWPC
0119 609E 6C8D FF70 INC RCBRW+5,PCR sct+1
0120 60A2 86 10 LDA #16
0121 60A4 A18D FF6A CMPA RCBRW+5,PCR
0122 60A8 2A F2 BPL SND13
0123 *read 16scts data from FM, write to PC (for side 1)
0124 60AA CC 0101 LDD #$0101 sct:1,side:1
0125 60AD ED8D FF61 STD RCBRW+5,PCR
0126 60B1 SND14 EQU *
0127 60B1 8D 0D BSR RFMWPC
0128 60B3 6C8D FF5B INC RCBRW+5,PCR sct+1
0129 60B7 86 10 LDA #16
0130 60B9 A18D FF55 CMPA RCBRW+5,PCR
0131 60BD 2A F2 BPL SND14
0132 60BF 39 RTS
0133
0134 *read 1sct data from FM, write to PC
0135 60C0 RFMWPC EQU *
0136 *write header to PC
0137 60C0 308D FF49 LEAX RCBRW,PCR
0138 60C4 C6 10 LDB #16
0139 60C6 17 00AB LBSR SNDCH
0140 *read sct data from FM
0141 60C9 308D FF40 LEAX RCBRW,PCR
0142 60CD AD9F FBFA RBLOP1 JSR [BIOS]
0143 60D1 A6 01 LDA 1,X
0144 60D3 26 F8 BNE RBLOP1
0145
0146 *write sct data to PC
0147 60D5 308D 0127 LEAX BUFF,PCR
0148 60D9 5F CLRB counter:256
0149 60DA 17 0097 LBSR SNDCH
0150 60DD 39 RTS
0151
0152 *
0153 *--------------------------------------------------
0154 * read sct data from WindowsPC, write to FM
0155 *
0156 60DE WRFM0 EQU *
0157 *set init for write
0158 60DE 17 FF40 LBSR INIWR
0159
0160 *read from PC, write to FM
0161 60E1 READ1 EQU *
0162 60E1 6F8D FF2C CLR RCBRW+4,PCR trk:0
0163 60E5 READ11 EQU *
0164 60E5 8D 1D BSR READ12
0165 60E7 6C8D FF26 INC RCBRW+4,PCR trk+1
0166 60EB A68D FF1D LDA MAXTRK,PCR
0167 60EF A18D FF1E CMPA RCBRW+4,PCR end trk?
0168 60F3 22 F0 BHI READ11
0169 *dp return
0170 60F5 A68D FF0D LDA DPSV,PCR
0171 60F9 1F 8B TFR A,DP
0172 *reset to 640KB FDD
0173 60FB B6 FD1E LDA CHGFDD
0174 60FE 84 BF ANDA #$BF bit6=0
0175 6100 B7 FD1E STA CHGFDD
0176 6103 39 RTS
0177
0178 *read 16scts data from PC, write to FM (for side 0)
0179 6104 READ12 EQU *
0180 6104 CC 0100 LDD #$0100 sct:1,side:0
0181 6107 ED8D FF07 STD RCBRW+5,PCR
0182 610B READ13 EQU *
0183 610B 8D 22 BSR RPCWFM
0184 610D 6C8D FF01 INC RCBRW+5,PCR sct+1
0185 6111 86 10 LDA #16
0186 6113 A18D FEFB CMPA RCBRW+5,PCR
0187 6117 2A F2 BPL READ13
0188 *read next 16scts data from PC, write to FM (for side 1)
0189 6119 CC 0101 LDD #$0101 sct:1,side:1
0190 611C ED8D FEF2 STD RCBRW+5,PCR
0191 6120 READ14 EQU *
0192 6120 8D 0D BSR RPCWFM
0193 6122 6C8D FEEC INC RCBRW+5,PCR sct+1
0194 6126 86 10 LDA #16
0195 6128 A18D FEE6 CMPA RCBRW+5,PCR
0196 612C 2A F2 BPL READ14
0197 612E 39 RTS
0198
0199 *read 1sct data from PC, write to FM
0200 612F RPCWFM EQU *
0201 *read sct data from PC
0202 612F 308D 00CD LEAX BUFF,PCR
0203 6133 5F CLRB counter:256
0204 6134 8D 12 DRD1 BSR RCVCH
0205 6136 A7 80 STA ,X+
0206 6138 5A DECB
0207 6139 26 F9 BNE DRD1
0208 *write data to sct of FM
0209 613B 308D FECE LEAX RCBRW,PCR
0210 613F AD9F FBFA WBLOP1 JSR [BIOS]
0211 6143 A6 01 LDA 1,X error?
0212 6145 26 F8 BNE WBLOP1
0213 6147 39 RTS
0214
0215 *
0216 *===== receive 1 chr =====
0217 * 1st received byte : bit7,6(located on bit5,4)
0218 * 2nd received byte : bit5-0
0219 * return A:input chr
0220 *
0221 6148 RCVCH EQU *
0222 6148 34 04 PSHS B
0223 614A 8D 20 BSR WTRDEN wait RXF=L
0224 614C C6 01 LDB #$01 read cmd(D0=H)
0225 614E 8D 12 BSR GETDAT get 1st byte
0226 6150 84 30 ANDA #$30 get bit5,4
0227 6152 48 ASLA
0228 6153 48 ASLA to bit7,6
0229 6154 34 02 PSHS A save bit7,6 of chr
0230 6156 8D 14 BSR WTRDEN wait RXF=L
0231 6158 8D 08 BSR GETDAT get 2nd byte
0232 615A 84 3F ANDA #$3F get bit5-0
0233 615C AB E4 ADDA ,S bit7,6+bit5-0
0234 615E 32 61 LEAS 1,S returns the SP
0235 6160 35 84 PULS B,PC
0236
0237 *get data
0238 * return A:input data
0239 6162 F7 FDFD GETDAT STB RGCMD write cmd
0240 6165 B6 FDFE LDA RGDAT get data
0241 6168 7F FDFD CLR RGCMD set RD#=L
0242 616B 39 RTS
0243 *
0244 * wait RXF enable
0245 * RXF L:data exist, H:not exist
0246 * RGSTS bit7:RXF
0247 *
0248 616C WTRDEN EQU *
0249 616C B6 FDFE RDE1 LDA RGSTS
0250 616F 84 80 ANDA #$80
0251 6171 26 F9 BNE RDE1 RXF=L?
0252 * CLR RGCMD set RD#=L
0253 6173 39 RTS
0254
0255 *
0256 *===== send 1 chr =====
0257 *send sct data from buf to ft245
0258 * write to ft245 at WR:H->L
0259 *
0260 * B:counter
0261 * X:adr of buff
0262 *
0263 6174 SNDCH EQU *
0264 6174 34 02 PSHS A
0265 6176 SNDD1
0266 6176 8D 12 BSR WTWREN wait TXE=L
0267 6178 86 02 LDA #2
0268 617A B7 FDFD STA RGCMD bit1=1(WR=H)
0269 617D A6 80 LDA ,X+
0270 617F B7 FDFE STA RGDAT set DATA
0271 6182 7F FDFD CLR RGCMD bit1=0(WR=H->L)
0272 6185 5A DECB
0273 6186 26 EE BNE SNDD1
0274 6188 35 82 PULS A,PC
0275
0276 *
0277 * wait Tx enable
0278 * TXE L:enable, H:disable
0279 * RGSTS bit6:TXE
0280 *
0281 618A WTWREN EQU *
0282 618A 34 02 PSHS A
0283 618C A68D FE7B LDA TXEMOD,PCR
0284 6190 27 07 BEQ WRE2
0285 6192 B6 FDFE WRE1 LDA RGSTS
0286 6195 84 40 ANDA #$40
0287 6197 26 F9 BNE WRE1 bit6=0?
0288 6199 35 82 WRE2 PULS A,PC
0289
0290 6200 ORG STTADR+$200
0291
0292 6200 FF BUFF RMB 256
0293
0294
0 error(s), 2 warning(s) is detected.
Label address
BIOS FBFA BUFF 6200 CHGFDD FD1E DPSV 6006 DRD1 6134
DRV 6009 DRVTYP 600A GETDAT 6162 INI2 6023 INI3 605B
INI4 605D INI5 6067 INI6 6069 INIRD 601D INIWR 6021
MAXTRK 600C RBLOP1 60CD RCBRST 6015 RCBRW 600D RCVCH 6148
RDE1 616C RDFM 6000 RDFM0 6074 READ1 60E1 READ11 60E5
READ12 6104 READ13 610B READ14 6120 RFMWPC 60C0 RGCMD FDFD
RGDAT FDFE RGSTS FDFE RPCWFM 612F SCT 6008 SND1 6076
SND11 6079 SND12 6095 SND13 609C SND14 60B1 SNDCH 6174
SNDD1 6176 STTADR 6000 TRK 6007 TXEMOD 600B WBLOP1 613F
WRE1 6192 WRE2 6199 WRFM 6003 WRFM0 60DE WTRDEN 616C
WTWREN 618A
</textarea> <div><br /></div><div>
<div><br /></div><div>以上ですが、作成したソフトなどを<a href="https://1drv.ms/u/s!Ags8oP_HCWjTmG13GrBrgqGlV5Vj?e=T5ykQh" target="_blank"><span style="color: #2b00fe;">OneDrive</span></a>に上げておきます。</div><div>内容は、</div><div>・Windows側</div><div> ft245drv.exe(64ビット版ですので32ビットOSでは動作しません)</div><div>・FM側</div><div> メニューソフト FT245DRV(F-BASIC)</div><div> サブルーチン FTDRV11o(機械語)ソースリストとバイナリ</div><div>・FMへの転送用DATファイル FT245DRIVER2.DAT(上記の2ソフトを収めてある)</div><div>・以上のソフトの使用説明書</div><div>・ユーティリティ</div><div> イメージファイル処理ソフト FBasDrvWin.exe</div><div> (以前紹介したものをDAT形式ファイルを扱えるように拡張したもの。</div><div> FT245通信カードと関係なく、イメージファイルを処理するソフトとして使用可能。)</div><div>です。</div></div></div><div><br /></div><div><br /></div><div><br /></div>Old68funhttp://www.blogger.com/profile/03252539884803065093noreply@blogger.com0