; Programme d'exemple d'utilisation
;    des canaux DMA son du CPC+
;
;   Zik pour Quasar CPC 20 (2002)
;
	Org &8000 ; o| vous voulez en dehors de &4000-&7fff
	Limit &80ff

	Nolist ; pour Maxam

DMASAR0	equ &6c00 ; adresse AY-liste
DMASAR1 equ &6c04
DMASAR2 equ &6c08
DMAPPR0 equ &6c02 ; adresse unit{ de pause
DMAPPR1 equ &6c06
DMAPPR2 equ &6c0a
DCSR	equ &6c0f ; ITraster / ITDMA2 / ITDMA1 / ITDMA0 /
		  ;     x    /  DMA2  /  DMA1  /  DMA0

	call delock ; d{verrouille l'ASIC

	di
	ld bc,&7fb8  ; Connexion page Asic (&4000-&7fff)
	out (c),c

	call exemple1
	call &bb18 ; attend une touche
	call exemple2

	ld bc,&7fa0  ; Deconnexion page Asic
	out (c),c
	ei
	ret

Exemple1
	xor a
	ld (DMAPPR2),a

	ld hl,Ay_ListeA
	ld (DMASAR2),hl

	ld a,%100 ; lance DMA2
	ld (DCSR),a
	ret

Exemple2
	ld a,17
	ld (DMAPPR2),a

	ld hl,Ay_ListeB
	ld (DMASAR2),hl

	ld a,%100 ; lance DMA2
	ld (DCSR),a
	ret

;# D{verrouille l'ASIC
;#####################
Delock	di
	ld a,17
	ld hl,asic
Loop	ld b,&bd
	outi
	dec a
	jr nz,loop
	ei
	ret

Asic	db 255,0,255,119,179,81,168,212,98,57,156,70,43,21,138,205,238

;# D{finition des AY-Listes
;##########################
	Org &8100 ; o| vous voulez en RAM centrale
		  ; doit etre une adresse paire
	Limit &81ff ; ne t'{loigne pas trop mon petit...

; 1er exemple ; g{n{ration de formes d'onde
Ay_ListeA dw &073f,&0000,&0100
	  dw &2040,&080f,&1012,&0800,&100f,&4001
	  dw &2040,&0808,&1011,&0800,&1010,&4001
	  dw &2080,&080f,&1011,&0800,&100e,&4001
	  dw &2080,&0808,&1010,&0800,&100f,&4001
	  dw &2060,&080f,&101b,&0800,&101b,&4001
	  dw &4020

; 2}me exemple ; sons classiques
Ay_ListeB dw &073f
	  dw &080f,&090f
	  dw &0000+159,&0100,&0200+213,&0300
	  dw &073c,&1040,&073f,&1050
	  dw &2002
	  dw &0000+142,&0100,&0200+358-256,&0301
	  dw &073c,&1040,&073f,&1050
	  dw &4001
	  dw &2002
	  dw &0000+127,&0100,&0200+319-256,&0301
	  dw &073c,&1040,&073f,&1050
	  dw &4001
	  dw &2003
	  dw &0000+119,&0100,&0200+190,&0300
	  dw &073c,&1040,&073f,&1050
	  dw &4001
	  dw &4020