MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!
[第126回]
●ファンクション28
ファンクション28は空きを00で埋めるランダムWRITEです。
ファンクション28は「ワンボードマイコンでCP/Mを!」[第229回]〜「ワンボードマイコンでCP/Mを!」[第232回]で説明をしています。
そこではファンクション22用のテストプログラムをもとにして、ファンクション22をコールしているところをファンクション28コールに置き換えたものを使ってテストを行ないました。
ND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)のファンクション28の最終的なテストは「ワンボードマイコンでCP/Mを!」[第395回]で行ないました。
そこでは「ワンボードマイコンでCP/Mを!」[第393回]で作ったVFTST20Bのファンクション22コールをファンクション28コールに置き換えてVFTST20Cを作りました。
いつものようにテストプログラムVFTST20Cのソースプログラムをインテルニーモニックに書き直してMFTST20Cを作りました。
●テストプログラムMFTST20C
MFTST20Cのソースプログラムです。
; BDOS TEST20-2 function22 random write
;2012/3/4 3/7 4/16 4/17 4/27
;9/15
;2013/5/14
;
ORG $0100
FCALL=$0005
NMBRTBL=$0300
FCB=$005C
FCBR0=$007D
FCBR1=$007E
FCBR2=$007F
DMA=$0080
;
MVI C,16;make file
LXI D,FCB
CALL FCALL
INR A;if FFH?
JZ DFULERR
;
XRA A
STA FCBR2
LXI H,NMBRTBL
PUSH H
LOOP:POP H
MOV A,M
STA FCBR0
MOV C,A
INX H
MOV A,M
CPI FF
JZ CLOSE
STA FCBR1
MOV B,A
INX H
PUSH H
MOV H,B
MOV L,C
CALL HEX4DP
CALL CRLF
;data fill
LXI H,DMA
MVI D,40
LOOP2:MOV M,C
INX H
MOV M,B
INX H
DCR D
JNZ LOOP2
;
MVI C,28;random write with 00
LXI D,FCB
CALL FCALL
ORA A
JZ LOOP
POP H
ORI 30
PUSH PSW
LXI D,ERRT
CALL MSGOUT
POP PSW
MOV E,A
MVI C,02
CALL FCALL
RET
;
CLOSE:MVI C,10;close
LXI D,FCB
CALL FCALL
INR A;if FFH?
JZ CLOSERR
LXI D,OK
JMP MSGOUT
;
DFULERR:LXI D,DFULL
JMP MSGOUT
CLOSERR:LXI D,CANTCLS
MSGOUT:MVI C,09
CALL FCALL
RET
;
;CL & LF
CRLF:MVI A,0D
CALL ADP
MVI A,0A
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
;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
;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;$
DFULL:"disk"
" ful"
"l!"
DB 0D
DB 0A
DB 24;$
CANTCLS:"can'"
"t cl"
"ose!"
DB 0D
DB 0A
DB 24;$
OK:"done"
DB 0D
DB 0A
DB 24;$
ERRT:"err "
DB 24;$
;
|
2015/2/2 23:9 mftst20c.txt
END=0200
; BDOS TEST20-2 function22 random write
;2012/3/4 3/7 4/16 4/17 4/27
;9/15
;2013/5/14
;
ORG $0100
FCALL=$0005
NMBRTBL=$0300
FCB=$005C
FCBR0=$007D
FCBR1=$007E
FCBR2=$007F
DMA=$0080
;
0100 0E16 MVI C,16;make file
0102 115C00 LXI D,FCB
0105 CD0500 CALL FCALL
0108 3C INR A;if FFH?
0109 CA6C01 JZ DFULERR
;
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 4F MOV C,A
011A 23 INX H
011B 7E MOV A,M
011C FEFF CPI FF
011E CA5A01 JZ CLOSE
0121 327E00 STA FCBR1
0124 47 MOV B,A
0125 23 INX H
0126 E5 PUSH H
0127 60 MOV H,B
0128 69 MOV L,C
0129 CDAC01 CALL HEX4DP
012C CD7B01 CALL CRLF
;data fill
012F 218000 LXI H,DMA
0132 1640 MVI D,40
0134 71 LOOP2:MOV M,C
0135 23 INX H
0136 70 MOV M,B
0137 23 INX H
0138 15 DCR D
0139 C23401 JNZ LOOP2
;
013C 0E28 MVI C,28;random write with 00
013E 115C00 LXI D,FCB
0141 CD0500 CALL FCALL
0144 B7 ORA A
0145 CA1401 JZ LOOP
0148 E1 POP H
0149 F630 ORI 30
014B F5 PUSH PSW
014C 11FC01 LXI D,ERRT
014F CD7501 CALL MSGOUT
0152 F1 POP PSW
0153 5F MOV E,A
0154 0E02 MVI C,02
0156 CD0500 CALL FCALL
0159 C9 RET
;
015A 0E10 CLOSE:MVI C,10;close
015C 115C00 LXI D,FCB
015F CD0500 CALL FCALL
0162 3C INR A;if FFH?
0163 CA7201 JZ CLOSERR
0166 11F501 LXI D,OK
0169 C37501 JMP MSGOUT
;
016C 11D901 DFULERR:LXI D,DFULL
016F C37501 JMP MSGOUT
0172 11E601 CLOSERR:LXI D,CANTCLS
0175 0E09 MSGOUT:MVI C,09
0177 CD0500 CALL FCALL
017A C9 RET
;
;CL & LF
017B 3E0D CRLF:MVI A,0D
017D CD8201 CALL ADP
0180 3E0A MVI A,0A
0182 C5 ADP:PUSH B
0183 E5 PUSH H
0184 5F MOV E,A
0185 0E02 MVI C,02
0187 CD0500 CALL FCALL
018A E1 POP H
018B C1 POP B
018C C9 RET
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
018D 7C B2HEX4:MOV A,H
018E CD9301 CALL B2HEX2
0191 EB XCHG
0192 7B MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
0193 F5 B2HEX2:PUSH PSW
0194 0F RRC
0195 0F RRC
0196 0F RRC
0197 0F RRC
0198 CDA201 CALL B2HEX1
019B 57 MOV D,A
019C F1 POP PSW
019D CDA201 CALL B2HEX1
01A0 5F MOV E,A
01A1 C9 RET
;binary to hex, low 4bit to ascii 1charactor
01A2 E60F B2HEX1:ANI 0F
01A4 C630 ADI 30
01A6 FE3A CPI 3A
01A8 D8 RC;0-9
01A9 C607 ADI 07;A-F
01AB C9 RET
;HL(bynary 2bytes) to asckii 4bytes & disp
01AC C5 HEX4DP:PUSH B
01AD E5 PUSH H
01AE CD8D01 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01B1 D5 PUSH D
01B2 EB XCHG
01B3 CDBD01 CALL DEDP
01B6 D1 POP D
01B7 CDBD01 CALL DEDP
01BA E1 POP H
01BB C1 POP B
01BC C9 RET
;DE(asckii 2bytes) disp
01BD D5 DEDP:PUSH D
01BE 5A MOV E,D
01BF 0E02 MVI C,02
01C1 CD0500 CALL FCALL
01C4 D1 POP D
01C5 0E02 MVI C,02
01C7 CD0500 CALL FCALL
01CA C9 RET
;
01CB 63616E27 CANTOPN:"can'"
01CF 74206F70 "t op"
01D3 656E21 "en!"
01D6 0D DB 0D
01D7 0A DB 0A
01D8 24 DB 24;$
01D9 6469736B DFULL:"disk"
01DD 2066756C " ful"
01E1 6C21 "l!"
01E3 0D DB 0D
01E4 0A DB 0A
01E5 24 DB 24;$
01E6 63616E27 CANTCLS:"can'"
01EA 7420636C "t cl"
01EE 6F736521 "ose!"
01F2 0D DB 0D
01F3 0A DB 0A
01F4 24 DB 24;$
01F5 646F6E65 OK:"done"
01F9 0D DB 0D
01FA 0A DB 0A
01FB 24 DB 24;$
01FC 65727220 ERRT:"err "
0200 24 DB 24;$
;
ADP =0182 B2HEX1 =01A2 B2HEX2 =0193
B2HEX4 =018D CANTCLS =01E6 CANTOPN =01CB
CLOSE =015A CLOSERR =0172 CRLF =017B
DEDP =01BD DFULERR =016C DFULL =01D9
DMA =0080 ERRT =01FC FCALL =0005
FCB =005C FCBR0 =007D FCBR1 =007E
FCBR2 =007F HEX4DP =01AC LOOP =0114
LOOP2 =0134 MSGOUT =0175 NMBRTBL =0300
OK =01F5
|







