;===================================================
;R7.0           1 = Window Sensor's failed
;R7.1           1 = Temp Sensor's failed
;R7.2           1 = Has dialed and connected
;R7.3           1 = Signal's stopped
;R7.4           1 = Microphone On 1
;R7.5           1 = Microphone On 2
;R7.6           1 = Buzzer On
;R4             00h = Normal
;               01h = Phone 1
;               02h = Phone 2
;P3.0           Hook drive
;
;===================================================
Start:
        Mov Tmod,#10h
        Clr P3.0
        Setb Tr0
        Acall Signal_Delay

;CW.0   Port C lower    1 Input
;CW.1   Port B          1 Input
;CW.2   Mode
;CW.3   Port C upper    1 Input
;CW.4   Port A lower    1 Input
;CW.5   Mode
;CW.6   Mode
;CW.7   1 Aktif

        Mov A,#83h              ;Init PPI
        Mov Dptr,#4003h
        Movx @Dptr,A

        Mov Dptr,#6100h
        Movx A,@Dptr
        Clr A
        Movx @Dptr,A
        Movx @Dptr,A
        Mov A,#08h
        Movx @Dptr,A
        Clr A
        Movx @Dptr,A
        Movx A,@Dptr

        Acall Signal_Delay
        Acall Signal_Delay

        Mov A,#09h
        Mov Dptr,#6100h
        Movx @Dptr,A
        Mov A,#00h
        Movx @Dptr,A

        Mov R4,#01h
        Mov Dph,#21h
        Acall Load

        Mov R7,#00h

Read_Sensor:
        Mov Dptr,#4001h                 ;Toggle Buzzer
        Movx A,@Dptr
        Jnb A.0,Not_Toggle
Toggle:
        Movx A,@Dptr
        Jnb A.0,Toggle
        Cpl Tr0

Not_Toggle:
        Mov Dptr,#4001h
        Movx A,@Dptr
        Jb A.4,Read_Sensor_1            ;Ring Detector
        Setb P3.0
        Mov A,R7
        Setb A.2
        Mov R7,A

Read_Sensor_1:
        Mov Dptr,#4001h
        Movx A,@Dptr
        Jnb A.2,Read_Sensor_2           ;Operation Mode
        Ajmp Check_Button

Read_Sensor_2:
        Mov R4,#01h
        Mov Dph,#21h
        Acall Load

        Mov Dptr,#4000h
        Mov A,#B0h
        Movx @Dptr,A

        Mov Dptr,#4002h
        Movx A,@Dptr
        Jnb A.0,IR_Error
        Jnb A.1,IR_Error
        Mov A,R7
        Clr A.0
        Mov R7,A

        Mov Dptr,#4002h
        Movx A,@Dptr
        Jb A.2,Temp_Error
        Jb A.3,Temp_Error

        Mov A,R7
        Clr A.1
        Clr A.6
        Clr A.7
        Mov R7,A
        Mov Dptr,#4002h
        Movx @Dptr,A
        Jnb A.2,Cancel_Connection
        Ajmp Check_DTMF

Cancel_Connection:
        Clr P3.0
        Mov R7,#00h
        Mov A,R7
        Mov Dptr,#4002h
        Movx @Dptr,A
        Sjmp Read_Sensor

IR_Error:
        Mov A,R7
        Setb A.0
        Mov R7,A

        Mov Dptr,#4002h
        Movx A,@Dptr
        Jb A.2,Temp_Error
        Jb A.3,Temp_Error

        Mov A,R7
        Clr A.1
        Mov R7,A
        Sjmp Failure_Procedure

Temp_Error:
        Mov A,R7
        Setb A.1
        Mov R7,A

Failure_Procedure:
        Jb Tr0,Buzzer_On
        Mov A,R7
        Clr A.6
        Mov R7,A
        Sjmp Connection_Status

Buzzer_On:
        Mov A,R7
        Setb A.6
        Mov R7,A

Connection_Status:
        Mov A,R7
        Mov Dptr,#4002h
        Movx @Dptr,A
        Jb A.2,Check_DTMF
        Ajmp Dial_1

Check_DTMF:
        Mov Dptr,#6100h
        Mov A,#01h
        Movx @Dptr,A
        Acall Signal_Delay
        Mov A,R7
        Jb A.3,Check_DTMF_1
        Acall Signal

