PTM – SOUND

kod 1 – gama
ljmp start

P5 equ 0F8H
P7 equ 0DBH
	
#define LINE_1		0x7f	; 0111 1111
#define LINE_2		0xbf	; 1011 1111
#define	LINE_3		0xdf	; 1101 1111
#define LINE_4		0xef	; 1110 1111

ORG 000BH     ; Obsługa przerwania Timer 0
	cpl P3.2	; Ruch membraną brzęczyka
	push ACC	
	mov A, R6	; Przeładowanie TH0
	mov TH0, A 	
	mov A, R7	; Przeładowanie TL0
	mov TL0, A
	pop ACC      	
	reti          

ORG 0100H
		
; Tablica przekodowania klawisze - dźwięki w XRAM
keymuz:		
	mov dptr, #8077H \ mov a, #89H  \ movx @dptr, a
	mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
	mov dptr, #807DH \ mov a, #5AH  \ movx @dptr, a
	mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80B7H \ mov a, #13H  \ movx @dptr, a
	mov dptr, #80BBH \ mov a, #68H  \ movx @dptr, a
	mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80BEH \ mov a, #04H  \ movx @dptr, a
	mov dptr, #80D7H \ mov a, #4CH  \ movx @dptr, a
	mov dptr, #80DBH \ mov a, #90H  \ movx @dptr, a
	mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
	mov dptr, #80DEH \ mov a, #0CH  \ movx @dptr, a
	mov dptr, #80E7H \ mov a, #45H  \ movx @dptr, a
	mov dptr, #80EBH \ mov a, #7AH  \ movx @dptr, a
	mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
	mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
	
	mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
	ret
 
start:  
	acall keymuz
	mov TMOD, #01H ; Timer 0 w trybie 1 (16-bitowym)
	mov IE, #82H   ; Odblokowanie przerwań globalnych i Timer 0
	
graj:
	mov r4, #00H   ; Wyczyszczenie rejestru poprzedniego klawisza
	clr TR0        ; Zatrzymanie dźwięku, gdy brak wciśniętego klawisza
		
key_1:
	mov r0, #LINE_1 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0 \ jz key_2
	mov a, r2 \ clr c \ subb a, r4 \ jz key_1
	mov a, r2 \ mov r4, a
	mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
	mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
	setb TR0 \ jmp key_1
			
key_2:
	mov r0, #LINE_2 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0 \ jz key_3
	mov a, r2 \ clr c \ subb a, r4 \ jz key_2
	mov a, r2 \ mov r4, a
	mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
	mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
	setb TR0 \ jmp key_2
			
key_3:
	mov r0, #LINE_3 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0 \ jz key_4
	mov a, r2 \ clr c \ subb a, r4 \ jz key_3
	mov a, r2 \ mov r4, a
	mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
	mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
	setb TR0 \ jmp key_3
			
key_4:
	mov r0, #LINE_4 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0 \ jz dalej
	mov a, r2 \ clr c \ subb a, r4 \ jz key_4
	mov a, r2 \ mov r4, a
	mov dph, #81h \ mov dpl, a \ movx a, @dptr \ mov R6, a \ mov TH0, a
	mov a, r2 \ mov dph, #80h \ mov dpl, a \ movx a, @dptr \ mov R7, a \ mov TL0, a
	setb TR0 \ jmp key_4	

dalej:
	jmp graj    
end start
kod 2
ljmp start

; --- DEFINICJE ADRESÓW I LINII LCD (Z TWOJEGO PROGRAMU) ---
LCDstatus  equ 0FF2EH       ; adres do odczytu gotowosci LCD
LCDcontrol equ 0FF2CH       ; adres do podania bajtu sterujacego LCD
LCDdataWR  equ 0FF2DH       ; adres do podania kodu ASCII na LCD

#define  HOME     0x80       
#define  INITDISP 0x38       
#define  HOM2     0xc0       
#define  LCDON    0x0e       
#define  CLEAR    0x01       

; --- REJESTRY I LINIE KLAWIATURY (Z PROGRAMU ORGANKÓW) ---
P5 equ 0F8H
P7 equ 0DBH
	
#define LINE_1		0x7f	; 0111 1111
#define LINE_2		0xbf	; 1011 1111
#define	LINE_3		0xdf	; 1101 1111
#define LINE_4		0xef	; 1110 1111

