2015.2.7

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

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


[第124回]


●ファンクション21

ファンクション21はランダムREADです。
ファンクション21は「ワンボードマイコンでCP/Mを!」[第394回]でテストをしています。
そこで作ったテストプログラムはVFTST21です。
VFTST21のもとになったプログラムについて「ワンボードマイコンでCP/Mを!」[第225回]で説明をしています。

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

●テストプログラムMFTST21

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

; BDOS TEST21 function21 random read
;2012/3/4 3/7 4/16 4/17 4/27
;10/1
;
        ORG $0100
        FCALL=$0005
        NMBRTBL=$0300
        FCB=$005C
        FCBR0=$007D
        FCBR1=$007E
        FCBR2=$007F
        DMA=$0080
;
        MVI C,0F;open file
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ OPENERR
;
        XRA A
        STA FCBR2
        LXI H,NMBRTBL
        PUSH H
LOOP:POP H
        MOV A,M
        STA FCBR0
        INX H
        MOV A,M
        CPI FF
        JZ END
        STA FCBR1
        INX H
        PUSH H
;
        MVI C,21;random read
        LXI D,FCB
        CALL FCALL
        ORA A
        JNZ READERR
;data disp
        LXI H,DMA
        MOV E,M
        INX H
        MOV D,M
        XCHG
        CALL HEX4DP
        CALL CRLF
        JMP LOOP
;
READERR:POP H
        ORI 30
        PUSH PSW
        LXI D,ERRT
        CALL MSGOUT
        POP PSW
        MOV E,A
        MVI C,02
        CALL FCALL
        RET
;
END:LXI D,OK
        JMP MSGOUT
;
OPENERR:LXI D,CANTOPN
MSGOUT:MVI C,09
        CALL FCALL
        RET
;
;CL & LF
CRLF:MVI A,0D
        CALL ADP
        MVI A,0A
        JMP ADP
;space disp
SPDP:MVI A,20
;A disp
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
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CPI 30;>="0"?
        RC;no
        CPI 3A;<="9"?
        JC HTOB1_2;yes,"0" to "9"
        CPI 41;>="A" ?
        RC;no
        CPI 47;<="F"?
        JC HTOB1_1
        CPI 61;>="a"?
        RC;no
        CPI 67;<="f"?
        CMC
        RC;no
HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:ANI 0F
        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
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH B
        PUSH H
        CALL B2HEX2
        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;$
OK:"end"
        DB 0D
        DB 0A
        DB 24;$
ERRT:"err "
        DB 24;$
;

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

2015/2/2  16:38  mftst21.txt
END=01F6
              ; BDOS TEST21 function21 random read
              ;2012/3/4 3/7 4/16 4/17 4/27
              ;10/1
              ;
                      ORG $0100
                      FCALL=$0005
                NMBRTBL=$0300
                      FCB=$005C
                FCBR0=$007D
                FCBR1=$007E
                FCBR2=$007F
                      DMA=$0080
              ;
0100 0E0F             MVI C,0F;open file
0102 115C00           LXI D,FCB
0105 CD0500           CALL FCALL
0108 3C               INR A;if FFH?
0109 CA5901           JZ OPENERR
              ;
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 23         INX H
011A 7E         MOV A,M
011B FEFF       CPI FF
011D CA5301     JZ END
0120 327E00     STA FCBR1
0123 23         INX H
0124 E5         PUSH H
              ;
0125 0E21       MVI C,21;random read
0127 115C00     LXI D,FCB
012A CD0500     CALL FCALL
012D B7         ORA A
012E C24101     JNZ READERR
              ;data disp
0131 218000     LXI H,DMA
0134 5E         MOV E,M
0135 23         INX H
0136 56         MOV D,M
0137 EB         XCHG
0138 CDB401     CALL HEX4DP
013B CD6201     CALL CRLF
013E C31401     JMP LOOP
              ;
0141 E1       READERR:POP H
0142 F630       ORI 30
0144 F5         PUSH PSW
0145 11F201     LXI D,ERRT
0148 CD5C01     CALL MSGOUT
014B F1         POP PSW
014C 5F         MOV E,A
014D 0E02       MVI C,02
014F CD0500     CALL FCALL
0152 C9         RET
              ;
0153 11EC01   END:LXI D,OK
0156 C35C01     JMP MSGOUT
              ;
0159 11DE01   OPENERR:LXI D,CANTOPN
015C 0E09     MSGOUT:MVI C,09
015E CD0500           CALL FCALL
0161 C9               RET
              ;
              ;CL & LF
0162 3E0D     CRLF:MVI A,0D
0164 CD6E01     CALL ADP
0167 3E0A       MVI A,0A
0169 C36E01     JMP ADP
              ;space disp
016C 3E20     SPDP:MVI A,20
              ;A disp
