2015.2.9

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

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


[第126回]


●ファンクション28

ファンクション28は空きを00で埋めるランダムWRITEです。
ファンクション28は「ワンボードマイコンでCP/Mを!」[第229回]「ワンボードマイコンでCP/Mを!」[第232回]で説明をしています。
そこではファンクション22用のテストプログラムをもとにして、ファンクション22をコールしているところをファンクション28コールに置き換えたものを使ってテストを行ないました。
ND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)のファンクション28の最終的なテストは「ワンボードマイコンでCP/Mを!」[第395回]で行ないました。
そこでは「ワンボードマイコンでCP/Mを!」[第393回]で作ったVFTST20Bのファンクション22コールをファンクション28コールに置き換えてVFTST20Cを作りました。

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

●テストプログラムMFTST20C

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

; BDOS TEST20-2 function22 random write
;2012/3/4 3/7 4/16 4/17 4/27
;9/15
;2013/5/14
;
        ORG $0100
        FCALL=$0005
        NMBRTBL=$0300
        FCB=$005C
        FCBR0=$007D
        FCBR1=$007E
        FCBR2=$007F
        DMA=$0080
;
        MVI C,16;make file
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ DFULERR
;
        XRA A
        STA FCBR2
        LXI H,NMBRTBL
        PUSH H
LOOP:POP H
        MOV A,M
        STA FCBR0
        MOV C,A
        INX H
        MOV A,M
        CPI FF
        JZ CLOSE
        STA FCBR1
        MOV B,A
        INX H
        PUSH H
        MOV H,B
        MOV L,C
        CALL HEX4DP
        CALL CRLF
;data fill
        LXI H,DMA
        MVI D,40
LOOP2:MOV M,C
        INX H
        MOV M,B
        INX H
        DCR D
        JNZ LOOP2
;
        MVI C,28;random write with 00
        LXI D,FCB
        CALL FCALL
        ORA A
        JZ LOOP
        POP H
        ORI 30
        PUSH PSW
        LXI D,ERRT
        CALL MSGOUT
        POP PSW
        MOV E,A
        MVI C,02
        CALL FCALL
        RET
;
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
;
;CL & LF
CRLF:MVI A,0D
        CALL ADP
        MVI A,0A
ADP:PUSH B
        PUSH H
        MOV E,A
        MVI C,02
        CALL FCALL
        POP H
        POP B
        RET
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:MOV A,H
        CALL B2HEX2
        XCHG
        MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH PSW
        RRC
        RRC
        RRC
        RRC
        CALL B2HEX1
        MOV D,A
        POP PSW
        CALL B2HEX1
        MOV E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:ANI 0F
        ADI 30
        CPI 3A
        RC;0-9
        ADI 07;A-F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH B
        PUSH H
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH D
        XCHG
        CALL DEDP
        POP D
        CALL DEDP
        POP H
        POP B
        RET
;DE(asckii 2bytes) disp
DEDP:PUSH D
        MOV E,D
        MVI C,02
        CALL FCALL
        POP D
        MVI C,02
        CALL FCALL
        RET
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
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;$
ERRT:"err "
        DB 24;$
;

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

2015/2/2  23:9  mftst20c.txt
END=0200
              ; BDOS TEST20-2 function22 random write
              ;2012/3/4 3/7 4/16 4/17 4/27
              ;9/15
              ;2013/5/14
              ;
                ORG $0100
                FCALL=$0005
                NMBRTBL=$0300
                FCB=$005C
                FCBR0=$007D
                FCBR1=$007E
                FCBR2=$007F
                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 CA6C01           JZ DFULERR
              ;
010C AF               XRA A
010D 327F00           STA FCBR2
0110 210003     LXI H,NMBRTBL
0113 E5         PUSH H
0114 E1       LOOP:POP H
0115 7E         MOV A,M
0116 327D00     STA FCBR0
0119 4F         MOV C,A
011A 23         INX H
011B 7E         MOV A,M
011C FEFF       CPI FF
011E CA5A01     JZ CLOSE
0121 327E00     STA FCBR1
0124 47         MOV B,A
0125 23         INX H
0126 E5         PUSH H
0127 60         MOV H,B
0128 69         MOV L,C
0129 CDAC01     CALL HEX4DP
012C CD7B01     CALL CRLF
              ;data fill
012F 218000     LXI H,DMA
0132 1640       MVI D,40
0134 71       LOOP2:MOV M,C
0135 23         INX H
0136 70         MOV M,B
0137 23         INX H
0138 15         DCR D
0139 C23401     JNZ LOOP2
              ;
013C 0E28       MVI C,28;random write with 00
013E 115C00     LXI D,FCB
0141 CD0500     CALL FCALL
0144 B7         ORA A
0145 CA1401     JZ LOOP
0148 E1         POP H
0149 F630       ORI 30
014B F5         PUSH PSW
014C 11FC01     LXI D,ERRT
014F CD7501     CALL MSGOUT
0152 F1         POP PSW
0153 5F         MOV E,A
0154 0E02       MVI C,02
0156 CD0500     CALL FCALL
0159 C9         RET
              ;
015A 0E10     CLOSE:MVI C,10;close
015C 115C00     LXI D,FCB
015F CD0500     CALL FCALL
0162 3C         INR A;if FFH?
0163 CA7201     JZ CLOSERR
0166 11F501     LXI D,OK
0169 C37501     JMP MSGOUT
              ;