; --- OBSŁUGA PRZERWANIA TIMER 0 ---
ORG 000BH     
	cpl P3.2	; ruch membraną brzęczyka
	push ACC	
	mov A, R6	; przeładowanie stałej timera
	mov TH0, A 	
	mov A, R7
	mov TL0, A
	pop ACC      	
	reti          

ORG 0100H

; --- MAKRA OBSŁUGI LCD (Z TWOJEGO PROGRAMU) ---
LCDcntrlWR MACRO x          
           LOCAL loop       
loop: MOV  DPTR,#LCDstatus  
      MOVX A,@DPTR          
      JB   ACC.7,loop       
                            
      MOV  DPTR,#LCDcontrol 
      MOV  A, x             
      MOVX @DPTR,A          
      ENDM
	  
LCDcharWR MACRO
      LOCAL tutu            
      PUSH ACC              
tutu: MOV  DPTR,#LCDstatus  
      MOVX A,@DPTR          
      JB   ACC.7,tutu       
      MOV  DPTR,#LCDdataWR  
      POP  ACC              
      MOVX @DPTR,A          
      ENDM
	  
init_LCD MACRO
         LCDcntrlWR #INITDISP 
         LCDcntrlWR #CLEAR    
         LCDcntrlWR #LCDON    
         ENDM

; --- PODPROGRAMY POMOCNICZE LCD ---
putcharLCD: 
	LCDcharWR
	ret

; Podprogram wypisujący nazwę nuty na podstawie kodu skaningowego z R2
POKAZ_NOTE:
	push dph
	push dpl
	push acc
	push b

	; Czyszczenie ekranu przed wyświetleniem nowej nuty
	LCDcntrlWR #CLEAR
	LCDcntrlWR #HOME

	mov a, r2
	acall GET_INDEX			; zamiana kodu skaningowego na indeks 0-15
	cjne a, #0FFH, POKAZ_OK
	sjmp POKAZ_KONIEC

POKAZ_OK:
	mov b, #5				; każda nazwa w tabeli zajmuje dokładnie 5 bajtów
	mul ab
	mov dptr, #NOTE_NAMES
	add a, dpl
	mov dpl, a
	mov a, b
	addc a, dph
	mov dph, a

PRINT_LOOP:
	clr a
	movc a, @a+dptr
	jz POKAZ_KONIEC
	
	; Zabezpieczenie DPTR przed nadpisaniem przez makro LCD (zgodnie z Twoim programem)
	push dph
	push dpl
	acall putcharLCD
	pop dpl
	pop dph
	
	inc dptr
	sjmp PRINT_LOOP

POKAZ_KONIEC:
	pop b
	pop acc
	pop dpl
	pop dph
	ret

; Konwersja kodu skaningowego (ACC) na indeks liczbowy (0-15)
GET_INDEX:
	cjne A, #77H, I_7B  \ mov A, #0  \ ret
I_7B:	cjne A, #7BH, I_7D  \ mov A, #1  \ ret
I_7D:	cjne A, #7DH, I_7E  \ mov A, #2  \ ret
I_7E:	cjne A, #7EH, I_B7  \ mov A, #3  \ ret
I_B7:	cjne A, #B7H, I_BB  \ mov A, #4  \ ret
I_BB:	cjne A, #BBH, I_BD  \ mov A, #5  \ ret
I_BD:	cjne A, #BDH, I_BE  \ mov A, #6  \ ret
I_BE:	cjne A, #BEH, I_D7  \ mov A, #7  \ ret
I_D7:	cjne A, #D7H, I_DB  \ mov A, #8  \ ret
I_DB:	cjne A, #DBH, I_DD  \ mov A, #9  \ ret
I_DD:	cjne A, #DDH, I_DE  \ mov A, #10 \ ret
I_DE:	cjne A, #DEH, I_E7  \ mov A, #11 \ ret
I_E7:	cjne A, #E7H, I_EB  \ mov A, #12 \ ret
I_EB:	cjne A, #EBH, I_ED  \ mov A, #13 \ ret
I_ED:	cjne A, #EDH, I_EE  \ mov A, #14 \ ret
I_EE:	cjne A, #EEH, I_ERR \ mov A, #15 \ ret
I_ERR:	mov A, #0FFH \ ret

