//
//**********************************************************
//
//   advanced feature server
//   =======================
//
//   with modemhandler
//   for EA-Generali --- DHS3 Terminaladapter TA-V24
//   configurated: automatic answer, HAYES commands, 9600,n,8,1
//------------------------------------------------------------
//
// revision:
//      V 3.0  Datensatzl„nge auf 150 Zeichen erh”ht f�r DHS 2
//
#define use_modem                       // for hangup modem
#define modem_init_str          "ATs0=1&b1/n" // for Modem
//#define modem_init_str          "AT/n"  //for TA-UA
#define auto_answer
//
//************************************************************
// mod0: edv      mod1: not used   mod2: dhs3   mod3: not used
//> R<cr>  int
//> O<cr>  int
//
//
// using: str 0 for work
//
//  string 0:
//
//          1111111111122222222233333333334444444444555555555566666666667
//01234567890123456789012345678901234567890123456789012345678901234567890
//EDV     0<0dddddddddddddddddddddddddddddddddddddddddd
//           -data for rd and wr
//          --sender kennung bei intermodultransfer
//        ----eigene modulnummer
//------------filename
//
// using: cnt 14 = cntl mem
//        cnt 13 = error mem
//        cnt 12 = loopcounter
//        cnt 11 = data-reco number
//      strings: s0,s2
//
        setbaud 1,9600,8,n,1  //modul setting 17.10.95
//**********************************************************
// setting up stx ... etx parameter
//
	setp	0x7f00,0x03
	setp	0x7f01,0x00
//
//**********************************************************
//
        mode_reco
        //
        setc    0,1          //error conter for to-send
        movd    "PModem          ",s0,0
        movd    "0<0",s0,8
        movd    " HAYES-Modem and TA v24 INTERFACE V3.1/n",s0,11
        out     s0,0,c4         //to sv-mon
        movd    " by HOERHAGER VTE READY !/l/n",s0,11
        out     s0,0,c4         //to sv-mon
        movd    " Modeminit=     ",s0,11
        movd    modem_init_str,s0,23
        out     s0,0,c4
reset_0:
        mode_reco
        setl    8,2
        movd    "0<0 /n",s0,8
        setc    12,5            //anzahl versuche modem-init
//
        movd    " TRY TO INIT TA V24 (MODEM) ---->/n",s0,11
        out     s0,0,c4
        call    modem_init
        jnz     reset_0
        movd    " MODEM-INIT OKAY !/n",s0,11
        out     s0,0,c4
        setl    8,1             //modul ready
        setc    12,60           //wartezeit auf ring (einheit= 10 sec) = 10 min
//
        call    wait_ring
        jnz     reset_0         //init modem
//
        call    modem_offh      // anruf abheben und warten auf connect
        jnz     reset_0
        movd    " CONNECT ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,24,21
        out     s0,0,c4
        sett    5
        wait    tf_sign
        mode_reco
        //
wait_cmd:
        setl    8,1
        sett    250
        wait    rx_sign,tf_sign //warte auf anforederung or timeout
        //
        // auforderung:
        // set channl is busy
        setl    8,2
        case    rx_sign,timeout_cmd
        rds     s0,11           //get data
        jz      wait_cmd        //
        //
        // test intern commands
        //
        compd   "NO CAR",s0,11
        jnz     test_end
        movd    " NO CARRIER ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,27,21
        out     s0,0,c4
        jmp     reset_0
//
test_end:
        compd   "E/n",s0,11
        jnz     test_rq
        movd    " END-CMD ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,24,21
        out     s0,0,c4
        call    modem_hangup
        jmp     reset_0
//
test_rq:
        compd   "R/n",s0,11
        jnz     test_old
        compc   13,0            //war zuvor ein fehler?
        jz      do_r_cmd        //
        out     s0,80,c5        //ja, dann alten reco zu printer
//
do_r_cmd:
        buffrd  s0,103
        buffst                   //get reco from buffer and send back
        incc    11
        call    data_stx
        jmp     wait_cmd
        //
test_old:
        compd   "O/n",s0,11
        jnz     test_for_bdi
        buffold s0,103
        call    data_stx
        jmp     wait_cmd
        //
test_for_bdi:
        movd    "0ERR_CMD/n",s0,10
send_mess:
        call    mess_stx           //answer back
        jmp     wait_cmd
        //
