マイコン独立大作戦
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
前へ
次へ
ホームページトップへ戻る