//*********************************************************
// Program for interfacing the Alcatel 4400 AHL
// ALCATEL 4400 (DHS 3)
//
// The portinterface hardware must be changed to
// V24 level.
// Use the pin 2 RXD
//	   pin 3 TXD
//         pin 7 GND
//
//*********************************************************
// By  H”rhager Josef VTE   06/96
//*********************************************************
// Revision:
// V1.0 04/96 orginate
//
//*********************************************************
//
// for testing define debug
// if debug print some messages to channel 4
//
//#define debug
//*********************************************************
#include        "ahl_def.h"
//
//
// Start Modul 1 ALCATEL HOTEL/HOSPITAL LINK "AHL"
// PABX: 4400 DHS3
//
// Revision: V 1.0
//
        setbaud 1,1200,8,n,1
// setting up stx ... etx parameter
//
	setp	0x7f00,0x03
	setp	0x7f01,0x00
//
        mode_opus300
//
ahl_init:
	call	init_b0
        call    init_b1
        call    init_b2
        call    init_b3
//
        movd    "AHL-Link1>1              /n",ahl_wstr,0
//
// send signon mess
//
        movd    mess_startup1,ahl_wstr,11
        out     ahl_wstr,0,c4
        movd    mess_startup2,ahl_wstr,11
        out     ahl_wstr,0,c4
        movd    mess_startup3,ahl_wstr,11
        out     ahl_wstr,0,c4
error_main:
        mode_opus300
        movd    mess_timeout,ahl_wstr,11
        out     ahl_wstr,0,c4
        movd    mess_send_ack,ahl_wstr,11
        out     ahl_wstr,0,c4
        wrchar  ack
        jmp     main
//
//***********************************************
// MAIN
main:
        setl    9,1
        movd    ahl_idle_state,ahl_wstr,11
        out     ahl_wstr,0,c4
        setc    counter_timeout,ahl_timeout     // set timeout units 10sec
main_loop:
        setl    9,1
        sett    100                             // units 10 sec
        wait    tf_sign,rx_sign,ans_sign,cntl_sign
        setl    9,2
        case    tf_sign,test_rx_state
        decc    counter_timeout                 // ahl timeout --
        jnz     main_loop
        jmp     error_main
//
//***********************************************
// on rx_sign
//
test_rx_state:
        case    rx_sign,test_ans_state
//
        call    opus_rxstate
//
        jmp     main
//
//*********************************************************
// Testing for ans_sign
//
test_ans_state:
        case    ans_sign,test_cntl_state
        movd    ahl_send_state,ahl_wstr,11
        out     ahl_wstr,0,c4
        readb   ahl_out_str,0,ahl_mess_in
        jz      main
//
        out     ahl_out_str,0,c4
        setc    repeat_counter,number_of_repeat            //anzahl wiederholungen wenn nak
l_data_stx:
        clear   cntl_sign               //
        opuswrs ahl_out_str,0,150       //sende STX data BCC BCC ETX
        jz      wait_ackn_data          //warte auf reaktion.
        //
//***********************************************
//
        mode_opus300                    //reset rx-buffer
        movd    " TIMEOUT ERROR ON WRITE TO CHANNEL AHL (xoff)!/n",ahl_wstr,11
        out     ahl_wstr,0,c4
        decc    repeat_counter
        jnz     l_data_stx
opus_err_timeout:
mess_max_retry:
        movd    " Max retry are reached!/n",ahl_wstr,11
        out     ahl_wstr,0,c4
        movd    mess_error_to,ahl_in_str,0
        out     ahl_in_str,0,c4
        writeb  ahl_in_str,0,ahl_mess_out
        sendsig ans_sign,modul_converter
        jmp     main
//
wait_ackn_data:
        sett    timeout_repeat          //warte 3 sec
        wait    cntl_sign,tf_sign,rx_sign
        case    rx_sign,do_cntl_stx
        call    opus_rxstate
        jmp     wait_ackn_data
//
do_cntl_stx:
        case    cntl_sign,to_data_stx
        compc   14,6                    //ein ack ?
        jnz     data_nak
        movd    "RECEIVED *ACK*/n",ahl_wstr,11
        out     ahl_wstr,0,c4
        jmp     main
//
data_nak:
        compc   14,21                   //ein nak ?
        jnz     data_wrong
        movd    " ERROR ON DATA-SEND: RECEIVED *NAK*!/n",ahl_wstr,11
        out     ahl_wstr,0,c4
        decc    repeat_counter          //nochmal senden ?
        jnz     l_data_stx              // ja
        jmp     mess_max_retry
//
data_wrong:
        movd    " ERROR ON DATA-SEND: RECEIVED *   *!/n",ahl_wstr,11
        movc    14,ahl_wstr,42        //dezimal ausgabe input char
        out     ahl_wstr,0,c4
        decc    repeat_counter          //nochmal senden ?
        jnz     l_data_stx
        jmp     mess_max_retry
//
to_data_stx:
        movd    " ERROR ON DATA-SEND: WAIT ACKN. TIMEOUT!/n",ahl_wstr,11
        out     ahl_wstr,0,c4
        decc    repeat_counter          //nochmal senden ?
        jnz     l_data_stx
        jmp     mess_max_retry
        //
//**********************************************************
//
//*********************************************************
// test cntl_state
test_cntl_state:
        case    cntl_sign,main
        movd    " ERROR CNTL-SIGN:    RECEIVED *   *!/n",ahl_wstr,11
        movc    14,ahl_wstr,42        //dezimal ausgabe input char
        out     ahl_wstr,0,c4
        jmp     main