Check_DTMF_1:
        Mov Dptr,#6100h
        Movx A,@Dptr
        Jnb A.2,Check_Over_Flow
        Acall Get_DTMF
        Mov 20h,#80h

Check_Over_Flow:
        Jb Tf1,Dec_20h
        Ajmp Read_Sensor

Dec_20h:
        Clr Tf1
        Mov A,20h
        Dec A
        Mov 20h,A
        Cjne A,#00h,Still_Connect

        Clr Tr1
        Clr P3.0
        Mov R7,#00h
        Acall Two_Seconds_Delay
        Ajmp Read_Sensor

Still_Connect:
        Ajmp Read_Sensor

Get_DTMF:
        Mov 20h,#80h
        Mov Dptr,#6000h
        Movx A,@Dptr
        Anl A,#0Fh

DTMF_Disconnect:
        Cjne A,#0Ah,DTMF_Signal
        Mov R7,#00h
        Clr P3.0
        Acall Two_Seconds_Delay
        Ret

DTMF_Signal:
        Cjne A,#01h,DTMF_Buzzer
        Mov A,R7
        Cpl A.3
        Mov R7,A
        Ret

DTMF_Buzzer:
        Cjne A,#02h,DTMF_Microphone_1
        Cpl Tr0
        Ret

DTMF_Microphone_1:
        Cjne A,#03h,DTMF_Microphone_2
        Mov A,R7
        Cpl A.4
        Mov R7,A
        Mov Dptr,#4002h
        Movx @Dptr,A
        Ret

DTMF_Microphone_2:
        Cjne A,#04h,Unused_DTMF
        Mov A,R7
        Cpl A.5
        Mov R7,A
        Mov Dptr,#4002h
        Movx @Dptr,A

Unused_DTMF:
        Ret

Signal:
        Mov A,R7
        Jb A.1,Long_Signal
        Jb A.0,Short_Signal
        Setb A.3
        Clr A.6
        Clr A.7
        Mov R7,A
        Mov Dptr,#4002h
        Mov A,R7
        Movx @Dptr,A
        Ret

Short_Signal:
        Mov R1,#5h
        Sjmp Send_Signal

Long_Signal:
        Mov R1,#19h

Send_Signal:
        Clr Tr1
        Mov Th1,#00h
        Mov Tl1,#00h
        Mov A,R1
        Mov R0,A
        Setb Tr1
        Mov A,R7
        Setb A.7
        Mov Dptr,#4002h
        Movx @Dptr,A

Send_High:
        Mov Dptr,#6100h
        Movx A,@Dptr
        Jb A.2,Incoming_DTMF

        Jnb Tf1,Send_High
        Clr Tf1
        Djnz R0,Send_High


        Clr Tr1
        Mov Th1,#00h
        Mov Tl1,#00h
        Mov A,R1
        Mov R0,A
        Setb Tr1
        Mov A,R7
        Clr A.7
        Mov Dptr,#4002h
        Movx @Dptr,A

Send_Low:
        Mov Dptr,#6100h
        Movx A,@Dptr
        Jb A.2,Incoming_DTMF

        Jnb Tf1,Send_Low
        Clr Tf1
        Djnz R0,Send_Low
        Ret


Incoming_DTMF:
        Acall Get_DTMF
        Ret

Call_Progress:
        Mov R7,#00h
        Clr P3.0
        Acall Two_Seconds_Delay
        Ret

Dial_1:
        Setb P3.0
        Acall Two_Seconds_Delay
        Mov R0,#21h
        Acall Dial_Number
        Nop
        Acall Wait_For_Connecting
        Cjne R0,#00h,Dial_2
        Mov A,R7
        Setb A.2
        Mov R7,A
        Ajmp Read_Sensor

Dial_2:
        Clr P3.0
        Acall Two_Seconds_Delay
        Setb P3.0
        Acall Two_Seconds_Delay
        Mov R0,#22h
        Acall Dial_Number
        Nop
        Acall Wait_For_Connecting
        Cjne R0,#00h,Dial_3
        Mov A,R7
        Setb A.2
        Mov R7,A
        Ajmp Read_Sensor

Dial_3:
        Clr P3.0
        Acall Two_Seconds_Delay
        Setb P3.0
        Acall Two_Seconds_Delay
        Mov R0,#21h
        Acall Dial_Number
        Nop
        Acall Wait_For_Connecting
        Cjne R0,#00h,No_Connection
        Mov A,R7
        Setb A.2
        Mov R7,A
        Ajmp Read_Sensor

