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;$
;
|
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
|