//**********************************************************
//
// on timeout after 25 sec write "channel_timeout" to sv-mon
//
//
timeout_cmd:
        movd    " CHANNEL_TIMEOUT on WAIT_CMD --> HANGUP!/n",s0,11
        out     s0,0,c4
        movd    " ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,16,21
        out     s0,0,c4
        call    modem_hangup
        jmp     reset_0
//
//
//**********************************************************
//
// subroutinen
//
write_error:
        movd    " TIMEOUT ERROR ON WRITE TO CHANNEL_0 (xoff) --> HANGUP!/n",s0,11
        out     s0,0,c4
        movd    " ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,16,21
        out     s0,0,c4
        call    modem_hangup
        jmp     reset_0
        //
        //
//
//**********************************************************
//
//  MODEM HANGUP !
//  input : -
//  output: -
//
modem_hangup:
        mode_reco
        sett    30
        wait    tf_sign
        wrd     "+++"
        sett    30
        wait    tf_sign
        wrd     "ATH/n"
//
        setrts  off
        sett    15
        wait    tf_sign
        setrts  on
        sett    15
        wait    tf_sign
hangup_wait:
        sett    20
        wait    tf_sign,rx_sign
        case    rx_sign,hangup_to
        rds     s0,11
        jz      hangup_wait
        out     s0,0,c4
        jmp     hangup_wait
//
hangup_to:
        ret
//
//**********************************************************
//
//  MODEM INIT !
//  input : cnt 12 anzahl der versuche
//  output: Z-flag wenn okay sonst NZ
//
modem_init:
#ifdef  use_modem
        call    modem_hangup
#endif
        wrd     modem_init_str
l_m_init:
        sett    100
        wait    rx_sign,tf_sign
        case    rx_sign,mi_timeout
        rds     s0,11
        jz      l_m_init
//
        out     s0,0,c4
        compd   "OK/n",s0,11
        jnz     l_m_init
        ret
//
mi_timeout:
        decc    12
        jnz     modem_init
        movd    " MODEM-INIT ERROR --->/n",s0,11
        out     s0,0,c4
        movd    " ON                       !/n",s0,11
        acall   fread_dt
        movs    s15,150,s0,16,21
        out     s0,0,c4
        incc    12
        ret
//
//
//**********************************************************
//
//  WAIT RING !
//  input : cnt 12 wartezeit in 10 sec einheit
//
wait_ring:
        sett    100     //10 sec warten auf
        wait    rx_sign,tf_sign
        case    rx_sign,wr_timeout
        rds     s0,11
        jz      wait_ring
        out     s0,0,c4         //send input
#ifdef auto_answer
        compd   "CONNECT",s0,11
        jnz     wait_ring
#else
        compd   "RING",s0,11
        jnz     wait_ring
#endif
        ret
//
wr_timeout:
        decc    12
        jnz     wait_ring
        incc    12
        ret
//
//
//**********************************************************
//
//  MODEM ANSWER RING AND WAIT CONNECT !
//  input : -
//  output: Z-flag connect okay sonst NZ
//
modem_offh:
        compd   "CONNECT",s0,11
        jz      modem_connected
        setc    12,30   // wartezeit fuer connect Meldung einheit = 1 sec
modem1_offh:
        sett    10
        wait    tf_sign
        wrd     "ATA/n"
//
m_wait_connect:
m_offh_l:
        sett    10
        wait    rx_sign,tf_sign
        case    rx_sign,moffh_timeout
        rds     s0,11
        jz      m_offh_l
        out     s0,0,c4
        //
modem_connected:
        setc    12,1
        decc    12
        ret
//
test_ring:
        compd   "RING",s0,11
        jnz      m_offh_l
        jmp     modem1_offh
        //
moffh_timeout:
        decc    12
        jnz     m_offh_l
        movd    " TIMEOUT WAIT-CONNECT                       !/n",s0,11
        acall   fread_dt               //33
        movs    s15,150,s0,34,21
        out     s0,0,c4                
        incc    12
        ret
//
//
//**********************************************************
//
//  CHANNEL 0 BAUDRATE 300 !
//
br_set_300:
        setp    0XfC81,0X44
        sett    2
        wait    tf_sign
        mode_reco
        ret
        //