; --- TABLICA PRZEKODOWANIA KLAWISZE - DŹWIĘKI W XRAM ---
keymuz:		
	mov dptr, #8077H \ mov a, #89H  \ movx @dptr, a
	mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
	mov dptr, #807DH \ mov a, #5AH  \ movx @dptr, a
	mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80B7H \ mov a, #13H  \ movx @dptr, a
	mov dptr, #80BBH \ mov a, #68H  \ movx @dptr, a
	mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80BEH \ mov a, #04H  \ movx @dptr, a
	mov dptr, #80D7H \ mov a, #4CH  \ movx @dptr, a
	mov dptr, #80DBH \ mov a, #90H  \ movx @dptr, a
	mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
	mov dptr, #80DEH \ mov a, #0CH  \ movx @dptr, a
	mov dptr, #80E7H \ mov a, #45H  \ movx @dptr, a
	mov dptr, #80EBH \ mov a, #7AH  \ movx @dptr, a
	mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
	mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
	
	mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
	ret
 
; --- PROGRAM GŁÓWNY ---
start:  
	acall keymuz
	init_LCD       ; Inicjalizacja LCD za pomocą Twojego makra
	
	MOV TMOD, #01H ; konfiguracja timera
	MOV IE, #82H   ; przerwania wlacz
	
graj:		
	MOV r4, #00H   ; dotychczasowy klawisz
	CLR TR0        ; timer stop
		
key_1:	
	mov r0, #LINE_1
	mov	a, r0
	mov	P5, a
	mov a, P7
	anl a, r0
	mov r2, a
	clr c
	subb a, r0	
	jz key_2
	mov a, r2
	clr c
	subb a, r4	
	jz key_1
	mov a, r2
	mov r4, a	
	
	acall POKAZ_NOTE ; Wyświetlenie znaku na LCD przy nowym kliknięciu
	
	mov dph, #81h	
	mov dpl, a
	movx a,@dptr
	mov R6, a
	mov TH0, a
	mov a, r2
	mov dph, #80h	
	mov dpl, a
	movx a,@dptr
	mov R7, a
	mov TL0, a
	setb TR0	
	jmp key_1
			
key_2:	
	mov r0, #LINE_2
	mov	a, r0
	mov	P5, a
	mov a, P7
	anl a, r0
	mov r2, a
	clr c
	subb a, r0
	jz key_3
	mov a, r2
	clr c
	subb a, r4
	jz key_2
	mov a, r2
	mov r4, a
	
	acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
	
	mov a, r2
	mov dph, #81h
	mov dpl, a
	movx a,@dptr
	mov R6, a
	mov TH0, a
	mov a, r2
	mov dph, #80h
	mov dpl, a
	movx a,@dptr
	mov R7, a
	mov TL0, a
	setb TR0
	jmp key_2
			
key_3:	
	mov r0, #LINE_3
	mov	a, r0
	mov	P5, a
	mov a, P7
	anl a, r0
	mov r2, a
	clr c
	subb a, r0
	jz key_4
	mov a, r2
	clr c
	subb a, r4
	jz key_3
	mov a, r2
	mov r4, a
	
	acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
	
	mov dph, #81h
	mov dpl, a
	movx a,@dptr
	mov R6, a
	mov TH0, a
	mov a, r2
	mov dph, #80h
	mov dpl, a
	movx a,@dptr
	mov R7, a
	mov TL0, a
	setb TR0
	jmp key_3
			
key_4:	
	mov r0, #LINE_4
	mov	a, r0
	mov	P5, a
	mov a, P7
	anl a, r0
	mov r2, a
	clr c
	subb a, r0
	jz dalej
	mov a, r2
	clr c
	subb a, r4
	jz key_4
	mov a, r2
	mov r4, a
	
	acall POKAZ_NOTE ; Wyświetlenie znaku na LCD
	
	mov dph, #81h
	mov dpl, a
	movx a,@dptr
	mov R6, a
	mov TH0, a
	mov a, r2
	mov dph, #80h
	mov dpl, a
	movx a,@dptr
	mov R7, a
	mov TL0, a
	setb TR0
	jmp key_4	

dalej:		
	jmp graj    
 