016C 11D901   DFULERR:LXI D,DFULL
016F C37501     JMP MSGOUT
0172 11E601   CLOSERR:LXI D,CANTCLS
0175 0E09     MSGOUT:MVI C,09
0177 CD0500           CALL FCALL
017A C9               RET
              ;
              ;CL & LF
017B 3E0D     CRLF:MVI A,0D
017D CD8201     CALL ADP
0180 3E0A       MVI A,0A
0182 C5       ADP:PUSH B
0183 E5         PUSH H
0184 5F         MOV E,A
0185 0E02       MVI C,02
0187 CD0500     CALL FCALL
018A E1         POP H
018B C1         POP B
018C C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
018D 7C       B2HEX4:MOV A,H
018E CD9301     CALL B2HEX2
0191 EB         XCHG
0192 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0193 F5       B2HEX2:PUSH PSW
0194 0F         RRC
0195 0F         RRC
0196 0F         RRC
0197 0F         RRC
0198 CDA201     CALL B2HEX1
019B 57         MOV D,A
019C F1         POP PSW
019D CDA201     CALL B2HEX1
01A0 5F         MOV E,A
01A1 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
01A2 E60F     B2HEX1:ANI 0F
01A4 C630       ADI 30
01A6 FE3A       CPI 3A
01A8 D8         RC;0-9
01A9 C607       ADI 07;A-F
01AB C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
01AC C5       HEX4DP:PUSH B
01AD E5         PUSH H
01AE CD8D01     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01B1 D5         PUSH D
01B2 EB         XCHG
01B3 CDBD01     CALL DEDP
01B6 D1         POP D
01B7 CDBD01     CALL DEDP
01BA E1         POP H
01BB C1         POP B
01BC C9         RET
              ;DE(asckii 2bytes) disp
01BD D5       DEDP:PUSH D
01BE 5A         MOV E,D
01BF 0E02       MVI C,02
01C1 CD0500     CALL FCALL
01C4 D1         POP D
01C5 0E02       MVI C,02
01C7 CD0500     CALL FCALL
01CA C9         RET
              ;
01CB 63616E27 CANTOPN:"can'"
01CF 74206F70         "t op"
01D3 656E21           "en!"
01D6 0D               DB 0D
01D7 0A               DB 0A
01D8 24               DB 24;$
01D9 6469736B DFULL:"disk"
01DD 2066756C         " ful"
01E1 6C21             "l!"
01E3 0D               DB 0D
01E4 0A               DB 0A
01E5 24               DB 24;$
01E6 63616E27 CANTCLS:"can'"
01EA 7420636C         "t cl"
01EE 6F736521         "ose!"
01F2 0D               DB 0D
01F3 0A               DB 0A
01F4 24               DB 24;$
01F5 646F6E65 OK:"done"
01F9 0D               DB 0D
01FA 0A               DB 0A
01FB 24               DB 24;$
01FC 65727220 ERRT:"err "
0200 24               DB 24;$
              ;
ADP          =0182  B2HEX1       =01A2  B2HEX2       =0193  
B2HEX4       =018D  CANTCLS      =01E6  CANTOPN      =01CB  
CLOSE        =015A  CLOSERR      =0172  CRLF         =017B  
DEDP         =01BD  DFULERR      =016C  DFULL        =01D9  
DMA          =0080  ERRT         =01FC  FCALL        =0005  
FCB          =005C  FCBR0        =007D  FCBR1        =007E  
FCBR2        =007F  HEX4DP       =01AC  LOOP         =0114  
LOOP2        =0134  MSGOUT       =0175  NMBRTBL      =0300  
OK           =01F5  

●MFTST20Cの実行

MFTST20Cを使ったファンクション28のテストは「ワンボードマイコンでCP/Mを!」[第395回]でのテスト作業をそのまま踏襲して行ないます。
最初に
ERASE B.VFD[Enter]
を実行して仮想Bドライブを削除しました。
仮想FDDをクリアするにはこれが一番簡単な方法です。
それからZB3DOSを起動します。

/CPM[Enter]
と入力してCP/M互換DOSモードにエントリすると、Bドライブが自動作成されます。

MFTST20C.COMをZドライブからコピーします。
後で作成されるTEST.RAFのセクタb仮想Cドライブと同じになるようにするために、MRAFTDOT.COMもコピーしておきます。
「ワンボードマイコンでCP/Mを!」[第395回]を開いて、その画像をバックにして、同じ操作をします。

MRAFTDOT.COMを実行しておいてから、MFTST20C.COMを実行します。
MFTST20C TEST.RAF[Enter]
と入力します。

TEST.RAFが作成されました。
DIRコマンドで確認しています。


ここからはVFDUMPでの確認です。
/EXIT[Entsr]
でZB3DOSを終了します。

VFDUMP[Enter]
と入力するとドライブ名の入力を要求されますから
B[Enter]
と入力します。
セクタbニして 0 を入力します。
ディレクトリが表示されました。

TEST.RAFの2番目のエクステント(ディレクトリ)の一番若いブロックbヘ0004です。
ブロック0004の先頭のセクタはbU4です(1ブロックは16セクタなので、16×4=64)。
セクタ64から順に表示させてみます。
まず64、65、66を表示させました。
セクタ66にデータ01A2が書かれています。


続いてセクタ67、68、69を表示させました。
セクタ69にデータ01A5が書かれています。
その間の64、65、67、68は00で埋められています。


比較のために仮想CドライブのTEST.RAFも同じように表示させてみます。


セクタ66にデータ01A2が書かれていますが、その前の64、65には何も書かれていなくて、フォーマットされたときのまま、E5が書かれています。


MYCPU80でCP/Mを![第126回]
2015.2.9upload

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