;
;**********************************************************
;
;   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
;012345670123456701234567012345670123456701234567012345670
;EDV     0<0dddddddddddddddddddddddddddddddd
;           -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
;**********************************************************
; setting up stx ... etx parameter
;
setp	0x7f00,0x03
setp	0x7f01,0x00
;
;**********************************************************
;
mode_reco
;
setc    0,1          ;error conter for to-send
movd    "EDV          ",s0,0
movd    "0<0",s0,8
movd    " READY for WORK with HAYES-Modem./l/n",s0,11
out     s0,0,c4         ;to sv-mon
reset_0:
call    br_set_2400
mode_reco
setl    8,2
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_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
;
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 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
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    60
wait    tf_sign
wrd     "+++"
sett    20
wait    tf_sign
wrd     "ATH/n"
;
;        setrts  off
;        sett    15
;        wait    tf_sign
;        setrts  on
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:
;        call    modem_hangup
wrd     "ATX3/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    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,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
;
zzz_end:
;
end

