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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第96回]


●ファンクションコール1FH(ディスクパラメータアドレスの取得)

ファンクションコール1FHはディスクパラメータの先頭アドレスを取得してHLレジスタに入れます。
ディスクパラメータについては[第33回]で説明をしています。
そのときはAドライブだけでしたが、その後仮RAMディスクを2つに分割してAドライブとBドライブに分けました。
そのためディスクパラメータも変更になり、その作業は[第83回]で説明をいたしました。
ディスクパラメータは、セクタ数、ブロック数やディスクサイズなどディスクドライブの基本的なパラメータで、15バイトのサイズがあります。

ファンクションコール1FHのテストプログラムFTST16.TXTのソースリストです。

; BDOS TEST16 function1F (get disk parameter address )
;2012/4/12
;
        ORG $8100
        FCALL=$8005
;
        LD C,1F
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        LD B,0F;=15
LOOP:LD A,(HL)
        CALL B2HEXDP
        CALL SPDP
        INC HL
        DEC B
        JP NZ,LOOP
        RET
;
;CL & LF
CRLF:LD A,0D
        CALL ADP
        LD A,0A
        JP ADP
;space disp
SPDP:LD A,20
;A disp
ADP:PUSH BC
        PUSH HL
        LD E,A
        LD C,02
        CALL FCALL
        POP HL
        POP BC
        RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
        CALL B2HEX2
        EX DE,HL
        LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL B2HEX1
        LD D,A
        POP AF
        CALL B2HEX1
        LD E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
        ADD A,30
        CP 3A
        RET C;0-9
        ADD A,07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CP 30;>="0"?
        RET C;no
        CP 3A;<="9"?
        JP C,HTOB1_2;yes,"0" to "9"
        CP 41;>="A" ?
        RET C;no
        CP 47;<="F"?
        JP C,HTOB1_1
        CP 61;>="a"?
        RET C;no
        CP 67;<="f"?
        CCF
        RET C;no
HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:AND 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
        PUSH HL
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH DE
        EX DE,HL
        CALL DEDP
        POP DE
        CALL DEDP
        POP HL
        POP BC
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
        PUSH HL
        CALL B2HEX2
        CALL DEDP
        POP HL
        POP BC
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
        LD E,D
        LD C,02
        CALL FCALL
        POP DE
        LD C,02
        CALL FCALL
        RET
;
ERRMSG:"err"
        DB 24;$
;

今回のプログラムも前回と同じで長く見えますが、そのほとんどは結果を表示するためのサブルーチンです。
表示のためのサブルーチンは[第42回]で使ったメモリダンププログラムからのコピーです。
メインプログラム部分は12行しかありません。

Cレジスタに1FHを入れて、システムをコールすると、HLレジスタにディスクパラメータのアドレスが入ってリターンしてきます。
そのHLレジスタの値を16進数で表示したあと、15バイトあるディスクパラメータの値を16進数で表示します。

FTST16.TXTをZASM.COMでアセンブルします。
下はアセンブルの結果作成されたアセンブルリストです。

2012/4/12  22:11  ftst16.txt
END=8199
              ; BDOS TEST16 function1F (get disk parameter address )
              ;2012/4/12
              ;
                        ORG $8100
                        FCALL=$8005
              ;
8100 0E1F       LD C,1F
8102 CD0580     CALL FCALL
8105 CD6C81     CALL HEX4DP
8108 CD1A81     CALL CRLF
810B 060F       LD B,0F;=15
810D 7E       LOOP:LD A,(HL)
810E CD7D81     CALL B2HEXDP
8111 CD2481     CALL SPDP
8114 23         INC HL
8115 05         DEC B
8116 C20D81     JP NZ,LOOP
8119 C9         RET
              ;
              ;CL & LF
811A 3E0D     CRLF:LD A,0D
811C CD2681     CALL ADP
811F 3E0A       LD A,0A
8121 C32681     JP ADP
              ;space disp
8124 3E20     SPDP:LD A,20
              ;A disp
