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

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

[第63回]

●ファンクションコール08(IOバイトのセット)

前回はIOバイトの取り出し(ファンクションコール07)について説明しました。
今回はIOバイトのセットです。
ソースプログラムリストです。

; BDOS TEST8 IOBYTE set/get
;2012/3/15
;
        ORG $8100
        FCALL=$8005
;
        LD E,55;010101
        CALL IOSETGET
        LD E,AA;10101010
        CALL IOSETGET
        LD E,FF;11111111        
;IOBYTE set/get
IOSETGET:PUSH DE
        LD DE,SETIO
        LD C,09;string out
        CALL FCALL
        POP DE
        LD A,E
        PUSH DE
        CALL B2HEXDP
        CALL CRLF
        POP DE
        LD C,08;iobyte set
        CALL FCALL
        LD C,07;iobyte get
        CALL FCALL
        CALL B2HEXDP
        CALL CRLF
        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
;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
;
;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
;
SETIO:"set "
        "ioby"
        "te "
        DB 24;$
;

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

2012/3/15  22:42  ftst8.txt
END=819B
              ; BDOS TEST8 IOBYTE set/get
              ;2012/3/15
              ;
                ORG $8100
                FCALL=$8005
              ;
8100 1E55       LD E,55;010101
8102 CD0C81     CALL IOSETGET
8105 1EAA       LD E,AA;10101010
8107 CD0C81     CALL IOSETGET
810A 1EFF       LD E,FF;11111111        
              ;IOBYTE set/get
810C D5       IOSETGET:PUSH DE
810D 119081     LD DE,SETIO
8110 0E09       LD C,09;string out
8112 CD0580     CALL FCALL
8115 D1         POP DE
8116 7B         LD A,E
8117 D5         PUSH DE
8118 CD5881     CALL B2HEXDP
811B CD3081     CALL CRLF
811E D1         POP DE
811F 0E08       LD C,08;iobyte set
8121 CD0580     CALL FCALL
8124 0E07       LD C,07;iobyte get
8126 CD0580     CALL FCALL
8129 CD5881     CALL B2HEXDP
812C CD3081     CALL CRLF
812F C9         RET
              ;
              ;CL & LF
8130 3E0D     CRLF:LD A,0D
8132 CD3C81     CALL ADP
8135 3E0A       LD A,0A
8137 C33C81     JP ADP
              ;space disp
813A 3E20     SPDP:LD A,20
              ;A disp
813C C5       ADP:PUSH BC
813D E5         PUSH HL
813E 5F         LD E,A
813F 0E02       LD C,02
8141 CD0580     CALL FCALL
8144 E1         POP HL
8145 C1         POP BC
8146 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
8147 C5       HEX4DP:PUSH BC
8148 E5         PUSH HL
8149 CD7181     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
814C D5         PUSH DE
814D EB         EX DE,HL
814E CD6381     CALL DEDP
8151 D1         POP DE
8152 CD6381     CALL DEDP
8155 E1         POP HL
8156 C1         POP BC
8157 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
8158 C5       B2HEXDP:PUSH BC
8159 E5         PUSH HL
815A CD7781     CALL B2HEX2
815D CD6381     CALL DEDP
8160 E1         POP HL
8161 C1         POP BC
8162 C9         RET
              ;
              ;DE(asckii 2bytes) disp
8163 D5       DEDP:PUSH DE
8164 5A         LD E,D
8165 0E02       LD C,02
8167 CD0580     CALL FCALL
816A D1         POP DE
816B 0E02       LD C,02
816D CD0580     CALL FCALL
8170 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8171 7C       B2HEX4:LD A,H
8172 CD7781     CALL B2HEX2
8175 EB         EX DE,HL
8176 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8177 F5       B2HEX2:PUSH AF
8178 0F         RRCA
8179 0F         RRCA
817A 0F         RRCA
817B 0F         RRCA
817C CD8681     CALL B2HEX1
817F 57         LD D,A
8180 F1         POP AF
8181 CD8681     CALL B2HEX1
8184 5F         LD E,A
8185 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
8186 E60F     B2HEX1:AND 0F
8188 C630       ADD A,30
818A FE3A       CP 3A
818C D8         RET C;0-9
818D C607       ADD A,07;A-F
818F C9         RET
              ;
8190 73657420 SETIO:"set "
8194 696F6279   "ioby"
8198 746520           "te "
819B 24               DB 24;$
              ;
ADP          =813C  B2HEX1       =8186  B2HEX2       =8177  
B2HEX4       =8171  B2HEXDP      =8158  CRLF         =8130  
DEDP         =8163  FCALL        =8005  HEX4DP       =8147  
IOSETGET     =810C  SETIO        =8190  SPDP         =813A  

●プログラムの説明

前回説明しましたように、CP/Mの起動時にIOバイトはクリアされて、00になります。
IOバイトは2ビットずつ4つに分けられていて、それぞれの2ビットに00、01、10、11を与えることで、LST:、PUN:、RDR:、CON:にそれぞれ4通りの物理デバイスを割り当てることができます。

今回のプログラムでは簡単なテストデータとして、各2ビットに同じ01、10、11の3通りの値を与えることにします。
最初は 01010101(55H)を、次に10101010(AAH)を、そして最後に11111111(FFH)を与えます。

IOバイトに値をセットしたあと、前回説明しましたファンクションコール07でIOバイトの値を取得して、その値を表示します。
全く同じ作業を3回繰り返しますから、その部分はサブルーチンにしました。

今回のプログラムも前回のプログラムと同様に、結果を表示するのに、[第42回]で作ったメモリダンププログラムのサブルーチンをそのまま利用しています。

●FTST8.TXTのアセンブル画面です

FTST8.TXTをZASM.COMでアセンブルしたあと、ZB3[Enter]でND80ZVとUSB接続しました。



この後はいつものように、ログファイルで説明をします。


logfile nd80zlog\03152242.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst8.bin,8100
loading FTST8.BIN ...009c(156)bytes loaded,from 8100 to 819B
>jp d233

a>save 1 ftst8.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
A: FTST8    COM
a>ftst8
set iobyte 55
55
set iobyte AA
AA
set iobyte FF
FF

a>^D>0000 00C3 - 
リモート接続を終了しました
logfile closed at Thu Mar 15 22:44:48 2012

/LDコマンドでFTST8.BINを8100Hにロードしました。
そのあと、
JP D233[Enter]
でCP/Mを起動しました。

SAVE 1 FTST8.COM[Enter]
と入力して、8100HからのプログラムをFTST8.COMの名前でRAMディスクに保存したあと、DIRコマンドで確認をしています。

FTST8[Enter]
で、FTST8.COMを実行しました。

実行の結果IOバイトの値はセットした値の通りに読み出されました。
CON:の値も初期値の00から、01、10、11と3通りに変更されましたが、コンソール表示は通常と変わらずに、正常に表示されました。

現在のBIOSプログラムでは、IOバイトの値を元にして、論理デバイスに物理デバイスを結びつけるようにはなっていません。
CON:にはUSBを経由してWindowsパソコンのキーボード入力と、コマンドプロンプト(DOSプロンプト)の画面への表示が直接プログラムされていますから、IOバイトの値を変更しても、論理デバイスであるCON:に対する表示に影響はありません。
今回のプログラムの実行によって、そのことが確かめられました。

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

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