;
;**********************************************************
;
;   advanced feature server
;   =======================
;
;   5200 hcn <==> front office systeme
;   mit modemhandler
;
;------------------------------------------------------------
; mod0: edv      mod1: telz   mod2: bdi   mod3: opa
;> R<cr>  int
;> O<cr>  int
;> SZ. <cr>----------x
;> SF. <cr>-----------------------x
;> SH. <cr>-----------------------x
;> rest --------------------------------------x
;
;
;  5200hcn v 1.0     modul 0  for edv
;  -----------------------------------
;
; 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
;
        setbaud 1,2400,8,n,1  ;modul setting 7-2-91
        mode_reco
        ;
        setp    0x7f00,0x03
        setp    0x7f01,0x00
        setc    0,1          ;error conter for to-send
        movd    "EDV          ",s0,0
        movd    "0<0",s0,8
        movd    " HAYES-Modem INTERFACE V2.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:
        setl    8,2
        call    br_set_2400
reset_01:
        setl    8,2
        mode_reco
        movd    "EDV          ",s0,0
        movd    "0<0 /n",s0,8
        setc    12,5            ;anzahl versuche modem-init
;
        movd    " TRY TO INIT 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_01  ;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
        ;
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
        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 bdi commands
        ;
test_for_bdi:
        compd   "SF",s0,11
        jnz     test1_for_bdi
wait_1:
        out     s0,10,c2        ;send to bdi
        jnz     wait_1
send_mess:
        call    mess_stx           ;answer back
        jmp     wait_cmd
        ;
test1_for_bdi:
        compd   "SH",s0,11
        jnz     test_telz
        jmp     wait_1
        ;
        ; test telfonzellen modul command
        ;
test_telz:
        compd   "SZ",s0,11
        jnz     opi_cmd
wait_3:
        out     s0,10,c1        ;telz on channl 1
        jnz     wait_3
        jmp     send_mess
        ;
        ; commands for opi
        ;
opi_cmd:
wait_4:
        out     s0,10,c3        ;send to opi
        jnz     wait_4
        jmp     send_mess
        ;
;**********************************************************
;
; 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
        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
        jmp     reset_0
        ;
        ;
;
;**********************************************************
;
;  MODEM HANGUP !
;  input : -
;  output: -
;
modem_hangup:
        setrts  off
        sett    15
        wait    tf_sign
        setrts  on
        sett    5
        wait    tf_sign
        ret
        ;
;
;**********************************************************
;
;  MODEM INIT !
;  input : cnt 12 anzahl der versuche
;  output: Z-flag wenn okay sonst NZ
;
modem_init:
        call    modem_hangup
        wrd     "ATZ/n"
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   "RING",s0,11
        jnz     wait_ring
        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:
        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
        ;
        compd   "CONNECT 1200/n",s0,11
        jnz     test_br_2400
        call    br_set_1200
        setc    12,1
        decc    12
        ret
        ;
test_br_2400:
        compd   "CONNECT 2400/n",s0,11
        jnz     test_br_300
        call    br_set_2400
        setc    12,1
        decc    12
        ret
        ;
test_br_300:
        compd   "CONNECT/n",s0,11
        jnz     test_ring
        call    br_set_300
        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    0xfc82,0x2a     ;reset rx and disable rx and tx
        setp    0xfc82,0x3a     ;reset tx
        setp    0xfc82,0x4a     ;reset error status
        setp    0XfC81,0X44     ;set baudrate
        mode_reco
        setp    0xfc82,0x05     ;enable rx and tx
        sett    2
        wait    tf_sign
        ret
        ;
;**********************************************************
;
;  CHANNEL 0 BAUDRATE 1200 !
;
br_set_1200:
        setp    0xfc82,0x2a     ;reset rx and disable rx and tx
        setp    0xfc82,0x3a     ;reset tx
        setp    0xfc82,0x4a     ;reset error status
        setp    0XfC81,0X66     ;set baudrate
        mode_reco
        setp    0XfC82,0x05
        sett    2
        wait    tf_sign
        ret
        ;
;**********************************************************
;
;  CHANNEL 0 BAUDRATE 2400 !
;
br_set_2400:
        setp    0xfc82,0x2a     ;reset rx and disable rx and tx
        setp    0xfc82,0x3a     ;reset tx
        setp    0xfc82,0x4a     ;reset error status
        setp    0XfC81,0X88     ;set baudrate
        mode_reco
        setp    0XfC82,0x05     ;enable rx and tx
        sett    2
        wait    tf_sign
        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,80       ;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
        ;
               ;
end