8126 C5       ADP:PUSH BC
8127 E5         PUSH HL
8128 5F         LD E,A
8129 0E02       LD C,02
812B CD0580     CALL FCALL
812E E1         POP HL
812F C1         POP BC
8130 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8131 7C       B2HEX4:LD A,H
8132 CD3781     CALL B2HEX2
8135 EB         EX DE,HL
8136 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8137 F5       B2HEX2:PUSH AF
8138 0F         RRCA
8139 0F         RRCA
813A 0F         RRCA
813B 0F         RRCA
813C CD4681     CALL B2HEX1
813F 57         LD D,A
8140 F1         POP AF
8141 CD4681     CALL B2HEX1
8144 5F         LD E,A
8145 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8146 E60F     B2HEX1:AND 0F
8148 C630       ADD A,30
814A FE3A       CP 3A
814C D8         RET C;0-9
814D C607       ADD A,07;A-F
814F C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
8150 FE30     HTOB1:CP 30;>="0"?
8152 D8         RET C;no
8153 FE3A       CP 3A;<="9"?
8155 DA6981     JP C,HTOB1_2;yes,"0" to "9"
8158 FE41       CP 41;>="A" ?
815A D8         RET C;no
815B FE47       CP 47;<="F"?
815D DA6781     JP C,HTOB1_1
8160 FE61       CP 61;>="a"?
8162 D8         RET C;no
8163 FE67       CP 67;<="f"?
8165 3F         CCF
8166 D8         RET C;no
8167 C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
8169 E60F     HTOB1_2:AND 0F
816B C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
816C C5       HEX4DP:PUSH BC
816D E5         PUSH HL
816E CD3181     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8171 D5         PUSH DE
8172 EB         EX DE,HL
8173 CD8881     CALL DEDP
8176 D1         POP DE
8177 CD8881     CALL DEDP
817A E1         POP HL
817B C1         POP BC
817C C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
817D C5       B2HEXDP:PUSH BC
817E E5         PUSH HL
817F CD3781     CALL B2HEX2
8182 CD8881     CALL DEDP
8185 E1         POP HL
8186 C1         POP BC
8187 C9         RET
              ;
              ;DE(asckii 2bytes) disp
8188 D5       DEDP:PUSH DE
8189 5A         LD E,D
818A 0E02       LD C,02
818C CD0580     CALL FCALL
818F D1         POP DE
8190 0E02       LD C,02
8192 CD0580     CALL FCALL
8195 C9         RET
              ;
8196 657272   ERRMSG:"err"
8199 24         DB 24;$
              ;
ADP          =8126  B2HEX1       =8146  B2HEX2       =8137  
B2HEX4       =8131  B2HEXDP      =817D  CRLF         =811A  
DEDP         =8188  ERRMSG       =8196  FCALL        =8005  
HEX4DP       =816C  HTOB1        =8150  HTOB1_1      =8167  
HTOB1_2      =8169  LOOP         =810D  SPDP         =8124  


●FTST16.COMのセーブと実行

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST16.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動し、
save 1 ftst16.com[Enter]
と入力し、FTST16.COMというファイル名でAドライブにセーブしました。
そのあと
ftst16[Enter]
と入力してFTST16.COMを実行しました。

logfile nd80zlog\04122211.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst16.bin,8100
loading FTST16.BIN ...009a(154)bytes loaded,from 8100 to 8199
>jp d233

a>save 1 ftst16.com
a>ftst16
D259
10 00 02 03 00 0B 00 0F 00 80 00 00 00 00 00 
a>^D
end of CP/M
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Thu Apr 12 22:17:21 2012

ディスクパラメータアドレスが16進数4桁で
D259
と表示され、続いて15バイトのディスクパラメータが16進数で表示されました。

下は[第83回]でディスクパラメータ部分を変更し、その後[第87回]で別の部分の変更を行なって作成したCPM22L.TXTのアセンブルリストの、ディスクパラメータ部分です。
アドレスと値が正しく読み出されています。



ワンボードマイコンでCP/Mを![第96回]
2012.4.19upload

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