SSブログ
English Version
前の5件 | -

電子メモパッドのペン作成 [3D_printer]

 思い付いたことを直ぐにメモできるように普段から手元にメモ用紙を置くようにしています。数か月前にダイソーで電子メモパッド(以降、メモパッドと記す)を見つけたので購入してみました。細かい文字は書き辛いですが中々便利でメモ用紙の消費が少なくなりました。

 先程、このメモパッドのペンが行方不明になり部屋の中の何処かにはあるはずなのですが、中々見つかりません。
 探している時は「そういえばペンを本体に繋げるように穴が開いていたなぁ」と思いましたが、いざ見つかってみると紐が邪魔になりそうで繋ぐ気にはなれません。

 そこで例え紛失しても困らないように3Dプリンタで作ってみました。そのまま似せて作るのもなんなのでちょっとアレンジしてみました。

メモパッド用のペン(CAD画面)


 このメモパッドは 500 円で電気的に消去できます(部分的な消去や書換えは不可)。

メモパッドとペンたち


 下の写真の上側が今回作成したペンです。手で持つ部分が六角なので手に馴染みます。こんなものがすぐできるなんて便利な世の中になったものです。

メモパッドとペンたち


 DesignSpakMechanical で作成していますが、二つのパーツが結合エラーになる状態で STL ファイル化したためか読込み時にエラーが出るかもしれませんが私の環境では出力できました。

★変更 2023/10/01 {
 STLファイルを修正し、読込み時にエラーが出なくなりました。
}

 下記からSTLファイルをダウンロードできます。商用利用以外であれば使用可能とします。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

FizzBuzz問題(独自解法) [Z80]

 今回は Twitter(X) のタイムラインで見かけた Fizz Buzz 問題の解法について書いてみたいと思います。ウィキペディアにも書いてあるように Fizz Buzz 問題とは1から100までを言い合う遊びで3の倍数の場合は数字の代わりに Fizz と言い、5の倍数の場合は Buzz、両者の倍数の場合は Fizz Buzz と言うゲームです。

 FizzBuzz 問題を解くプログラムを作ること自体は容易なのですが、面白くするために高速化という観点から剰余算を使わないという制約を設けます。また、FizzBuzz の間にはスペースを入れず、それぞれの数字や 単語の後にはスペースを1個入れることとします。

 素数を求める時によく使われる「エラトステネスの篩(ふるい)」でのフラグ設定のように3周期のカウンタと5周期のカウンタを持つことでそれぞれの倍数であることを判断できます。
 最初に考えたC言語のソースは次のようなものでした。

FizzBuzz 問題の解答プログラム(C言語)
/* * FizzBuzz Solver Ver 0.01 2023/09/21 by skyriver */ #include <stdio.h> int main( void ) { for( int i=1, f=3, b=5; i <= 100; i++ ) { if( --f == 0 ) { f = 3; printf( "Fizz" ); } if( --b == 0 ) { b = 5; printf( "Buzz" ); } else if( f != 3 ) { printf( "%d", i ); } putchar( ' ' ); } return 0; }


 ネット上のコンパイラ環境サービスで実行結果を確かめることもできます(便利な世の中になったものですね)。

 上述のように3と5のカウンタを持っているので全体は15周期の繰り返しになり、4ビットでカウントできます。ならば15周期のカウンタだけを使って処理できないものでしょうか?

 ここで15以内の3と5の倍数について考えてみます。両者の倍数である15を除外して列挙すると
  • 3の倍数
     0011,0110,1100,1001
  • 5の倍数
     0101,1010
となり、いずれも1が2個で巡回ローテートしたものを同一視すると2つのパターン(0011,0101)に縮退されます。かつ、1が2個のパターンを網羅しています。
 更に面白いことに相互を XOR してみると他のパターンに推移するので、これらの3の倍数と5の倍数は2進数の観点で見ると密接な関係があるかのように思えてきます。
 この特徴を利用して Z80 のアセンブリ言語で FizzBuzz 問題を解くプログラムを作ってみることにしました。上記は独自の解析なので恐らくこの手法による FizzBuzz プログラムは世界初だと思いますw

 1のビットの数が2個だった場合、上述のように3か5の倍数ということになるのですが、どちらに属するかの判断方法は簡単そうに見えて中々思いつきませんでした。
 最も単純なのは

   CP 5
   JR Z,Buzz
   CP 10
   JR Z,Buzz