016E C5       ADP:PUSH B
016F E5         PUSH H
0170 5F         MOV E,A
0171 0E02       MVI C,02
0173 CD0500     CALL FCALL
0176 E1         POP H
0177 C1         POP B
0178 C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0179 7C       B2HEX4:MOV A,H
017A CD7F01     CALL B2HEX2
017D EB         XCHG
017E 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
017F F5       B2HEX2:PUSH PSW
0180 0F         RRC
0181 0F         RRC
0182 0F         RRC
0183 0F         RRC
0184 CD8E01     CALL B2HEX1
0187 57         MOV D,A
0188 F1         POP PSW
0189 CD8E01     CALL B2HEX1
018C 5F         MOV E,A
018D C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
018E E60F     B2HEX1:ANI 0F
0190 C630       ADI 30
0192 FE3A       CPI 3A
0194 D8         RC;0-9
0195 C607       ADI 07;A-F
0197 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
0198 FE30     HTOB1:CPI 30;>="0"?
019A D8         RC;no
019B FE3A       CPI 3A;<="9"?
019D DAB101     JC HTOB1_2;yes,"0" to "9"
01A0 FE41       CPI 41;>="A" ?
01A2 D8         RC;no
01A3 FE47       CPI 47;<="F"?
01A5 DAAF01     JC HTOB1_1
01A8 FE61       CPI 61;>="a"?
01AA D8         RC;no
01AB FE67       CPI 67;<="f"?
01AD 3F         CMC
01AE D8         RC;no
01AF C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
01B1 E60F     HTOB1_2:ANI 0F
01B3 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
01B4 C5       HEX4DP:PUSH B
01B5 E5         PUSH H
01B6 CD7901     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01B9 D5         PUSH D
01BA EB         XCHG
01BB CDD001     CALL DEDP
01BE D1         POP D
01BF CDD001     CALL DEDP
01C2 E1         POP H
01C3 C1         POP B
01C4 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
01C5 C5       B2HEXDP:PUSH B
01C6 E5         PUSH H
01C7 CD7F01     CALL B2HEX2
01CA CDD001     CALL DEDP
01CD E1         POP H
01CE C1         POP B
01CF C9         RET
              ;
              ;DE(asckii 2bytes) disp
01D0 D5       DEDP:PUSH D
01D1 5A         MOV E,D
01D2 0E02       MVI C,02
01D4 CD0500     CALL FCALL
01D7 D1         POP D
01D8 0E02       MVI C,02
01DA CD0500     CALL FCALL
01DD C9         RET
              ;
01DE 63616E27 CANTOPN:"can'"
01E2 74206F70         "t op"
01E6 656E21           "en!"
01E9 0D               DB 0D
01EA 0A               DB 0A
01EB 24               DB 24;$
01EC 656E64   OK:"end"
01EF 0D               DB 0D
01F0 0A               DB 0A
01F1 24               DB 24;$
01F2 65727220 ERRT:"err "
01F6 24               DB 24;$
              ;
ADP          =016E  B2HEX1       =018E  B2HEX2       =017F  
B2HEX4       =0179  B2HEXDP      =01C5  CANTOPN      =01DE  
CRLF         =0162  DEDP         =01D0  DMA          =0080  
END          =0153  ERRT         =01F2  FCALL        =0005  
FCB          =005C  FCBR0        =007D  FCBR1        =007E  
FCBR2        =007F  HEX4DP       =01B4  HTOB1        =0198  
HTOB1_1      =01AF  HTOB1_2      =01B1  LOOP         =0114  
MSGOUT       =015C  NMBRTBL      =0300  OK           =01EC  
OPENERR      =0159  READERR      =0141  SPDP         =016C   

●MFTST21の実行

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

あれ?
エラーになってしまいました。
ああ、そうでした。
実は前回のファンクション22(ランダムWRITE)のテストのあと、今回のテストまでちょっと間が空いていたため、その間MYCPU80の電源をOFFにしておりました。
前回のファンクション22(ランダムWRITE)のテストと同様、今回のテストもトランジェントエリアの空きスペースにレコード番号表データを作成しておく必要がありました。
MYCPU80の電源をOFFにしたため、前回のテストで作成したレコード番号表データが失われてしまったのでした。
MYCPU80上にあるアドレス8000〜FFFFのRAMはボタン電池でバックアップしていますから、電源を切ってもRAMのデータは保持されますが、増設RAMボード上のRAM(アドレス0000〜7FFF)はバックアップされていないため、電源を切るとRAMの内容は失われてしまいます。
そこで前回と同じようにMRAFTDOTを実行してレコード番号表データを作成しました。

そのあと、もう一度MFTST21を実行したところ、今度は正しく実行できたようです。


MYCPU80でCP/Mを![第124回]
2015.2.7upload

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