; --- TABELA NAZW NUT (DOPASOWANA DO FORMATU 5 BAJTÓW NA TEKST) ---
NOTE_NAMES:
	db "C1  ",00
	db "CIS1",00
	db "D1  ",00
	db "DIS1",00
	db "E1  ",00
	db "F1  ",00
	db "FIS1",00
	db "G1  ",00
	db "GIS1",00
	db "A1  ",00
	db "B1  ",00
	db "H1  ",00
	db "C2  ",00
	db "CIS2",00
	db "D2  ",00
	db "DIS2",00

    end start

kod 3
ljmp start

; --- DEFINICJE ADRESÓW I LINII LCD (Z TWOJEGO PROGRAMU) ---
LCDstatus  equ 0FF2EH       ; adres do odczytu gotowosci LCD
LCDcontrol equ 0FF2CH       ; adres do podania bajtu sterujacego LCD
LCDdataWR  equ 0FF2DH       ; adres do podania kodu ASCII na LCD

#define  HOME     0x80     
#define  INITDISP 0x38     
#define  HOM2     0xc0     
#define  LCDON    0x0e     
#define  CLEAR    0x01     

; --- REJESTRY I LINIE KLAWIATURY (Z PROGRAMU ORGANKÓW) ---
P5 equ 0F8H
P7 equ 0DBH
	
#define LINE_1		0x7f	
#define LINE_2		0xbf	
#define	LINE_3		0xdf	
#define LINE_4		0xef	

; --- OBSŁUGA PRZERWANIA TIMER 0 ---
ORG 000BH     
	cpl P3.2	; ruch membraną brzęczyka
	push ACC	
	mov A, R6	; przeładowanie stałej TH0
	mov TH0, A 	
	mov A, R7	; przeładowanie stałej TL0
	mov TL0, A
	pop ACC      	
	reti          

ORG 0100H

; --- MAKRA OBSŁUGI LCD (Z TWOJEGO PROGRAMU) ---
LCDcntrlWR MACRO x          
           LOCAL loop       
loop: MOV  DPTR,#LCDstatus  
      MOVX A,@DPTR          
      JB   ACC.7,loop       
                            
      MOV  DPTR,#LCDcontrol 
      MOV  A, x             
      MOVX @DPTR,A          
      ENDM
	  
LCDcharWR MACRO
      LOCAL tutu            
      PUSH ACC              
tutu: MOV  DPTR,#LCDstatus  
      MOVX A,@DPTR          
      JB   ACC.7,tutu       
      MOV  DPTR,#LCDdataWR  
      POP  ACC              
      MOVX @DPTR,A          
      ENDM
	  
init_LCD MACRO
         LCDcntrlWR #INITDISP 
         LCDcntrlWR #CLEAR    
         LCDcntrlWR #LCDON    
         ENDM

; --- PODPROGRAMY POMOCNICZE ---

putcharLCD: 
	LCDcharWR
	ret

; --- CENTRALNA PROCEDURA ODTWARZANIA I TRANSPOZYCJI ---
; Wejście: R2 - oryginalny kod skaningowy wciśniętego klawisza
ZAGRAJ_Z_TRANSP:
	mov A, R2
	clr c
	subb A, R4
	jz KONIEC_ZAGRAJ        ; Jeśli to ten sam klawisz, kontynuuj granie bez zmian

	mov A, R2
	mov R4, A               ; Zapisz aktualny klawisz bazowy

	; 1. Pobierz bazowy indeks nuty (0-15)
	mov A, R2
	acall GET_INDEX
	
	; 2. Dodaj wartość transpozycji zapisaną w R3
	add A, R3
	
	; Zabezpieczenie przed wyjściem ponad najwyższą dostępną nutę (indeks 15)
	clr c
	mov R5, A               ; R5 przechowuje ostateczny, przesunięty indeks nuty
	subb A, #16
	jc INDEKS_OK
	mov R5, #15             ; Jeśli przekroczy zakres, utnij do najwyższej nuty DIS2
