;
; AFS-Applikation SCHALTUHR
;
; MODUL - 1
;
; USING: s0 for gen. working
;        s1,200 for config_message  CONFIG
;        s1,100 last date and time  yymmddwdhhmm
;        s1,130 last date           yymmdd
;        s1,150 search year_tab (Y)
;        s1,0   last programm
;        s0,100 week_string         wdhhmm,pn,fl
;               year_prog           yymmdd,hhmm,pn
;
;        s3,100 enable prog from other moduls
;		enter prog-number , wait for clear prog-number,
;		enter next prog-number
;        s3,140: Modul 2 enter "LOGIN" on begin of connecting to CFC
;                and enter "LOGOUT" after end of connecting.
;
restart_0:
        setbaud 1,9600,8,n,1
        mode_reco
;        call    init_b0
	movd	"      ",s3,100
;
; send sign-on message
;
reset_0:
        setl    9,2
        movd    " AFS - SCHALTUHR for UA-SETS V2.0  Modul 1/n",s0,0
        out     s0,0,c4
        movd    " SCHALTU1.DW1  BY Josef HOERHAGER VTE/n",s0,0
        out     s0,0,c4
        movd    "                                                            ",s1,100
        ;
; test if sytemconfiguration okay
;
        compd   "SU_CONFIG",s1,200
        jnz     not_config
        setl    7,0
        setl    9,0
        setl    13,0
        setl    12,0
;
; beginn work
;
schaltu_0:
;        wrchar  xon
        setl    9,1     ;configuration okay
        sett    50      ;wait 5 sec
        wait    tf_sign,im_sign
        case    tf_sign,test_rx_0
;        wrchar  xoff
	compd	"   ",s3,100
	jz	no_extern_call
	movs	s3,100,s15,0,2
	call	do_programm
	movd	"       ",s3,100
;
no_extern_call:
        acall   read_dt
        comps   s1,100,s15,180,12       ;date or time changed
        jz      schaltu_0
        movs    s15,180,s1,100,12       ;save new date and time
        comps   s1,100,s1,130,6         ;date changed?
        jz      schaltu_1               ;date not changed!
        movs    s1,100,s1,130,6         ;save new date
        movd    "Y",s1,150              ;set flag for search in year_tab
;
; select week_dbs datbase in modul-0
;
schaltu_1:
        movd    "1 0     ",s15,100      ;select dbs-0 element 0
        acall   pfirst_dbs
schaltu_2:
        movs    s1,106,s15,0,6          ;search for week-day and time
        acall   find_dbs
        jnz     schaltu_10              ;time not found test date
        acall   read_dbs                ;read week-reco
        movs    s14,0,s0,100,20         ;save week-prog in s0
        compd   "A",s14,8               ;flag ausnahme set?
        jnz     schaltu_4               ;no exception switch
;
; wenn ausnahme besteht suche datum in year-tab database-2
;
        movs    s1,130,s15,0,6          ;set element for search
        movd    "2 0     ",s15,100      ;select dbs year_tab
        acall   pfirst_dbs
        acall   find_dbs
        jnz     schaltu_4
;
; switch to next reco and search for week again
;
schaltu_3:      
        movd    "1 0     ",s15,100      ;select dbs-0 element 0
        acall   pnext_dbs
        jmp     schaltu_2
;
; switch programm from database for week_tab
;
schaltu_4:
;
; on input s0,100 = week-string
;
        movs    s0,106,s15,0,2          ;set programmnumber for search
        call    do_programm
        jmp     schaltu_3
;
; ausfuehren des jahresprogramm
;
schaltu_10:
        compd   "Y",s1,150
        jnz     schaltu_0
;
; select dbs 2
;
        movd    "2 0   ",s15,100
        acall   pfirst_dbs
        movs    s1,130,s15,0,6
        acall   find_dbs
        jnz     schaltu_20       ; date not found
