$MOD51
        DSEG
	Org	50H
TF1_Counter:     Ds      1
Stack_Temp:      Ds      1

        CSEG
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    ACC,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',0FH

Sambung_Msg:
        DB      'Sambung',0FH
NadaSambung_Msg:
        DB      'Nd Sambung',0FH

Busy_Msg:
        DB      'Busy',0FH

Batal_Msg:
        DB      'Batal',0FH
        END