INDEKS_OK:

	; 3. Wyświetlenie przetransponowanej nuty na LCD przy użyciu Twojego makra
	acall POKAZ_NOTE_PO_INDEKSIE

	; 4. Konwersja indeksu z R5 z powrotem na kod skaningowy potrzebny do XRAM
	mov A, R5
	mov dptr, #SCAN_CODES
	movc A, @A+dptr
	mov R1, A               ; R1 = nowy, przetransponowany kod skaningowy

	; 5. Ładowanie wartości Timera z XRAM przy użyciu przetransponowanego kodu w R1
	mov dph, #81h
	mov dpl, R1
	movx A, @dptr
	mov R6, A
	mov TH0, A
	
	mov dph, #80h
	mov dpl, R1
	movx A, @dptr
	mov R7, A
	mov TL0, A
	
	setb TR0                ; Uruchomienie brzmienia
KONIEC_ZAGRAJ:
	ret

; --- WYŚWIETLANIE NUTY NA PODSTAWIE INDEKSU Z R5 ---
POKAZ_NOTE_PO_INDEKSIE:
	push dph
	push dpl
	push acc
	push b

	LCDcntrlWR #CLEAR
	LCDcntrlWR #HOME

	mov A, R5
	mov b, #5               ; każda nazwa w tabeli zajmuje dokładnie 5 bajtów
	mul ab
	mov dptr, #NOTE_NAMES
	add a, dpl
	mov dpl, a
	mov a, b
	addc a, dph
	mov dph, a

PRINT_LOOP:
	clr a
	movc a, @a+dptr
	jz POKAZ_KONIEC
	
	; Zabezpieczenie rejestru DPTR przed nadpisaniem przez makro LCD
	push dph
	push dpl
	acall putcharLCD
	pop dpl
	pop dph
	
	inc dptr
	sjmp PRINT_LOOP

POKAZ_KONIEC:
	pop b
	pop acc
	pop dpl
	pop dph
	ret

; Konwersja kodu skaningowego (ACC) na indeks liczbowy (0-15)
GET_INDEX:
	cjne A, #77H, I_7B  \ mov A, #0  \ ret
I_7B:	cjne A, #7BH, I_7D  \ mov A, #1  \ ret
I_7D:	cjne A, #7DH, I_7E  \ mov A, #2  \ ret
I_7E:	cjne A, #7EH, I_B7  \ mov A, #3  \ ret
I_B7:	cjne A, #B7H, I_BB  \ mov A, #4  \ ret
I_BB:	cjne A, #BBH, I_BD  \ mov A, #5  \ ret
I_BD:	cjne A, #BDH, I_BE  \ mov A, #6  \ ret
I_BE:	cjne A, #BEH, I_D7  \ mov A, #7  \ ret
I_D7:	cjne A, #D7H, I_DB  \ mov A, #8  \ ret
I_DB:	cjne A, #DBH, I_DD  \ mov A, #9  \ ret
I_DD:	cjne A, #DDH, I_DE  \ mov A, #10 \ ret
I_DE:	cjne A, #DEH, I_E7  \ mov A, #11 \ ret
I_E7:	cjne A, #E7H, I_EB  \ mov A, #12 \ ret
I_EB:	cjne A, #EBH, I_ED  \ mov A, #13 \ ret
I_ED:	cjne A, #EDH, I_EE  \ mov A, #14 \ ret
I_EE:	cjne A, #EEH, I_ERR \ mov A, #15 \ ret
I_ERR:	mov A, #0FFH \ ret