;
; date found read reco and compare time
;
schaltu_11:
        acall   read_dbs
        movs    s14,0,s0,100,14
        comps   s1,108,s14,6,4
        jnz     schaltu_12
        movs    s0,110,s15,0,2
        call    do_programm
;
schaltu_12:
        movd    "2 0  ",s15,100
        acall   pnext_dbs
        movs    s1,130,s15,0,6
        acall   find_dbs
        jz      schaltu_11
;
schaltu_13:
        jmp     schaltu_0
;
; no date found for this day
;
schaltu_20:
        movd    "n",s1,150
        jmp     schaltu_0
;
;
;************************************************
;
; search for programmnumber in s15,0
;
do_programm:
        movd    "F",s1,250              ;first entry to modul
        movd    "3 0   ",s15,100        ;select programm-database
        acall   pfirst_dbs
        acall   find_dbs
        jnz     do_prog_error
        acall   fread_dt
        movd    "Programm :                                   /n",s0,0
        movs    s15,0,s0,11,2
        movs    s15,150,s0,15,22
        movs    s0,0,s1,0,80    ;save last programm
        wrs     s0,0,80
        out     s0,0,c4
entry_prog_loop:
        acall   read_dbs        ;lese Befehlszeile
        comps   s15,0,s14,0,2   ;und pruefe ob gleiches Programm
        jnz     do_prog_ende
;        compd   "OPI",s14,2
;        jz      prog_for_opi
        compd   "F",s1,250      ;first entry to modul
        jnz     do_prog_1
        movd    "N",s1,250      ;set not first
        buffwr  s0,0            ;sende zu task modulnr. 2
do_prog_1:
        buffwr  s14,2
;
go_on:
        acall   pnext_dbs
        jmp     entry_prog_loop
;
;
;************************************************
; send programmcode to buffer 0 for opi
; buffer 0  begin 9000h length 1000h
;
; all lines with "OPI" at the beginn.
; all other lines will be ignored.
;
prog_for_opi:
        writeb  s14,2,0         ;write to buffer
	jmp	go_on
	;
do_prog_ende:
        movd    "Ende-Prog :     /n",s0,0
        movs    s15,0,s0,12,2
        wrs     s0,0,80
        out     s0,0,c4
        buffwr  s0,0            ;sende zu task modulnr. 2
        sendsig ans_sign,c0     ;start immediate
        ret
;
; programm not found
;       
do_prog_error:
        movd    "FEHLER: Programm Nr.:    nicht gefunden!!!/n",s0,0
        movs    s15,0,s0,22,2
        wrs     s0,0,80
        out     s0,0,c4
        ret
;
;
;************************************************
;
; eintritt wenn rx_sign auftritt
;
test_rx_0:
        case    im_sign,schaltu_0
        in      s0,0
        jz      test_rx_1
;
; echo leerzeile
;
        ansd    "/n"
        jmp     reset_0
;
; pruefe zeile ob command gueltig
;
test_rx_1:
;        wrchar  xoff
        setl    9,2
        anss    s0,0
;
        compd   "L/n",s0,0
        jnz     test_cfg
        movs    s1,0,s0,0,80    ;Answer last switch-time
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     reset_0
;
not_config:
        movd    "FEHLER! Schaltuhr ist nicht Konfiguriert !!!/n",s0,0
        out     s0,0,c4
        ;wrs     s0,0,80
        setl    9,2
        setl    13,2
        setl    12,2
        setl    7,2
        ;
loop_cfg:
        setl    9,2
        call    wait_string
;
test_cfg:
        ;Schaltuhr Cofiguration
        ;
        compd   ";",s0,0
        jz      loop_cfg
        compd   "SU_CONFIG",s0,0
        jnz     su_cmd_error    ;sende error
        clear   s0,0            ;loesche config mess
        movd    "               /n",s1,0
        ;
        ; init der database for year
        ;
        movd    "2 16384 200 3 6 4 2  ",s15,100
        acall   open_dbs
        ;
        movd    "              ",s14,0
        acall   init_dbs
        ;
        ; init database for week-programm
        ;
        movd    "1 16384 200 3 6 2 1    ",s15,100
        acall   open_dbs
        ;
        movd    "               ",s14,0
        acall   init_dbs
        ;
        ; init data-base for programm"s
        ;
        movd    "3 4096 400 2 2 50   ",s15,100
        acall   open_dbs
        ;
        movd    "                                        /n",s14,0
        acall   init_dbs
        ;
