2017.9.11
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
ROM/RAM/RTCボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
作戦その3は、SDカードインターフェースです。
作戦その4は、ROM/RAM/RTCボードです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第23回]


●LOGデータファイル作成プログラム

やっと増設RAMのアクセスプログラムが収まるべきところに落ち着きました。
いよいよ本題のログファイルの作成にかかります。
ログファイル作成は、システムルーチンにあります1文字を画面に表示するルーチンに組み込んで、画面に表示すると同時に増設RAMのログバッファにも書き込むようにするものです。
画面表示ルーチンへの組込みは最終的にプログラムが完成して動作テストが完了したあとで行ないます。
それまでは1文字のデータを連続してログファイル作成プログラムに送ることでログファイルが正しく作成される、というところまでを順を追ってテストしていきます。

前回までのところで、増設RAMの任意の場所にデータを書き込み、それを読み出すプログラムを作成しました。
ログファイルはSDカードに作成します。
SDカードはセクタ単位(512バイト)で書き込みますから、512バイトのバッファを増設RAMに設けます。
そのアドレスはどこでもよいのですが、カラーキャラクタディイプレイのための画面バッファエリアをEFバンクの7800〜7FCFに設けました(カラーキャラクタディスプレイインターフェースの製作[第5回])から、その近くということで同じEFバンクの7000〜71FFを使うことにしました。

文字データはバッファの先頭から順に格納されていきます。
バッファが一杯になるまでは、バッファに書き込んだらそれだけでメインプログラムにリターンします。
バッファが一杯になったときが正念場です(ここがむつかしいところです。果たしてうまくいきますかどうか)。
バッファが一杯になると、SDカードのファイル書き込みプログラムをコールしてログファイルデータを1セクタ分書き込みます。

下はSDカードプログラムの先頭のジャンプテーブルの部分です。

9000 C3E293     JP LD
9003 C3BD94     JP SV
9006 C36197     JP LOAD
9009 C3A396     JP SAVE
900C C32E96     JP DIR;DIR disp
900F C33E98     JP DELETE
9012 C37198     JP RENAME
9015 C3F499     JP TSDLD
9018 C38E9A     JP TSDSV
901B C31C9A     JP SDLD
901E C3099B     JP SDSV
9021 C3AF98     JP CPMFMT
              ;for cp/m
9024 C36091     JP SCTRD
9027 C39F91     JP SCTWR
902A C32A93     JP DTADRSSET
902D C31094     JP NAMESET
9030 C35A93     JP LDSUB12;=set cf if error
9033 C34491     JP DIRRD
9036 C31298     JP DTBFCLR
9039 C32198     JP ZDIRCLR
903C C36F90     JP SDINIT
903F C30A96     JP ZDIR
9042 C37795     JP SVSB
9045 C35495     JP NXTCLSET
9048 C30693     JP NEXTCLSRC
904B C31C96     JP LDIR;not z80 command
904E C39B9B     JP LOGOPEN
9051 C3FB9B     JP LOGWR
9054 C3909C     JP LOGCLOSE

アドレス9051のジャンプ先、LOGWRがログファイル作成プログラムです。
下がLOGWRの部分です。

              ;
9BFB E5       LOGWR:PUSH HL
9BFC 2ACCF4     LD HL,(LBFADRS)
9BFF C5         PUSH BC
9C00 4F         LD C,A
9C01 3EEF       LD A,EF
9C03 EB         EX DE,HL
9C04 CDA0E9     CALL BKWR
9C07 EB         EX DE,HL
9C08 23         INC HL
9C09 7C         LD A,H
9C0A FE72       CP 72;buffer full?
9C0C CA159C     JP Z,LOGWR2
9C0F 22CCF4     LD (LBFADRS),HL
9C12 C1         POP BC
9C13 E1         POP HL
9C14 C9         RET
9C15 210002   LOGWR2:LD HL,$0200
9C18 22CEF4   LOGWR3:LD (LOGBFDATA),HL
9C1B D5         PUSH DE
9C1C CDA09C     CALL DTBFBKUP
9C1F 210070     LD HL,LOGBF
9C22 1100EA     LD DE,DATABF
9C25 CDA69C     CALL DTBFBKUP1
9C28 CDDB9B     CALL LOGBFCLR
              ;log sector write
9C2B 21C2F4     LD HL,LDTSCTNO
9C2E 7E         LD A,(HL)
9C2F 23         INC HL
9C30 4E         LD C,(HL)
9C31 23         INC HL
9C32 46         LD B,(HL)
9C33 2100EA     LD HL,DATABF
9C36 CD9F91     CALL SCTWR
              ;log dir write
