Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PICを作ろう ,コードメモリ ~昼休みにまったり進めるプロジェクト~

今日はコード用(プログラムを格納する)メモリ


//
// code memory (c)2007 BakaOyaji
// $Id$
//

`include "../pic_def.h"

`define CODE_SIZE ('d4096)

module codemem( addr_i, data_o ) ;
input [(`PC_Length-1):0] addr_i ;
output [(`Instruction_Len-1):0] data_o ;

reg [7:0] hexrom[ 0: ((`CODE_SIZE)*2 -1)] ;
reg [15:0] a ;

reg [(`Instruction_Len-1):0] data_o ;
initial begin
$readmemh( "rom.data", hexrom);
end // initial

always@( addr_i ) begin
data_o <= {hexrom[(addr_i << 1 )+1], hexrom[ addr_i << 1 ]};
end // always

endmodule // codemem( addr, data ) ;

// EOF codemem.v


まあ、超ちょろいですね。Verilog-HDLのシステムタスク、$readmemh形式で読めるように、メモリの内容の入ったファイル「rom.data」も作って、簡単にデバッグ。問題はなさそう。ただ、メモリの内容を手で作るのは面倒くさいので、MPLABの出力したROMイメージを変換する仕掛けを用意しないとやりきれない。インテルHEX形式を変換するのがいいかな…
 ん~、でもインテルHEXフォーマットの仕様に関する記事が見つかりませんね。だれか教えてください(笑)。
---
本日の御託
私の勤める職場には、イントラネットのポータルページに、「今日の一枚」みたいな、写真と簡単なキャプションがついたページがあるのだが、ちょっとした善行(?笑)をしてそのコーナーに載ってしまった。世界中にいる同僚に「conglaturation!」なんてメールをもらったりして、なんというか、ちょっとこそばゆい。

スポンサーサイト

PICを作ろう ,インストラクションレジスタ ~昼休みにまったり進めるプロジェクト~

今回は、インストラクションレジスタです。

//
// Instruction register
// skip_i signal will override the instruction fetched
// to NOP. This is used for inserting dummy cycle
// at skip, branch, call and 1st stage of interrupt services
//
// (c) 2007 BakaOyaji
// $Id
//

`include "../piccpu.h"
`include "../pic_instructions.h"
module ir( clk_i, reset_i,
skip_i , // skip , overriding the instruction fetched to NOP
instruction_i , // the instruction that is fetched from codemem[PC+1]
instruction_o, // the instruction to execute
flush_o // indicates flush , for debug purpose
);

input clk_i, reset_i , skip_i ;
input [13:0] instruction_i ;

output [13:0] instruction_o ;
output flush_o ;

reg [13:0] instruction_o ;
reg force_nop ;
wire flush_o ;

    assign flush_o = force_nop | skip_i ;
    always@( instruction_o ) begin
        casex( instruction_o )
            `INST_GOTO,
            `INST_CALL,
            `INST_RETURN,
            `INST_RETFIE,
            `INST_RETW : begin
                force_nop <= 1'b1 ;
            end
            default : begin
                force_nop <= 1'b0 ;
            end
        endcase
    end // always

    always@( posedge clk ) begin
        if( reset_i == 1'b1 ) begin
            instruction_o <= 'b00_0000_0000_0000 ;
        end // if
        else if ( flush_o == 1'b1) begin
            // instruction_o <= `Inst_NOP ;
            instruction_o <= 'b00_0000_0000_0000 ;
        end // if
        else begin
            instruction_o <= instruction_i ;
        end // else
     end // always
endmodule // ir
// EOF ir.v

2つのalwaysブロックがありますが、最初のものは命令から次のサイクルでNOPを実行する場合を出コードしています。個々の命令から、条件を抽出するのは、昔ならカルノーマップとかを使って、論理の圧縮をするところですが、HDL+論理合成なら楽チンです。論理合成ツールの論理圧縮のアルゴリズムは、USB(カリフォルニア大バークレー校)で開発されたEspressoというアルゴリズムを祖先とするものを使用しているそうです。ここもパラレル・ケースが使えますが、まずはこのままにします。
2番目のalwaysブロックはレジスタを記述しています。flush_oによって、命令をフラッシュしています。

次回は、CPUの外側ですが、コードメモリ(プログラム用メモリ)を実装します。分散したデコーダにしているので、プログラムカウンタとインストラクションレジスタとコードメモリがあれば、一部の命令(分岐命令)は実行できるはずです。
---
本日の御託
みんなPICのネタは好きだねぇ、いつもはほとんどアクセスがないこのページもアクセス数が軽く150を超えている。(選挙速報はみなかったの?笑)
このBlogもGoogleとかで、「PIC」「Verilog」とかで上位に表示されるが、CQPIC support pageというページを見つけた。16F84A相当のCPUがVerilog(VHDLも)で書かれているそうである。カンニングの誘惑にかられる(笑) が、もう少し我慢しようと思う。



PICを作ろう ,プログラムカウンタ ~昼休みにまったり進めるプロジェクト~

んじゃ,プログラムカウンタ(PC)行ってみましょう.PC(スタックを含む)に必要な機能は,昨日書いたように,以下の6種類
- 分岐 GOTO命令
- サブルーチンコール CALL命令
- サブルーチンからの復帰 RETURN,RETLW,RETFIE命令
- +1 (インクリメント)その他の命令
- 割り込みハンドルルーチン(0004h番地)へのコール
- ホールド(割り込みサイクル)
このうち,割り込みハンドルルーチン(0004h番地)へのコールとホールドの機能は,命令ではなく,インタラプトコントローラからの信号によって機能します.また,SKIP系の命令はインストラクションレジスタのフラッシュ(リセット)によって実装するので,PCには関係する機能はありません.

//
// Program counter
// (c) 2007 BakaOyaji
// $Id$
//
//

`include "../pic_instructions.h"
`include "../pic_def.h"

module pc(

    clk_i, reset_i, por_i ,
    instruction_i, // instruction from instruction reg.
    data_i , // from FileReg write bus
    pcl_we_i , // write enable for pcl
    program_counter_o, // out put of program counter
    pclath_i, // from PCLATH reg
    force_call4_i, // force call 0004
    hold_i, // hold current address
    pcl_o // pcl
);
input clk_i, reset_i, por_i ;
input [(`Instruction_Len-1):0] instruction_i ;

input [7:0] data_i ; // from FileReg write bus
input pcl_we_i ; // write enable for pcl
output [(`PC_Length-1):0] program_counter_o ;
input [7:0] pclath_i ; // from PCLATH reg
input force_call4_i; // force call 0004
input hold_i; // hold current address
output pcl_o ; // pcl out


reg [(`PC_Length-1):0] ProgramCounter ; // program counter
reg [(`PC_Length-1):0] stack[(`StackDepth-1):0];
reg [(`SP_Length-1):0] StackPointer;

    assign program_counter_o = ProgramCounter;
    assign pcl_o = ProgramCounter[7:0] ;

    always@( posedge clk_i ) begin
        if( por_i== 1'b1 ) begin
            ProgramCounter <= 'b0 ;
            StackPointer <= 'b0 ;
        end // if
        else if( reset_i == 1'b1 ) begin
            ProgramCounter <= 'b0 ;
        end // else if
        else if( pcl_we_i == 1'b1 ) begin
            ProgramCounter <= {pclath_i , data_i } ;
        end // else if
        else if(force_call4_i == 1'b1 ) begin
            ProgramCounter <= 'h0004 ;
            // Push note that PC is always advance
            stack[StackPointer] <= ProgramCounter ;
            StackPointer <= StackPointer + 1 ;
        end // else if
        else begin
            casex ( instruction_i )
                `Inst_GOTO : begin 
                    ProgramCounter <= {pclath_i[7:3] , instruction_i[10:0] } ;
                 end
                `Inst_CALL : begin 
                    ProgramCounter <= {pclath_i[7:3] , instruction_i[10:0] } ;
                    // Push note that PC is always advance
                    stack[StackPointer] <= ProgramCounter ;
                    StackPointer <= StackPointer + 1 ;
                 end
                `Inst_RETURN ,
                `Inst_RETFIE,
                `Inst_RETLW : begin // pop & branch
                    ProgramCounter <= stack[ StackPointer - 1 ] ;
                    StackPointer <= StackPointer - 1 ;
                end // pop
                default : begin
                    if( hold_i == 1'b1 ) begin 
                    end // if
                    else begin
                        ProgramCounter <= ProgramCounter + 1 ;
                    end // else
                end // default
            endcase // Instruction
        end // else
    end // always
endmodule // pc
// EOF pc.v


まあ,こんな感じでしょうか? 信号名は入力は最後に_iを,出力は_oをつけています.
リセットは,por_i(PowerOnReset)とreset_iの2系統にしてあります.論理合成してインプリメントする場合は同じ扱いでよいと思いますが,PICの仕様ではリセット時に不定になるレジスタがあり,シミュレーションでもそのように動作させるべく分けました.
pcl_we_iは,PCLレジスタのWriteEnableです.計算型GOTOに相当する機能ですね.分岐アドレスの計算は,PCLレジスタに書き込みの場合は,8ビット目から上をpclathで補うので,
    ProgramCounter <= {pclath_i , data_i } ;
その他リテラル命令の場合は,11ビット目から上を,pclathの3ビット目から上を補うので,
    ProgramCounter <= {pclath_i[7:3] , instruction_i[10:0] } ;
としています.
ホールドの機能は,
    if( hold_i == 1'b1 ) begin
    end // if

という記述で実現しています.条件が成立したら「何もしない」という感じです.

スタックはスタックポインターを使って実装していますが,書き上げてから気がついたのですが,所詮8レベルしかないので,シフトレジスタで書いたほうがよさそうです.また,alwaysブロックの中のif ~ else if ~ else ifとそれに続くcasexの条件は,相互排他(mutual exclusive)になっているところがあるので,論理合成時にはparallel caseにした方がよいです.
この辺は,全体が出来上がってからなおすことにしましょう.

次回は、インストラクションレジスタの予定です。
---
本日の御託
庭の芝刈りをしました.先週サボったために結構大変だった.雑草は気にせず雑草ごと刈り込みしてしまう.春先に気になっていた,スギナも毎週芝刈りをしていれば,それほど生えてはこない.一方,「野芝」が最近は目立つ.野芝はイネ科のため,芝用の除草剤でも駆除できないので,気長に手で摘み取るしかない.コガネムシの幼虫発見。そのうち、薬を撒こう。その他、カナヘビの子供2匹目撃.



PICを作ろう ,全体の構成 ~昼休みにまったり進めるプロジェクト~

具体的なコーディングをする前に,全体の構成を少し考えてみる.PICは,プログラムカウンタやステータスレジスタもSpecial Function Registerということで,通常のFile Registerと同じようにアクセスできる.だが,全体の構成を考える上で,やはりCPUとIO(Special Function Register),Memory(File Register)を分離しておいたほうが,PICのいろいろなバリエーションを実装するうえで,便利だろう.では,何をというか,どこまでCPUに含めるべきか?W-Reg,ALU辺りはいいとして,プログラムカウンタやステータスレジスタはどうだろう?無理にCPUに入れなくてもいいのだが,直接インストラクションの内容によって駆動されるかどうかで,区別して,これらはCPUに入れることにしよう.

で,プログラムカウンタ(PC)あたりから考えてみることにする.PCとスタックは一体化していると考えて,PCが行うべき動作は,
- +1 (インクリメント)
- 分岐
- サブルーチンコール
- サブルーチンからの復帰
- ホールド(割り込みサイクル)
の5種類である.したがって,PCの「命令」としては5種類である.一般的な実装では,PICそのもののインストラクションをデコードし,これらの「命令」に再度エンコードしてPCに与える.MicroChip社のPICのブロックダイアグラム(2007/7/12の日記参照)でも,Instruction Decode&Controlというのがあり、これがその機能だろうと想像できる.
もちろん,これでよいのだが,デコーダが集中していると,この部分が出来上がらないと,全体の動作の確認がしづらい.今回のように,ちんたら「開発」をしていると,すこし,「アルツ」の入っている私(笑)には困ったことになる.

そこで,このような集中デコーダではなく,PCなどの個々のモジュールに分散してデコーダを持たせることにする.このような実装にすることで,部分的に出来上がったところだけでも,CPUの動作を確認しやすくなる(はずである).また,CPUの各部の動作と「命令」の関係を直接的に記述することになるので,CPUの働きに対する理解が容易になる(誰のため?笑).論理合成によるゲートレベルへの実装には不利になるだろうが,全体の階層を崩したうえで最適化を図れば影響は軽微だろうと思う.ここまで考えると,CPUに内蔵するつもりのSpecial Function RegisterもCPUだけで完結する実装も可能だが,アドレスデコーダを分散させるのはさすがに問題がありそうなので,それはやめようと思う.
---
本日の御託
土用の丑も近いことだし,のびのびになっていた誕生日祝いで,横浜の高島屋の「野田岩」へうなぎを喰いにいった.激混みなので,順番待ちに名前を書いて,そこらで時間をつぶす.白焼きでビールを飲み,うな重を喰う.旨かったが,1時間半待つ価値があるかどうかはビミョー.


PICを作ろう ,命令の定義 ~昼休みにまったり進めるプロジェクト~

いやー,東京は激暑いね.というわけで,まず,インストラクションを定義しよう.

 
`ifdef __PIC_INSTRUCTIONS_H
`else
`define __PIC_INSTRUCTIONS_H
//
// Based on Table 15-2 PIC16F627A/628A/648A INSTRUCTION SET
// (c) 2007 BAKAOyaji
// $Id
//

// Byte oriented File Register Operations
`define INST_ADDWF 14'b00_0111_xxxx_xxxx
`defineINST_ANDWF 14'b00_0101_xxxx_xxxx
`defineINST_CLRF 14'b00_0001_1xxx_xxxx
`defineINST_CLRW 14'b00_0001_0xxx_xxxx
`defineINST_COMF 14'b00_1001_xxxx_xxxx
`defineINST_DECF 14'b00_0011_xxxx_xxxx
`defineINST_DECFSZ 14'b00_1011_xxxx_xxxx
`defineINST_INCF 14'b00_1010_xxxx_xxxx
`defineINST_INCFSZ 14'b00_1111_xxxx_xxxx
`defineINST_IORWF 14'b00_0100_xxxx_xxxx
`defineINST_MOVF 14'b00_1000_xxxx_xxxx
`defineINST_MOVWF 14'b00_0000_1xxx_xxxx
`defineINST_NOP 14'b00_0000_0xx0_0000
`defineINST_RLF 14'b00_1101_xxxx_xxxx
`defineINST_RRF 14'b00_1100_xxxx_xxxx
`defineINST_SUBWF 14'b00_0010_xxxx_xxxx
`define INST_SWAPF 14'b00_1110_xxxx_xxxx
`defineINST_XORWF 14'b00_0110_xxxx_xxxx

// BIT-Oriented File Register Operations
`define INST_BCF 14'b01_00xx_xxxx_xxxx
`defineINST_BSF 14'b01_01xx_xxxx_xxxx
`defineINST_BTFSC 14'b01_10xx_xxxx_xxxx
`defineINST_BTFSS 14'b01_11xx_xxxx_xxxx

// Literal and control Operations
`defineINST_ADDLW 14'b11_111x_xxxx_xxxx
`defineINST_ANDLW 14'b11_1001_xxxx_xxxx
`defineINST_CALL 14'b10_0xxx_xxxx_xxxx
`defineINST_CLRWDT 14'b00_0000_0110_0100
`defineINST_GOTO 14'b10_1xxx_xxxx_xxxx
`defineINST_IORLW 14'b11_1000_xxxx_xxxx
`define INST_MOVLW 14'b11_00xx_xxxx_xxxx
`define INST_RETFIE 14'b00_0000_0000_1001
`defineINST_RETLW 14'b11_01xx_xxxx_xxxx
`defineINST_RETURN 14'b00_0000_0000_1000
`defineINST_SLEEP 14'b00_0000_0110_0011
`defineINST_SUBLW 14'b11_110x_xxxx_xxxx
`defineINST_XORLW 14'b11_1010_xxxx_xxxx

`endif // `if __PIC_INSTRUCTIONS_H
// EOF pic_instructions.h



こんな感じかな。xはVerilog-HDLでは、一般的には「不定」を意味することになっているのだが、私はちょっと「不定」という用語には違和感を覚える。RTLのソースコード中ではむしろ、「無視」、あるいは「どうでもよい」の意味になる。英語では「don't care」に相当します。
たとえば、

`define INST_ADDWF  14'b00_0111_xxxx_xxxx

の下位8ビットの「x」(=don't care)は、命令のオペランドの部分なので、命令のデコードをするためには、「どうでもよい」部分ということです。
----
本日の御託
 「ラプター」について、ちょっと調べてみた。まあ、所詮「戦争の道具」だけど、男の子は飛行機はすきなのだ。
水平尾翼は一応独立した形になっているが、主翼と同一面のようだし、主翼との大きさとの比率からいっても、むしろ無尾翼機の発展型といってもいいように思う。巡航速度がマッハ1.5程度の超高速機にもかかわらず、エンジンはターボファン(!)。純粋な、ジェットエンジンってもうないんだろうね。
 ところが、米国議会は、日本には売ってくれないらしい。
「けっ、いらねいよ!」

 



PICを作ろう ,ペリフェラル ~昼休みにまったり進めるプロジェクト~

ということで,だいたいCPUの検討は終わった.PICはペリフェラルを含めてPICなので,ペリフェラルも見てみると,Timerユニットはちょっと問題ありだな.単相クロックではどうしても手に負えないところがある(残念).まあ,いいや,適当にごまかすことにしよう.
USARTとかが結構複雑みたいだ.最悪後回しにしよう.と,志を下げる.
さすがに,そろそろコーディングをを始めよう…
----
本日の御託
実は,札幌にいる.もちろん避暑とかではなくて,仕事だ.ちょっと,時間があいたので,大通り公園で焼きもろこし喰った.涼しいし,湿度も低くて本当に快適~♪


致死率75%!?

緊急事態である.我が家では,ファイルサーバーに,

玄人志向SATA2RI4-LPPCI+ Maxtor 6H500F0 × 4台

でRaid5にしてある.
 先週ふと,Arreyマネージャを見ると,Raid5のボリュームを同期している.合計1.3Tくらいあるボリュームなので,同期するのに約11時間くらいかかる.取り合えず,同期は完了したが,しばらくするとまた,同期を取り直している.よく見てると,時々HDDが1台見えなくなってしまうようだ.電源を入れなおせば,少なくともその瞬間は,ちゃんとSATAのリンクは生きている.1時間から,1日程度するとSATAのリンクが切れてしまう.
週末以外は時間をとるのは,難しいので,ファイルサーバーの電源を切っておいた.問題は,SATAのホストコントローラー側かもしれないので,会社の帰りにもう一枚SATA2RI4-LPPCIを買っておく.

 まず,問題はHDDかSATAのホストコントローラかを特定するために,問題の起きている1番のポートを他のポートに入れ替える.これで,問題が起きるポートが変わらなければ,コントローラの問題だろうし,入れ替えたポートに問題が起きるようならHDDの問題だろう.待つこと半日,結論としてHDDの問題とわかる.しょうがないので,手持ちのHGST HDT725050VLA360

と交換する.また同期に11時間かかるが,とりあえず,問題なくなった.と思ったら,また別のHDDで同じ症状が出てしまい,こちらもHDT725050VLA360に交換.今のところは問題なし.
----
本日の御託
前にも書いたけど,Maxtor 6H500F0だが,4台買ったドライブはすべて,1年以内に壊れて交換している.今回死んだ2台も交換済みのものなので,約1年半の間に8台中6台が壊れた(死亡率75%)ことになる.みな問題はSATAのインターフェースみたいだが,なんなんだMaxtor orz


PICを作ろう パイプラインの検討、割り込み編,その3 ~昼休みにまったり進めるプロジェクト~

今回は,SKIP系の命令の場合を考えます.
SKIP命令の場合は,命令のフェッチに関しては,通常の命令とまったく変わらず,SKIPする場合は,フェッチした命令を破棄することで実現しています.このときに同時にインタラプトが起きるとちょっと問題になります.
割り込みが起きた場合は,割り込み処理が終了し,元のスレッドに復帰してくるときに,スキップしなかった場合は,PC+1に,スキップする場合は,PC+2に復帰しなくてはなりません.スキップの条件を,復帰するときまで,保存するのはあまりよいやり方とは思えないので,割り込み処理ルーチンに分岐する際に,スタックに積むリターンアドレスをPC+1またはPC+2に変えてやる必要があります.
具体的には,Fig4-4,4-5のようにすればよいと思います.PC+2の「+2」のために特別にハードウェアを用意するのはもったいない(実は+1と共用できますが)ので,
CYCLE=2のとき,プログラムカウンタの値をホールドするのをやめ,普通にインクリメントさせれば,所望するアドレスになります.

これで,パイプラインの挙動に対する考察はだいたい終わりだと思います.プログラムカウンタ,インストラクションレジスタ,インタラプトコントローラもだいたいどんな機能を持たせるかもだいたい決まりました.
----
本日の御託
えー,Verilogシミュレータですが,結局Veritakを購入しました.もちろん,Basic版ですけど.
波形エディタは適当なものが見つからないので,今日と前々回の波形は,Verilogで適当なコードを書いて,Veritakの波形表示機能を使って,表示させたものを使っています.(結局これが一番簡単だったりして…)


PICを作ろう パイプラインの検討、割り込み編,その2~昼休みにまったり進めるプロジェクト~

引き続き,割り込みサイクルのパイプライン処理の挙動です.Inst(PC)が分岐命令の場合が,Fig4-2(昨日の図を見てください)になります.CYCLE=1で分岐命令が実行されるので,CYCLE=2でのプログラムカウンタの値は,分岐先になり,割り込み処理ルーチンからの復帰の際はこのアドレスに戻ってこなければなりません.

また,割り込みの発生と,割り込みをマスクをする命令の実行が重なった場合,気をつけなければならないですね.Fig.4-3のように動作すればいいと思います.この場合は,割り込みルーチンへの分岐は起きませんが,1Cycleのダミーサイクルが挿入されます.たぶん,実際のPICでも同じだと思うのですがちょっと調べようがありません.

次回は,割り込みサイクルの検討の3回目です.条件分岐(スキップ命令)の場合を考察します.

----
本日の御託
上司が離婚するらしい。この間呑んだときに、問わず語りに話したのは、

「『あれしろ、これしろ、あれするな』ってウルサいんだよねぇ…」

といっていた,なんて話を家内にしたら、

「うっ、ちょっと耳が痛いかも…『手を洗え』とか、『歯磨きしろ』とか、『鼻くそほじるな』とか、『お尻だすな』とか、『…』とか、『…』とか、言ってるかも…」

といたってマジメな顔で言うが、それを聞いていた私は、自分がつくづくダメ人間であることを改めて自覚させられる。orz.



PICを作ろう パイプラインの検討、割り込み編~昼休みにまったり進めるプロジェクト~

もう少し,パイプライン処理の挙動を考えることにしましょう.今度は割り込みの場合です.
例によって,PICmicro Mid-Range MCU Family Reference Manual(文書番号33023A)を参考にします.
11.4 TMR0 InterruptのFigure 11-4: TMR0 Interrupt Timingがだいぶ判りやすく書かれています.本物のPIC16xは4相クロックですが,しぶとく単相クロックで動作させることを考えると,上のFig4-1みたいになるでしょう.ちなみに,
 int_in 割り込み入力
 gie_X 割り込みのイネーブル
 interrupt_X 上記2つの信号のAND(CPUへの割り込み信号)
 sample_X interrupt_X のサンプリングポイント
 pc_X ProgramCounter
 Fetched_X フェッチされた命令
 Executed_X 実行される命令

問題は,CYCLE=2であらわしている,サイクルです.このサイクルは割り込み応答サイクルと考えられるでしょう.割り込み応答サイクルで行うべきはGIEのリセットとサブルーチンコールです.CYCLE=2では,PCの値をスタックに退避しておかなければなりません.
また,プログラムカウンタは,順調にインクリメントされるわけではインストラクションレジスタの「Flush」が必要です.Fig4-Xでは,PICのデータブックにあわせ,「Dummy」としていますが,要は,分岐の際の処理と同じ,と考えれば,強制NOPを実行するようにすればよいはずです.
プログラムカウンタの値は,PC→ PC+1→ PC+1→0004(インタラプトベクタ)と変化します.PC+1→ PC+1のところは,割り込みとかがなければ,PC+1→ PC+2と変化するはずですので,PC+1→ PC+1を「分岐」していると考えれば(ちょっとこじつけですね),分岐したときは,つぎのサイクルは,強制NOPという16日の日記に書いたのと同じ処理で,CYCLE=2,3のDummyサイクルを実現できそうです.
続きはまたあとで…
----
本日の御託
家内によると,夕べ私は,夜中に寝ぼけて,ひとしきり,大きく手拍子をしていたらと思ったら,また鼾をかいて寝てしまったようである.なんの夢をみていたのだろう…


FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。