のような8バイトものコードになってしまいます。漸く思い付いたのが次の方法です。

   SUB 5
   OR A
   JP PE,Buzz

如何でしょう。引き算後のビット1の総数(パリティ)で判断できました(ほかに良い方法があればコメント下さい)。

★追記 2023/09/23 {
 もっと判り易く、簡潔な判定方法を思い付きました^^
   AND 5
   JP PE,Buzz
}

★追記 2023/09/23 {
 ビット数の判定をループ処理方式

  L1: LD BC,4 * 256 + 0
    XOR A ; clear bit counter
    LD L,D
  L2: RRC L
    ADC A,C
    DJNZ L2
    CP 2
    JR NZ,DspNum

 から下記のループ処理無しの方式に改善してみました。

    LD A,D
    OR A
    JP PO,DspNum
    CP 0FH
    JR Z,Both
}

 できたソースを下記に示します。CP/M用に作成していますがDOSコールしているのは1文字出力サービスのみですので他の環境にも移植は容易だと思います。メインループ処理の簡潔さを堪能してください。

FizzBuzz 問題の解答プログラム(Z80アセンブリ)
; FizzBuzz solver by skyriver ; Ver 0.02 2023/09/22 ; Ver 0.03 2023/09/23 ; Ver 0.04 2023/09/23 ; Ver 0.05 2023/09/23 ; Ver 0.05 2023/09/23 ; Ver 0.06 2023/09/24(95 bytes) ; Ver 0.07 2023/09/27 improve DspNum(93 bytes) 0005 DosSrv EQU 5 ; DOS Service 0002 FnCout EQU 2 ; console out(E:data) 0064 MaxNum EQU 100 ; repeat until this number 0000' ASEG ORG 0100H 0100 01 64F1 Start: LD BC,256 * MaxNum + 0F1H ; B:loop counter, C:15 counter 0103 79 Loop: LD A,C 0104 21 0153 LD HL,MsgFiz 0107 0C INC C 0108 28 17 JR Z,Both ; if 15 010A B7 OR A 010B E2 0128 JP PO,DspNum ; if 1,2,4,7,8,11,13,14 010E E6 05 AND 5 0110 E2 0116 JP PO,Dsp ; if x3 0113 21 0158 DspBuz: LD HL,MsgBuz 0116 CD 013D Dsp: CALL Puts 0119 3E 20 Next: LD A,' ' 011B CD 0148 CALL Putch 011E 10 E3 DJNZ Loop 0120 C9 RET 0121 0E F1 Both: LD C,0F1H ; restart 15 counter 0123 CD 013D CALL Puts 0126 18 EB JR DspBuz 0128 3E 65 DspNum: LD A,MaxNum + 1 012A 90 SUB B 012B 11 FF0A LD DE,256 * (-1) + 10 012E 6F DspN10: LD L,A 012F 93 SUB E 0130 14 INC D ; not affect to Cy 0131 30 FB JR NC,DspN10 0133 7A LD A,D ; get 10s digit 0134 C4 0146 CALL NZ,PutNum 0137 7D LD A,L 0138 CD 0146 CALL PutNum 013B 18 DC JR Next ; put string ; HL <- string addr ; 013D 7E Puts: LD A,(HL) 013E B7 OR A 013F C8 RET Z 0140 CD 0148 CALL Putch 0143 23 INC HL 0144 18 F7 JR Puts ; put number with ascii ; A <- data 0146 C6 30 PutNum: ADD A,'0' ; put char ; A <- data 0148 C5 Putch: PUSH BC 0149 E5 PUSH HL 014A 5F LD E,A 014B 0E 02 LD C,FnCout 014D CD 0005 CALL DosSrv 0150 E1 POP HL 0151 C1 POP BC 0152 C9 RET 0153 46 69 7A 7A MsgFiz: DB "Fizz", 0 0157 00 0158 42 75 7A 7A MsgBuz: DB "Buzz", 0 015C 00 END Start Macros: Symbols: 0121 BOTH 0005 DOSSRV 0116 DSP 0113 DSPBUZ 012E DSPN10 0128 DSPNUM 0002 FNCOUT 0103 LOOP 0064 MAXNUM 0158 MSGBUZ 0153 MSGFIZ 0119 NEXT 0148 PUTCH 0146 PUTNUM 013D PUTS 0100 START No Fatal error(s)


 上のプログラムの出力結果は次のようになります。

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

 上記のソースよりは少し前のバージョンですが、ネット上のサービスとして公開されている MSX のエミュ環境である MSXPenでも実行できました(重ねて便利な世の中に・・)。


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