No_Connection:
        Clr P3.0
        Mov R7,#00h
        Acall Two_Seconds_Delay
        Ajmp Read_Sensor

Dial_Number:
        Mov A,#09h
        Mov Dptr,#6100h
        Movx @Dptr,A
        Mov A,#00h
        Movx @Dptr,A
        Mov A,R0
        Mov Dph,A
        Mov Dpl,#00
        Movx A,@Dptr
        Mov R3,A
        Mov R1,#00h

Dial_Number_1:
        Inc R1
        Mov A,R1
        Mov Dpl,A
        Mov A,R0
        Mov Dph,A
        Movx A,@Dptr
        Cjne A,#00h,Send
        Mov A,#0Ah

Send:
        Mov Dptr,#6000h
        Movx @Dptr,A

Send_1:
        Mov Dptr,#6100h
        Movx A,@Dptr
        Jnb A.1,Send_1
        Mov A,R1
        Mov B,R3
        Cjne A,B,Dial_Number_1
        Ret

Wait_For_Connecting:
        Mov Dptr,#6100h
        Mov A,#07h
        Movx @Dptr,A

        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay

        Clr Tr1
        Mov Th1,#00h
        Mov Tl1,#00h
        Clr Tf1
        Mov R0,#4Dh
        Mov R1,#05h
        Setb Tr1

Wait_For_Connecting_1:
        Jb P3.2,Dec_R1
        Jnb Tf1,Wait_For_Connecting_1
        Clr Tf1
        Djnz R0,Wait_For_Connecting_1
        Clr Tr1
        Mov R0,#00h
        Mov A,#04h
        Mov Dptr,#4000h
        Movx @Dptr,A
        Ret

Dec_R1:
        Acall Two_Seconds_Delay
        Mov R0,#4Dh
        Djnz R1,Wait_For_Connecting_1
        Mov A,#05h
        Mov Dptr,#4000h
        Movx @Dptr,A
        Clr Tr1
        Mov R0,#FFh
        Ret

Two_Seconds_Delay:
        Mov B,#18h
Two_Seconds_Delay_1:
        Acall Signal_Delay
        Djnz B,Two_Seconds_Delay_1
        Ret

Signal_Delay:
        Mov R6,#FFh
Signal_Delay_1:
        Acall Delay
        Djnz R6,Signal_Delay_1
        Ret

Saving_Delay:
        Mov R6,#10h
Saving_Delay_1:
        Acall Delay
        Djnz R6,Saving_Delay_1
        Ret

Delay:
        Mov R5,#FFh
        Djnz R5,$
        Ret



Check_Button:
        Lcall Delay

L1:
        Clr P1.0
        Setb P1.1
        Setb P1.2
        Acall Delay

        Jb P3.3,L2
        Jb P1.6,K1
        Mov R3,#00h
        Mov 61h,#0Bh
        Mov 62h,#0Bh
        Mov 63h,#0Bh
        Mov 64h,#0Bh
        Mov 65h,#0Bh
        Mov 66h,#0Bh
        Mov 67h,#0Bh
        Mov 68h,#0Bh
        Mov 69h,#0Bh
        Mov 6Ah,#0Bh
        Mov 6Bh,#0Bh
        Mov 6Ch,#0Bh
        Ajmp Wait


K1:
        Jb P1.5,K2
        Mov B,#7h
        Ajmp Key_Pressed

K2:
        Jb P1.4,K3
        Mov B,#4h
        Ajmp Key_Pressed

K3:
        Jb P1.3,No_Key
        Mov B,#1h
        Ajmp Key_Pressed

L2:
        Setb P1.0
        Clr P1.1
        Setb P1.2
        Acall Delay

        Jb P3.3,L3
        Jb P1.6,K4
        Mov B,#0h
        Ajmp Key_Pressed

K4:
        Jb P1.5,K5
        Mov B,#8h
        Ajmp Key_Pressed

K5:
        Jb P1.4,K6
        Mov B,#5h
        Ajmp Key_Pressed

K6:
        Jb P1.3,No_Key
        Mov B,#2h
        Ajmp Key_Pressed

No_Key:
        Acall Display
        Ajmp Read_Sensor

