2015.2.13

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

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


[第129回]


●ファンクション24(3)

前々回、前回と同様に今回も以前に行なったファンクション24のテストをそのまま踏襲します。
以前に行なったテストは「ワンボードマイコンでCP/Mを!」[第233回]から「ワンボードマイコンでCP/Mを!」[第235回]で行ないました。
今回は「ワンボードマイコンでCP/Mを!」[第235回]と同じテストを行ないます。
「ワンボードマイコンでCP/Mを!」[第235回]ではその前に作ったVFTST24にファンクションコール24を追加したVFTST25作り、そのファンクションコールによって、ランダムアクセスのためのレコードbェFCB上に作成されることを確認しました。

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

●テストプログラムMFTST25

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

; BDOS VFTST25 function call 24
; from ftest4-1.txt & ftest3dm.txt
;2012/2/28
;4/30
;10/18
;from vftst24.txt & ftst25.txt 10/21
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        FCBR0=$007D
        FCBR1=$007E
        FCBR2=$007F
        DMA=$0080
;
        MVI C,0F;open
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ ERR
        XRA A
        STA RECNO
;
LOOP1:MVI C,14;read
        LXI D,FCB
        CALL FCALL
        ORA A
        RNZ;read end
;
        LDA RECNO
        CALL B2HEXDP
        MVI A,28;(
        CALL ADP
        LXI H,DMA
        MOV C,M
        INX H
        MOV A,M
        CALL B2HEXDP
        MOV A,C
        CALL B2HEXDP
        MVI A,29;)
        CALL ADP
        MVI A,5B;[
        CALL ADP
        LXI D,FCB
        MVI C,24
        CALL FCALL
        LDA FCBR2
        CALL B2HEXDP
        CALL SPDP
        LDA FCBR1
        CALL B2HEXDP
        CALL SPDP
        LDA FCBR0
        CALL B2HEXDP
        MVI A,5D;]
        CALL ADP
        CALL SPDP
        CALL SPDP
        JMP LOOP1
;
;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
;
ERR:LXI D,ERRMSG
        MVI C,09
        CALL FCALL
        RET
ERRMSG:"can'"
        "t op"
        "en"
        DB 0D
        DB 0A
        DB 24;$
;

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

2015/2/3  15:15  mftst25.txt
END=01FB
              ; BDOS VFTST25 function call 24
              ; from ftest4-1.txt & ftest3dm.txt
              ;2012/2/28
              ;4/30
              ;10/18
              ;from vftst24.txt & ftst25.txt 10/21
              ;
                      ORG $0100
                      FCALL=$0005
                      FCB=$005C
                      RECNO=$007C
                FCBR0=$007D
                FCBR1=$007E
                FCBR2=$007F
                      DMA=$0080
              ;
0100 0E0F             MVI C,0F;open
0102 115C00           LXI D,FCB
0105 CD0500           CALL FCALL
0108 3C               INR A;if FFH?
0109 CAE601           JZ ERR
010C AF               XRA A
010D 327C00           STA RECNO
              ;
0110 0E14     LOOP1:MVI C,14;read
0112 115C00           LXI D,FCB
0115 CD0500           CALL FCALL
0118 B7               ORA A
0119 C0               RNZ;read end
              ;
011A 3A7C00     LDA RECNO
011D CDCD01     CALL B2HEXDP
0120 3E28       MVI A,28;(
0122 CD7601     CALL ADP
0125 218000           LXI H,DMA
0128 4E         MOV C,M
0129 23         INX H
012A 7E         MOV A,M
012B CDCD01           CALL B2HEXDP
012E 79         MOV A,C
012F CDCD01     CALL B2HEXDP
0132 3E29       MVI A,29;)
0134 CD7601     CALL ADP
0137 3E5B       MVI A,5B;[
0139 CD7601     CALL ADP
013C 115C00     LXI D,FCB
013F 0E24       MVI C,24
0141 CD0500     CALL FCALL
0144 3A7F00           LDA FCBR2
0147 CDCD01     CALL B2HEXDP
014A CD7401     CALL SPDP
014D 3A7E00     LDA FCBR1
0150 CDCD01     CALL B2HEXDP
0153 CD7401     CALL SPDP
0156 3A7D00     LDA FCBR0
0159 CDCD01     CALL B2HEXDP
015C 3E5D       MVI A,5D;]
015E CD7601     CALL ADP
0161 CD7401           CALL SPDP
0164 CD7401     CALL SPDP
0167 C31001           JMP LOOP1
              ;
              ;CL & LF
016A 3E0D     CRLF:MVI A,0D
016C CD7601     CALL ADP
016F 3E0A       MVI A,0A
0171 C37601     JMP ADP
              ;space disp
0174 3E20     SPDP:MVI A,20
              ;A disp