; --- TABLICA PRZEKODOWANIA KLAWISZE - DŹWIĘKI W XRAM ---
keymuz:		
	mov dptr, #8077H \ mov a, #89H  \ movx @dptr, a
	mov dptr, #807BH \ mov a, #0F4H \ movx @dptr, a
	mov dptr, #807DH \ mov a, #5AH  \ movx @dptr, a
	mov dptr, #807EH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80B7H \ mov a, #13H  \ movx @dptr, a
	mov dptr, #80BBH \ mov a, #68H  \ movx @dptr, a
	mov dptr, #80BDH \ mov a, #0B9H \ movx @dptr, a
	mov dptr, #80BEH \ mov a, #04H  \ movx @dptr, a
	mov dptr, #80D7H \ mov a, #4CH  \ movx @dptr, a
	mov dptr, #80DBH \ mov a, #90H  \ movx @dptr, a
	mov dptr, #80DDH \ mov a, #0CFH \ movx @dptr, a
	mov dptr, #80DEH \ mov a, #0CH  \ movx @dptr, a
	mov dptr, #80E7H \ mov a, #45H  \ movx @dptr, a
	mov dptr, #80EBH \ mov a, #7AH  \ movx @dptr, a
	mov dptr, #80EDH \ mov a, #0ADH \ movx @dptr, a
	mov dptr, #80EEH \ mov a, #0DDH \ movx @dptr, a
	
	mov dptr, #8177H \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817BH \ mov a, #0F8H \ movx @dptr, a
	mov dptr, #817DH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #817EH \ mov a, #0F9H \ movx @dptr, a
	mov dptr, #81B7H \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BBH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BDH \ mov a, #0FAH \ movx @dptr, a
	mov dptr, #81BEH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81D7H \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DBH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DDH \ mov a, #0FBH \ movx @dptr, a
	mov dptr, #81DEH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81E7H \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EBH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EDH \ mov a, #0FCH \ movx @dptr, a
	mov dptr, #81EEH \ mov a, #0FCH \ movx @dptr, a
	ret
 
; --- PROGRAM GŁÓWNY ---
start:  
	acall keymuz
	init_LCD       ; Inicjalizacja LCD za pomocą Twojego makra
	
	mov TMOD, #01H ; Konfiguracja timera
	mov IE, #82H   ; Przerwania włącz
	mov R3, #0     ; Domyślne przesunięcie interwału = 0 (brak transpozycji)
	
graj:		
	mov R4, #00H   ; Wyczyszczenie rejestru poprzedniego klawisza
	clr TR0        ; Wyłączenie dźwięku, gdy żaden klawisz klawiatury nie jest wciśnięty
		
pętla_główna:
	; Sprawdzanie przycisków zmiany brzmienia na porcie P3
	jb P3.3, spr_p34
	mov R3, #0     ; Klawisz P3.3 wciśnięty -> oryginalne brzmienie (+0 półtonów)
	sjmp key_1
spr_p34:
	jb P3.4, spr_p35
	mov R3, #4     ; Klawisz P3.4 wciśnięty -> przesunięcie o tercję (+4 półtony)
	sjmp key_1
spr_p35:
	jb P3.5, spr_p36
	mov R3, #7     ; Klawisz P3.5 wciśnięty -> przesunięcie o kwintę (+7 półtonów)
	sjmp key_1
spr_p36:
	jb P3.6, key_1
	mov R3, #12    ; Klawisz P3.6 wciśnięty -> przesunięcie o oktawę (+12 półtonów)

; --- SEKCJA SKANOWANIA KLAWIATURY MATRYCOWEJ ---
key_1:	
	mov r0, #LINE_1 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0	
	jz key_2
	acall ZAGRAJ_Z_TRANSP
	jmp key_1
			
key_2:	
	mov r0, #LINE_2 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0
	jz key_3
	acall ZAGRAJ_Z_TRANSP
	jmp key_2
			
key_3:	
	mov r0, #LINE_3 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0
	jz key_4
	acall ZAGRAJ_Z_TRANSP
	jmp key_3
			
key_4:	
	mov r0, #LINE_4 \ mov a, r0 \ mov P5, a \ mov a, P7 \ anl a, r0 \ mov r2, a
	clr c \ subb a, r0
	jz dalej
	acall ZAGRAJ_Z_TRANSP
	jmp key_4	

dalej:		
	jmp graj    

; --- TABELA MAPOWANIA ZWROTNEGO: INDEKS (0-15) -> KOD SKANINGOWY ---
SCAN_CODES:
	db 77H, 7BH, 7DH, 7EH
	db B7H, BBH, BDH, BEH
	db D7H, DBH, DDH, DEH
	db E7H, EBH, EDH, EEH

; --- TABELA NAZW NUT (PO 5 BAJTÓW NA WPIS) ---
NOTE_NAMES:
	db "C1  ",00
	db "CIS1",00
	db "D1  ",00
	db "DIS1",00
	db "E1  ",00
	db "F1  ",00
	db "FIS1",00
	db "G1  ",00
	db "GIS1",00
	db "A1  ",00
	db "B1  ",00
	db "H1  ",00
	db "C2  ",00
	db "CIS2",00
	db "D2  ",00
	db "DIS2",00

    end start