wait_cmd1:
        call    wait_string
        ;
        compd   ";",s0,0
        jz      wait_cmd1
        ;
wait_cmd11:
        compd   "ENDE_SU_CONFIG",s0,0
        jz      config_ende
        ;
        compd   "JAHRES_TABELLE",s0,0
        jz      cfg_year
        ;
        compd   "WOCHEN_TABELLE",s0,0
        jz      cfg_week
        ;
        compd   "PROGRAMM_TABELLE",s0,0
        jz      cfg_prog
        ;
        movd    "FEHLER! Befehl nicht vorhanden!/n",s0,0
        out     s0,0,c4
        jmp     wait_cmd1
        ;
;**********************************************************
;
; ENDE_SU_CONFIG
;
config_ende:
        movd    "SU_CONFIG",s1,200      ;set okay
        compd   "BE  ",s1,0             ;test fehler in year-tab
        jz      week_cfg_end
        movd    "          ",s1,200     ;clear config mess
        movd    "FEHLER in JAHRES_TABELLE!/n",s0,0
        ;wrs     s0,0,80
        out     s0,0,c4
;
week_cfg_end:
        compd   "BE  ",s1,4             ;test fehler in week-tab
        jz      prog_cfg_end
        movd    "          ",s1,200     ;clear config mess
        movd    "FEHLER in WOCHEN_TABELLE!/n",s0,0
        ;wrs     s0,0,80
        out     s0,0,c4
;
prog_cfg_end:
        compd   "BE  ",s1,8             ;test fehler in prog-tab
        jz      okay_cfg_end
        movd    "          ",s1,200     ;clear config mess
        movd    "FEHLER in PROGRAMM_TABELLE!/n",s0,0
        ;wrs     s0,0,80
        out     s0,0,c4
;
okay_cfg_end:
        jmp     restart_0
;
su_cmd_error:
        movd    "FEHLER! Befehl nicht vorhanden!/n",s0,0
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     restart_0
;
;**********************************************************
;
; JAHRES_TABELLE
;
cfg_year:
        movd    "B",s1,0        ;set beginn year cfg
        movd    "2 0  ",s15,100 ;select data-base 2
        acall   pfirst_dbs      ;select 1. reco
        ;