ポケコン(G850)用拡張ボード(EborsyEEP)でCP/M(その9)使用方法まとめ [ポケコン]

 今回開発した PC-G850V(以降、ポケコンと記す)用の増設メモリボード(EborsyEEP、以降 増設ボード と記す)を使い、CP/M が安定して動作し、ポケコン用の既存のプログラム(100Hから始まるマシン語で作成されたもの)を CP/M 上から実行できるランチャーの使い勝手も良いことから BOOTH で配布することにしました。

 本増設ボードの使用方法について以下にまとめました。下記の手順で必要なファイルは BOOTH からダウンロードできる「おまけファイル」に入っています。

  1. 前提条件
     本増設ボードは CP/M インストール後のファイル転送手段として通信速度が 19200bps のソフトウェアシリアル方式を用いたポケコン専用の xmodem 通信ソフトを使用することを前提としています。そのため、本増設ボードを使用するためには次の条件を満たす必要があります。

    • 「周辺機器接続端子」に接続するシリアル通信用の通信アダプタを所有しており、パソコンからポケコンに HEX ファイルを転送し、ポケコン上で実行できること。
    • 下記URLで公開しているソフトウェアシリアル方式を使用したヘキサファイルローダー(DropHx)が動作することを確認済みであること。
        https://piclabo.blog.ss-blog.jp/DropHxForG850#usage
      ※G850S,G850VSでの動作は未確認ですが、クロックが 9MHz であることから通信速度を 21600bps(= 19200x9/8)に設定すれば動く可能性があります。
    • Windows用のTeraTermのようなxmodemプロトコルに対応した通信ソフトが動作すること。


  2. EEPROM の初期化
     出荷検査時に EEPROM を初期化済みなので本作業は不要ですが、万が一ファイルシステムが破壊された場合等に次の手順で EEPROM を初期化直後の状態にできます。
     添付の EEPROM 初期化ソフト(INIEEPXM.HEX)で EEPROM を初期化します。
     具体的な操作としては INIEEPXM.HEX をポケコンにダウンロードし、増設ボードを装着した状態で実行する(G100)と LCD 画面に下記のメッセージが表示されるの"Y"を入力すると数秒で初期化が完了します。

    注1)増設ボードの抜き差しはポケコンの電源が OFF の状態で行ってください。
     2)初期化するとファイルシステム上のファイルは A:XM.COM のみになります。

    ** Init EEPROM **
    find 8MB : Drive A,B,C,D   
    Are you sure ?(Y/N)


  3. CP/M の起動と終了
     添付の CP/M ローダー(GOCPM.HEX)を上述のDropHxを使ってポケコンにダウンロードし、実行する(G100)と CP/M が起動します。

    CP/M loading ... ok
    G850 Eborsy 47K CP/M 2.2 (C) DIGITAL

    A>_

     「ON」キーを押下することで CP/M が終了し、ポケコンのモニタに戻ります。
     再度実行する(G100)と CP/M が再起動します。


  4. CP/M へのファイル転送
     パソコンとポケコンの CP/M 間のファイル転送はAドライブにあるxmodemソフト(XM.COM)を使用します。送信側を先に起動後、受信側を起動して下さい。
     hoge.com ファイルを TeraTerm でポケコンへ転送する際の操作は次のようになります。

    1. ポケコンにシリアル通信インターフェースを装着し、パソコンとケーブル接続する(通院速度は 19200bps)。
    2. TeraTerm の「ファイルメニュー」から file⇒Transfer⇒XMODEM⇒Send を選択し、hoge.com ファイルを指定する。
    3. ポケコン側で xmodem を起動する。

      A>XM HOGE.COM /R        


       xm のみの起動で簡易的なヘルプが表示されます。

     複数のファイルを転送する場合は Windows のアーカイブソフト(7-ZIP)で tar 形式のアーカイブファイル(hoge.tar)にし、ポケコンへ転送後、添付の解凍ソフト(UNTAR.COM)で次の操作により解凍することで転送作業が楽になります。

    A>UNTAR HOGE /E         


     尚、untar のみの起動で簡易的なヘルプが表示されます。


  5. CP/M 上でのポケコンの既存ソフトの起動
     スタートアドレスが 100H のポケコンの既存のソフトを下記の操作で CP/M 上から起動できます。本 CP/M のドライブ容量は1ドライブにつき約 2M バイトなので既存アプリの保存場所としては無尽蔵と言えるくらいの大きさです^^

    1. 既存ソフトのヘキサファイル(ファイル名の拡張子は *.HEX にする)を上述の方法でパソコンからポケコンの CP/M 環境へ転送する。
    2. 添付の LOAD コマンドでバイナリファイルに変換する。
       例:LOAD HOGE
    3. 変換したバイナリファイル(*.com)を *.850 にリネームする。
       例:REN HOGE.850=HOGE.COM
    4. 添付の run コマンドで起動する。
       例:RUN HOGE

     下記は life.hex を転送後、起動するまでの操作例です。

    A>LOAD LIFE          

    FIRST ADDRESS 0100
    LAST ADDRESS 134A
    BYTES READ 124B
    RECORDS WRITTEN 25


    A>REN LIFE.850=LIFE.COM
    A>RUN LIFE



  6. CP/M でのキー操作
     CP/M を操作する際に使用する各キーは次の操作で入力てきます。

      ^C ⇒ SHIFT + C
      ^X ⇒ SHIFT + X
      ^Z ⇒ SHIFT + Z
      ^S ⇒ SHIFT + V

     また、本 CP/M では 80 x 25 表示の仮想画面の一部を LCD に表示(縮小フォントにより 36 x 8 表示)しています。カーソルキーを操作することで LCD の表示範囲を変更できます。この表示範囲の変更操作は CP/M のアプリケーションが動作中の時でもキーセンスさえしていれば可能です。


  7. パソコンの端末化
     ポケコンの表示画面は狭いので次のコマンドによりシリアル接続したパソコンを端末として使用することで操作性が向上します。

    A>STAT CON:=TTY:         


     パソコン側で次のコマンドを実行することでパソコン端末を切断し、ポケコン側からの操作に戻ります。

    A>stat con:=crt:              


     パソコンとのシリアル通信はポケコン側でソフトウェアシリアル方式により、19200bps を実現している為、キーセンスができないという制限があります。
     代替えとしてポケコン側のキー押下でキー入力有と判断するような実装にしていますので ^S で表示を一時停止したい場合はポケコン側のキーを押した後にパソコン側で ^S キーを押して下さい。


  8. CP/M アプリからの IOCS コール方法
     CP/M は増設ボード内のメモリ上で動作している為、CP/M 側のアプリからポケコンの ROM 内にある IOCS 処理を従来の方法でコールすることはできません。
     このため、ブリッジ処理を使うことで CP/M アプリから IOCS コールを実現できるようにしています。手順は次の通りです。

    1. 0BE03H にコール先のアドレスを設定する。
    2. コール時に必要な情報をレジスタに設定する。
    3. 0BE06H をコールする。


  9. おまけ
     二値動画再生ソフト(DISP.COM)用の BadApple!! 動画ファイルをここからダウンロードできます。
     再生方法 : DISP BADAPPLE.BIN



