2015.2.6

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

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


[第123回]


●ファンクション22

ファンクション22はランダムWRITEです。
ファンクション22は「ワンボードマイコンでCP/Mを!」[第216回]から「ワンボードマイコンでCP/Mを!」[第224回]で試行錯誤しながらテストをしています。
その後にCP/M互換DOSを大幅に修正したため、再テストが必要になりました。
結局「ワンボードマイコンでCP/Mを!」[第393回]で最終的なテストを行ないました。
そこで作ったテストプログラムはVFTST20Bです。
またレコード番号表プログラムRAFTDOUTも作りました。

テストプログラムVFTST20Bのソースプログラムをインテルニーモニックに書き直してMFTST20Bを作りました。

●テストプログラムMFTST20B

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

; BDOS TEST20-2 function22 random write
;2012/3/4 3/7 4/16 4/17 4/27
;9/15
;
        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,22;random write
        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;$
;

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

2015/2/1  9:38  mftst20b.txt
END=0200
              ; BDOS TEST20-2 function22 random write
              ;2012/3/4 3/7 4/16 4/17 4/27
              ;9/15
              ;
                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 0E22       MVI C,22;random write
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  

●レコード番号表プログラムMRAFTDOT

レコード番号表プログラムRAFTDOUTのソースプログラムをインテルニーモニックに書き直してMRAFTDOTを作りました。
MRAFTDOTのソースプログラムです。

;raf test data sakusei
;2013/4/20
;
        ORG $0100
        LXI D,$0300
        LXI H,DATA
LOOP:MOV C,M
        INX H
        MOV B,M
        XCHG
        MOV M,C
        INX H
        MOV M,B
        XCHG
        INX H
        INX D
        INX B
        MOV A,B
        ORA C
        JNZ LOOP
        RET
DATA:DW $01A2
DW $03B5
DW $009E
DW $0044
DW $03B6
DW $01A7
DW $009F
DW $009A
DW $03B3
DW $01A5
DW $0098
DW $0047
DW $0042
DW $0028
DW $00C7
DW $0182
DW $03E5
DW $FFFF

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

2015/2/1  9:38  mraftdot.txt
END=013A
              ;raf test data sakusei
              ;2013/4/20
              ;
                ORG $0100
0100 110003     LXI D,$0300
0103 211701     LXI H,DATA
0106 4E       LOOP:MOV C,M
0107 23         INX H
0108 46         MOV B,M
0109 EB         XCHG
010A 71         MOV M,C
010B 23         INX H
010C 70         MOV M,B
010D EB         XCHG
010E 23         INX H
010F 13         INX D
0110 03         INX B
0111 78         MOV A,B
0112 B1         ORA C
0113 C20601     JNZ LOOP
0116 C9         RET
0117 A201     DATA:DW $01A2
0119 B503     DW $03B5
011B 9E00     DW $009E
011D 4400     DW $0044
011F B603     DW $03B6
0121 A701     DW $01A7
0123 9F00     DW $009F
0125 9A00     DW $009A
0127 B303     DW $03B3
0129 A501     DW $01A5
012B 9800     DW $0098
012D 4700     DW $0047
012F 4200     DW $0042
0131 2800     DW $0028
0133 C700     DW $00C7
0135 8201     DW $0182
0137 E503     DW $03E5
0139 FFFF     DW $FFFF
              
DATA         =0117  LOOP         =0106  

●MRAFTDOTの実行

「ワンボードマイコンでCP/Mを!」[第393回]にしたがって、C.VFDを削除してからZB3BASICを起動してCP/M互換DOSにエントリしました。


MFTST20B.COMとMRAFTDOT.COMをCドライブにコピーしてから、MRAFTDOTを実行しました。


●MFTST20Bの実行

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


RAM上にレコード番号表が作成されたことを確認するため、ここで一旦CP/Mモードを終了してZB3BASICに戻りました。

●VFDUMPの実行

「ワンボードマイコンでCP/Mを!」[第393回]でのテストと同じように、DM@コマンドで0300〜に作成されたレコード番号データを表示させてみました。
そのあと/EXIT[Enter]
でZB3DOSを終了しました。

VFDUMPを実行して、仮想Cドライブの中身を確認しています。
VFDUMP[Enter]
でドライブbフ入力要求が表示されます。
C[Enter]
と入力すると、セクタ番号の入力になりますから、
0[Enter]
と入力します。
セクタ0の内容が表示されました。
TEST.RAFのFCBが複数作成されています。

1[Enter]
と入力してセクタ1を表示させました。


レコードデータが書き込まれたセクタも確認してみました。
最後のデータ03E5の書き込まれたセクタを見てみます。
03E5はエクステントbO7のレコード65Hになります(「ワンボードマイコンでCP/Mを!」[第223回]参照)。
エクステント内レコードの65Hはブロック06のレコード05です。
エクステント07のブロック06のところを見ますと、000Bになっています。
ブロックナンバー000BのbO5セクタに03E5のデータがあることになります。
ブロック番号とセクタ番号から、先頭を0000とするセクタb求めます。
000Bを1桁シフトして000B0として、そこに5を加算した000B5を10進数に直します。
B5の10進数は181です。
セクタbP81を表示させました。


MYCPU80でCP/Mを![第123回]
2015.2.6upload

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