cfg_yearl:
        call    wait_string
        ;
        compd   ";",s0,0
        jz      cfg_yearl
        ;
        compd   "ENDE_JAHRES_TABELLE",s0,0
        jz      cfg_end_year
        ;
        compd   "ENDE_SU_",s0,0
        jz      wait_cmd11
        ;
        ; data reco
        ;
        compd   ",",s0,6        ;test trennzeichen
        jnz     err_cfg_year
        movs    s0,0,s14,0,6
        setc    10,7
        setc    11,6
        setc    12,4
        call    move_s0_s14
        decc    12
        jz      err_cfg_year    ;transfer hhmm
        setc    11,10
        setc    12,2
        call    move_s0_s14
        decc    12
        jz      err_cfg_year    ;transfer nn (prog#.)
        replace "*?",s14,0,10
        acall   write_dbs
        acall   pnext_dbs
        jz      cfg_yearl
        ;
        ; error no more space in dbs
        ;
        movd    "FEHLER! DATA-BASE IST VOLL!!!/n",s0,0
        movd    "F",s1,2
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_yearl
        ;
err_cfg_year:
        movd    "FEHLER! Parameter falsch oder nicht vorhanden!/n",s0,0
        movd    "F",s1,2
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_yearl
;
cfg_end_year:
        movd    "E",s1,1
        jmp     wait_cmd1        
;
;**********************************************************
;
; WOCHEN_TABELLE
;
cfg_week:
        movd    "B",s1,4        ;set beginn week cfg
        movd    "1 0  ",s15,100 ;select data-base 0
        acall   pfirst_dbs      ;select 1. reco
        ;
cfg_weekl:
        call    wait_string
        ;
        compd   ";",s0,0
        jz      cfg_weekl
        ;
        compd   "ENDE_WOCHEN_TABELLE",s0,0
        jz      cfg_end_week
        ;
        compd   "ENDE_SU_",s0,0
        jz      wait_cmd11
        ;
        ; data reco
        ;
        setc    10,0
        setc    11,100
        setc    12,3            ;transfer weekday name
        call    move_s0_s14
        decc    12
        jz      err_cfg_week
        setc    11,2
        setc    12,4
        call    move_s0_s14
        decc    12
        jz      err_cfg_week    ;transfer hhmm
        setc    11,6
        setc    12,2
        call    move_s0_s14
        decc    12
        jz      err_cfg_week    ;transfer nn (prog#.)
        setc    11,8
        setc    12,2
        call    move_s0_s14     ;transfer ausnahme flag
        decc    12
        jz      err_cfg_week
;
; transfer weekday name
;
        setc    12,1
        compd   "MON",s14,100
        jz      tr_weekday
        compd   "mon",s14,100
        jz      tr_weekday
        incc    12
        compd   "DIE",s14,100
        jz      tr_weekday
        compd   "die",s14,100
        jz      tr_weekday
        incc    12
        compd   "MIT",s14,100
        jz      tr_weekday
        compd   "mit",s14,100
        jz      tr_weekday
        incc    12
        compd   "DON",s14,100
        jz      tr_weekday
        compd   "don",s14,100
        jz      tr_weekday
        incc    12
        compd   "FRE",s14,100
        jz      tr_weekday
        compd   "fre",s14,100
        jz      tr_weekday
        incc    12
        compd   "SAM",s14,100
        jz      tr_weekday
        compd   "sam",s14,100
        jz      tr_weekday
        incc    12
        compd   "SON",s14,100
        jz      tr_weekday
        compd   "son",s14,100
        jz      tr_weekday
        compd   "***",s14,100
        jnz     err_weekday
        movd    "**",s14,0
        jmp     tr1_weekday
        ;
tr_weekday:
        movc    12,s14,100
        movs    s14,101,s14,0,2
        ;
tr1_weekday:
        replace "*?",s14,0,6
        acall   write_dbs
        acall   pnext_dbs
        jz      cfg_weekl
        ;
        ; error no more space in dbs
        ;
        movd    "FEHLER! DATA-BASE IST VOLL!!!/n",s0,0
        movd    "F",s1,6
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_weekl
        ;
err_cfg_week:
        movd    "FEHLER! Parameter falsch oder nicht vorhanden!/n",s0,0
        movd    "F",s1,6
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_weekl
;
err_weekday:
        movd    "FEHLER! Wochentag falsch!/n",s0,0
        movd    "F",s1,6
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_weekl
        ;
cfg_end_week:
        movd    "E",s1,5
        jmp     wait_cmd1        
;
;**********************************************************
;
; PROGRAMM_TABELLE
;
cfg_prog:
        movd    "B",s1,8        ;set beginn prog cfg
        movd    "3 0  ",s15,100 ;select data-base 1
        acall   pfirst_dbs      ;select 1. reco
        movd    "00",s14,100    ;set default prog#.
        ;
cfg_progl:
        call    wait_string
        ;
        compd   ";",s0,0
        jz      cfg_progl
        ;
        compd   "PROG_",s0,0
        jz      set_prognum
        ;
        compd   "prog_",s0,0
        jz      set_prognum
        ;
        compd   "ENDE_PROGRAMM_TABELLE",s0,0
        jz      cfg_end_prog
        ;
        compd   "ENDE_SU_",s0,0
        jz      wait_cmd11
        ;
        ; data reco
        ;
; test reco
; if too long write error
;
        setc    0,50            ;maximale laenge data_reco
        setc    1,0
        ;
test_reco_l:
        compd   "/n",s0,c1
        jz      reco_l_okay
        incc    1
        decc    0
        jnz     test_reco_l
        ;
        ; error reco is too long
        ;
        movd    "FEHLER! DATA-RECO ZU LANG (max 49 char)!!!/n",s0,0
        movd    "F",s1,10
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_progl
        ;
        ;
reco_l_okay:
        movs    s14,100,s14,0,2
        movs    s0,0,s14,2,50
        ;
        acall   write_dbs
        acall   pnext_dbs
        jz      cfg_progl
        ;
        ; error no more space in dbs
        ;
        movd    "FEHLER! DATA-BASE IST VOLL!!!/n",s0,0
        movd    "F",s1,10
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_progl
        ;
err_cfg_prog:
        movd    "FEHLER! Programmnummer falsch oder nicht vorhanden!/n",s0,0
        movd    "F",s1,10
        ;wrs     s0,0,80
        out     s0,0,c4
        jmp     cfg_progl
;
cfg_end_prog:
        movd    "E",s1,9
        jmp     wait_cmd1        
;
set_prognum:
        setc    10,5
        setc    11,100
        setc    12,2            ;transfer prog-number
        call    move_s0_s14
        decc    12
        jz      err_cfg_prog
        jmp     cfg_progl
;
;************************************************
;
;   Parameter mov
;
;   Transferiert Parameter von s0 nach s14
;
;   Trennzeichen ist ","
;
;   Aufruf: call        move_s0_s14
;
;     Input:  count c10 ... Source Parameter in s0
;             count c11 ... Destination Parameter in s14
;             count c12 ... maximale laenge des Parameters
;
;   Output:  wenn kein Fehler auftrat:
;               count c12 = 0
;               count c10 zeigt auf Zeichen nach dem Trennzeichen.
;
;           wenn ein fehler auftrat ( Parameter ist zu lange )
;               count c12 = 1
;               count c10  zeigt auf Zeichen welches nicht mehr uebertragen
;                          wurde.
;
; Funktion:  Liest Source und speichert die Zeichen nach Destination.
;            Ende ist entweder durch das Trennzeichen gegeben oder durch
;            Zeilenende oder durch die maximale Anzahl der zu uebertragenden
;            Zeichen.
;            Ist der Parameter kuerzer als die maximale Anzahl, so
;            wird bis zur maximalen Parameterlaenge mit Space aufgefuellt.
;
;
move_s0_s14:
        compd   ",",s0,c10    ;test if terminatior
        jz      mend_ms0_s14
        compd   "/n",s0,c10   ;test for <cr>
        jz      mend_ms0_s14
        movs    s0,c10,s14,c11,1 ;transfer char
        incc    10
        incc    11
        decc    12
        jnz     move_s0_s14
        compd    ",",s0,c10
        jz     move_end_s14
        compd   "/n",s0,c10
        jz      move_end_s14
        compd   " ",s0,c10
        jz      move_end_s14
        setc    12,1           ;melde fehler
        ret
;
move_end_s14:
        incc    10
        ret
        ;
mend_ms0_s14:
        incc    10
term_ms0_s14:
        movd    " ",s14,c11
        incc    11
        decc    12
        jnz     term_ms0_s14
        ret
                
;**********************************************************
; subroutine wait for string and send echo to channel 0
; set channel 0 to xoff
;
wait_string:
        ;wrchar  xon
        wait    im_sign
        case    im_sign,wait_string
        in      s0,0
        anss     s0,0
;        jz      wait_string
        ;wrchar  xoff
        ;wrs     s0,0,80
        ;wrd     "/l"
        ret
        ;
;
;************************************************
zzzz:
end