[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

マウスホイールの修理 [修理]

 手に馴染んていて愛用しているマウス(エレコム M-XGM10BBBK)のホイールの調子が悪くなりました。具体的な症状はホイールでスクロールダウン(CAD系ソフトではズームアウト)操作で最初に逆方向に反応して中々思ったように操作できませんorz

 この状態でCADソフトを使うと忍耐力の要請ギブスになります(でも暫く使ってた)w

愛用しているマウス(M-XGM10BBBK)


 パソコンが非力で録画中に YouTube を見ると音が飛んだりすることもあるので BlueTooth 絡みの問題かと思い、BlueToothを V4.0 のものから V5.1 へ変えたのですが同じ状況でした。試しにマウスをノートパソコンへペアリングしたところ、同様の症状が出たのでマウスが原因であることが判りました。
 このマウスは 2021年10月に購入したもので値段もそれほど高くはないので買い替えも考えましたが、他の部分は問題無いので修理してみることにしました。修理するには分解する必要がありますが、裏面のマウスソールが貼ってあるところを爪を当てて確認すると3つのネジの場所が判りました(下図)。
 因みに電池カバーが白いのは「マウスの電池カバーの修理」の記事で書いたように3Dプリンタで作成したものだからです。

ネジの場所


 マウスソールのネジの場所をデザインナイフで繰り貫くとY型のネジの頭部が見えました。

ネジ部分カット後の様子


 この3つのネジを外すことで簡単に分解できました。強力なブロアがあればいいのですがないので手持ちのカメラ用のブロアでごみを取り除きました。ホイールのセンサ部分には髪の毛が絡まっていたのでピンセットで取り除きました。

分解後のマウスの様子


 組立後、ホイールの調子は良くなりましたが、まだ本調子では無い感じです。しばらく様子を見てみたいと思います。


★追記 2023/09/13
 その後もやはりホイールの調子が悪く、イライラが募る状態でした。
 マウスの構造を再考してみるとホイールのエンコーダー部分はユニットになっていて外部からのゴミの影響は受けにくそうです。軸の部分の動きを確認して見ましたが、空回りしている様子はありませんでした。
 ということは・・・多分、エンコーダー内の接触不良ですねぇ。エンコーダーの軸の両側から接点復活スプレーを掛けたところ、イライラの元が見事に解消しました^^

ホイールのエンドーダー部分



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

SOIC 8ピンアダプタ [その他]

 「ポケコン(G850)用拡張ボード(EborsyEEP)でCP/M(その7)改善基板到着」の記事等で書いているポケコン(PC-G850V)用の拡張メモリボードで SOIC 8 ピンパッケージの EEPROM(W25Q64JV) を使用しているのですが、プリント基板への実装前に動作確認を行いたいと思い、ロムライタ(TL866II Plus)でID チェックを行うことにしました。そこで問題になるのがロムライタの DIP ソケットにどうやって装着するかです。

 8ピンなので気軽に考えて手持ち部品で自作することにしました。

 秋月さんで購入した手持ちのDIP変換基板(下図)があったのですが SOP 用なのでリード部分のフットプリントの幅がギリギリで位置合せのマージンが少ないことが判りました。

秋月さんの SOP 8pin to DIP 変換基板


 aitendp さんから購入した変換基板(下図)を見つけ、幅広だったのでこれを使ってアダプタを作ることにしました。

aitendo さんの SIP 変換基板とアダプタ自作用部品


 完成した SOIC アダプタが下の写真です。リードを押え込む治具は3Dプリンタで作成しました。

自作したアダプタ(その1)


 下の写真はICを固定した状態を上から見たものです。

自作したアダプタ(その2)


 横から見るとこんな感じです。

自作したアダプタ(その3)


 ロムライタに装着した状態が下の写真になります。しかし、ICチップの位置合せが微妙でロムライタに装着してもエラーになることがありました。

自作したアダプタ(その4)


 この手のアダプタは高額という印象があったのですが、ネットで検索したところ割合安い(送料込みで¥649)ものを見つけたので購入してみました。

購入したアダプタ


 上部を押すことでリードを挟む機構部分が開き、この状態でICチップを入れ、上部を放すとリードをしっかり掴みます。うまく出来ていますね。ロムライタに装着して確認しましたが、エラーもなく安定感がありました。


 Twitter(X)に投稿した動画付きメッセージも貼っておきます。



nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー
前の5件 | -