L3:
        Setb P1.0
        Setb P1.1
        Clr P1.2
        Acall Delay

        Jb P3.3,No_Key
        Jb P1.6,K7
        Cjne R4,#01h,Save_2
        Mov Dph,#21h
        Acall Save
        Mov R4,#02h
        Mov Dph,#22h
        Acall Load
        Sjmp Wait

Save_2:
        Mov Dph,#22h
        Acall Save
        Mov R4,#01h
        Mov Dph,#21h
        Acall Load
        Sjmp Wait

K7:
        Jb P1.5,K8
        Mov B,#9h
        Ajmp Key_Pressed

K8:
        Jb P1.4,K9
        Mov B,#6h
        Ajmp Key_Pressed

K9:
        Jb P1.3,No_Key
        Mov B,#3h

Key_Pressed:
        Inc R3
        Mov A,R3
        Add A,#60h
        Mov R0,A
        Mov A,B
        Mov @R0,A

Wait:
        Acall Display
        Nop
        Jnb P3.3,Wait
        Ljmp Read_Sensor

Display:
        Mov A,R4
        Mov Dptr,#4000h
        Movx @Dptr,A
        Acall Delay

Display_1:
        Mov A,61h
        Orl A,#10h
        Movx @Dptr,A
        Acall Delay

        Mov A,62h
        Orl A,#20h
        Movx @Dptr,A
        Acall Delay

        Mov A,63h
        Orl A,#30h
        Movx @Dptr,A
        Acall Delay

        Mov A,64h
        Orl A,#40h
        Movx @Dptr,A
        Acall Delay

        Mov A,65h
        Orl A,#50h
        Movx @Dptr,A
        Acall Delay

        Mov A,66h
        Orl A,#60h
        Movx @Dptr,A
        Acall Delay

        Mov A,67h
        Orl A,#70h
        Movx @Dptr,A
        Acall Delay

        Mov A,68h
        Orl A,#E0h
        Movx @Dptr,A
        Acall Delay

        Mov A,69h
        Orl A,#F0h
        Movx @Dptr,A
        Acall Delay

        Mov A,6Ah
        Orl A,#80h
        Movx @Dptr,A
        Acall Delay

        Mov A,6Bh
        Orl A,#90h
        Movx @Dptr,A
        Acall Delay

        Mov A,6Ch
        Orl A,#A0h
        Movx @Dptr,A
        Acall Delay

        Ret

Clear_RAM:
        Mov 61h,#0Bh
        Mov 62h,#0Bh
        Mov 63h,#0Bh
        Mov 64h,#0Bh
        Mov 65h,#0Bh
        Mov 66h,#0Bh
        Mov 67h,#0Bh
        Mov 68h,#0Bh
        Mov 69h,#0Bh
        Mov 6Ah,#0Bh
        Mov 6Bh,#0Bh
        Mov 6Ch,#0Bh
        Ret
        

Save:
        Mov A,R3
        Mov Dpl,#00
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Acall Saving_Delay

        Mov R0,#61h
        Mov Dpl,#01h

Save_A:
        Mov A,@R0
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Acall Saving_Delay
        Inc Dpl
        Inc R0
        Cjne R0,#6Dh,Save_A
        Ret

Load:
        Mov Dpl,#00h
        Movx A,@Dptr
        Mov R3,A

        Mov R0,#61h
        Mov Dpl,#01h

Load_A:
        Movx A,@Dptr
        Mov @R0,A
        Inc Dpl
        Inc R0
        Cjne R0,#6Dh,Load_A
        Ret











Percobaan:
        Mov Dptr,#2100h
        Mov A,#0Bh
        Acall Store
        Inc Dpl
        Mov A,#00h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#01h
        Acall Store
        Inc Dpl
        Mov A,#02h
        Acall Store
        Inc Dpl
        Mov A,#09h
        Acall Store
        Inc Dpl
        Mov A,#04h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#02h
        Acall Store
        Inc Dpl
        Mov A,#06h
        Acall Store
        Inc Dpl
        Mov A,#06h
        Acall Store
        Inc Dpl
        Mov A,#01h
        Acall Store

        Mov Dptr,#2200h
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#07h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Inc Dpl
        Mov A,#01h
        Acall Store
        Inc Dpl
        Mov A,#01h
        Acall Store
        Inc Dpl
        Mov A,#06h
        Acall Store
        Inc Dpl
        Mov A,#08h
        Acall Store
        Ret

Store:
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Movx @Dptr,A
        Acall Saving_Delay
        Ret




