//*********************************************************
// Program for buffering SMDR-RECORD of the
// ALCATEL 4220 (DHS 2)
//
// The portinterface hardware must be changed to
// V24 level.
// Use the pin 2 RXD
//	   pin 3 TXD
//	   pin 5 RTS for hardware handshake to stop
//
//*********************************************************
// By  H”rhager Josef VTE   04/96
//*********************************************************
// Revision:
// V1.0 04/96 orginate
// V 1.1 16.07.1996 Clear the ISDN marker
//
//*********************************************************
//
// for testing define debug_4
// if debug_4 print bdi-reco to channel 4
//
#define debug_4
//
#define how_much	"80 "   // calc back to impulse
//
#define mess_startup1   " Alcatel 4220 (DHS 2) SMDR-Buffer V1.1/n"
#define mess_startup2	" BY HOERHAGER JOSEF VTE /n"
#define mess_startup3	" Ready for working !/l/n"
//
//**********************************************************
//  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_3dg	s15,235
#define calc_erg_5dg	s15,233
#define calc_rest	s15,240
//**********************************************************
//**********************************************************
// ALCATEL 4220 (DHS 2)
// Definition of SMDR-RECORD standard
//
#define in_str			s7
#define date_save		s6
//
#define dhs2_str		s7
#define dhs2_init_str		"                                                                                                                    "
#define dhs2_extension		dhs2_str,2	//l=6 right
#define dhs2_direction		dhs2_str,8	//l=3
#define dhs2_trunk_number	dhs2_str,12	//l=2
#define dhs2_date		dhs2_str,15	//l=8 tt/mm/yy
#define dhs2_date_day		dhs2_str,15
#define dhs2_date_month 	dhs2_str,18
#define dhs2_date_yaer		dhs2_str,21
#define dhs2_time		dhs2_str,24	//l=5 hh:mm
#define dhs2_time_hour		dhs2_str,24
#define dhs2_time_minute	dhs2_str,27
#define dhs2_durat		dhs2_str,30	//l=8 hh:mm:ss
#define dhs2_durat_hour 	dhs2_str,30
#define dhs2_durat_hour_1	dhs2_str,31
#define dhs2_durat_minute	dhs2_str,33
#define dhs2_durat_secunde	dhs2_str,36
#define dhs2_cost_units 	dhs2_str,39	//l=4 right
#define dhs2_dienste		dhs2_str,44	//l=2
#define dhs2_isdn		dhs2_str,47	//l=3 left
#define dhs2_isdn_pos           46
#define dhs2_called_number      dhs2_str,51     //l=26 left
#define dhs2_mode		dhs2_str,78	//l=1
#define dhs2_durat_call 	dhs2_str,80	//l=5 mm:ss
#define dhs2_durat_call_minute	dhs2_str,80
#define dhs2_durat_call_secunde dhs2_str,83
#define dhs2_cost_currency	dhs2_str,86	//l=10 left
#define dhs2_project_number	dhs2_str,97	//l=16 left
#define dhs2_name		dhs2_str,114	//l=16 left
//
//*********************************************************
// Buffer 0 definitionen
//***********************************************
#define buffer_m0		0
#define badr_0_high		0x20
#define lbuff_0_high		0x40
#define modnum_0		0x00
//************************************************
//*********************************************************
//  AFS - RESET LABEL:
//
        setbaud 1,300,7,e,1
	mode_reco
	setrts	off
//
	call	init_b0
//
// send signon mess
//
	movd	mess_startup1,s7,100
	out	s7,100,c4
	movd	mess_startup2,s7,100
	out	s7,100,c4
	movd	mess_startup3,s7,100
	out	s7,100,c4
error_main:
	mode_reco
	jmp	main
//
//**********************************************************
// MAIN PROGRAMM
//
main:
	movd	"                                                                                                                                    ",in_str,0
main1:
	sett	200
	setl	9,1	// for modul 1
	setrts	on	//enable out
	wait	rx_sign,im_sign,cntl_sign
	setl	9,2
	case	cntl_sign,test_rx_sign
	compc	14,255
	jz	overrun
	jmp	main1
overrun:
	movd	"ERROR Buffer overrun on input CHANNEL 1/n",s7,100
	writeb	s7,100,0
	jmp	error_main
test_rx_sign:
	case	rx_sign,test_im_sign
//
// stop transmitter of dhs 2
//
	setrts	off
	rds	in_str,0      //read reco from channel
	jz	main1
	compc	15,0
	jz	read_okay
	movd	"ERROR          on input CHANNEL 1/n",s7,100
	movc	15,s7,106
	writeb	s7,100,0
	compc	15,128		//test for break only
	jz	read_okay
	jmp	error_main
read_okay:
//*********************************************************
	writeb	in_str,0,0	// to buffer (M 3 will print it)
//
//*********************************************************
// V1.1 clear the ISDN markers because the 4715 FT19 registers the
//	SMDR-records doubble.
//
//        movd    "   ",in_str,dhs2_isdn_pos
// ********************************************** // BDI-RECO is now complete
// terminate the roco and write it to the buffer
//
	buffwr in_str,0
	buffst				// status of buffer for update the leds
//
// **********************************************
//
	jmp main
//
// ********************************************************
// on im_sign send answer "1ERR_CMD/n"
//
test_im_sign:
	case	im_sign,default_test
	in	s6,100
	out	s6,100,c4
	movd	"1ERR_CMD/n",s6,100
	out	s6,100,c4
	anss	s6,100
	jmp	main
//
// default do nothing
//
default_test:
	jmp	main
//
// ***********************************************
// 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
//
zzz:
end