0176 C5       ADP:PUSH B
0177 E5         PUSH H
0178 5F         MOV E,A
0179 0E02       MVI C,02
017B CD0500     CALL FCALL
017E E1         POP H
017F C1         POP B
0180 C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0181 7C       B2HEX4:MOV A,H
0182 CD8701     CALL B2HEX2
0185 EB         XCHG
0186 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0187 F5       B2HEX2:PUSH PSW
0188 0F         RRC
0189 0F         RRC
018A 0F         RRC
018B 0F         RRC
018C CD9601     CALL B2HEX1
018F 57         MOV D,A
0190 F1         POP PSW
0191 CD9601     CALL B2HEX1
0194 5F         MOV E,A
0195 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
0196 E60F     B2HEX1:ANI 0F
0198 C630       ADI 30
019A FE3A       CPI 3A
019C D8         RC;0-9
019D C607       ADI 07;A-F
019F C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
01A0 FE30     HTOB1:CPI 30;>="0"?
01A2 D8         RC;no
01A3 FE3A       CPI 3A;<="9"?
01A5 DAB901     JC HTOB1_2;yes,"0" to "9"
01A8 FE41       CPI 41;>="A" ?
01AA D8         RC;no
01AB FE47       CPI 47;<="F"?
01AD DAB701     JC HTOB1_1
01B0 FE61       CPI 61;>="a"?
01B2 D8         RC;no
01B3 FE67       CPI 67;<="f"?
01B5 3F         CMC
01B6 D8         RC;no
01B7 C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
01B9 E60F     HTOB1_2:ANI 0F
01BB C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
01BC C5       HEX4DP:PUSH B
01BD E5         PUSH H
01BE CD8101     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01C1 D5         PUSH D
01C2 EB         XCHG
01C3 CDD801     CALL DEDP
01C6 D1         POP D
01C7 CDD801     CALL DEDP
01CA E1         POP H
01CB C1         POP B
01CC C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
01CD C5       B2HEXDP:PUSH B
01CE E5         PUSH H
01CF CD8701     CALL B2HEX2
01D2 CDD801     CALL DEDP
01D5 E1         POP H
01D6 C1         POP B
01D7 C9         RET
              ;
              ;DE(asckii 2bytes) disp
01D8 D5       DEDP:PUSH D
01D9 5A         MOV E,D
01DA 0E02       MVI C,02
01DC CD0500     CALL FCALL
01DF D1         POP D
01E0 0E02       MVI C,02
01E2 CD0500     CALL FCALL
01E5 C9         RET
              ;
01E6 11EF01   ERR:LXI D,ERRMSG
01E9 0E09             MVI C,09
01EB CD0500           CALL FCALL
01EE C9               RET
01EF 63616E27 ERRMSG:"can'"
01F3 74206F70         "t op"
01F7 656E             "en"
01F9 0D               DB 0D
01FA 0A               DB 0A
01FB 24               DB 24;$
              ;
ADP          =0176  B2HEX1       =0196  B2HEX2       =0187  
B2HEX4       =0181  B2HEXDP      =01CD  CRLF         =016A  
DEDP         =01D8  DMA          =0080  ERR          =01E6  
ERRMSG       =01EF  FCALL        =0005  FCB          =005C  
FCBR0        =007D  FCBR1        =007E  FCBR2        =007F  
HEX4DP       =01BC  HTOB1        =01A0  HTOB1_1      =01B7  
HTOB1_2      =01B9  LOOP1        =0110  RECNO        =007C  
SPDP         =0174    

以下の説明は「ワンボードマイコンでCP/Mを!」[第235回でVFTST25について書いたところをそのまま引用しました。

前回作成したプログラムMFTST24では、シーケンシャルファイルの1レコードデータを読んで、その次のシーケンシャルリードでレコードを読むためのレ コードbェ置かれる、FCBの33バイト目(RECNO)の値を読んで表示し、それからレコードの先頭のデータ2バイトを()で囲んで16 進数で表示しました。
今回のMFTST25では、そのあとに追加して、ファンクションコール24Hを実行して、その結果作成されたFCBのランダムアクセス用のレコードb格納しているFCBの34バイト目から36バイト目の値を[]で囲んで16進数で表示します。

●MFTST25の実行

前回のテストのあとですぐにMFTST25を実行しました。



「ワンボードマイコンでCP/Mを!」[第235回ではVFTST25にバグがみつかったため、その次の「ワンボードマイコンでCP/Mを!」[第236回で再実行をしました。

今回は再実行した「ワンボードマイコンでCP/Mを!」[第236回を開いてその画像をバックにして、MFTST25を実行しました。
下は実行を完了したあとの画面です。



[]の中の数値は()の中の数値+1になっています。
ファンクション24をコールしているため、「次」のレコードbェ作成されています。

ながながと書いてきましたが、今回でやっとファンクションコールのテストが終りました。
あともう2〜3回、書き残したことなどについて書きましてから、いよいよMYCPU80用CP/M互換DOSの発売開始という段取りになる予定で準備をすすめています。
もう一息です。

MYCPU80でCP/Mを![第129回]
2015.2.13upload

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