		DEVICE PIC16C84,HS_OSC,WDT_OFF,PROTECT_OFF

indi		equ	00h	;Ezen a regiszteren keresztul irunk a pufferbe
pc		equ	02h	;PC
transp		equ	0ch	;Hangjegyek eltolasa
w0		equ	10h	;wait
cnt		equ	11h	;cnt
data		equ	12h	;A szubrutinokkal valo kapcsolattartashoz
cycle		equ	13h	;cycle
bit_k		equ	14h	;Az adatatviteli sebesseget allitja
system		equ	15h	;Jelzobitek
note		equ	19h	;Hangjegy, avagy a billentyukod
buff0		equ	1ah	;wait
buff1		equ	1bh	;wait
timer		equ	1ch	;idozito
;buffers equ 20h - 2fh

data_ok			=	system.0
led_red_flash		=	system.1	;A piros LED villoghat,ha 1
led_green_flash		=	system.2	;A zold LED villoghat, ha 1
van			=	system.3	;Van talalat (find szubrutin)

dout		= ra.0	;MIDI adatkimenet
led_green	= ra.1	;Zold LED
led_red		= ra.2	;Piros LED
button_octaver	= ra.3	;Oktavemelo funkciogomb
testin		= rb.6	;Matrix bemenet (vagy ki-bemenet)
testout		= rb.7	;Matrix kimenet (vagy ki-bemenet)

start	clrf ra			;Init ports
	clrf rb
	movlw 01000000b
	tris rb
	movlw 255
	movwf ra
	movlw 11011000b
	tris ra
	clrf 0ah
	clrb led_red
	clrb led_green
	clrf system
	clrf transp
	clrb data_ok
	setb dout		;Init
	movlw 0fh		;Bit rate
	movwf bit_k
	setb led_red_flash	;--- Uzemkepesseg jelzese ---
	clrb led_green_flash
	call ledtest
	call ledtest
	clrb led_red_flash
	setb led_green_flash
	call ledtest
	call ledtest
	setb led_red		;A zold LED a "POWER LED"
	setb led_green		;----------------------------
	movlw 3ch		;--- Teszt hangok ---
	call note_on_w
	call bigwait
	movlw 40h
	call note_on_w
	call bigwait
	movlw 42h
	call note_on_w
	call bigwait
	movlw 24
	movwf transp
	movlw 42h
	call note_on_w
	call bigwait
	call bigwait
	call bigwait
	call bigwait
	movlw 3ch
	call note_off_w
	call bigwait
	movlw 40h
	call note_off_w
	call bigwait
	movlw 42h
	call note_off_w
	call bigwait
	movlw 42h
	call note_off_w
	call bigwait
	call bigwait
	call bigwait
	call bigwait		;------------------
	clrb led_red
	call clear_buffer	;FFh-ra allitjuk a puffert (ez az uresseg jelzo)
	movlw 24		;Ez akkor hasznos, ha "kicsi"
	movwf transp		;a billentyuzetunk. 2 oktavval feljebb allitjuk.

main	setb testout		;Raadjuk a fesz.-t a matrixra.
	clrf note		;A note a bill. kodja.
c_main	movlw 11000000b		;Nullazzuk az RB port also 6 bitjet.
	andwf rb,1		;
	movf note,0		;Ez a billentyukod, amit
	iorwf rb,1		;kiteszunk az RB0-RB5 labakra.
	decfsz timer,1		;--- Funkciogombok ellenorzese ---------------
	goto skip		;A timer a pergesmentes miatt kell. Ha le van
	movlw 12		;
	btfsc button_octaver	;nyomva a gomb, akkor egy oktavot emelunk.
	addwf transp,1		;
	movlw 49h		;Ha transp > 48h, akkor toroljuk transp -ot.
	subwf transp,0		;
	btfsc c			;
	clrf transp		;
c_b_0	btfsc button_octaver	;Varunk a gomb felengedsere.
	goto c_b_0		;--------------------------------------------
skip	nop			;--- A matrix sebessege miatti varakozas ---
	nop			;CMOS IC-k,
	nop			;diodak,
	nop			;vezetekek,
	nop			;egyebek miatt.
	nop			;Gyanus hangzas eseten
	nop			;tobb nop -ot kell beilleszteni ide.
	nop			;-------------------------------------------
	btfsc testin		;Megnezzuk le van -e nyomva a billentyu.
	goto pressed		;Igen
	goto unpressed		;Nem
next	incf note,1		;Noveljuk, johet a kovetkezo bill. ellenorzese.
	movf note,0		;Ha elerte a max. erteket,
	xorlw 64		;akkor
	btfsc z			;
	clrf note		;toroljuk.
	goto c_main		;Vissza a ciklus elejere.

