復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第42回]
●メモリダンププログラム
このところとりあえずND80ZVの上で動くようになったCP/Mの動作テストのために、ファンクションコールを使ったテストプログラムの説明をしております。
今回もファンクションコール1、2、9を使ったプログラムですが、今回は実用的なプログラムを書いてみることにします。
タイトルに書きましたようにメモリダンププログラムです。
メモリダンプはZB3BASICのマシン語モニタの機能にもありますが、それと同じものをCP/M上で使えるようにしたい、という目的で作ってみることにしました。
●ソースプログラムリストです
; BDOS TEST3 DUMP MEMORY
;
ORG $8100
FCALL=$8005
;
TOP:LD H,00
LOOP:PUSH HL
LD E,3F;?
LD C,02
CALL FCALL
LD C,01
CALL FCALL
CP 1A;^z?
POP HL
RET Z
CP 0D;[enter]?
JP Z,NEXT
CALL HTOB1
JP C,WHATDP
RLCA
RLCA
RLCA
RLCA
LD H,A
PUSH HL
LD C,01
CALL FCALL
CP 1A;^z?
POP HL
RET Z
CALL HTOB1
JP C,WHATDP
OR H
LD H,A
NEXT:LD L,00
; memory dump
CALL CRLF
LD B,10;=16
LOOP1:CALL HEX4DP;address disp
LD C,08
LOOP2:CALL SPDP;space disp
LD A,(HL)
CALL B2HEXDP;data disp
INC HL
DEC C
JP NZ,LOOP2
LD A,2D;"-"
CALL ADP
LD C,08
LOOP3:LD A,(HL)
CALL B2HEXDP
CALL SPDP
INC HL
DEC C
JP NZ,LOOP3
CALL CRLF
DEC B
JP NZ,LOOP1
CALL CRLF
JP LOOP
WHATDP:CALL CRLF
LD DE,WHATT
LD C,09
CALL FCALL
CALL CRLF
JP TOP
WHATT:"what"
DB 3F;?
DB 24;$
;
;CR & 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 66 -> 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
;
|
2012/2/23 20:51 ftest3dm.txt
END=81FF
; BDOS TEST3 DUMP MEMORY
;
ORG $8100
FCALL=$8005
;
8100 2600 TOP:LD H,00
8102 E5 LOOP:PUSH HL
8103 1E3F LD E,3F;?
8105 0E02 LD C,02
8107 CD0580 CALL FCALL
810A 0E01 LD C,01
810C CD0580 CALL FCALL
810F FE1A CP 1A;^z?
8111 E1 POP HL
8112 C8 RET Z
8113 FE0D CP 0D;[enter]?
8115 CA3581 JP Z,NEXT
8118 CDBA81 CALL HTOB1
811B DA6D81 JP C,WHATDP
811E 07 RLCA
811F 07 RLCA
8120 07 RLCA
8121 07 RLCA
8122 67 LD H,A
8123 E5 PUSH HL
8124 0E01 LD C,01
8126 CD0580 CALL FCALL
8129 FE1A CP 1A;^z?
812B E1 POP HL
812C C8 RET Z
812D CDBA81 CALL HTOB1
8130 DA6D81 JP C,WHATDP
8133 B4 OR H
8134 67 LD H,A
8135 2E00 NEXT:LD L,00
; memory dump
8137 CD8481 CALL CRLF
813A 0610 LD B,10;=16
813C CDD681 LOOP1:CALL HEX4DP;address disp
813F 0E08 LD C,08
8141 CD8E81 LOOP2:CALL SPDP;space disp
8144 7E LD A,(HL)
8145 CDE781 CALL B2HEXDP;data disp
8148 23 INC HL
8149 0D DEC C
814A C24181 JP NZ,LOOP2
814D 3E2D LD A,2D;"-"
814F CD9081 CALL ADP
8152 0E08 LD C,08
8154 7E LOOP3:LD A,(HL)
8155 CDE781 CALL B2HEXDP
8158 CD8E81 CALL SPDP
815B 23 INC HL
815C 0D DEC C
815D C25481 JP NZ,LOOP3
8160 CD8481 CALL CRLF
8163 05 DEC B
8164 C23C81 JP NZ,LOOP1
8167 CD8481 CALL CRLF
816A C30281 JP LOOP
816D CD8481 WHATDP:CALL CRLF
8170 117E81 LD DE,WHATT
8173 0E09 LD C,09
8175 CD0580 CALL FCALL
8178 CD8481 CALL CRLF
817B C30081 JP TOP
817E 77686174 WHATT:"what"
8182 3F DB 3F;?
8183 24 DB 24;$
;
;CR & LF
8184 3E0D CRLF:LD A,0D
8186 CD9081 CALL ADP
8189 3E0A LD A,0A
818B C39081 JP ADP
;space disp
818E 3E20 SPDP:LD A,20
;A disp
8190 C5 ADP:PUSH BC
8191 E5 PUSH HL
8192 5F LD E,A
8193 0E02 LD C,02
8195 CD0580 CALL FCALL
8198 E1 POP HL
8199 C1 POP BC
819A C9 RET
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
819B 7C B2HEX4:LD A,H
819C CDA181 CALL B2HEX2
819F EB EX DE,HL
81A0 7B LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
81A1 F5 B2HEX2:PUSH AF
81A2 0F RRCA
81A3 0F RRCA
81A4 0F RRCA
81A5 0F RRCA
81A6 CDB081 CALL B2HEX1
81A9 57 LD D,A
81AA F1 POP AF
81AB CDB081 CALL B2HEX1
81AE 5F LD E,A
81AF C9 RET
;binary to hex, low 4bit to ascii 1charactor
81B0 E60F B2HEX1:AND 0F
81B2 C630 ADD A,30
81B4 FE3A CP 3A
81B6 D8 RET C;0-9
81B7 C607 ADD A,07;A-F
81B9 C9 RET
;hex to binary, ascii 1charactor to low 4bit
81BA FE30 HTOB1:CP 30;>="0"?
81BC D8 RET C;no
81BD FE3A CP 3A;<="9"?
81BF DAD381 JP C,HTOB1_2;yes,"0" to "9"
81C2 FE41 CP 41;>="A" ?
81C4 D8 RET C;no
81C5 FE47 CP 47;<="F"?
81C7 DAD181 JP C,HTOB1_1
81CA FE61 CP 61;>="a"?
81CC D8 RET C;no
81CD FE67 CP 67;<="f"?
81CF 3F CCF
81D0 D8 RET C;no
81D1 C609 HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 66 -> 6A to 6F
81D3 E60F HTOB1_2:AND 0F
81D5 C9 RET
;HL(bynary 2bytes) to asckii 4bytes & disp
81D6 C5 HEX4DP:PUSH BC
81D7 E5 PUSH HL
81D8 CD9B81 CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81DB D5 PUSH DE
81DC EB EX DE,HL
81DD CDF281 CALL DEDP
81E0 D1 POP DE
81E1 CDF281 CALL DEDP
81E4 E1 POP HL
81E5 C1 POP BC
81E6 C9 RET
;A(binary) to asckii 2bytes HEX & disp
81E7 C5 B2HEXDP:PUSH BC
81E8 E5 PUSH HL
81E9 CDA181 CALL B2HEX2
81EC CDF281 CALL DEDP
81EF E1 POP HL
81F0 C1 POP BC
81F1 C9 RET
;
;DE(asckii 2bytes) disp
81F2 D5 DEDP:PUSH DE
81F3 5A LD E,D
81F4 0E02 LD C,02
81F6 CD0580 CALL FCALL
81F9 D1 POP DE
81FA 0E02 LD C,02
81FC CD0580 CALL FCALL
81FF C9 RET
;
ADP =8190 B2HEX1 =81B0 B2HEX2 =81A1
B2HEX4 =819B B2HEXDP =81E7 CRLF =8184
DEDP =81F2 FCALL =8005 HEX4DP =81D6
HTOB1 =81BA HTOB1_1 =81D1 HTOB1_2 =81D3
LOOP =8102 LOOP1 =813C LOOP2 =8141
LOOP3 =8154 NEXT =8135 SPDP =818E
TOP =8100 WHATDP =816D WHATT =817E
|