//**********************************************************
//
//  CHANNEL 0 BAUDRATE 1200 !
//
br_set_1200:
        setp    0XfC81,0X66
        sett    2
        wait    tf_sign
        mode_reco
        ret
        //
//**********************************************************
//
//  CHANNEL 0 BAUDRATE 2400 !
//
br_set_2400:
        setp    0XfC81,0X88
        sett    2
        wait    tf_sign
        mode_reco
        ret
        //
//
//**********************************************************
//
//  WRITE DATA_RECO TO LINE !
//  input : cnt 11 reco-nummer
//          s0,103 data-string to send
//  output: cnt 13 = 0 datatransfer okay else not 0
//
// ack = 6
// nak = 21
// eot = 4
// enq = 5
//
data_stx:
        movc    11,s0,100       //reco-nummer zu data-string
        setc    12,1            //anzahl wiederholungen wenn nak
l_data_stx:
        clear   cntl_sign       //
        stxwrs  s0,100,150       //sende STX num data ETX BCC
        jz      wait_ackn_data  //warte auf reaktion.
        //
        call    write_error     //err-string zu SV-MON
        mode_reco               //reset rx-buffer
        movd    "CHANNEL TIMEOUT     ",s0,80
        setc    13,1            //return (err)
        ret
        //
wait_ackn_data:
        sett    30              //warte 3 sec
        wait    cntl_sign,tf_sign
        case    cntl_sign,to_data_stx
        compc   14,6            //ein ack ?
        jnz     data_nak
        setc    13,0            //transfer war okay
        ret
//
data_nak:
        compc   14,21           //ein nak ?
        jnz     data_wrong
        decc    12              //nochmal senden ?
        jnz     l_data_stx      // ja
        movd    " ERROR ON DATA-SEND: RECEIVED *NAK*!/n",s0,11
        out     s0,11,c4
        movd    "RECEIVED *NAK*      ",s0,80
        setc    13,1            // transfer error
        ret
//
data_wrong:
        movd    " ERROR ON DATA-SEND: RECEIVED *   *!     /n",s0,11
        movc    14,s0,42        //dezimal ausgabe input char
        out     s0,0,c4
        decc    12
        jnz     l_data_stx
        movs    s0,32,s0,80,20
        setc    13,1            //transfer error
        ret
//
to_data_stx:
        movd    " ERROR ON DATA-SEND: WAIT ACKN. TIMEOUT!/n",s0,11
        out     s0,0,c4
        decc    12
        jnz     l_data_stx
        movd    "WAIT ACKN. TIMEOUT  ",s0,80
        setc    13,1
        ret
        //
//**********************************************************
//
//  WRITE MESSAGE_RECO TO LINE !
//  input : s0,11 message-string to send
//  output: -
//
// ack = 6
// nak = 21
// eot = 4
// enq = 5
//
mess_stx:
        setc    12,1            //anzahl wiederholungen wenn nak
        movs    s0,11,s2,0,80
l_mess_stx:
        clear   cntl_sign       //
        stxwrs  s2,0,80         //sende STX message ETX BCC
        jz      wait_ackn_mess  //warte auf reaktion.
        //
        call    write_error     //err-string zu SV-MON
        mode_reco               //reset rx-buffer
        ret
        //
wait_ackn_mess:
        sett    30              //warte 3 sec
        wait    cntl_sign,tf_sign
        case    cntl_sign,to_mess_stx
        compc   14,6            //ein ack ?
        jnz     mess_nak
        ret
//
mess_nak:
        compc   14,21           //ein nak ?
        jnz     mess_wrong
        decc    12              //nochmal senden ?
        jnz     l_mess_stx      // ja
        movd    " ERROR ON MESSAGE-SEND: RECEIVED *NAK*!/n",s0,11
        out     s0,11,c4
        ret
//
mess_wrong:
        movd    " ERROR ON MESSAGE-SEND: RECEIVED *   *!/n",s0,11
        movc    14,s0,45        //dezimal ausgabe input char
        out     s0,0,c4
        decc    12
        jnz     l_mess_stx
        ret
//
to_mess_stx:
        movd    " ERROR ON MESSAGE-SEND: WAIT ACKN. TIMEOUT!/n",s0,11
        out     s0,0,c4
        decc    12
        jnz     l_mess_stx
        ret
        //
zzz_end:
//
end

