2015.2.10

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第127回]


●ファンクション24

ファンクション24については「ワンボードマイコンでCP/Mを!」[第233回]で説明をしています。
ちょっとどう使うのかよくわからないファンクションだと書いています。
実はそれ以前に、「ワンボードマイコンでCP/Mを!」[第111回]「ワンボードマイコンでCP/Mを!」[第113回]で最初のテストを行なっています。
「ワンボードマイコンでCP/Mを!」[第233回]では結局「ワンボードマイコンでCP/Mを!」[第111回]と同じことをやって確かめているようです。
そのあと都合3回にわたってテストをしていますが、最初はまずテストプログラムVFTST23を作って、シーケンシャルファイルTEST.SAFを作成しています。

で、いつものようにテストプログラムVFTST23のソースプログラムをインテルニーモニックに書き直してMFTST23を作りました。

●テストプログラムMFTST23

MFTST23のソースプログラムです。

; BDOS VFTST23 sequential file make
;ftom ftst5cpy.txt
;2012/3/4 3/7
;2012/4/30
;10/17
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        DMA=$0080
;
        MVI C,16;make file
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ DFULERR
;
        XRA A
        STA RECNO
        LXI B,$0000
;
LOOP:MVI E,40
        LXI H,DMA
LOOP1:MOV M,C
        INX H
        MOV M,B
        INX H
        DCR E
        JNZ LOOP1
        PUSH B
        PUSH D
        MVI C,15;write
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        POP D
        POP B
        JZ DFULERR
        INX B
        MOV A,B
        CPI 02
        JNZ LOOP
;
CLOSE:MVI C,10;close
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ CLOSERR
        LXI D,OK
        JMP MSGOUT
;
DFULERR:LXI D,DFULL
        JMP MSGOUT
CLOSERR:LXI D,CANTCLS
MSGOUT:MVI C,09
        CALL FCALL
        RET
;
DFULL:"disk"
        " ful"
        "l!"
        DB 0D
        DB 0A
        DB 24;$
CANTCLS:"can'"
        "t cl"
        "ose!"
        DB 0D
        DB 0A
        DB 24;$
OK:"done"
        DB 0D
        DB 0A
        DB 24;$
;

下はMFTST23のアセンブルリストです。

2015/2/3  15:12  mftst23.txt
END=017A
              ; BDOS VFTST23 sequential file make
              ;ftom ftst5cpy.txt
              ;2012/3/4 3/7
              ;2012/4/30
              ;10/17
              ;
                      ORG $0100
                      FCALL=$0005
                      FCB=$005C
                      RECNO=$007C
                      DMA=$0080
              ;
0100 0E16       MVI C,16;make file
0102 115C00     LXI D,FCB
0105 CD0500     CALL FCALL
0108 3C         INR A;if FFH?
0109 CA4901     JZ DFULERR
              ;
010C AF               XRA A
010D 327C00           STA RECNO
0110 010000     LXI B,$0000
              ;
0113 1E40     LOOP:MVI E,40
0115 218000     LXI H,DMA
0118 71       LOOP1:MOV M,C
0119 23         INX H
011A 70         MOV M,B
011B 23         INX H
011C 1D         DCR E
011D C21801     JNZ LOOP1
0120 C5         PUSH B
0121 D5         PUSH D
0122 0E15       MVI C,15;write
0124 115C00     LXI D,FCB
0127 CD0500     CALL FCALL
012A 3C         INR A;if FFH?
012B D1         POP D
012C C1         POP B
012D CA4901     JZ DFULERR
0130 03         INX B
0131 78         MOV A,B
0132 FE02       CPI 02
0134 C21301     JNZ LOOP
              ;
0137 0E10     CLOSE:MVI C,10;close
0139 115C00     LXI D,FCB
013C CD0500     CALL FCALL
013F 3C         INR A;if FFH?
0140 CA4F01     JZ CLOSERR
0143 117401     LXI D,OK
0146 C35201     JMP MSGOUT
              ;
0149 115801   DFULERR:LXI D,DFULL
014C C35201     JMP MSGOUT
014F 116501   CLOSERR:LXI D,CANTCLS
0152 0E09     MSGOUT:MVI C,09
0154 CD0500           CALL FCALL
0157 C9               RET
              ;
0158 6469736B DFULL:"disk"
015C 2066756C         " ful"
0160 6C21             "l!"
0162 0D               DB 0D
0163 0A               DB 0A
0164 24               DB 24;$
0165 63616E27 CANTCLS:"can'"
0169 7420636C         "t cl"
016D 6F736521         "ose!"
0171 0D               DB 0D
0172 0A               DB 0A
0173 24               DB 24;$
0174 646F6E65 OK:"done"
0178 0D               DB 0D
0179 0A               DB 0A
017A 24               DB 24;$
              ;
CANTCLS      =0165  CLOSE        =0137  CLOSERR      =014F  
DFULERR      =0149  DFULL        =0158  DMA          =0080  
FCALL        =0005  FCB          =005C  LOOP         =0113  
LOOP1        =0118  MSGOUT       =0152  OK           =0174  
RECNO        =007C  

●MFTST23の実行

結果を分かりやすくするため、Bドライブをフォーマットし直してから、そこにMFTST23.COMをコピーして、テストをすることにしました。


「ワンボードマイコンでCP/Mを!」[第233回]を開いてその画像をバックにして、MFTST23を実行しました。



DIRコマンドを実行してシーケンシャルファイルTEST.SAFが作成されたことを確認し、そこでCP/M互換DOSを終了しました。

●TEST.SAFの中身の確認

VFDUMPを使って、TEST.SAFの中身を確認してみました。
まずはディレクトリの内容の確認です。



TEST.SAFのFCBは4つ作成されています。
ブロックbO003から0022Hまでが使われています。
全部で32ブロックです。
MFTST23はレコードbO000Hから0200Hまで512個のレコードからなるシーケンシャルファイルを作成します。
1ブロックは16セクタで、1レコードに1セクタが使われますから、
512/16=32ブロックです。
計算は合っています。

それでは書き込まれたレコードの中身を確認してみます。
最初と最後の数レコードを抽出して確かめてみます。
最初のレコードはブロックbO003の先頭のセクタです。
VFDUMPでのセクタbヘ10進数を与えます。
ブロックbO003の先頭のセクタbヘ、次の計算で求められます(とても簡単です)。

3×16=48

セクタbS8と49の中身を表示させました。



最初のレコードには0000、次のレコードには0001が書き込まれています。
正しく実行されているようです。

次に最後のデータはどうでしょうか。
最後のブロックbヘ0022Hです。
その先頭のセクタb計算してみます。
22Hを10進数に直します。
34です。

34×16=544

そのブロックの最後のセクタbヘ、35×16−1で求められます(次のブロックの先頭セクタa|1)。
559です。
セクタbT44と559の中身を表示させてみました。



最後まで正しく実行されているようです。

MYCPU80でCP/Mを![第127回]
2015.2.10upload

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