9C39 CDB79C     CALL DIRBFBKUP
9C3C CDD29C     CALL LDIRBFRET
9C3F 2AEAE9     LD HL,(FSIZEADRS)
9C42 5E         LD E,(HL)
9C43 23         INC HL
9C44 56         LD D,(HL)
9C45 E5         PUSH HL
9C46 2ACEF4     LD HL,(LOGBFDATA)
9C49 19         ADD HL,DE
9C4A EB         EX DE,HL
9C4B E1         POP HL
9C4C 72         LD (HL),D
9C4D 2B         DEC HL
9C4E 73         LD (HL),E
9C4F CDC99C     CALL LDIRBFBKUP
9C52 2AC0F4     LD HL,(LDIRADRSNOW)
9C55 CD5591     CALL DIRWR1
9C58 3ACFF4     LD A,(LOGBFDATAH)
9C5B FE02       CP 02
9C5D C27B9C     JP NZ,LOGWR41;LOGCLOSE
9C60 21C2F4     LD HL,LDTSCTNO
9C63 7E         LD A,(HL)
9C64 C601       ADD A,01
9C66 77         LD (HL),A
9C67 23         INC HL
9C68 7E         LD A,(HL)
9C69 CE00       ADC A,00
9C6B 77         LD (HL),A
9C6C 23         INC HL
9C6D 7E         LD A,(HL)
9C6E CE00       ADC A,00
9C70 77         LD (HL),A
              ;
9C71 3ACAF4     LD A,(LSCTCNTR)
9C74 3D         DEC A
9C75 CA859C     JP Z,LOGWR5;this cluster is end
9C78 32CAF4   LOGWR4:LD (LSCTCNTR),A
9C7B CDAE9C   LOGWR41:CALL DTBFRET
9C7E CDC09C     CALL DIRBFRET
9C81 D1         POP DE
9C82 C1         POP BC
9C83 E1         POP HL
9C84 C9         RET
              ;next cluster set
9C85 CD5495   LOGWR5:CALL NXTCLSET
9C88 CDDB9B     CALL LOGBFCLR
9C8B 3E40       LD A,40
9C8D C3789C     JP LOGWR4

9BFBから9C14までがLOGWRの本体です。
ここでは特に難しいことはしていません。
増設RAMのログ用バッファにデータを書いていくだけです。
9C0Aでバッファフルかどうかをチェックしています。
バッファは7000〜71FFですから、アドレスカウンタが7200になったらバッファフルです。
そこからあとがちょいと面倒なことをやっています。
ここを解説するのはちょっと難しいです。
ですのでここはさらりと流してしまいます(悪しからず)。

ログファイルをSDカードに書き込むには、普通のSDカードのファイルセーブルーチンを使います。
そこに大きな問題があります。
ログファイルの作成プログラムは常時スタンバイしていて、画面に1文字が表示されるのと同時に起動する仕組みです。
そしてバッファが一杯になるとSDカードのファイルセーブルーチンがコールされます。
その直前にディレクトリやファイルのセーブ、ロードなどが行なわれていると、SDカードのディレクトリバッファやデータバッファには、そのときのデータが読み出されたり、書き込み途中だったりする可能性があります。
そこでログファイルのセーブルーチンが動く前に、それらのバッファの内容を一時退避させておいて、ログファイルのセーブが終わったら元に戻す、という面倒なことをやっているのです。

下は各バッファの退避のためのルーチンです。

9CA0 2100EA   DTBFBKUP:LD HL,DATABF
9CA3 110072     LD DE,DTBFBF
9CA6 3EEF     DTBFBKUP1:LD A,EF
9CA8 010002     LD BC,$0200
9CAB C3B0E9     JP BKMV
9CAE 210072   DTBFRET:LD HL,DTBFBF
9CB1 1100EA     LD DE,DATABF
9CB4 C3A69C     JP DTBFBKUP1
9CB7 2100EE   DIRBFBKUP:LD HL,DIRBF
9CBA 110074     LD DE,DIRBFBF
9CBD C3A69C     JP DTBFBKUP1
9CC0 210074   DIRBFRET:LD HL,DIRBFBF
9CC3 1100EE     LD DE,DIRBF
9CC6 C3A69C     JP DTBFBKUP1
9CC9 2100EE   LDIRBFBKUP:LD HL,DIRBF
9CCC 110076     LD DE,LDIRBF
9CCF C3A69C     JP DTBFBKUP1
9CD2 210076   LDIRBFRET:LD HL,LDIRBF
9CD5 1100EE     LD DE,DIRBF
9CD8 C3A69C     JP DTBFBKUP1

データバッファの「バッファ」はEFバンクの7200〜73FFに置いています。
ディレクトリバッファの「バッファ」はEFバンクの7400〜75FFに置いています。
ログディレクトリバッファの「バッファ」はEFバンクの7600〜77FFに置いています。

ちょいとややこしい考え方なのですが、こういういかにもコンピュータ的なプログラムがうまく動いてくれると、「やったぜ!」という気分になります。
ちなみに私はこういうややこしいプログラムを書くときでもフローチャートは書きません。
ノートに覚え程度のメモを書いておくだけで、いきなりプログラムを書いてしまいます。
自分でもよくわからないのですけれど、フローは頭の中に自然に浮かんでくるようです。

ROM/RAM/RTCボードの製作[第23回]
2017.9.11upload

前へ
次へ
ホームページトップへ戻る