pressed		call find	;Van a pufferban mar ilyen bill.?
		btfsc van	;Ha van, akkor vissza, megegyszer nem
		goto next	;adjuk ki a kodjat.
		call store	;Ha nincs, akkor eltaroljuk.
		btfsc data_ok	;Ez jelzi, hogy a kodot sikerult
		call note_on	;eltarolni, ugyhogy kiadjuk a note on kodjat.
		goto next	;Vissza

unpressed	call find	;Ha az elozo korben nem volt lenyomva,
		btfss van	;akkor
		goto next	;vissza.
		movlw 255	;Ha az elozo korben le volt nyomva,
		movwf indi	;akkor most toroljuk a pufferbol
		call note_off	;es elkuldjuk a note off kodjat.
		goto next	;Vissza

;---------------------------------------------------------------------------
;---------------------------  SUBSYSTEMS  ----------------------------------
;---------------------------------------------------------------------------
txmidiw	movwf data	;--- Ezt hivjuk meg, ha az ertek a WORK -ben van. ---
txmidi	movlw 8		;--- Ezt hivjuk meg, ha az ertek a data -ban van. ---
	movwf cycle
	clrb dout		;Start bit
	call wbit		;---------
gotx	rrf data,1		;Betoljuk C-be.
	btfsc c			;Ha C=1, akor
	goto setb_dout		;Dout=1.
	btfss c			;Ha C=0, akkor
	goto clrb_dout		;Dout=0.
cnt_txd	call wbit
	decfsz cycle,1
	goto gotx
	setb dout		;Stop bit
	call wbit		;--------
	return

setb_dout	nop
		nop
		nop
		nop
		setb dout
		goto cnt_txd

clrb_dout	nop
		nop
		clrb dout
		goto cnt_txd

wbit	movf bit_k,0
	movwf w0
wbitc0	decfsz w0,1
	goto wbitc0
	return

note_on_w	movwf note	; Ha a WORK -ben van a hangjegy (bill.) kodja.
note_on		movlw 90h	; Ha a note -ban van a hangjegy (bill.) kodja
		movwf data
		call txmidi
		movf note,0
		movwf data
		movf transp,0
		addwf data,1
		call txmidi
		movlw 40h
		movwf data
		call txmidi
		return

note_off_w	movwf note
note_off	movlw 80h
		movwf data
		call txmidi
		movf note,0
		movwf data
		movf transp,0
		addwf data,1
		call txmidi
		movlw 40h
		movwf data
		call txmidi
		return

clear_buffer	movlw 20h		;--- Puffer torlese ---
		movwf fsr		; A 255 -os ertek jelzi
c_clear_buffer	movlw 255		; a szabad helyet
		movwf indi
		incf fsr,1
		movf fsr,0
		xorlw 30h
		btfss z
		goto c_clear_buffer
		return			;----------------------

find		clrb van		;--- Hangjegy keresese a pufferben ---
		movlw 20h
		movwf fsr
c_find		movf indi,0
		xorwf note,0
		btfsc z
		goto found_note		;Talalat eseten kilepunk (return).
		incf fsr,1
		movf fsr,0
		xorlw 28h		;28h=egyszerre 8 bill. lehet leutve.
		btfss z
		goto c_find
		return			; van=0 Vissza a 'find' rutinbol.

found_note	setb van		; van=1 Vissza a 'find' rutinbol.
		return			;--------------------------------------

store		clrb data_ok		;--- Hangjegy eltarolasa a pufferbe ---
		movlw 1fh
		movwf fsr
c_store		incf fsr,1
		movf fsr,0
		xorlw 28h		;8 byte-os puffer, 8 egyszerre leutott
		btfsc z			;billentyuvel foglalkozunk.
		return
		movf indi,0
		xorlw 255
		btfss z
		goto c_store
		movf note,0
		movwf indi
		setb data_ok		;data_ok=1, ha sikerult beirni
		return			;--------------------------------------

;-----------------------------  LEDTEST  -------------------------------
ledtest		btfsc led_red_flash
		setb led_red
		btfsc led_green_flash
		setb led_green
		call bigwait
		btfsc led_red_flash
		clrb led_red
		btfsc led_green_flash
		clrb led_green
		call bigwait
		return

bigwait		clrf buff0
		clrf buff1
		movlw 2
		movwf w0
bwc0		decfsz buff0,1
		goto bwc0
		decfsz buff1,1
		goto bwc0
		decfsz w0,1
		goto bwc0
		return
;----------------------------------------------------------------------
;-------------------------------------------------------------------------------
;----------------------------- END OF SUBSYSTEMS -------------------------------
;-------------------------------------------------------------------------------

;
;Egyszeru MIDI billentyuzet egyszeru programja.
;Xtal=8Mhz	k=0fh	bit=32us (microsec.)
;
; Boldizsar Ivan boldivi@freemail.hu
; 2000

