//************************************************
//
// downloading programm for channl 1
//
//************************************************
// Project Patienten Notruf B„renhof am Felsenbad
//************************************************
//
// Using datebase in module 3
// format:	EXTENSION # ... 4 digit
//		ON / OFF    ... 1 char
//		BLINKING    ... 1 char
//		Timeout blink.. 4 digit
//
// Database will be initialisized in modul 0
//
// This Modul: Init buffer for modul 2
//      Make a display output every 10 seconds, or if the
//      ANS_SIGN is aktiv. Write to display the headerline,
//      read the data from the database and display the data
//      if the flag _dispon = 1, set the data to flash if
//      the flag _blink = 1 and clears the display if no
//      flag is set.
//
//*********************************************************
//  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 calc_p1         s15,210
#define calc_p2         s15,220
#define calc_erg        s15,230
#define calc_erg6       s15,232
#define calc_erg4       s15,234
#define calc_rest       s15,240
#define calc_erg_flag   s15,204
#define dt_str          s15,180
#define fdt_str         s15,150
#define lfdt_str        21
#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 dbs_para        s15,100
#define dbs_pointer     s15,102
#define dbs_search_str  s15,0
#define dbs_str         s14
#define dbs_str_0       s14,0
//
#define str_opi_cnd     0xd240,0
#define str_opi2_cnd    0xd220,0
#define str_opi1_cnd    0xd200,0
//
//************************************************
// Database definition
#define _extension      0
#define _dispon         4
#define _blink          5
#define _bltime         6
//
//*******************************************************************
// Buffer definition
#define badr_0_high     0x40
#define lbuff_0_high    0x30
#define modnum_0        2
//
#define display_buff    0
//
//*******************************************************************
// Screen Handling
//
#define bell            "^G"
//
// Definition for Qume QVT103
//
#define cursor_home     "^[[H^[[0m/n"
#define dhight_top      "^[#3"
#define dhight_bottom   "^[#4"
#define single_hight    "^[#5"
//
#define normal_video    "^[[0m"
#define blink_video     "^[[5m"
#define reverse_video   "^[[7m"
#define erase_display   "^[[2j"
//
#define clear_display_home      "^[[2j^[[H/n"
#define default_video   "^[[0m/n"
//                                        1         2         3         4         5         6         7         8
//                               12345678901234567890123456789012345678901234567890123456789012345678901234567890
#define header_top1h   "^[#3^[[0m ALCATEL AUSTRIA AG                 AOH /l/n"
#define header_top1b   "^[#4^[[0m ALCATEL AUSTRIA AG                 AOH /l/n"
#define header_top2h   "^[#3^[[0m  ALCATEL AUSTRIA AG               AOH  /l/n"
#define header_top2b   "^[#4^[[0m  ALCATEL AUSTRIA AG               AOH  /l/n"
#define header_top2n   "^[#5^[[0m                                                  Notruf Anzeige                /l/n"
#define line_1         "^[#5^[[0m--------------------------------------------------------------------------------/l/n"
#define line_2         "^[#5^[[0m________________________________________________________________________________/l/n"
#define empty_lineh    "^[#3^[[0m                   ^[[0m                     /n"
#define empty_lineb    "^[#4^[[0m                   ^[[0m                     /n"
//
#define _change_header  6       //number of display-cycles for changing header
#define _line_type      0
#define _video_t1       3
#define _text_pos1      7
#define _ext_pos1       15
#define _video_t2       26
#define _text_pos2      30
#define _ext_pos2       37
//
//*******************************************************************
//
#define signon_1        "Project: Patienten Notruf B„renhof am Felsenbad V 2.0/n"
#define signon_2        "MOD     1<1 by Hoerhager Josef VTE ready!/n"
//
// Starting up the modulsoftware
//
        setbaud 1,9600,8,n,1    ;Modul Default
        mode_reco
//
        setl    9,2
        call    init_b0
        jmp     start_0
//
//*******************************************************************
//
start_0:
        movd    signon_1,s1,0
        out     s1,0,c4
        movd    signon_2,s1,0
        out     s1,0,c4
        setc    0,6             //counter for changing the TOP-line
        setc    1,0             //indicate first is "TPSC"
