	.DATA
	Org	50H
TF1_Counter	Ds	1
Stack_Temp	Ds	1

	.CODE
Delay_1detik		EQU	015CH
Delay_100mS		EQU	016EH
Enter_Code		EQU	01ABH
Init_Serial		EQU	01B8H
KirimPesan_Serial	EQU	01D8H
Filter			EQU	01E4H

;DF-88 Routines
;Mode DTMF
Init_MT8888		EQU	0682H
CP_Mode			EQU	06A1H
Awal_CP			EQU	06AAH
TungguAkhir_CP		EQU	06CCH

Alamat_DF88		EQU	6000H
Gagang			Bit	T0

	Org	2000H			;Reset Vector
	Ajmp	Start			;
	Org	2003H			;External Interrupt 0 Vector
	Reti				;
	Org	200BH			;Timer 0 Interrupt Vector
	Reti				;
	Org	2013H			;External Interrupt 1 Vector
	Reti				;
	Org	201BH			;Timer 1 Interrupt Vector
	Ajmp	Timer1_Interrupt
	Org	2023H			;Serial Interrupt Vector
	Reti				;

Start:
	Mov	Stack_Temp,SP		;Isi Stack Pointer di temporary
	Mov	DPTR,#Alamat_DF88	;Inisial MT8888
	Lcall	Init_MT8888		;
	Jb	Gagang,*		;Tunggu diangkat
	Jb	INT0,*

	Mov	DPTR,#Alamat_DF88
	Lcall	CP_Mode			;Set MT8888 Mode Call Progress
					;Proses pendeteksi gagang lawan
					;diangkat aktif
	Setb	EA			;Interrupt Aktif

;Deteksi menggunakan 2 buah Timer
;Timer 0 digunakan untuk deteksi adanya Sinyal Call Progress 425 Hz
;Timer 1 digunakan untuk menghitung lama antara CP1 dan CP2
;Bila antara CP1 dan CP2 hanya 60000H Cycle maka nada bicara
;Bila antara CP1 dan CP2 200000H hingga 500000H Cycle maka nada sambung
;Bila setelah 600000H Cycle tidak ada CP berarti tersambung

	Lcall	Awal_CP			;Ambil awal Call Progress
LoopTunggu_Tersambung:
	Clr	TR1			;Stop Timer 1
	Mov	TMOD,#11H		;Aktifkan Timer 1
	Lcall	Reset_Timer1		;Reset Timer 1
	Lcall	TungguAkhir_CP		;Tunggu CP pertama berakhir
	Setb	TR1			;Start Timer 1
	Setb	IE.3			;Aktifkan Interrupt Timer 1

	Lcall	Awal_CP			;Tunggu CP berikutnya
	Lcall	TungguAkhir_CP		;Tunggu CP berikut berakhir
	Clr	TR1			;Stop Timer 1
	Clr	IE.3			;Non aktifkan Interrupt Timer 1
	Mov	R7,#18H			;Jarak antara CP1 dan CP2
	Mov	R6,#04H			;antara 40000H - 180000H Cycle?
	Mov	A,TF1_Counter		;
	Lcall	Filter			;
	Jnc	Nada_Bicara		;Ya! berarti nada bicara

	Lcall	Init_Serial
	Lcall	Enter_Code
	Mov	DPTR,#NadaSambung_Msg	;Kirim Pesan Nada Sambung
	Lcall	KirimPesan_Serial
	Ajmp	LoopTunggu_Tersambung

Nada_Bicara:
	Lcall	Init_Serial
	Lcall	Enter_Code
	Mov	DPTR,#Busy_Msg		;
	Lcall	KirimPesan_Serial	;
	Clr	P1.0			;Putus hubungan telephone
	Setb	P1.1			;
	Lcall	Delay_1detik		;Delay 3 detik
	Lcall	Delay_1detik		;
	Lcall	Delay_1detik		;
	Setb	P1.0			;Sambung hubungan telephone
	Lcall	Delay_100mS
	Ajmp	*

Tersambung:
	Jb	Gagang,Batal		;Gagang sudah diletakkan, batal
	Lcall	Init_Serial		;Belum tersambung
	Lcall	Enter_Code		;
	Mov	DPTR,#Sambung_Msg	;Kirim Pesan Tersambung
	Lcall	KirimPesan_Serial	;
	Ajmp	*

Batal:
	Lcall	Init_Serial		;Kirim Pesan Batal
	Lcall	Enter_Code		;
	Mov	DPTR,#Batal_Msg		;
	Lcall	KirimPesan_Serial	;
	Ajmp	*	

;INTERRUPT SUBROUTINE
Timer1_Interrupt:
	Clr	EA			;Matikan Interrupt
	Clr	IE.3			;
	Clr	TR1			;Matikan Timer 1
	Push	PSW			;Simpan PSW
	Push	03H			;Simpan R3
	Inc	TF1_Counter		;TF1 Counter + 1
	Mov	R3,TF1_Counter		;
	Cjne	R3,#050H,Belum_Sambung	;TF1 Counter 50x?

	Pop	03H			;Ambil R3
	Pop	PSW			;Ambil PSW
	Mov	A,SP			;SP - Isi Stack Temporary - 2
	Mov	B,Stack_Temp		;
	Clr	C			;
	Subb	A,B			;
	Dec	A			;
	Dec	A			;

LoopKembalikan_Stack:
	Pop	7Fh			;Pop data dari SP sebanyak
	Djnz	A,LoopKembalikan_Stack	;SP - Stack Temporary - 2
	Mov	DPTR,#Tersambung	;Isi SP dengan label tersambung
	Push	DPL			;
	Push	DPH			;
	Reti				;Loncat ke alamat tersambung

Belum_Sambung:
	Pop	03H			;Belum overflow 50x, belum 
	Pop	PSW			;tersambung
	Setb	IE.3			;
	Setb	TR1			;
	Setb	EA			;
	Reti				;

Reset_Timer1	
	Mov	TF1_Counter,#00H
	Mov	TH1,#00H
	Mov	TL1,#00H
	Ret

;KUMPULAN PESAN-PESAN YANG DITAMPILKAN
CP_Msg:
	DB	'Tone',$0F

Sambung_Msg:
	DB	'Sambung',$0F
NadaSambung_Msg:
	DB	'Nd Sambung',$0F

Busy_Msg:
	DB	'Busy',$0F

Batal_Msg:
	DB	'Batal',$0F
