; test2.asm
; Prova di assembler 8051
; usando AS31
;
; La scheda GPC2 con il suo monitor consente di caricare un programma
; dall'indirizzo 8050h.
; Quell'indirizzo viene fatto corrispondere all'inizio della ROM (indirizzo 0), quindi
; dopo quell'indirizzo si trovano i vettori di interruzione.
; Al piedino P1.2 sono connessi un LED ed un cicalino (uscita PWM nella
; documentazione).
;
; Per produrre un suono si utilizza un ciclo di ritardo.
; Ogni istruzione 'djnz ...' impiega 24 cicli. L'oscillatore va a 11,0592 MHz.
; Vengono quindi eseguiti 11.059.200 / 24 =  460.800 loop al secondo.
; Se lasciamo a 0 il registro contatore, l'istruzione DJNZ verra' eseguita 256
; volte, quindi avremo in un secondo 460.800 / 256 = 1800 ripetizioni del loop
; ogni secondo. Dato che un ciclo dell'oinda quadra prodotta dal beeper sara'
; costituito da una parte ad 1 ed una a 0, quindi da due ripetizioni del loop,
; il cicalino oscilera' a 900 Hz. Se invece useremo un conteggio di 128, la 
; frequenza del tono raddoppiera', quindi avremo un tono a 1800 Hz.
;
; Produciamo adesso un suno intermittente: 64 cicli a 900Hz, pari a circa 70 mS,
; seguiti da 128 cicli a 1800 Hz, quindi sempre 70 mS, seguiti da una pausa di 140 mS. 
;
	.org	8050h
;
on:
	mov	r1,128	; Numero di semicicli
lo:	mov	r0,0	; Durata del semiciclo (0 -> 256)
	cpl	p1.2	; commuta l'onda
lo1:	djnz	r0,lo1	; loop di ritardo semiciclo
	djnz	r1,lo	; loop sui semicicli
;
	mov	r1,0	; Numero di semicicli (0 -> 256)
hi:	mov	r0,128	; Durata del semiciclo
	cpl	p1.2	; commuta l'onda
hi1:	djnz	r0,hi1	; loop di ritardo semiciclo
	djnz	r1,hi	; loop sui cicli
;
	mov	r1,0	; Numero di cicli di ritardo (0 -> 256)
off:	mov	r0,0	; Durata del ritardo (0 -> 256)
	setb	p1.2	; Azione nulla (non produce suono)
off1:	djnz	r0,off1	; loop di ritardo
	djnz	r1,off	; loop sui cicli di ritardo
;
	sjmp	on	; loop infinito sul suono
;
	.end
