//
//**********************************************************
//
//   advanced feature server
//   =======================
//   INTERFACE TO A 4713 / 4715
//   direct connection
//------------------------------------------------------------
//**********************************************************
//  COMMON AFS DEFINES
//
#define csra	0Xfc81
#define csrb	0Xfc89
#define csrc	0Xfc91
#define csrd	0xfc99
#define baud_300	0X44
#define baud_1200	0X66
#define baud_2400	0X88
#define baud_4800	0X99
#define baud_9600	0Xbb
//
#define hour_to_sec		"3600  "
#define min_to_sec		"60  "
//
//
#define dbs_str 	s14
#define dbs_str_0	s14,0
#define dbs_search_str	s15,0
#define dbs_para	s15,100
//
#define calc_erg_sub	s15,140
//
#define fdt_str 	s15,150
#define dt_str		s15,180
#define dt_str_year	s15,180
#define dt_str_month	s15,182
#define dt_str_day	s15,184
#define dt_str_weekday	s15,186
#define dt_str_hour	s15,188
#define dt_str_minute	s15,190
#define lfdt_str	21
//
#define calc_erg_flag	s15,204
#define calc_p1 	s15,210
#define calc_p1_5	s15,215
#define calc_p2 	s15,220
#define calc_erg	s15,230
#define calc_erg_1dg	s15,237
#define calc_erg_2dg	s15,236
#define calc_erg_3dg	s15,235
#define calc_erg_5dg	s15,233
#define calc_rest	s15,240
#define calc_rest_2dg	s15,246
//
#define modem_init_str          "AT/n"
#define auto_answer
//
//************************************************************
// mod0: edv      mod1: not used   mod2: dhs3   mod3: not used
//> R<cr>  int
//> O<cr>  int
//
//
// using: str 0 for work
//
#define xon                     0x11
//  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,1200,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    "4713          ",s0,0
        movd    "0<0",s0,8
        movd    " 4713 Interface for DIRECTCONNECTION V1.0/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
reset_0:
        mode_reco
        setc    1,3
        jmp     wait_cmd_1
//
wait_cmd_1:
        //
wait_cmd:
        clear   cntl_sign
        setl    8,1
        sett    250
        wait    rx_sign,tf_sign,cntl_sign //warte auf anforederung or timeout
        //
        // auforderung:
        // set channl is busy
        setl    8,2
        case    rx_sign,test_cntl_sign
        rds     s0,11           //get data
        jz      wait_cmd        //
        //
        // test intern commands
        //
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  s1,0
        buffst                   //get reco from buffer and send back
        incc    11
        call    data_send
        jmp     wait_cmd
        //
test_old:
        compd   "O/n",s0,11
        jnz     test_for_bdi
        buffold s1,0
        call    data_send
        jmp     wait_cmd
        //
test_for_bdi:
        movd    "0ERR_CMD/n",s0,10
send_mess:
        call    mess_send           //answer back
        jmp     wait_cmd
        //
// **********************************************
// test if CNTL-SIGN is request
//
test_cntl_sign:
        case    cntl_sign,timeout_cmd
        compc   14,xon
        jnz     wait_cmd
//
        decc    1
        jnz     wait_cmd
//
test_send:
        setc    1,3
        buffrd  s1,0
        buffst                   //get reco from buffer and send back
        clear   cntl_sign
//
        compd   "E/n",s1,0
        jz      wait_cmd
//
        incc    11
        call    data_send
        jmp     wait_cmd
//
// **********************************************
//

// *********************************************************
//
// on timeout after 25 sec write "channel_timeout" to sv-mon
//
//
timeout_cmd:
        decc    1
        jnz     wait_cmd
        movd    " CHANNEL_TIMEOUT on WAITING XON from 4713!/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
        jmp     reset_0
//
// ********************************************************
// send data to 4713
// input string in s1,0
#define bdi_str         s1
#define clear_calc_p2   movd    "        ",calc_p2
#define clear_calc_p1   movd    "        ",calc_p1
#define bdi_duration	bdi_str,38	//l=5 hmmss
#define bdi_durat_sec   bdi_str,38      //l=5 hmmss
#define bdi_ica_durat	bdi_str,38	//l=5 in sekunden
#define bdi_duration_h	bdi_str,38
#define bdi_duration_m	bdi_str,39
#define bdi_duration_s	bdi_str,41
//
data_send:

        clear_calc_p2
	movs	bdi_duration_h,calc_p2,1
	movd	"3600 ",calc_p1
	acall	mul
        clear_calc_p2
	movs	calc_erg,calc_p1,8
	movs	bdi_duration_s,calc_p2,2
	acall	add
	movd	"60 ",calc_p1
        clear_calc_p2
	movs	bdi_duration_m,calc_p2,2
        movs    calc_erg_5dg,bdi_durat_sec,5
	acall	mul
	movs	calc_erg,calc_p1,8
        clear_calc_p2
	movs	bdi_durat_sec,calc_p2,5
	acall	add
        movs    calc_erg_5dg,bdi_durat_sec,5

        wrs     s1,0,150
        wrchar  ^J
        out     s1,0,c4
        ret
//
mess_send:
        out     s0,10,c4
        ret
//
//**********************************************************
//
// 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
        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"
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:
        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
        compd   "CONNECT",s0,11
        jz      wait_ring_end
        compd   "RING",s0,11
        jnz     wait_ring
wait_ring_end:
        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
//
//
//**********************************************************
//
//  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,s1,10       //reco-nummer zu data-string
        setc    12,1            //anzahl wiederholungen wenn nak
l_data_stx:
        clear   cntl_sign       //
        stxwrs  s1,10,140       //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,s0,150,80
l_mess_stx:
        clear   cntl_sign       //
        stxwrs  s0,150,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