//
//*********************************************************
// subroutinen
//
opus_rxstate:
        movd    ahl_receive_state,ahl_wstr,11
        out     ahl_wstr,0,c4
        opusrds ahl_in_str,0
        jz      main_loop
        compc   15,0                    // receive ok?
        jnz     error_rxopus
//
// send message and data to c4
//
        movd    mess_send_ack,ahl_wstr,11
        out     ahl_in_str,0,c4
        out     ahl_wstr,0,c4
//
        wrchar  ack
        writeb  ahl_in_str,0,ahl_mess_out
        sendsig ans_sign,modul_converter
        ret
//
error_rxopus:
        movd    mess_send_nak,ahl_wstr,11
        out     ahl_in_str,0,c4
        out     ahl_wstr,0,c4
//
        wrchar  nak
        ret
//
//***********************************************
// Buffer 0 init
//
// Aufruf:	 call	 Init_b0
//
init_b0:
	setp	0XD300,badr_0_high	//beginn adresse high
	setp	0XD301,0x00		//beginn adresse low
//
	setp	0Xd302,lbuff_0_high	//bufferlaenge high
	setp	0XD303,0x00		//bufferlaenge low
//
	setp	0Xd304,lbuff_0_high	//anzahl bytes free high
	setp	0XD305,0x00		//anzahl bytes free low
//
	setp	0Xd306,badr_0_high	//input zeiger high
	setp	0XD307,0x00		//input zeiger low
//
	setp	0Xd308,lbuff_0_high	//input laenge bis bufferende high
	setp	0XD309,0x00		//input laenge bis bufferende low
//
	setp	0Xd30A,badr_0_high	//output zeiger high
	setp	0XD30B,0x00		//output zeiger low
//
	setp	0Xd30C,lbuff_0_high	//output laenge bis bufferende high
	setp	0XD30D,0x00		//output laenge bis bufferende low
//
	setp	0XD30E,modnum_0 	//modulnummer falls in modulmem
//
	ret
//
// ***********************************************
// Buffer 1 init
//
// Aufruf:       call    Init_b1
//
init_b1:
        setp    0XD310,badr_1_high      //beginn adresse high
        setp    0XD311,0x00             //beginn adresse low
//
        setp    0Xd312,lbuff_1_high     //bufferlaenge high
        setp    0Xd313,0x00             //bufferlaenge low
//
        setp    0Xd314,lbuff_1_high     //anzahl bytes free high
        setp    0Xd315,0x00             //anzahl bytes free low
//
        setp    0Xd316,badr_1_high      //input zeiger high
        setp    0Xd317,0x00             //input zeiger low
//
        setp    0Xd318,lbuff_1_high     //input laenge bis bufferende high
        setp    0Xd319,0x00             //input laenge bis bufferende low
//
        setp    0Xd31A,badr_1_high      //output zeiger high
        setp    0Xd31B,0x00             //output zeiger low
//
        setp    0Xd31C,lbuff_1_high     //output laenge bis bufferende high
        setp    0Xd31D,0x00             //output laenge bis bufferende low
//
        setp    0Xd31E,modnum_1         //modulnummer falls in modulmem
//
	ret
//
// ***********************************************
// Buffer 2 init
//
// Aufruf:       call    Init_b2
//
init_b2:
        setp    0Xd320,badr_2_high      //beginn adresse high
        setp    0Xd321,0x00             //beginn adresse low
//
        setp    0Xd322,lbuff_2_high     //bufferlaenge high
        setp    0Xd323,0x00             //bufferlaenge low
//
        setp    0Xd324,lbuff_2_high     //anzahl bytes free high
        setp    0Xd325,0x00             //anzahl bytes free low
//
        setp    0Xd326,badr_2_high      //input zeiger high
        setp    0Xd327,0x00             //input zeiger low
//
        setp    0Xd328,lbuff_2_high     //input laenge bis bufferende high
        setp    0Xd329,0x00             //input laenge bis bufferende low
//
        setp    0Xd32A,badr_2_high      //output zeiger high
        setp    0Xd32B,0x00             //output zeiger low
//
        setp    0Xd32C,lbuff_2_high     //output laenge bis bufferende high
        setp    0Xd32D,0x00             //output laenge bis bufferende low
//
        setp    0Xd32E,modnum_2         //modulnummer falls in modulmem
//
	ret
//
// ***********************************************
// Buffer 3 init
//
// Aufruf:       call    Init_b3
//
init_b3:
        setp    0Xd330,badr_3_high      //beginn adresse high
        setp    0Xd331,0x00             //beginn adresse low
//
        setp    0Xd332,lbuff_3_high     //bufferlaenge high
        setp    0Xd333,0x00             //bufferlaenge low
//
        setp    0Xd334,lbuff_3_high     //anzahl bytes free high
        setp    0Xd335,0x00             //anzahl bytes free low
//
        setp    0Xd336,badr_3_high      //input zeiger high
        setp    0Xd337,0x00             //input zeiger low
//
        setp    0Xd338,lbuff_3_high     //input laenge bis bufferende high
        setp    0Xd339,0x00             //input laenge bis bufferende low
//
        setp    0Xd33A,badr_3_high      //output zeiger high
        setp    0Xd33B,0x00             //output zeiger low
//
        setp    0Xd33C,lbuff_3_high     //output laenge bis bufferende high
        setp    0Xd33D,0x00             //output laenge bis bufferende low
//
        setp    0Xd33E,modnum_3         //modulnummer falls in modulmem
//
	ret
//
zzz:
//
end