//
//*******************************************************************
//
main_0:
        movd    clear_display_home,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        jmp     goto_display
//
main:
        setl    9,1
        sett    100
        wait    tf_sign,ans_sign
        case    ans_sign,goto_display
goto_display:
        setl    9,2
        clear   ans_sign
        movd    cursor_home,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
//        compc   1,0
//        jnz     headline_bott
        call    display_header
        call    display_dbs
        jmp     main
//headline_bott:
//        call    display_dbs
//        call    display_header
//        jmp     main
        //
//*******************************************************************
// display data base
// Input:       cursor at aktuell position
//
display_dbs:
        setc    4,0
        setc    2,0             // reco pointer in dbs
        setc    3,7             // number lines for display
loop_dbs:
        movd    "3       ",s15,100
        movc    2,s15,102
        acall   preco_dbs
//
// now read 2 records from dbs to string s4, s5
//
        acall   read_dbs
        movs    s14,0,s4,0,25
        acall   pnext_dbs
        incc    2
        acall   read_dbs
        movs    s14,0,s5,0,25
        incc    2
//
        call    send_display
//
        decc    3
        jz      loop_end_dbs
//
// write seperator line
//
        movd    "/l/n",s1,150
        writeb  s1,150,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,150,25
        movd    "^[#5^[[0m                                                                                /l/n",s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        jmp     loop_dbs
//
loop_end_dbs:
        ret
//
//*******************************************************************
// send_display
// input:       string s4,s5 dbs records from database
// output:      send string to serial-channel and into the buffer for
//              reading of modul 2.
//      If the flag ON / OFF = 1 the display string is on (displayed)
//      If the flag BLINK = 1 the display string are flashing.
//      If the flag ON / OFF = 0 the display string is space only
//
// The output is as folows: s4 is first column
//                          s5 is second column
//
send_display:
        movd    empty_lineh,s1,0        //set default line (first half)
//
// construct column 1
//
        compd   "10",s4,_dispon         // display on and no blink
        jnz     col1_blink
        incc    4
        movd    "Zimmer: ",s1,_text_pos1
        movs    s4,_extension,s1,_ext_pos1,4
        jmp     col2
//
col1_blink:
        compd   "11",s4,_dispon
        jnz     col2
        incc    4
        movd    "Zimmer: ",s1,_text_pos1
        movs    s4,_extension,s1,_ext_pos1,4
        movd    blink_video,s1,_video_t1
//
col2:
        compd   "10",s5,_dispon         // display on and no blink
        jnz     col2_blink
        incc    4
        movd    "Zimmer: ",s1,_text_pos2
        movs    s5,_extension,s1,_ext_pos2,4
        jmp     col3
//
col2_blink:
        compd   "11",s5,_dispon
        jnz     col3
        incc    4
        movd    "Zimmer: ",s1,_text_pos2
        movs    s5,_extension,s1,_ext_pos2,4
        movd    blink_video,s1,_video_t2
//
col3:
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    "/l/n",s1,150
        compc   4,0
        jz      skip_col3
        movd    "^G^G/l/n",s1,150
//
skip_col3:
        writeb  s1,150,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,150,25
        movd    dhight_bottom,s1,_line_type
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        ret
//
//*******************************************************************
// Display HEADER LINES:
// Input:       Cursor at home position
//
display_header:
//
// if counter 1 = 0 display first "ALCATEL "
//
        compc   1,0
        jnz     cycle_2
//
        movd    header_top1h,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    header_top1b,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    header_top2n,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    line_1,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    default_video,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        decc    0
        jnz     disp_end_header
        setc    0,_change_header
        setc    1,1                     // change header
disp_end_header:
        ret
//
// first top-line 2
//
cycle_2:
        movd    header_top2n,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    header_top2h,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    header_top2b,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    line_2,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        movd    default_video,s1,0
        writeb  s1,0,display_buff
        sendsig ans_sign,c2             //start output
        wrs     s1,0,255
        decc    0
        jnz     disp_end_header
        setc    0,_change_header
        setc    1,0                     // change header
        ret
//
//************************************************
// 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
//
zz:
end

