CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

Z80-DMA(2)

検証のためにこんなコードを書いてみました。

①8100-81FF番地を「76H」(HALTのコード)で埋めておく
②8300-83FF番地を「00H」(NOPのコード)で埋めておく
③DMAを外部トリガによって8300番地から256バイトを8100番地にメモリ間転送するようにプログラミング
④8100番地にジャンプ。(ただし既にHALTで埋まっているのでそこでCPUは停止)
⑤8200番地以降にそこまでプログラムがきたことがわかるようにLCDに表示

8100番地でHALT中にDMAにより8100-81FF番地が0で埋められれば一気にNOPで走れるようになり
8200番地まで行き着けるはずです


	org	8000H
main:
	call	pioini
	call	ctcini
	call	lcdini
	call	dlin

	LD	HL,STRMSG
	LD	A,0C0H
	CALL	LCDCSET
	CALL	DLIN2

	LD	HL,CBUFF	;8100-81FF HALT set
L1:	LD	(HL),76H
	INC	HL
	LD	A,L
	CP	0
	JR	NZ,L1
	
	LD	HL,ZBUFF	;8300-83FF NOP set
L2:	LD	(HL),00H
	INC	HL
	LD	A,L
	CP	0
	JR	NZ,L2

DMASET:
	LD	A,0C3H	;DMAC reset
	LD	B,6
LOOP:	OUT	(DMAADR),A
	DJNZ	LOOP

	LD	HL,DMACC	;DMAC program
	LD	B,DMACL-DMACC
BEGIN0:	LD	C,DMAADR
	OTIR
	JP	CBUFF
	
	org	8100H   ;ExecuteCodeBuffer
CBUFF:	DS	256
	
	org	8200H
	
CHECK:	LD	HL,FINMSG
	LD	A,0C0H
	CALL	LCDCSET
	CALL	DLIN2
	RST	38h

DMACC:	DB	0C3H	;reset command
	DB	7DH	;transfer PORTA->PORTB
	DW	ZBUFF	;source address
	DW	LENGTH	;length
	DB	54H	;PORTA address increment,memory
	DB	02H	;2cycle early end
	DB	50H	;PORTB address increment,memory
	DB	02H	;2cycle early end
	DB	80H	;interrupt disable
	DB	0CDH	;burst mode
	DW	CBUFF	;destination address
	DB	8AH	;stop end of block CE/only READY active high
DMACC0:	DB	0CFH	;load count/address
	DB	87H	;enable DMA
DMACL	EQU	$

dspb:	defb	"* DMA TEST  10/3/30 ",0
STRMSG:	defb	" HALT",0
FINMSG:	defb	" RESTART",0

	org	8300H
ZBUFF:	DS	256