; ***********************************************
; * MIDI8051 - Mikrocontroller Entwicklungsboard 
; * fuer ATARI ST/STE 
; *
; * MORSE: Diese kleine Demo sendet einen Text im
; *        Morsealphabet. Das Signal wird auf der
; * 	   eingebauten LED (optisch) und und am 
; *		   Port P1.0 als Tonsignal ausgegeben.
; *        Mit einer Taste zwischen P3.3 und GND
; *        laesst sich die Morsetonhoehe aendern.
; *
; ***********************************************

	.registers reg51.inc	; 8031-Register-Defs.

; * Konstanten: Morsetempo und Tonhoehe:
tonh_o = 200				; Die orig. Werte
speed_o = 200

; * Variablen (im internen RAM)

			.var_org $30

tonh:	.ds.b 1				; 1 Byte fuer tonh
speed:	.ds.b 1				; 1 Byte fuer speed
stack:						; darueber ist Stack

	.text_org $8000		; RAM Entwicklungsboards

; * Hier geht's los:
go_0:
	mov SP,#stack			; Stack ueber Vars.
	mov tonh,#tonh_o		; Variablen init.
	mov speed,#speed_o		; Originalpeed

go:
	mov DPTR,#text			; Auf den Text zeigen
			
again:
	movx A,@DPTR		; Zeich. @DPTR im XRAM
	inc DPTR			; DPTR auf naechstes Byte
	jz go				; '0': Wieder von vorne

	jb P3.3,ton_ok		; Schalter am Port gedr.?
	inc speed			; Ton hoeher, damit aber
	dec tonh			; wg. Tempo konst.: Speed dekr.
	mov A,#'e'          ; ein 'e' ausgeben (.)
	mov DPTR,#text		; und wieder von vorne...
ton_ok:

	cjne A,#' ',was

	mov R3,#16			; Space: Laengere Pause
	acall pause
	sjmp again			; und von vorne

was:					; Es gibt was zu piepsen
	acall holen			; Daten zum Buchst. holen
zeich:
	setb P3.5			; LED an
	rlc A				; A shift, Bit7 in Carry
	jnc kurz
	acall on			; Lang: lang piepsen
	acall on
kurz:
	acall on			; Kurz: kurz piepsen
	clr P3.5			; LED aus
	setb P1.0			; Lautsp. aus (sparen!)		

	mov R3,#1			
	acall pause			; kurz warten
	djnz R0,zeich		; Zeichen ausgeben
	
	mov R3,#4			; am Ende:
	acall pause			; laengere Pause

	sjmp again			; Bis Textende...

; * pause: Wartet in R2 angegebene Pausen
pause:
	mov R2,speed
?p1:
	mov R1,tonh			; Timing wie 'on:'
	djnz R1,!			; Inner Warteschleife		
	djnz R2,?p1
	djnz R3,pause		; Aeussere Warteschl.
	ret

; * on: Sound piepen, kurz warten
on:
	mov R2,speed		; 'speed' mal
?o1:					; '?': Verstecktes Label	
	cpl P1.0			; Lautsprecher AN/AUS
	mov R1,tonh			; tonhoehe
	djnz R1,!			; Inner Warteschleife		
	djnz R2,?o1			; Aeussere Warteschl.
	ret
	
; * Holen A: Lang/Kurz's, R0: Anzahl Bits
holen:
	add A,#-'a'					; A=A-'a'
	rl A						; A=2*A
	mov R0,A					; A merken
	add A,#(alphabet-h1)+1		; Offs. zur Tab.
	movc A,@A+PC				; Anz. Bits holen
h1:
	xch A,R0					; A/R0 vertausch.
	add A,#alphabet-h2			; R0: Anzahl Bits
	movc A,@A+PC				; A: Muster
h2:
	ret

alphabet:				
; * Aufb.: 1.) 1/0: lang/kurz, 2.) Anz. Bits  
	.dc.b %01000000,2 	; 'a'  .-
	.dc.b %10000000,4	; 'b'  -...
	.dc.b %10100000,4	; 'c'  -.-.
	.dc.b %10000000,3	; 'd'  -..
	.dc.b %00000000,1	; 'e'  .
	.dc.b %00100000,4 	; 'f'  ..-.
	.dc.b %11000000,3   ; 'g'  --.
	.dc.b %00000000,4   ; 'h'  ....
	.dc.b %00000000,3   ; 'i'  ..
	.dc.b %01110000,4   ; 'j'  .---
	.dc.b %10100000,3 	; 'k'  -.-
	.dc.b %01000000,4 	; 'l'  .-..
	.dc.b %11000000,2 	; 'm'  --
	.dc.b %10000000,2 	; 'n'  -.
	.dc.b %11100000,3 	; 'o'  ---
	.dc.b %01100000,4 	; 'p'  .--.
	.dc.b %11010000,4 	; 'q'  --.-
	.dc.b %10100000,3 	; 'r'  -.-
	.dc.b %00000000,3 	; 's'  ...
	.dc.b %10000000,1 	; 't'  -
	.dc.b %00100000,3 	; 'u'  ..-
	.dc.b %00100000,4 	; 'v'  ...-
	.dc.b %01100000,3 	; 'w'  .--
	.dc.b %10010000,4 	; 'x'  -..-
	.dc.b %10110000,4 	; 'y'  -.--
	.dc.b %11000000,4 	; 'z'  --..

; * Der Morsetext (nur Kleinbuchstaben und 
;* 'Space', keine Zahlen!)
text:
	.dc.b "hallo user hier morst dein "
	.dc.b "mikrocontroller   ",0

