From 040749ecc1efa2b795be6c858085f23642473df4 Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 8 Sep 2021 21:32:30 +0200 Subject: [PATCH] First commit 05/11/1995 --- BOT.CPP | 861 ++++++++++++++++++++++++ CNT.PLC | Bin 0 -> 71073 bytes DIFD(14).PLC | Bin 0 -> 71057 bytes DIFU(13).PLC | Bin 0 -> 71057 bytes EGAVGAF.OBJ | Bin 0 -> 5668 bytes KEEP(11).PLC | Bin 0 -> 71057 bytes KEY.EXE | Bin 0 -> 12757 bytes KIT.PLC | Bin 0 -> 71070 bytes LITTF.OBJ | Bin 0 -> 5240 bytes MAKE_BOT.OBJ | Bin 0 -> 24708 bytes PLC.CFG | Bin 0 -> 6 bytes PLC.CPP | 97 +++ PLC.DAT | 694 +++++++++++++++++++ PLC.DSK | Bin 0 -> 529 bytes PLC.EXE | Bin 0 -> 150517 bytes PLC.H | 257 +++++++ PLC.PRJ | Bin 0 -> 21255 bytes PLC_ACER.CPP | 152 +++++ PLC_EDIT.CPP | 1804 ++++++++++++++++++++++++++++++++++++++++++++++++++ PLC_FILE.CPP | 595 +++++++++++++++++ PLC_RUN.CPP | 1423 +++++++++++++++++++++++++++++++++++++++ PLC_UTIL.CPP | 221 +++++++ R.BAT | 1 + README.md | 9 + SFT.PLC | Bin 0 -> 71073 bytes 25 files changed, 6114 insertions(+) create mode 100644 BOT.CPP create mode 100644 CNT.PLC create mode 100644 DIFD(14).PLC create mode 100644 DIFU(13).PLC create mode 100644 EGAVGAF.OBJ create mode 100644 KEEP(11).PLC create mode 100644 KEY.EXE create mode 100644 KIT.PLC create mode 100644 LITTF.OBJ create mode 100644 MAKE_BOT.OBJ create mode 100644 PLC.CFG create mode 100644 PLC.CPP create mode 100644 PLC.DAT create mode 100644 PLC.DSK create mode 100644 PLC.EXE create mode 100644 PLC.H create mode 100644 PLC.PRJ create mode 100644 PLC_ACER.CPP create mode 100644 PLC_EDIT.CPP create mode 100644 PLC_FILE.CPP create mode 100644 PLC_RUN.CPP create mode 100644 PLC_UTIL.CPP create mode 100644 R.BAT create mode 100644 README.md create mode 100644 SFT.PLC diff --git a/BOT.CPP b/BOT.CPP new file mode 100644 index 0000000..569a2b6 --- /dev/null +++ b/BOT.CPP @@ -0,0 +1,861 @@ +/***************************************************************/ +/* */ +/* Conversin de fuentes de MAKE BOTON en ASCII a fuentes */ +/* para CPP, que pueden ser compilados junto al programa. */ +/* */ +/***************************************************************/ +/* */ +/* MAKE BOTON es un programa realizado por Jos David Guilln */ +/* MB a CPP es una utilidad complementaria a Make Boton por */ +/* Jos David Guilln... */ +/* */ +/***************************************************************/ +/* */ +/* GRACIAS POR UTILIZAR MI SOFTWARE... */ +/* */ +/* JOS DAVID GUILLN (c) 1995 */ +/* */ +/***************************************************************/ + + + +// Debe indicar el directorio exacto de la Cabecera de MAKE BOTON +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON +#include "stdlib.h" +#include "conio.h" +#include "alloc.h" +#include "graphics.h" + + + +extern int /*vez,*/ memoria_asignada, Secuencias, *n_Botones_Secuencia; + struct Make_Boton { int Up, Left, Down, Right; unsigned char Cdf, Cb1, Cb2; unsigned char Ab, Pb; unsigned Isc, Sc; }; +extern struct Make_Boton far *Botones; +struct Make_Boton Bot_Static; + + + +extern void Libera_Memoria(void);extern void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp); + + +// Esta funcin debe ser llamada para la inicializacion de los +// botones en lugar de CARGA_BOTONES(...). +// Para cargar los botones con parametro 0 y para imprimir +// imprimir los estaticos con parametro [ n de secuencia ] +int Fichero_bot(char Dinamicos_Estaticos); + +int Fichero_bot(char Dinamicos_Estaticos) { + +static char vez = 0; + + switch(Dinamicos_Estaticos) { + + case 0: + if( vez == 0 ) { + vez = 1; + atexit( Libera_Memoria ); + } + if ( memoria_asignada == 1 ) { + free(n_Botones_Secuencia); + farfree(Botones); + memoria_asignada = 0; + } + int SiZe_BoToN = 0; + if ( (Botones = (struct Make_Boton far *)farcalloc(1, sizeof( struct Make_Boton ) )) == NULL) + return SIN_MEMORIA; + memoria_asignada = 1; + + Secuencias = 5; + if (( n_Botones_Secuencia = (int *) malloc( sizeof(int)*Secuencias ) ) == NULL) { + cprintf("\nNo Hay suficiente Memoria, ni para un Boton\n\n"); + return SIN_MEMORIA; + } + n_Botones_Secuencia[1 - 1] = 91; + SiZe_BoToN += ( sizeof( struct Make_Boton ) * 91); + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = 1; + return SIN_MEMORIA; + } + memoria_asignada = 1; + Botones [0].Left = 565; Botones [0].Up = 0;Botones [0]. Right = 640;Botones [0]. Down = 26; + Botones [0]. Cdf = 7; Botones [0]. Cb1 = 56; Botones [0]. Cb2 = 63; Botones [0]. Ab = 2; Botones [0]. Pb = 1; Botones [0]. Isc = 0; Botones [0]. Sc = 30; + Botones [1].Left = 20; Botones [1].Up = 34;Botones [1]. Right = 45;Botones [1]. Down = 59; + Botones [1]. Cdf = 7; Botones [1]. Cb1 = 56; Botones [1]. Cb2 = 63; Botones [1]. Ab = 2; Botones [1]. Pb = 1; Botones [1]. Isc = 0; Botones [1]. Sc = 0; + Botones [2].Left = 47; Botones [2].Up = 34;Botones [2]. Right = 72;Botones [2]. Down = 59; + Botones [2]. Cdf = 7; Botones [2]. Cb1 = 56; Botones [2]. Cb2 = 63; Botones [2]. Ab = 2; Botones [2]. Pb = 1; Botones [2]. Isc = 0; Botones [2]. Sc = 0; + Botones [3].Left = 74; Botones [3].Up = 34;Botones [3]. Right = 99;Botones [3]. Down = 59; + Botones [3]. Cdf = 7; Botones [3]. Cb1 = 56; Botones [3]. Cb2 = 63; Botones [3]. Ab = 2; Botones [3]. Pb = 1; Botones [3]. Isc = 0; Botones [3]. Sc = 0; + Botones [4].Left = 101; Botones [4].Up = 34;Botones [4]. Right = 126;Botones [4]. Down = 59; + Botones [4]. Cdf = 7; Botones [4]. Cb1 = 56; Botones [4]. Cb2 = 63; Botones [4]. Ab = 2; Botones [4]. Pb = 1; Botones [4]. Isc = 0; Botones [4]. Sc = 0; + Botones [5].Left = 128; Botones [5].Up = 34;Botones [5]. Right = 153;Botones [5]. Down = 59; + Botones [5]. Cdf = 7; Botones [5]. Cb1 = 56; Botones [5]. Cb2 = 63; Botones [5]. Ab = 2; Botones [5]. Pb = 1; Botones [5]. Isc = 0; Botones [5]. Sc = 0; + Botones [6].Left = 155; Botones [6].Up = 34;Botones [6]. Right = 180;Botones [6]. Down = 59; + Botones [6]. Cdf = 7; Botones [6]. Cb1 = 56; Botones [6]. Cb2 = 63; Botones [6]. Ab = 2; Botones [6]. Pb = 1; Botones [6]. Isc = 0; Botones [6]. Sc = 0; + Botones [7].Left = 182; Botones [7].Up = 34;Botones [7]. Right = 207;Botones [7]. Down = 59; + Botones [7]. Cdf = 7; Botones [7]. Cb1 = 56; Botones [7]. Cb2 = 63; Botones [7]. Ab = 2; Botones [7]. Pb = 1; Botones [7]. Isc = 0; Botones [7]. Sc = 0; + Botones [8].Left = 209; Botones [8].Up = 34;Botones [8]. Right = 234;Botones [8]. Down = 59; + Botones [8]. Cdf = 7; Botones [8]. Cb1 = 56; Botones [8]. Cb2 = 63; Botones [8]. Ab = 2; Botones [8]. Pb = 1; Botones [8]. Isc = 0; Botones [8]. Sc = 0; + Botones [9].Left = 20; Botones [9].Up = 61;Botones [9]. Right = 45;Botones [9]. Down = 86; + Botones [9]. Cdf = 7; Botones [9]. Cb1 = 56; Botones [9]. Cb2 = 63; Botones [9]. Ab = 2; Botones [9]. Pb = 1; Botones [9]. Isc = 0; Botones [9]. Sc = 0; + Botones [10].Left = 47; Botones [10].Up = 61;Botones [10]. Right = 72;Botones [10]. Down = 86; + Botones [10]. Cdf = 7; Botones [10]. Cb1 = 56; Botones [10]. Cb2 = 63; Botones [10]. Ab = 2; Botones [10]. Pb = 1; Botones [10]. Isc = 0; Botones [10]. Sc = 0; + Botones [11].Left = 74; Botones [11].Up = 61;Botones [11]. Right = 99;Botones [11]. Down = 86; + Botones [11]. Cdf = 7; Botones [11]. Cb1 = 56; Botones [11]. Cb2 = 63; Botones [11]. Ab = 2; Botones [11]. Pb = 1; Botones [11]. Isc = 0; Botones [11]. Sc = 0; + Botones [12].Left = 101; Botones [12].Up = 61;Botones [12]. Right = 126;Botones [12]. Down = 86; + Botones [12]. Cdf = 7; Botones [12]. Cb1 = 56; Botones [12]. Cb2 = 63; Botones [12]. Ab = 2; Botones [12]. Pb = 1; Botones [12]. Isc = 0; Botones [12]. Sc = 0; + Botones [13].Left = 128; Botones [13].Up = 61;Botones [13]. Right = 153;Botones [13]. Down = 86; + Botones [13]. Cdf = 7; Botones [13]. Cb1 = 56; Botones [13]. Cb2 = 63; Botones [13]. Ab = 2; Botones [13]. Pb = 1; Botones [13]. Isc = 0; Botones [13]. Sc = 0; + Botones [14].Left = 155; Botones [14].Up = 61;Botones [14]. Right = 180;Botones [14]. Down = 86; + Botones [14]. Cdf = 7; Botones [14]. Cb1 = 56; Botones [14]. Cb2 = 63; Botones [14]. Ab = 2; Botones [14]. Pb = 1; Botones [14]. Isc = 0; Botones [14]. Sc = 0; + Botones [15].Left = 182; Botones [15].Up = 61;Botones [15]. Right = 207;Botones [15]. Down = 86; + Botones [15]. Cdf = 7; Botones [15]. Cb1 = 56; Botones [15]. Cb2 = 63; Botones [15]. Ab = 2; Botones [15]. Pb = 1; Botones [15]. Isc = 0; Botones [15]. Sc = 0; + Botones [16].Left = 209; Botones [16].Up = 61;Botones [16]. Right = 234;Botones [16]. Down = 86; + Botones [16]. Cdf = 7; Botones [16]. Cb1 = 56; Botones [16]. Cb2 = 63; Botones [16]. Ab = 2; Botones [16]. Pb = 1; Botones [16]. Isc = 0; Botones [16]. Sc = 0; + Botones [17].Left = 236; Botones [17].Up = 34;Botones [17]. Right = 261;Botones [17]. Down = 59; + Botones [17]. Cdf = 3; Botones [17]. Cb1 = 56; Botones [17]. Cb2 = 63; Botones [17]. Ab = 3; Botones [17]. Pb = 1; Botones [17]. Isc = 0; Botones [17]. Sc = 0; + Botones [18].Left = 263; Botones [18].Up = 34;Botones [18]. Right = 288;Botones [18]. Down = 59; + Botones [18]. Cdf = 3; Botones [18]. Cb1 = 56; Botones [18]. Cb2 = 63; Botones [18]. Ab = 3; Botones [18]. Pb = 1; Botones [18]. Isc = 0; Botones [18]. Sc = 0; + Botones [19].Left = 290; Botones [19].Up = 34;Botones [19]. Right = 315;Botones [19]. Down = 59; + Botones [19]. Cdf = 3; Botones [19]. Cb1 = 56; Botones [19]. Cb2 = 63; Botones [19]. Ab = 3; Botones [19]. Pb = 1; Botones [19]. Isc = 0; Botones [19]. Sc = 0; + Botones [20].Left = 236; Botones [20].Up = 61;Botones [20]. Right = 261;Botones [20]. Down = 86; + Botones [20]. Cdf = 3; Botones [20]. Cb1 = 56; Botones [20]. Cb2 = 63; Botones [20]. Ab = 3; Botones [20]. Pb = 1; Botones [20]. Isc = 0; Botones [20]. Sc = 0; + Botones [21].Left = 263; Botones [21].Up = 61;Botones [21]. Right = 288;Botones [21]. Down = 86; + Botones [21]. Cdf = 3; Botones [21]. Cb1 = 56; Botones [21]. Cb2 = 63; Botones [21]. Ab = 3; Botones [21]. Pb = 1; Botones [21]. Isc = 0; Botones [21]. Sc = 0; + Botones [22].Left = 290; Botones [22].Up = 61;Botones [22]. Right = 315;Botones [22]. Down = 86; + Botones [22]. Cdf = 3; Botones [22]. Cb1 = 56; Botones [22]. Cb2 = 63; Botones [22]. Ab = 3; Botones [22]. Pb = 1; Botones [22]. Isc = 0; Botones [22]. Sc = 0; + Botones [23].Left = 341; Botones [23].Up = 34;Botones [23]. Right = 366;Botones [23]. Down = 59; + Botones [23]. Cdf = 7; Botones [23]. Cb1 = 56; Botones [23]. Cb2 = 63; Botones [23]. Ab = 2; Botones [23]. Pb = 1; Botones [23]. Isc = 0; Botones [23]. Sc = 0; + Botones [24].Left = 368; Botones [24].Up = 34;Botones [24]. Right = 393;Botones [24]. Down = 59; + Botones [24]. Cdf = 7; Botones [24]. Cb1 = 56; Botones [24]. Cb2 = 63; Botones [24]. Ab = 2; Botones [24]. Pb = 1; Botones [24]. Isc = 0; Botones [24]. Sc = 0; + Botones [25].Left = 395; Botones [25].Up = 34;Botones [25]. Right = 420;Botones [25]. Down = 59; + Botones [25]. Cdf = 7; Botones [25]. Cb1 = 56; Botones [25]. Cb2 = 63; Botones [25]. Ab = 2; Botones [25]. Pb = 1; Botones [25]. Isc = 0; Botones [25]. Sc = 0; + Botones [26].Left = 422; Botones [26].Up = 34;Botones [26]. Right = 447;Botones [26]. Down = 59; + Botones [26]. Cdf = 7; Botones [26]. Cb1 = 56; Botones [26]. Cb2 = 63; Botones [26]. Ab = 2; Botones [26]. Pb = 1; Botones [26]. Isc = 0; Botones [26]. Sc = 0; + Botones [27].Left = 449; Botones [27].Up = 34;Botones [27]. Right = 474;Botones [27]. Down = 59; + Botones [27]. Cdf = 7; Botones [27]. Cb1 = 56; Botones [27]. Cb2 = 63; Botones [27]. Ab = 2; Botones [27]. Pb = 1; Botones [27]. Isc = 0; Botones [27]. Sc = 0; + Botones [28].Left = 476; Botones [28].Up = 34;Botones [28]. Right = 499;Botones [28]. Down = 59; + Botones [28]. Cdf = 7; Botones [28]. Cb1 = 56; Botones [28]. Cb2 = 63; Botones [28]. Ab = 2; Botones [28]. Pb = 1; Botones [28]. Isc = 0; Botones [28]. Sc = 0; + Botones [29].Left = 501; Botones [29].Up = 34;Botones [29]. Right = 526;Botones [29]. Down = 59; + Botones [29]. Cdf = 7; Botones [29]. Cb1 = 56; Botones [29]. Cb2 = 63; Botones [29]. Ab = 2; Botones [29]. Pb = 1; Botones [29]. Isc = 0; Botones [29]. Sc = 0; + Botones [30].Left = 528; Botones [30].Up = 34;Botones [30]. Right = 553;Botones [30]. Down = 59; + Botones [30]. Cdf = 7; Botones [30]. Cb1 = 56; Botones [30]. Cb2 = 63; Botones [30]. Ab = 2; Botones [30]. Pb = 1; Botones [30]. Isc = 0; Botones [30]. Sc = 0; + Botones [31].Left = 341; Botones [31].Up = 61;Botones [31]. Right = 366;Botones [31]. Down = 86; + Botones [31]. Cdf = 7; Botones [31]. Cb1 = 56; Botones [31]. Cb2 = 63; Botones [31]. Ab = 2; Botones [31]. Pb = 1; Botones [31]. Isc = 0; Botones [31]. Sc = 0; + Botones [32].Left = 368; Botones [32].Up = 61;Botones [32]. Right = 393;Botones [32]. Down = 86; + Botones [32]. Cdf = 7; Botones [32]. Cb1 = 56; Botones [32]. Cb2 = 63; Botones [32]. Ab = 2; Botones [32]. Pb = 1; Botones [32]. Isc = 0; Botones [32]. Sc = 0; + Botones [33].Left = 395; Botones [33].Up = 61;Botones [33]. Right = 420;Botones [33]. Down = 86; + Botones [33]. Cdf = 7; Botones [33]. Cb1 = 56; Botones [33]. Cb2 = 63; Botones [33]. Ab = 2; Botones [33]. Pb = 1; Botones [33]. Isc = 0; Botones [33]. Sc = 0; + Botones [34].Left = 422; Botones [34].Up = 61;Botones [34]. Right = 447;Botones [34]. Down = 86; + Botones [34]. Cdf = 7; Botones [34]. Cb1 = 56; Botones [34]. Cb2 = 63; Botones [34]. Ab = 2; Botones [34]. Pb = 1; Botones [34]. Isc = 0; Botones [34]. Sc = 0; + Botones [35].Left = 449; Botones [35].Up = 61;Botones [35]. Right = 474;Botones [35]. Down = 86; + Botones [35]. Cdf = 7; Botones [35]. Cb1 = 56; Botones [35]. Cb2 = 63; Botones [35]. Ab = 2; Botones [35]. Pb = 1; Botones [35]. Isc = 0; Botones [35]. Sc = 0; + Botones [36].Left = 476; Botones [36].Up = 61;Botones [36]. Right = 499;Botones [36]. Down = 86; + Botones [36]. Cdf = 7; Botones [36]. Cb1 = 56; Botones [36]. Cb2 = 63; Botones [36]. Ab = 2; Botones [36]. Pb = 1; Botones [36]. Isc = 0; Botones [36]. Sc = 0; + Botones [37].Left = 501; Botones [37].Up = 61;Botones [37]. Right = 526;Botones [37]. Down = 86; + Botones [37]. Cdf = 7; Botones [37]. Cb1 = 56; Botones [37]. Cb2 = 63; Botones [37]. Ab = 2; Botones [37]. Pb = 1; Botones [37]. Isc = 0; Botones [37]. Sc = 0; + Botones [38].Left = 528; Botones [38].Up = 61;Botones [38]. Right = 553;Botones [38]. Down = 86; + Botones [38]. Cdf = 7; Botones [38]. Cb1 = 56; Botones [38]. Cb2 = 63; Botones [38]. Ab = 2; Botones [38]. Pb = 1; Botones [38]. Isc = 0; Botones [38]. Sc = 0; + Botones [39].Left = 555; Botones [39].Up = 34;Botones [39]. Right = 580;Botones [39]. Down = 59; + Botones [39]. Cdf = 3; Botones [39]. Cb1 = 56; Botones [39]. Cb2 = 63; Botones [39]. Ab = 3; Botones [39]. Pb = 1; Botones [39]. Isc = 0; Botones [39]. Sc = 0; + Botones [40].Left = 582; Botones [40].Up = 34;Botones [40]. Right = 607;Botones [40]. Down = 59; + Botones [40]. Cdf = 3; Botones [40]. Cb1 = 56; Botones [40]. Cb2 = 63; Botones [40]. Ab = 3; Botones [40]. Pb = 1; Botones [40]. Isc = 0; Botones [40]. Sc = 0; + Botones [41].Left = 609; Botones [41].Up = 34;Botones [41]. Right = 634;Botones [41]. Down = 59; + Botones [41]. Cdf = 3; Botones [41]. Cb1 = 56; Botones [41]. Cb2 = 63; Botones [41]. Ab = 3; Botones [41]. Pb = 1; Botones [41]. Isc = 0; Botones [41]. Sc = 0; + Botones [42].Left = 555; Botones [42].Up = 61;Botones [42]. Right = 580;Botones [42]. Down = 86; + Botones [42]. Cdf = 3; Botones [42]. Cb1 = 56; Botones [42]. Cb2 = 63; Botones [42]. Ab = 3; Botones [42]. Pb = 1; Botones [42]. Isc = 0; Botones [42]. Sc = 0; + Botones [43].Left = 582; Botones [43].Up = 61;Botones [43]. Right = 607;Botones [43]. Down = 86; + Botones [43]. Cdf = 3; Botones [43]. Cb1 = 56; Botones [43]. Cb2 = 63; Botones [43]. Ab = 3; Botones [43]. Pb = 1; Botones [43]. Isc = 0; Botones [43]. Sc = 0; + Botones [44].Left = 609; Botones [44].Up = 61;Botones [44]. Right = 634;Botones [44]. Down = 86; + Botones [44]. Cdf = 3; Botones [44]. Cb1 = 56; Botones [44]. Cb2 = 63; Botones [44]. Ab = 3; Botones [44]. Pb = 1; Botones [44]. Isc = 0; Botones [44]. Sc = 0; + Botones [45].Left = 582; Botones [45].Up = 364;Botones [45]. Right = 634;Botones [45]. Down = 388; + Botones [45]. Cdf = 7; Botones [45]. Cb1 = 56; Botones [45]. Cb2 = 63; Botones [45]. Ab = 2; Botones [45]. Pb = 1; Botones [45]. Isc = 0; Botones [45]. Sc = 19; + Botones [46].Left = 582; Botones [46].Up = 390;Botones [46]. Right = 607;Botones [46]. Down = 451; + Botones [46]. Cdf = 7; Botones [46]. Cb1 = 56; Botones [46]. Cb2 = 63; Botones [46]. Ab = 2; Botones [46]. Pb = 1; Botones [46]. Isc = 0; Botones [46]. Sc = 38; + Botones [47].Left = 609; Botones [47].Up = 390;Botones [47]. Right = 634;Botones [47]. Down = 451; + Botones [47]. Cdf = 7; Botones [47]. Cb1 = 56; Botones [47]. Cb2 = 63; Botones [47]. Ab = 2; Botones [47]. Pb = 1; Botones [47]. Isc = 0; Botones [47]. Sc = 34; + Botones [48].Left = 582; Botones [48].Up = 453;Botones [48]. Right = 634;Botones [48]. Down = 478; + Botones [48]. Cdf = 7; Botones [48]. Cb1 = 56; Botones [48]. Cb2 = 63; Botones [48]. Ab = 2; Botones [48]. Pb = 1; Botones [48]. Isc = 0; Botones [48]. Sc = 31; + Botones [49].Left = 555; Botones [49].Up = 364;Botones [49]. Right = 580;Botones [49]. Down = 478; + Botones [49]. Cdf = 7; Botones [49]. Cb1 = 56; Botones [49]. Cb2 = 63; Botones [49]. Ab = 2; Botones [49]. Pb = 1; Botones [49]. Isc = 0; Botones [49]. Sc = 46; + Botones [50].Left = 538; Botones [50].Up = 103;Botones [50]. Right = 632;Botones [50]. Down = 127; + Botones [50]. Cdf = 9; Botones [50]. Cb1 = 56; Botones [50]. Cb2 = 63; Botones [50]. Ab = 2; Botones [50]. Pb = 1; Botones [50]. Isc = 0; Botones [50]. Sc = 22; + Botones [51].Left = 500; Botones [51].Up = 100;Botones [51]. Right = 530;Botones [51]. Down = 130; + Botones [51]. Cdf = 7; Botones [51]. Cb1 = 56; Botones [51]. Cb2 = 63; Botones [51]. Ab = 2; Botones [51]. Pb = 1; Botones [51]. Isc = 78; Botones [51]. Sc = 0; + Botones [52].Left = 465; Botones [52].Up = 100;Botones [52]. Right = 495;Botones [52]. Down = 130; + Botones [52]. Cdf = 7; Botones [52]. Cb1 = 56; Botones [52]. Cb2 = 63; Botones [52]. Ab = 2; Botones [52]. Pb = 1; Botones [52]. Isc = 83; Botones [52]. Sc = 0; + Botones [53].Left = 430; Botones [53].Up = 100;Botones [53]. Right = 460;Botones [53]. Down = 130; + Botones [53]. Cdf = 7; Botones [53]. Cb1 = 56; Botones [53]. Cb2 = 63; Botones [53]. Ab = 2; Botones [53]. Pb = 1; Botones [53]. Isc = 70; Botones [53]. Sc = 0; + Botones [54].Left = 605; Botones [54].Up = 135;Botones [54]. Right = 635;Botones [54]. Down = 165; + Botones [54]. Cdf = 7; Botones [54]. Cb1 = 56; Botones [54]. Cb2 = 63; Botones [54]. Ab = 2; Botones [54]. Pb = 1; Botones [54]. Isc = 72; Botones [54]. Sc = 0; + Botones [55].Left = 570; Botones [55].Up = 135;Botones [55]. Right = 600;Botones [55]. Down = 165; + Botones [55]. Cdf = 7; Botones [55]. Cb1 = 56; Botones [55]. Cb2 = 63; Botones [55]. Ab = 2; Botones [55]. Pb = 1; Botones [55]. Isc = 82; Botones [55]. Sc = 0; + Botones [56].Left = 535; Botones [56].Up = 135;Botones [56]. Right = 565;Botones [56]. Down = 165; + Botones [56]. Cdf = 7; Botones [56]. Cb1 = 56; Botones [56]. Cb2 = 63; Botones [56]. Ab = 2; Botones [56]. Pb = 1; Botones [56]. Isc = 84; Botones [56]. Sc = 0; + Botones [57].Left = 500; Botones [57].Up = 135;Botones [57]. Right = 530;Botones [57]. Down = 165; + Botones [57]. Cdf = 7; Botones [57]. Cb1 = 56; Botones [57]. Cb2 = 63; Botones [57]. Ab = 2; Botones [57]. Pb = 1; Botones [57]. Isc = 67; Botones [57]. Sc = 0; + Botones [58].Left = 465; Botones [58].Up = 135;Botones [58]. Right = 495;Botones [58]. Down = 165; + Botones [58]. Cdf = 7; Botones [58]. Cb1 = 56; Botones [58]. Cb2 = 63; Botones [58]. Ab = 2; Botones [58]. Pb = 1; Botones [58]. Isc = 79; Botones [58]. Sc = 0; + Botones [59].Left = 430; Botones [59].Up = 135;Botones [59]. Right = 460;Botones [59]. Down = 165; + Botones [59]. Cdf = 7; Botones [59]. Cb1 = 56; Botones [59]. Cb2 = 63; Botones [59]. Ab = 2; Botones [59]. Pb = 1; Botones [59]. Isc = 65; Botones [59]. Sc = 0; + Botones [60].Left = 605; Botones [60].Up = 170;Botones [60]. Right = 635;Botones [60]. Down = 200; + Botones [60]. Cdf = 7; Botones [60]. Cb1 = 56; Botones [60]. Cb2 = 63; Botones [60]. Ab = 2; Botones [60]. Pb = 1; Botones [60]. Isc = 0; Botones [60]. Sc = 24; + Botones [61].Left = 570; Botones [61].Up = 170;Botones [61]. Right = 600;Botones [61]. Down = 200; + Botones [61]. Cdf = 7; Botones [61]. Cb1 = 56; Botones [61]. Cb2 = 63; Botones [61]. Ab = 2; Botones [61]. Pb = 1; Botones [61]. Isc = 0; Botones [61]. Sc = 35; + Botones [62].Left = 535; Botones [62].Up = 170;Botones [62]. Right = 565;Botones [62]. Down = 200; + Botones [62]. Cdf = 7; Botones [62]. Cb1 = 56; Botones [62]. Cb2 = 63; Botones [62]. Ab = 2; Botones [62]. Pb = 1; Botones [62]. Isc = 68; Botones [62]. Sc = 0; + Botones [63].Left = 500; Botones [63].Up = 170;Botones [63]. Right = 530;Botones [63]. Down = 200; + Botones [63]. Cdf = 7; Botones [63]. Cb1 = 56; Botones [63]. Cb2 = 63; Botones [63]. Ab = 2; Botones [63]. Pb = 1; Botones [63]. Isc = 77; Botones [63]. Sc = 0; + Botones [64].Left = 465; Botones [64].Up = 170;Botones [64]. Right = 495;Botones [64]. Down = 200; + Botones [64]. Cdf = 7; Botones [64]. Cb1 = 56; Botones [64]. Cb2 = 63; Botones [64]. Ab = 2; Botones [64]. Pb = 1; Botones [64]. Isc = 85; Botones [64]. Sc = 0; + Botones [65].Left = 430; Botones [65].Up = 170;Botones [65]. Right = 460;Botones [65]. Down = 200; + Botones [65]. Cdf = 7; Botones [65]. Cb1 = 56; Botones [65]. Cb2 = 63; Botones [65]. Ab = 2; Botones [65]. Pb = 1; Botones [65]. Isc = 76; Botones [65]. Sc = 0; + Botones [66].Left = 605; Botones [66].Up = 205;Botones [66]. Right = 635;Botones [66]. Down = 235; + Botones [66]. Cdf = 14; Botones [66]. Cb1 = 56; Botones [66]. Cb2 = 63; Botones [66]. Ab = 2; Botones [66]. Pb = 1; Botones [66]. Isc = 0; Botones [66]. Sc = 0; + Botones [67].Left = 570; Botones [67].Up = 205;Botones [67]. Right = 600;Botones [67]. Down = 235; + Botones [67]. Cdf = 14; Botones [67]. Cb1 = 56; Botones [67]. Cb2 = 63; Botones [67]. Ab = 2; Botones [67]. Pb = 1; Botones [67]. Isc = 0; Botones [67]. Sc = 0; + Botones [68].Left = 535; Botones [68].Up = 205;Botones [68]. Right = 565;Botones [68]. Down = 235; + Botones [68]. Cdf = 14; Botones [68]. Cb1 = 56; Botones [68]. Cb2 = 63; Botones [68]. Ab = 2; Botones [68]. Pb = 1; Botones [68]. Isc = 0; Botones [68]. Sc = 0; + Botones [69].Left = 500; Botones [69].Up = 205;Botones [69]. Right = 530;Botones [69]. Down = 235; + Botones [69]. Cdf = 63; Botones [69]. Cb1 = 56; Botones [69]. Cb2 = 7; Botones [69]. Ab = 2; Botones [69]. Pb = 1; Botones [69]. Isc = 57; Botones [69]. Sc = 0; + Botones [70].Left = 465; Botones [70].Up = 205;Botones [70]. Right = 495;Botones [70]. Down = 235; + Botones [70]. Cdf = 63; Botones [70]. Cb1 = 56; Botones [70]. Cb2 = 7; Botones [70]. Ab = 2; Botones [70]. Pb = 1; Botones [70]. Isc = 56; Botones [70]. Sc = 0; + Botones [71].Left = 430; Botones [71].Up = 205;Botones [71]. Right = 460;Botones [71]. Down = 235; + Botones [71]. Cdf = 63; Botones [71]. Cb1 = 56; Botones [71]. Cb2 = 7; Botones [71]. Ab = 2; Botones [71]. Pb = 1; Botones [71]. Isc = 55; Botones [71]. Sc = 0; + Botones [72].Left = 605; Botones [72].Up = 240;Botones [72]. Right = 635;Botones [72]. Down = 270; + Botones [72]. Cdf = 14; Botones [72]. Cb1 = 56; Botones [72]. Cb2 = 63; Botones [72]. Ab = 2; Botones [72]. Pb = 1; Botones [72]. Isc = 0; Botones [72]. Sc = 0; + Botones [73].Left = 570; Botones [73].Up = 240;Botones [73]. Right = 600;Botones [73]. Down = 270; + Botones [73]. Cdf = 14; Botones [73]. Cb1 = 56; Botones [73]. Cb2 = 63; Botones [73]. Ab = 2; Botones [73]. Pb = 1; Botones [73]. Isc = 0; Botones [73]. Sc = 83; + Botones [74].Left = 535; Botones [74].Up = 240;Botones [74]. Right = 565;Botones [74]. Down = 270; + Botones [74]. Cdf = 14; Botones [74]. Cb1 = 56; Botones [74]. Cb2 = 63; Botones [74]. Ab = 2; Botones [74]. Pb = 1; Botones [74]. Isc = 0; Botones [74]. Sc = 0; + Botones [75].Left = 500; Botones [75].Up = 240;Botones [75]. Right = 530;Botones [75]. Down = 270; + Botones [75]. Cdf = 63; Botones [75]. Cb1 = 56; Botones [75]. Cb2 = 7; Botones [75]. Ab = 2; Botones [75]. Pb = 1; Botones [75]. Isc = 54; Botones [75]. Sc = 0; + Botones [76].Left = 465; Botones [76].Up = 240;Botones [76]. Right = 495;Botones [76]. Down = 270; + Botones [76]. Cdf = 63; Botones [76]. Cb1 = 56; Botones [76]. Cb2 = 7; Botones [76]. Ab = 2; Botones [76]. Pb = 1; Botones [76]. Isc = 53; Botones [76]. Sc = 0; + Botones [77].Left = 430; Botones [77].Up = 240;Botones [77]. Right = 460;Botones [77]. Down = 270; + Botones [77]. Cdf = 63; Botones [77]. Cb1 = 56; Botones [77]. Cb2 = 7; Botones [77]. Ab = 2; Botones [77]. Pb = 1; Botones [77]. Isc = 52; Botones [77]. Sc = 0; + Botones [78].Left = 605; Botones [78].Up = 275;Botones [78]. Right = 635;Botones [78]. Down = 305; + Botones [78]. Cdf = 14; Botones [78]. Cb1 = 56; Botones [78]. Cb2 = 63; Botones [78]. Ab = 2; Botones [78]. Pb = 1; Botones [78]. Isc = 0; Botones [78]. Sc = 72; + Botones [79].Left = 570; Botones [79].Up = 275;Botones [79]. Right = 600;Botones [79]. Down = 305; + Botones [79]. Cdf = 14; Botones [79]. Cb1 = 56; Botones [79]. Cb2 = 63; Botones [79]. Ab = 2; Botones [79]. Pb = 1; Botones [79]. Isc = 0; Botones [79]. Sc = 82; + Botones [80].Left = 535; Botones [80].Up = 275;Botones [80]. Right = 565;Botones [80]. Down = 305; + Botones [80]. Cdf = 14; Botones [80]. Cb1 = 56; Botones [80]. Cb2 = 63; Botones [80]. Ab = 2; Botones [80]. Pb = 1; Botones [80]. Isc = 0; Botones [80]. Sc = 0; + Botones [81].Left = 500; Botones [81].Up = 275;Botones [81]. Right = 530;Botones [81]. Down = 305; + Botones [81]. Cdf = 63; Botones [81]. Cb1 = 56; Botones [81]. Cb2 = 7; Botones [81]. Ab = 2; Botones [81]. Pb = 1; Botones [81]. Isc = 51; Botones [81]. Sc = 0; + Botones [82].Left = 465; Botones [82].Up = 275;Botones [82]. Right = 495;Botones [82]. Down = 305; + Botones [82]. Cdf = 63; Botones [82]. Cb1 = 56; Botones [82]. Cb2 = 7; Botones [82]. Ab = 2; Botones [82]. Pb = 1; Botones [82]. Isc = 50; Botones [82]. Sc = 0; + Botones [83].Left = 430; Botones [83].Up = 275;Botones [83]. Right = 460;Botones [83]. Down = 305; + Botones [83]. Cdf = 63; Botones [83]. Cb1 = 56; Botones [83]. Cb2 = 7; Botones [83]. Ab = 2; Botones [83]. Pb = 1; Botones [83]. Isc = 49; Botones [83]. Sc = 0; + Botones [84].Left = 605; Botones [84].Up = 310;Botones [84]. Right = 635;Botones [84]. Down = 340; + Botones [84]. Cdf = 14; Botones [84]. Cb1 = 56; Botones [84]. Cb2 = 63; Botones [84]. Ab = 2; Botones [84]. Pb = 1; Botones [84]. Isc = 0; Botones [84]. Sc = 80; + Botones [85].Left = 570; Botones [85].Up = 310;Botones [85]. Right = 600;Botones [85]. Down = 340; + Botones [85]. Cdf = 14; Botones [85]. Cb1 = 56; Botones [85]. Cb2 = 63; Botones [85]. Ab = 2; Botones [85]. Pb = 1; Botones [85]. Isc = 13; Botones [85]. Sc = 0; + Botones [86].Left = 535; Botones [86].Up = 310;Botones [86]. Right = 565;Botones [86]. Down = 340; + Botones [86]. Cdf = 14; Botones [86]. Cb1 = 56; Botones [86]. Cb2 = 63; Botones [86]. Ab = 2; Botones [86]. Pb = 1; Botones [86]. Isc = 0; Botones [86]. Sc = 0; + Botones [87].Left = 500; Botones [87].Up = 310;Botones [87]. Right = 530;Botones [87]. Down = 340; + Botones [87]. Cdf = 63; Botones [87]. Cb1 = 56; Botones [87]. Cb2 = 7; Botones [87]. Ab = 2; Botones [87]. Pb = 1; Botones [87]. Isc = 8; Botones [87]. Sc = 0; + Botones [88].Left = 430; Botones [88].Up = 310;Botones [88]. Right = 460;Botones [88]. Down = 340; + Botones [88]. Cdf = 63; Botones [88]. Cb1 = 56; Botones [88]. Cb2 = 7; Botones [88]. Ab = 2; Botones [88]. Pb = 1; Botones [88]. Isc = 48; Botones [88]. Sc = 0; + Botones [89].Left = 430; Botones [89].Up = 345;Botones [89]. Right = 530;Botones [89]. Down = 359; + Botones [89]. Cdf = 7; Botones [89]. Cb1 = 56; Botones [89]. Cb2 = 63; Botones [89]. Ab = 2; Botones [89]. Pb = 1; Botones [89]. Isc = 0; Botones [89]. Sc = 0; + Botones [90].Left = 535; Botones [90].Up = 345;Botones [90]. Right = 635;Botones [90]. Down = 359; + Botones [90]. Cdf = 7; Botones [90]. Cb1 = 56; Botones [90]. Cb2 = 63; Botones [90]. Ab = 2; Botones [90]. Pb = 1; Botones [90]. Isc = 0; Botones [90]. Sc = 0; + n_Botones_Secuencia[2 - 1] = 31; + SiZe_BoToN += ( sizeof( struct Make_Boton ) * 31); + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = 2; + return SIN_MEMORIA; + } + memoria_asignada = 1; + Botones [91].Left = 20; Botones [91].Up = 34;Botones [91]. Right = 45;Botones [91]. Down = 59; + Botones [91]. Cdf = 7; Botones [91]. Cb1 = 56; Botones [91]. Cb2 = 63; Botones [91]. Ab = 2; Botones [91]. Pb = 1; Botones [91]. Isc = 0; Botones [91]. Sc = 0; + Botones [92].Left = 47; Botones [92].Up = 34;Botones [92]. Right = 72;Botones [92]. Down = 59; + Botones [92]. Cdf = 7; Botones [92]. Cb1 = 56; Botones [92]. Cb2 = 63; Botones [92]. Ab = 2; Botones [92]. Pb = 1; Botones [92]. Isc = 0; Botones [92]. Sc = 0; + Botones [93].Left = 74; Botones [93].Up = 34;Botones [93]. Right = 99;Botones [93]. Down = 59; + Botones [93]. Cdf = 7; Botones [93]. Cb1 = 56; Botones [93]. Cb2 = 63; Botones [93]. Ab = 2; Botones [93]. Pb = 1; Botones [93]. Isc = 0; Botones [93]. Sc = 0; + Botones [94].Left = 101; Botones [94].Up = 34;Botones [94]. Right = 126;Botones [94]. Down = 59; + Botones [94]. Cdf = 7; Botones [94]. Cb1 = 56; Botones [94]. Cb2 = 63; Botones [94]. Ab = 2; Botones [94]. Pb = 1; Botones [94]. Isc = 0; Botones [94]. Sc = 0; + Botones [95].Left = 128; Botones [95].Up = 34;Botones [95]. Right = 153;Botones [95]. Down = 59; + Botones [95]. Cdf = 7; Botones [95]. Cb1 = 56; Botones [95]. Cb2 = 63; Botones [95]. Ab = 2; Botones [95]. Pb = 1; Botones [95]. Isc = 0; Botones [95]. Sc = 0; + Botones [96].Left = 155; Botones [96].Up = 34;Botones [96]. Right = 180;Botones [96]. Down = 59; + Botones [96]. Cdf = 7; Botones [96]. Cb1 = 56; Botones [96]. Cb2 = 63; Botones [96]. Ab = 2; Botones [96]. Pb = 1; Botones [96]. Isc = 0; Botones [96]. Sc = 0; + Botones [97].Left = 182; Botones [97].Up = 34;Botones [97]. Right = 207;Botones [97]. Down = 59; + Botones [97]. Cdf = 7; Botones [97]. Cb1 = 56; Botones [97]. Cb2 = 63; Botones [97]. Ab = 2; Botones [97]. Pb = 1; Botones [97]. Isc = 0; Botones [97]. Sc = 0; + Botones [98].Left = 209; Botones [98].Up = 34;Botones [98]. Right = 234;Botones [98]. Down = 59; + Botones [98]. Cdf = 7; Botones [98]. Cb1 = 56; Botones [98]. Cb2 = 63; Botones [98]. Ab = 2; Botones [98]. Pb = 1; Botones [98]. Isc = 0; Botones [98]. Sc = 0; + Botones [99].Left = 20; Botones [99].Up = 61;Botones [99]. Right = 45;Botones [99]. Down = 86; + Botones [99]. Cdf = 7; Botones [99]. Cb1 = 56; Botones [99]. Cb2 = 63; Botones [99]. Ab = 2; Botones [99]. Pb = 1; Botones [99]. Isc = 0; Botones [99]. Sc = 0; + Botones [100].Left = 47; Botones [100].Up = 61;Botones [100]. Right = 72;Botones [100]. Down = 86; + Botones [100]. Cdf = 7; Botones [100]. Cb1 = 56; Botones [100]. Cb2 = 63; Botones [100]. Ab = 2; Botones [100]. Pb = 1; Botones [100]. Isc = 0; Botones [100]. Sc = 0; + Botones [101].Left = 74; Botones [101].Up = 61;Botones [101]. Right = 99;Botones [101]. Down = 86; + Botones [101]. Cdf = 7; Botones [101]. Cb1 = 56; Botones [101]. Cb2 = 63; Botones [101]. Ab = 2; Botones [101]. Pb = 1; Botones [101]. Isc = 0; Botones [101]. Sc = 0; + Botones [102].Left = 101; Botones [102].Up = 61;Botones [102]. Right = 126;Botones [102]. Down = 86; + Botones [102]. Cdf = 7; Botones [102]. Cb1 = 56; Botones [102]. Cb2 = 63; Botones [102]. Ab = 2; Botones [102]. Pb = 1; Botones [102]. Isc = 0; Botones [102]. Sc = 0; + Botones [103].Left = 128; Botones [103].Up = 61;Botones [103]. Right = 153;Botones [103]. Down = 86; + Botones [103]. Cdf = 7; Botones [103]. Cb1 = 56; Botones [103]. Cb2 = 63; Botones [103]. Ab = 2; Botones [103]. Pb = 1; Botones [103]. Isc = 0; Botones [103]. Sc = 0; + Botones [104].Left = 155; Botones [104].Up = 61;Botones [104]. Right = 180;Botones [104]. Down = 86; + Botones [104]. Cdf = 7; Botones [104]. Cb1 = 56; Botones [104]. Cb2 = 63; Botones [104]. Ab = 2; Botones [104]. Pb = 1; Botones [104]. Isc = 0; Botones [104]. Sc = 0; + Botones [105].Left = 182; Botones [105].Up = 61;Botones [105]. Right = 207;Botones [105]. Down = 86; + Botones [105]. Cdf = 7; Botones [105]. Cb1 = 56; Botones [105]. Cb2 = 63; Botones [105]. Ab = 2; Botones [105]. Pb = 1; Botones [105]. Isc = 0; Botones [105]. Sc = 0; + Botones [106].Left = 209; Botones [106].Up = 61;Botones [106]. Right = 234;Botones [106]. Down = 86; + Botones [106]. Cdf = 7; Botones [106]. Cb1 = 56; Botones [106]. Cb2 = 63; Botones [106]. Ab = 2; Botones [106]. Pb = 1; Botones [106]. Isc = 0; Botones [106]. Sc = 0; + Botones [107].Left = 236; Botones [107].Up = 34;Botones [107]. Right = 261;Botones [107]. Down = 59; + Botones [107]. Cdf = 3; Botones [107]. Cb1 = 56; Botones [107]. Cb2 = 63; Botones [107]. Ab = 3; Botones [107]. Pb = 1; Botones [107]. Isc = 0; Botones [107]. Sc = 0; + Botones [108].Left = 263; Botones [108].Up = 34;Botones [108]. Right = 288;Botones [108]. Down = 59; + Botones [108]. Cdf = 3; Botones [108]. Cb1 = 56; Botones [108]. Cb2 = 63; Botones [108]. Ab = 3; Botones [108]. Pb = 1; Botones [108]. Isc = 0; Botones [108]. Sc = 0; + Botones [109].Left = 290; Botones [109].Up = 34;Botones [109]. Right = 315;Botones [109]. Down = 59; + Botones [109]. Cdf = 3; Botones [109]. Cb1 = 56; Botones [109]. Cb2 = 63; Botones [109]. Ab = 3; Botones [109]. Pb = 1; Botones [109]. Isc = 0; Botones [109]. Sc = 0; + Botones [110].Left = 236; Botones [110].Up = 61;Botones [110]. Right = 261;Botones [110]. Down = 86; + Botones [110]. Cdf = 3; Botones [110]. Cb1 = 56; Botones [110]. Cb2 = 63; Botones [110]. Ab = 3; Botones [110]. Pb = 1; Botones [110]. Isc = 0; Botones [110]. Sc = 0; + Botones [111].Left = 263; Botones [111].Up = 61;Botones [111]. Right = 288;Botones [111]. Down = 86; + Botones [111]. Cdf = 3; Botones [111]. Cb1 = 56; Botones [111]. Cb2 = 63; Botones [111]. Ab = 3; Botones [111]. Pb = 1; Botones [111]. Isc = 0; Botones [111]. Sc = 0; + Botones [112].Left = 290; Botones [112].Up = 61;Botones [112]. Right = 315;Botones [112]. Down = 86; + Botones [112]. Cdf = 3; Botones [112]. Cb1 = 56; Botones [112]. Cb2 = 63; Botones [112]. Ab = 3; Botones [112]. Pb = 1; Botones [112]. Isc = 0; Botones [112]. Sc = 0; + Botones [113].Left = 555; Botones [113].Up = 34;Botones [113]. Right = 580;Botones [113]. Down = 59; + Botones [113]. Cdf = 3; Botones [113]. Cb1 = 56; Botones [113]. Cb2 = 63; Botones [113]. Ab = 3; Botones [113]. Pb = 1; Botones [113]. Isc = 0; Botones [113]. Sc = 0; + Botones [114].Left = 582; Botones [114].Up = 34;Botones [114]. Right = 607;Botones [114]. Down = 59; + Botones [114]. Cdf = 3; Botones [114]. Cb1 = 56; Botones [114]. Cb2 = 63; Botones [114]. Ab = 3; Botones [114]. Pb = 1; Botones [114]. Isc = 0; Botones [114]. Sc = 0; + Botones [115].Left = 609; Botones [115].Up = 34;Botones [115]. Right = 634;Botones [115]. Down = 59; + Botones [115]. Cdf = 3; Botones [115]. Cb1 = 56; Botones [115]. Cb2 = 63; Botones [115]. Ab = 3; Botones [115]. Pb = 1; Botones [115]. Isc = 0; Botones [115]. Sc = 0; + Botones [116].Left = 555; Botones [116].Up = 61;Botones [116]. Right = 580;Botones [116]. Down = 86; + Botones [116]. Cdf = 3; Botones [116]. Cb1 = 56; Botones [116]. Cb2 = 63; Botones [116]. Ab = 3; Botones [116]. Pb = 1; Botones [116]. Isc = 0; Botones [116]. Sc = 0; + Botones [117].Left = 582; Botones [117].Up = 61;Botones [117]. Right = 607;Botones [117]. Down = 86; + Botones [117]. Cdf = 3; Botones [117]. Cb1 = 56; Botones [117]. Cb2 = 63; Botones [117]. Ab = 3; Botones [117]. Pb = 1; Botones [117]. Isc = 0; Botones [117]. Sc = 0; + Botones [118].Left = 609; Botones [118].Up = 61;Botones [118]. Right = 634;Botones [118]. Down = 86; + Botones [118]. Cdf = 3; Botones [118]. Cb1 = 56; Botones [118]. Cb2 = 63; Botones [118]. Ab = 3; Botones [118]. Pb = 1; Botones [118]. Isc = 0; Botones [118]. Sc = 0; + Botones [119].Left = 538; Botones [119].Up = 103;Botones [119]. Right = 632;Botones [119]. Down = 127; + Botones [119]. Cdf = 9; Botones [119]. Cb1 = 56; Botones [119]. Cb2 = 63; Botones [119]. Ab = 2; Botones [119]. Pb = 1; Botones [119]. Isc = 0; Botones [119]. Sc = 31; + Botones [120].Left = 605; Botones [120].Up = 275;Botones [120]. Right = 635;Botones [120]. Down = 305; + Botones [120]. Cdf = 14; Botones [120]. Cb1 = 56; Botones [120]. Cb2 = 63; Botones [120]. Ab = 2; Botones [120]. Pb = 1; Botones [120]. Isc = 0; Botones [120]. Sc = 72; + Botones [121].Left = 605; Botones [121].Up = 310;Botones [121]. Right = 635;Botones [121]. Down = 340; + Botones [121]. Cdf = 14; Botones [121]. Cb1 = 56; Botones [121]. Cb2 = 63; Botones [121]. Ab = 2; Botones [121]. Pb = 1; Botones [121]. Isc = 0; Botones [121]. Sc = 80; + n_Botones_Secuencia[3 - 1] = 2; + SiZe_BoToN += ( sizeof( struct Make_Boton ) * 2); + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = 3; + return SIN_MEMORIA; + } + memoria_asignada = 1; + Botones [122].Left = 204; Botones [122].Up = 274;Botones [122]. Right = 276;Botones [122]. Down = 291; + Botones [122]. Cdf = 7; Botones [122]. Cb1 = 56; Botones [122]. Cb2 = 63; Botones [122]. Ab = 2; Botones [122]. Pb = 1; Botones [122]. Isc = 0; Botones [122]. Sc = 30; + Botones [123].Left = 364; Botones [123].Up = 274;Botones [123]. Right = 436;Botones [123]. Down = 291; + Botones [123]. Cdf = 7; Botones [123]. Cb1 = 56; Botones [123]. Cb2 = 63; Botones [123]. Ab = 2; Botones [123]. Pb = 1; Botones [123]. Isc = 0; Botones [123]. Sc = 46; + n_Botones_Secuencia[4 - 1] = 4; + SiZe_BoToN += ( sizeof( struct Make_Boton ) * 4); + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = 4; + return SIN_MEMORIA; + } + memoria_asignada = 1; + Botones [124].Left = 377; Botones [124].Up = 169;Botones [124]. Right = 391;Botones [124]. Down = 221; + Botones [124]. Cdf = 7; Botones [124]. Cb1 = 56; Botones [124]. Cb2 = 63; Botones [124]. Ab = 0; Botones [124]. Pb = 1; Botones [124]. Isc = 0; Botones [124]. Sc = 46; + Botones [125].Left = 377; Botones [125].Up = 223;Botones [125]. Right = 391;Botones [125]. Down = 276; + Botones [125]. Cdf = 7; Botones [125]. Cb1 = 56; Botones [125]. Cb2 = 63; Botones [125]. Ab = 0; Botones [125]. Pb = 1; Botones [125]. Isc = 0; Botones [125]. Sc = 30; + Botones [126].Left = 377; Botones [126].Up = 278;Botones [126]. Right = 391;Botones [126]. Down = 303; + Botones [126]. Cdf = 7; Botones [126]. Cb1 = 56; Botones [126]. Cb2 = 63; Botones [126]. Ab = 0; Botones [126]. Pb = 1; Botones [126]. Isc = 0; Botones [126]. Sc = 72; + Botones [127].Left = 377; Botones [127].Up = 305;Botones [127]. Right = 391;Botones [127]. Down = 330; + Botones [127]. Cdf = 7; Botones [127]. Cb1 = 56; Botones [127]. Cb2 = 63; Botones [127]. Ab = 0; Botones [127]. Pb = 1; Botones [127]. Isc = 0; Botones [127]. Sc = 80; + n_Botones_Secuencia[5 - 1] = 22; + SiZe_BoToN += ( sizeof( struct Make_Boton ) * 22); + if ( (Botones = (struct Make_Boton far *)farrealloc(Botones, SiZe_BoToN )) == NULL) { + Secuencias = 5; + return SIN_MEMORIA; + } + memoria_asignada = 1; + Botones [128].Left = 15; Botones [128].Up = 380;Botones [128]. Right = 25;Botones [128]. Down = 390; + Botones [128]. Cdf = 0; Botones [128]. Cb1 = 7; Botones [128]. Cb2 = 7; Botones [128]. Ab = 3; Botones [128]. Pb = 0; Botones [128]. Isc = 82; Botones [128]. Sc = 0; + Botones [129].Left = 15; Botones [129].Up = 405;Botones [129]. Right = 25;Botones [129]. Down = 415; + Botones [129]. Cdf = 0; Botones [129]. Cb1 = 7; Botones [129]. Cb2 = 7; Botones [129]. Ab = 3; Botones [129]. Pb = 0; Botones [129]. Isc = 73; Botones [129]. Sc = 0; + Botones [130].Left = 15; Botones [130].Up = 430;Botones [130]. Right = 25;Botones [130]. Down = 440; + Botones [130]. Cdf = 0; Botones [130]. Cb1 = 7; Botones [130]. Cb2 = 7; Botones [130]. Ab = 3; Botones [130]. Pb = 0; Botones [130]. Isc = 80; Botones [130]. Sc = 0; + Botones [131].Left = 15; Botones [131].Up = 455;Botones [131]. Right = 25;Botones [131]. Down = 465; + Botones [131]. Cdf = 0; Botones [131]. Cb1 = 7; Botones [131]. Cb2 = 7; Botones [131]. Ab = 3; Botones [131]. Pb = 0; Botones [131]. Isc = 77; Botones [131]. Sc = 0; + Botones [132].Left = 315; Botones [132].Up = 380;Botones [132]. Right = 325;Botones [132]. Down = 390; + Botones [132]. Cdf = 0; Botones [132]. Cb1 = 7; Botones [132]. Cb2 = 7; Botones [132]. Ab = 3; Botones [132]. Pb = 0; Botones [132]. Isc = 84; Botones [132]. Sc = 0; + Botones [133].Left = 315; Botones [133].Up = 395;Botones [133]. Right = 325;Botones [133]. Down = 405; + Botones [133]. Cdf = 0; Botones [133]. Cb1 = 7; Botones [133]. Cb2 = 7; Botones [133]. Ab = 3; Botones [133]. Pb = 0; Botones [133]. Isc = 83; Botones [133]. Sc = 0; + Botones [134].Left = 315; Botones [134].Up = 410;Botones [134]. Right = 325;Botones [134]. Down = 420; + Botones [134]. Cdf = 0; Botones [134]. Cb1 = 7; Botones [134]. Cb2 = 7; Botones [134]. Ab = 3; Botones [134]. Pb = 0; Botones [134]. Isc = 86; Botones [134]. Sc = 0; + Botones [135].Left = 496; Botones [135].Up = 380;Botones [135]. Right = 506;Botones [135]. Down = 390; + Botones [135]. Cdf = 1; Botones [135]. Cb1 = 56; Botones [135]. Cb2 = 63; Botones [135]. Ab = 0; Botones [135]. Pb = 0; Botones [135]. Isc = 0; Botones [135]. Sc = 0; + Botones [136].Left = 496; Botones [136].Up = 392;Botones [136]. Right = 506;Botones [136]. Down = 402; + Botones [136]. Cdf = 2; Botones [136]. Cb1 = 56; Botones [136]. Cb2 = 63; Botones [136]. Ab = 0; Botones [136]. Pb = 0; Botones [136]. Isc = 0; Botones [136]. Sc = 0; + Botones [137].Left = 496; Botones [137].Up = 402;Botones [137]. Right = 506;Botones [137]. Down = 412; + Botones [137]. Cdf = 3; Botones [137]. Cb1 = 56; Botones [137]. Cb2 = 63; Botones [137]. Ab = 0; Botones [137]. Pb = 0; Botones [137]. Isc = 0; Botones [137]. Sc = 0; + Botones [138].Left = 496; Botones [138].Up = 414;Botones [138]. Right = 506;Botones [138]. Down = 424; + Botones [138]. Cdf = 4; Botones [138]. Cb1 = 56; Botones [138]. Cb2 = 63; Botones [138]. Ab = 0; Botones [138]. Pb = 0; Botones [138]. Isc = 0; Botones [138]. Sc = 0; + Botones [139].Left = 496; Botones [139].Up = 426;Botones [139]. Right = 506;Botones [139]. Down = 436; + Botones [139]. Cdf = 5; Botones [139]. Cb1 = 56; Botones [139]. Cb2 = 63; Botones [139]. Ab = 0; Botones [139]. Pb = 0; Botones [139]. Isc = 0; Botones [139]. Sc = 0; + Botones [140].Left = 508; Botones [140].Up = 380;Botones [140]. Right = 518;Botones [140]. Down = 390; + Botones [140]. Cdf = 6; Botones [140]. Cb1 = 56; Botones [140]. Cb2 = 63; Botones [140]. Ab = 0; Botones [140]. Pb = 0; Botones [140]. Isc = 0; Botones [140]. Sc = 0; + Botones [141].Left = 508; Botones [141].Up = 392;Botones [141]. Right = 518;Botones [141]. Down = 402; + Botones [141]. Cdf = 7; Botones [141]. Cb1 = 56; Botones [141]. Cb2 = 63; Botones [141]. Ab = 0; Botones [141]. Pb = 0; Botones [141]. Isc = 0; Botones [141]. Sc = 0; + Botones [142].Left = 508; Botones [142].Up = 402;Botones [142]. Right = 518;Botones [142]. Down = 412; + Botones [142]. Cdf = 8; Botones [142]. Cb1 = 56; Botones [142]. Cb2 = 63; Botones [142]. Ab = 0; Botones [142]. Pb = 0; Botones [142]. Isc = 0; Botones [142]. Sc = 0; + Botones [143].Left = 508; Botones [143].Up = 414;Botones [143]. Right = 518;Botones [143]. Down = 424; + Botones [143]. Cdf = 9; Botones [143]. Cb1 = 56; Botones [143]. Cb2 = 63; Botones [143]. Ab = 0; Botones [143]. Pb = 0; Botones [143]. Isc = 0; Botones [143]. Sc = 0; + Botones [144].Left = 508; Botones [144].Up = 426;Botones [144]. Right = 518;Botones [144]. Down = 436; + Botones [144]. Cdf = 10; Botones [144]. Cb1 = 56; Botones [144]. Cb2 = 63; Botones [144]. Ab = 0; Botones [144]. Pb = 0; Botones [144]. Isc = 0; Botones [144]. Sc = 0; + Botones [145].Left = 520; Botones [145].Up = 380;Botones [145]. Right = 530;Botones [145]. Down = 390; + Botones [145]. Cdf = 11; Botones [145]. Cb1 = 56; Botones [145]. Cb2 = 63; Botones [145]. Ab = 0; Botones [145]. Pb = 0; Botones [145]. Isc = 0; Botones [145]. Sc = 0; + Botones [146].Left = 520; Botones [146].Up = 392;Botones [146]. Right = 530;Botones [146]. Down = 402; + Botones [146]. Cdf = 12; Botones [146]. Cb1 = 56; Botones [146]. Cb2 = 63; Botones [146]. Ab = 0; Botones [146]. Pb = 0; Botones [146]. Isc = 0; Botones [146]. Sc = 0; + Botones [147].Left = 520; Botones [147].Up = 402;Botones [147]. Right = 530;Botones [147]. Down = 412; + Botones [147]. Cdf = 13; Botones [147]. Cb1 = 56; Botones [147]. Cb2 = 63; Botones [147]. Ab = 0; Botones [147]. Pb = 0; Botones [147]. Isc = 0; Botones [147]. Sc = 0; + Botones [148].Left = 520; Botones [148].Up = 414;Botones [148]. Right = 530;Botones [148]. Down = 424; + Botones [148]. Cdf = 14; Botones [148]. Cb1 = 56; Botones [148]. Cb2 = 63; Botones [148]. Ab = 0; Botones [148]. Pb = 0; Botones [148]. Isc = 0; Botones [148]. Sc = 0; + Botones [149].Left = 520; Botones [149].Up = 426;Botones [149]. Right = 530;Botones [149]. Down = 436; + Botones [149]. Cdf = 15; Botones [149]. Cb1 = 56; Botones [149]. Cb2 = 63; Botones [149]. Ab = 0; Botones [149]. Pb = 0; Botones [149]. Isc = 0; Botones [149]. Sc = 0; + break; + case 1: + Bot_Static.Left = 236; Bot_Static.Up = 95; Bot_Static.Right = 425; Bot_Static.Down = 135; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 239; Bot_Static.Up = 98; Bot_Static.Right = 422; Bot_Static.Down = 132; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 1; Bot_Static.Up = 140; Bot_Static.Right = 91; Bot_Static.Down = 165; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 4; Bot_Static.Up = 143; Bot_Static.Right = 87; Bot_Static.Down = 162; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 1; Bot_Static.Up = 170; Bot_Static.Right = 91; Bot_Static.Down = 359; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 4; Bot_Static.Up = 173; Bot_Static.Right = 87; Bot_Static.Down = 356; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 96; Bot_Static.Up = 140; Bot_Static.Right = 231; Bot_Static.Down = 165; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 99; Bot_Static.Up = 143; Bot_Static.Right = 228; Bot_Static.Down = 162; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 96; Bot_Static.Up = 170; Bot_Static.Right = 231; Bot_Static.Down = 359; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 99; Bot_Static.Up = 173; Bot_Static.Right = 228; Bot_Static.Down = 356; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 236; Bot_Static.Up = 140; Bot_Static.Right = 425; Bot_Static.Down = 165; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 239; Bot_Static.Up = 143; Bot_Static.Right = 422; Bot_Static.Down = 162; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 236; Bot_Static.Up = 170; Bot_Static.Right = 425; Bot_Static.Down = 359; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 239; Bot_Static.Up = 173; Bot_Static.Right = 422; Bot_Static.Down = 356; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(63); settextstyle( 2, 0, 5); outtextxy( 4, 143, " Direccin Instruccin Dato" ); + setcolor(0); settextstyle( 2, 0, 5); outtextxy( 5, 144, " Direccin Instruccin Dato" ); + Bot_Static.Left = 0; Bot_Static.Up = 0; Bot_Static.Right = 565; Bot_Static.Down = 26; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 3; Bot_Static.Up = 3; Bot_Static.Right = 562; Bot_Static.Down = 23; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 0; Bot_Static.Up = 30; Bot_Static.Right = 320; Bot_Static.Down = 90; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 4; Bot_Static.Up = 34; Bot_Static.Right = 18; Bot_Static.Down = 86; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(63); settextstyle( 2, 1, 4); outtextxy( 4, 34, "Entradas" ); + setcolor(0); settextstyle( 2, 1, 4); outtextxy( 5, 35, "Entradas" ); + Bot_Static.Left = 321; Bot_Static.Up = 30; Bot_Static.Right = 640; Bot_Static.Down = 90; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 325; Bot_Static.Up = 34; Bot_Static.Right = 339; Bot_Static.Down = 86; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(63); settextstyle( 2, 1, 4); outtextxy( 325, 34, "Salidas " ); + setcolor(0); settextstyle( 2, 1, 4); outtextxy( 326, 35, "Salidas " ); + Bot_Static.Left = 1; Bot_Static.Up = 364; Bot_Static.Right = 550; Bot_Static.Down = 478; Bot_Static.Cdf = 12; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 6; Bot_Static.Up = 369; Bot_Static.Right = 545; Bot_Static.Down = 473; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 535; Bot_Static.Up = 100; Bot_Static.Right = 635; Bot_Static.Down = 130; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + break; + case 2: + + setcolor(4); settextstyle( 2, 0, 6); + outtextxy( 539, 105, " R U N" ); + outtextxy( 539, 108, " _" ); + + setcolor(12); settextstyle( 2, 0, 4); + outtextxy( 570, 8, "_" ); + + settextstyle( 2, 0, 5); + outtextxy( 582, 368, " _" ); + outtextxy( 582, 457, " _" ); + + settextstyle( 2, 0, 6); + outtextxy( 538, 104, " R U N" ); + outtextxy( 538, 107, " _" ); + + settextstyle( 2, 1, 5); + outtextxy( 587, 395, " _ " ); + outtextxy( 616, 395, " _ " ); + outtextxy( 558, 369, " Configurar " ); + outtextxy( 560, 369, " _ " ); + + setcolor(0); settextstyle( 2, 0, 4); + outtextxy( 571, 6, "Acerca de..." ); + outtextxy( 571, 9, "_" ); + + setcolor(0); settextstyle( 2, 1, 5); + outtextxy( 561, 370, " _ " ); + outtextxy( 586, 396, " Salvar" ); + outtextxy( 588, 396, " _ " ); + outtextxy( 613, 396, " Cargar" ); + outtextxy( 617, 396, " _ " ); + outtextxy( 559, 370, " Configurar " ); + + + // INICIO 63 + setcolor(63); + settextstyle( 2, 0, 5); + outtextxy( 126, 64, " 12" ); + outtextxy( 153, 64, " 13" ); + outtextxy( 180, 64, " 14" ); + outtextxy( 207, 64, " 15" ); + outtextxy( 234, 64, " 03" ); + outtextxy( 261, 64, " 04" ); + outtextxy( 288, 64, " 19" ); + outtextxy( 339, 37, " 0" ); + outtextxy( 366, 37, " 1" ); + outtextxy( 393, 37, " 2" ); + outtextxy( 570, 5, "Acerca de..." ); + outtextxy( 582, 366, " Reset" ); + outtextxy( 420, 37, " 3" ); + outtextxy( 447, 37, " 4" ); + outtextxy( 582, 455, " Salir" ); + outtextxy( 18, 37, " 0" ); + outtextxy( 45, 37, " 1" ); + outtextxy( 72, 37, " 2" ); + outtextxy( 99, 37, " 3" ); + outtextxy( 126, 37, " 4" ); + outtextxy( 153, 37, " 5" ); + outtextxy( 180, 37, " 6" ); + outtextxy( 207, 37, " 7" ); + outtextxy( 234, 37, " 00" ); + outtextxy( 261, 37, " 01" ); + outtextxy( 288, 37, " 02" ); + outtextxy( 18, 64, " 8" ); + outtextxy( 45, 64, " 9" ); + outtextxy( 72, 64, " 10" ); + outtextxy( 99, 64, " 11" ); + outtextxy( 339, 64, " 8" ); + outtextxy( 526, 37, " 7" ); + outtextxy( 499, 37, " 6" ); + outtextxy( 474, 37, " 5" ); + outtextxy( 553, 37, " 05" ); + outtextxy( 580, 37, " 06" ); + outtextxy( 607, 37, " 07" ); + outtextxy( 366, 64, " 9" ); + outtextxy( 393, 64, " 10" ); + outtextxy( 434, 105, "FUN" ); + outtextxy( 474, 64, " 13" ); + outtextxy( 447, 64, " 12" ); + outtextxy( 420, 64, " 11" ); + outtextxy( 499, 64, " 14" ); + outtextxy( 526, 64, " 15" ); + outtextxy( 553, 64, " 08" ); + outtextxy( 580, 64, " 09" ); + outtextxy( 434, 107, "_" ); + outtextxy( 607, 64, " 10" ); + outtextxy( 433, 140, "AND OR CNT" ); + outtextxy( 469, 105, "SFT" ); + outtextxy( 469, 107, "_" ); + outtextxy( 505, 105, "NOT" ); + outtextxy( 505, 107, "_" ); + outtextxy( 614, 142, "_" ); + outtextxy( 614, 140, "HR" ); + outtextxy( 430, 175, " LD OUT" ); + outtextxy( 544, 140, "TR LR" ); + outtextxy( 544, 142, "_ _" ); + outtextxy( 430, 177, " _ _" ); + outtextxy( 505, 175, "TIM" ); + outtextxy( 505, 175, " _" ); + outtextxy( 544, 175, "DM CH" ); + outtextxy( 544, 177, "_" ); + outtextxy( 433, 142, "_ _ _" ); + + + setcolor(63); settextstyle( 2, 1, 5); + outtextxy( 585, 395, " Salvar" ); + outtextxy( 612, 395, " Cargar" ); + setcolor(63); settextstyle( 2, 0, 4); + outtextxy( 609, 177, "CONT" ); + outtextxy( 430, 345, " Debug Code" ); + outtextxy( 533, 345, " Reset Valores" ); + // FIN 63 + + setcolor(0); settextstyle( 2, 0, 5); + outtextxy( 583, 459, " _" ); + outtextxy( 583, 367, " Reset" ); + outtextxy( 583, 369, " _" ); + outtextxy( 583, 456, " Salir" ); + outtextxy( 19, 38, " 0" ); + outtextxy( 46, 38, " 1" ); + outtextxy( 73, 38, " 2" ); + outtextxy( 100, 38, " 3" ); + outtextxy( 127, 38, " 4" ); + outtextxy( 154, 38, " 5" ); + outtextxy( 181, 38, " 6" ); + outtextxy( 208, 38, " 7" ); + outtextxy( 235, 38, " 00" ); + outtextxy( 262, 38, " 01" ); + outtextxy( 289, 38, " 02" ); + outtextxy( 19, 65, " 8" ); + outtextxy( 46, 65, " 9" ); + outtextxy( 73, 65, " 10" ); + outtextxy( 100, 65, " 11" ); + outtextxy( 127, 65, " 12" ); + outtextxy( 154, 65, " 13" ); + outtextxy( 181, 65, " 14" ); + outtextxy( 208, 65, " 15" ); + outtextxy( 235, 65, " 03" ); + outtextxy( 262, 65, " 04" ); + outtextxy( 289, 65, " 19" ); + outtextxy( 340, 38, " 0" ); + outtextxy( 367, 38, " 1" ); + outtextxy( 394, 38, " 2" ); + outtextxy( 421, 38, " 3" ); + outtextxy( 448, 38, " 4" ); + outtextxy( 475, 38, " 5" ); + outtextxy( 500, 38, " 6" ); + outtextxy( 527, 38, " 7" ); + outtextxy( 554, 38, " 05" ); + outtextxy( 581, 38, " 06" ); + outtextxy( 608, 38, " 07" ); + outtextxy( 340, 65, " 8" ); + outtextxy( 367, 65, " 9" ); + outtextxy( 394, 65, " 10" ); + outtextxy( 421, 65, " 11" ); + outtextxy( 448, 65, " 12" ); + outtextxy( 475, 65, " 13" ); + outtextxy( 500, 65, " 14" ); + outtextxy( 527, 65, " 15" ); + outtextxy( 554, 65, " 08" ); + outtextxy( 581, 65, " 09" ); + outtextxy( 608, 65, " 10" ); + outtextxy( 435, 106, "FUN" ); + outtextxy( 435, 108, "_" ); + outtextxy( 470, 106, "SFT" ); + outtextxy( 470, 108, "_" ); + outtextxy( 506, 106, "NOT" ); + outtextxy( 506, 108, "_" ); + outtextxy( 434, 141, "AND OR CNT" ); + outtextxy( 434, 143, "_ _ _" ); + outtextxy( 545, 141, "TR LR" ); + outtextxy( 545, 143, "_ _" ); + outtextxy( 614, 141, "HR" ); + outtextxy( 614, 143, "_" ); + outtextxy( 431, 176, " LD OUT" ); + outtextxy( 431, 178, " _ _" ); + outtextxy( 506, 176, "TIM" ); + outtextxy( 506, 176, " _" ); + outtextxy( 545, 176, "DM CH" ); + outtextxy( 545, 178, "_" ); + outtextxy( 545, 178, " _" ); + outtextxy( 544, 246, " DEL" ); + outtextxy( 441, 216, " 7 9" ); + outtextxy( 438, 216, " 8" ); + outtextxy( 540, 211, "EXT" ); + outtextxy( 438, 251, " 5" ); + outtextxy( 544, 211, " CHG" ); + outtextxy( 441, 251, " 4 6" ); + outtextxy( 441, 286, " 1 3" ); + outtextxy( 438, 286, " 2 " ); + outtextxy( 540, 281, "REC" ); + outtextxy( 536, 281, " INS UP" ); + outtextxy( 441, 321, " 0" ); + outtextxy( 506, 316, "CLR" ); + outtextxy( 508, 316, " VER" ); + + setcolor(0); + settextstyle( 2, 0, 4); + outtextxy( 609, 178, "CONT" ); + outtextxy( 609, 180, " _" ); + outtextxy( 538, 249, "" ); + outtextxy( 543, 256, "SET" ); + outtextxy( 609, 248, "MONT" ); + outtextxy( 540, 243, "PLAY" ); + outtextxy( 609, 213, "SCRH" ); + outtextxy( 428, 242, " E F" ); + outtextxy( 428, 277, " B C D" ); + outtextxy( 428, 312, " A" ); + outtextxy( 539, 318, " WRIT DOWN" ); + outtextxy( 539, 318, " DOWN" ); + outtextxy( 431, 346, " Debug Code" ); + outtextxy( 534, 346, " Reset Valores" ); + + setcolor(7); + outtextxy( 429, 243, " E F" ); + outtextxy( 429, 278, " B C D" ); + outtextxy( 429, 313, " A" ); + setcolor(22); + outtextxy( 539, 242, "PLAY" ); + outtextxy( 538, 248, "" ); + outtextxy( 538, 317, " WRIT DOWN" ); + outtextxy( 538, 317, " DOWN" ); + outtextxy( 609, 247, "MONT" ); + outtextxy( 542, 255, "SET" ); + outtextxy( 609, 212, "SCRH" ); + + settextstyle( 2, 0, 5); + outtextxy( 440, 250, " 4 6" ); + outtextxy( 437, 250, " 5" ); + outtextxy( 507, 315, " VER" ); + outtextxy( 535, 280, " INS UP" ); + outtextxy( 440, 320, " 0" ); + outtextxy( 505, 315, "CLR" ); + outtextxy( 543, 245, " DEL" ); + outtextxy( 440, 285, " 1 3" ); + outtextxy( 539, 280, "REC" ); + outtextxy( 437, 285, " 2" ); + outtextxy( 440, 215, " 7 9" ); + outtextxy( 437, 215, " 8" ); + outtextxy( 539, 210, "EXT" ); + outtextxy( 543, 210, " CHG" ); + + setcolor(12); + outtextxy( 544, 177, " _" ); + settextstyle( 2, 0, 4); + outtextxy( 609, 179, " _" ); + + + break; + case 3: + Bot_Static.Left = 538; Bot_Static.Up = 103; Bot_Static.Right = 632; Bot_Static.Down = 127; Bot_Static.Cdf = 9; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + settextstyle( 2, 0, 6); + setcolor(12); + outtextxy( 538, 104, " S T O P" ); + settextstyle( 2, 0, 6); outtextxy( 538, 107, " _" ); + setcolor(4); + settextstyle( 2, 0, 6); outtextxy( 539, 105, " S T O P" ); + settextstyle( 2, 0, 6); outtextxy( 539, 108, "_" ); + break; + case 4: + Bot_Static.Left = 538; Bot_Static.Up = 103; Bot_Static.Right = 632; Bot_Static.Down = 127; Bot_Static.Cdf = 9; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + settextstyle( 2, 0, 6); + setcolor(12); + outtextxy( 538, 104, " R U N" ); + outtextxy( 538, 107, " _" ); + setcolor(4); + outtextxy( 539, 105, " R U N" ); + outtextxy( 539, 108, " _" ); + break; + case 100: + Bot_Static.Left = 200; Bot_Static.Up = 212; Bot_Static.Right = 440; Bot_Static.Down = 267; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 205; Bot_Static.Up = 217; Bot_Static.Right = 435; Bot_Static.Down = 262; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 200; Bot_Static.Up = 270; Bot_Static.Right = 280; Bot_Static.Down = 295; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 360; Bot_Static.Up = 270; Bot_Static.Right = 440; Bot_Static.Down = 295; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + break; + case 101: + settextstyle( 2, 0, 5); + setcolor(63); + outtextxy( 200, 274, " Aceptar" ); + outtextxy( 340, 274, " Cancelar" ); + setcolor(0); + outtextxy( 201, 275, " Aceptar" ); + outtextxy( 201, 275, " A" ); + outtextxy( 341, 275, " C" ); + outtextxy( 341, 275, " Cancelar" ); + setcolor(14); + outtextxy( 200, 274, " A" ); + outtextxy( 340, 274, " C" ); + break; + case 10: + Bot_Static.Left = 240; Bot_Static.Up = 140; Bot_Static.Right = 400; Bot_Static.Down = 340; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 243; Bot_Static.Up = 143; Bot_Static.Right = 397; Bot_Static.Down = 337; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 250; Bot_Static.Up = 150; Bot_Static.Right = 391; Bot_Static.Down = 164; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(0, Bot_Static); + Bot_Static.Left = 250; Bot_Static.Up = 169; Bot_Static.Right = 375; Bot_Static.Down = 180; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 250; Bot_Static.Up = 185; Bot_Static.Right = 375; Bot_Static.Down = 330; Bot_Static.Cdf = 0; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 377; Bot_Static.Up = 169; Bot_Static.Right = 391; Bot_Static.Down = 221; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 377; Bot_Static.Up = 223; Bot_Static.Right = 391; Bot_Static.Down = 276; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 377; Bot_Static.Up = 278; Bot_Static.Right = 391; Bot_Static.Down = 303; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 377; Bot_Static.Up = 305; Bot_Static.Right = 391; Bot_Static.Down = 330; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 0; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + + setcolor(63); + settextstyle( 2, 1, 4); + outtextxy( 377, 169, "Cancelar" ); + outtextxy( 377, 223, "Aceptar " ); + + setcolor(2); + outtextxy( 377, 169, "C " ); + outtextxy( 377, 223, "A " ); + + setcolor(0); + outtextxy( 378, 170, "Cancelar" ); + outtextxy( 378, 170, "C " ); + outtextxy( 378, 224, "Aceptar " ); + outtextxy( 378, 224, "A " ); + settextstyle( 2, 0, 4); + outtextxy( 378, 289, " -" ); + outtextxy( 378, 316, " +" ); + + setcolor(63); + outtextxy( 377, 288, " -" ); + setcolor(63); + outtextxy( 377, 315, " +" ); + + break; + case 20: + setcolor(63); settextstyle( 2, 0, 5); + outtextxy( 14, 383, " _" ); + outtextxy( 14, 408, " _" ); + outtextxy( 14, 433, " _" ); + outtextxy( 14, 458, " _" ); + outtextxy( 314, 398, " _" ); + outtextxy( 314, 383, " _" ); + outtextxy( 314, 413, " _" ); + setcolor(4); + outtextxy( 15, 405, " Usar INT 8 [ Ejecucin TURBO ]" ); + outtextxy( 15, 380, " RETROCEDER... Colores >>> >> >" ); + outtextxy( 15, 430, " Usar PC_Out [ Interfaz PC <> Out ]" ); + outtextxy( 15, 455, " Mostrar Diagramas de Tiempo" ); + setcolor(12); + outtextxy( 315, 380, " Texto >" ); + outtextxy( 315, 395, " Texto Sealado >" ); + outtextxy( 315, 410, " Visor LCD >" ); + break; + case 200: + Bot_Static.Left = 200; Bot_Static.Up = 212; Bot_Static.Right = 440; Bot_Static.Down = 267; Bot_Static.Cdf = 12; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 205; Bot_Static.Up = 217; Bot_Static.Right = 435; Bot_Static.Down = 262; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(240); settextstyle( 2, 0, 5); + outtextxy( 210, 222, " ERROR ABRIENDO FICHERO" ); + outtextxy( 210, 242, " OPERACION ABORTADA" ); + break; + case 300: + Bot_Static.Left = 200; Bot_Static.Up = 212; Bot_Static.Right = 440; Bot_Static.Down = 267; Bot_Static.Cdf = 12; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 205; Bot_Static.Up = 217; Bot_Static.Right = 435; Bot_Static.Down = 262; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(240); settextstyle( 2, 0, 5); + outtextxy( 210, 222, " P L C (c) 1995 v 2.0" ); + outtextxy( 210, 242, " Jos David Guilln.." ); + break; + case 500: + Bot_Static.Left = 200; Bot_Static.Up = 212; Bot_Static.Right = 440; Bot_Static.Down = 267; Bot_Static.Cdf = 12; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 205; Bot_Static.Up = 217; Bot_Static.Right = 435; Bot_Static.Down = 262; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(240); settextstyle( 2, 0, 5); outtextxy( 210, 222, " Programa no tiene FUN" ); + setcolor(240); settextstyle( 2, 0, 5); outtextxy( 210, 242, " ERROR EN LA EJECUCIN..." ); + break; + case 501: + Bot_Static.Left = 200; Bot_Static.Up = 212; Bot_Static.Right = 440; Bot_Static.Down = 267; Bot_Static.Cdf = 12; Bot_Static.Cb1 = 63; Bot_Static.Cb2 = 56; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + Bot_Static.Left = 205; Bot_Static.Up = 217; Bot_Static.Right = 435; Bot_Static.Down = 262; Bot_Static.Cdf = 7; Bot_Static.Cb1 = 56; Bot_Static.Cb2 = 63; Bot_Static.Ab = 2; Bot_Static.Pb = 1; + Imprime_Boton(1, Bot_Static); + setcolor(240); settextstyle( 2, 0, 5); + outtextxy( 210, 222, " Se encontro una funcin" ); + outtextxy( 210, 242, " no reconocida por PLC..." ); + break; + default: + break; + } +} diff --git a/CNT.PLC b/CNT.PLC new file mode 100644 index 0000000000000000000000000000000000000000..83e96e71226eb29406f36057486b255f13789f07 GIT binary patch literal 71073 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 )?oIzbpq>q zU8nK}PqhjE8ob)zxl6s}jd90$qkMP6@dH79z6=pes8NRe%swQ$jRFf!GH`Oq;+B7o zl*OgG`>w9Cd(5)I@XD!~+tMMfIylmGbz0ct@xp%Sa&W?B3JTre%=n?gdSE1>NfN<# z?J2)ZjurF=MoMsQ;mOTA)Qb*BA!tMcB;l_^`S@IDaWV0Rep@ErZc%^(gn{Be7Z-&q z!(jhDIoD^IV>6NiCGe!|n}BDSicf&+Jx`o(blsHRj7knlO+CN1NWD^{bPEFBflQZo zK$)y-|6Xd6z69@fQKTL^DO39wa~(egA6BzH^-qCw2u}FSt%7cKoz$4^!Q)Vl=e^Z+ za9sLseqq9qQElEq#fGASgma^guR6ZYt6NkDj;kd#$rtzQ5WIJ_wclmxhMbp?-@1h( zj*A?u2j|81BQkyum8Dm~ha5k_*idf6$t^!iTPq%w>|3}*(V(s6pGrN->u1cEp>)Bs zcvM?k64#8yqggq48RDbyI8BKG{{xkhm%-1GZsyM%86DJ4$`Dt>iG+*1Hm4^GR zkw_vX!UD$-apb!P~KkgAw(;djQ{oO}{OYRZy&gs`%bLI&E=w1fi|_}(lalrz<{TWv zOX?l|RQs3E%cD_1-It4lD*hU+YP(Y`6AOIL3@E|GD#m-IP&9xeM#|Hafl*9ZB19^q z!MV=3i+&=G`F&_FV$OTnw69CFMRH)ur{seOR=TzRUEdv}pg(*94qFeOLB2ciLI%xe zH*~)bOBx)0hkbn@Igfqz^>pwvm}_5us(yt<%8i1ap_hh9Z)nqwmpGU^3CDZRryccb z;b^+plonm8m7=9(+V1!9{==YY(eWr0aPLDo($}Zb3`H^=VSjzg(g~ z|3WK?R`3|zWlF#uD8J#D~e)wkM_&s7)d@r;e;{ZIbJ`9IRdlL z;PNhfuwv6q|d zbJUtxP}z*nUB`R0OiGZ02~x7$fX;fI+k`n>b6rZg%_TqrKf}x6MTmDlRCE>GA`fLn zYcGeNgb$kD3aRQF!+I{wlTNGF{kHbI;i90BVJMKSZoI{r*lxJ)aj?LIGZkGYwGAX| zr7u-$hs|%j4MRW3RbkGba-H+1-{8y_#Uq=$VN@kuCui>u3&q2)!=bw$BK%-6 zJ-x)TS?dg5nFH;q+uYB=(1QjD)O;dEgQi;@U8xqGvs5R-FDO5pH34)627V5kJCfjS zff!e9U-$MV7CEyfz~&Be^KqVR>4Iq0I$gnp3nhIFd_va8ZPYnkSA!kUj_{F4L~g7r zC|W^rN{Dk^-Pq4DjeTid%LYp6$O-;5ehG6+`9aQwmq=JH#pAAKFu7Q z)f!&8*>~7uh&ZHcVR|!=%>|g1b3c|W;ar8mP;~#Z4cLy{a9zDG1jdT9+0LJnOgCJ! z+4$K;zK1x6fBwn?KBQZ|kDo!j+7TzWIFku~(?P0FJ_DJEaNa&XK9cBj!vsiV$-YEG zb|ky*e*scj9r#@}?33=m*~(9H4J`d!jaH*PRs-jtqicpDWq8d{jWW1qs8$(R!yv_2 z!@&1@HH?;&Qx!yOidi>&HX_9a**P|?Fc-el%EKFEG9S)?Bb&#WbJH3PaTpeQ)p~Yh W5&WJW39jf>V>kAo^>f~Q{{I4{V+Y6p literal 0 HcmV?d00001 diff --git a/DIFD(14).PLC b/DIFD(14).PLC new file mode 100644 index 0000000000000000000000000000000000000000..9030f155816e5e9367cde165461462f149185316 GIT binary patch literal 71057 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 literal 0 HcmV?d00001 diff --git a/DIFU(13).PLC b/DIFU(13).PLC new file mode 100644 index 0000000000000000000000000000000000000000..80a020ec452e7409429beaaa04a62557040ae934 GIT binary patch literal 71057 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 literal 0 HcmV?d00001 diff --git a/EGAVGAF.OBJ b/EGAVGAF.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..b2e2499b2813598c173a228b2b5b192d31aa1326 GIT binary patch literal 5668 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 ePa&LW4r6#fA*O@x0vx&H@H&i{D; literal 0 HcmV?d00001 diff --git a/KEEP(11).PLC b/KEEP(11).PLC new file mode 100644 index 0000000000000000000000000000000000000000..873cd325ea40ddfb85c454a82f7cc565ef1fdc79 GIT binary patch literal 71057 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 Xbq%8KMp4%&&=gu1YAF2METI1bs|4?u literal 0 HcmV?d00001 diff --git a/KEY.EXE b/KEY.EXE new file mode 100644 index 0000000000000000000000000000000000000000..719566bc652f236e00470cf479b28a014a2000e8 GIT binary patch literal 12757 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 F{{R$ajbi`+ literal 0 HcmV?d00001 diff --git a/KIT.PLC b/KIT.PLC new file mode 100644 index 0000000000000000000000000000000000000000..b61628b37466e16d761ae42de167684fa8ca79e0 GIT binary patch literal 71070 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 Gi~j|UYFfO81N8EADW9vY&D*g<56k} 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 X@sk~|_wmQOUEo&-@b9j~N-h5nGci+Y literal 0 HcmV?d00001 diff --git a/MAKE_BOT.OBJ b/MAKE_BOT.OBJ new file mode 100644 index 0000000000000000000000000000000000000000..29c8ff9f8767d9c42adba8490e9200e27fdaecb2 GIT binary patch literal 24708 zcmch934ByV@^Bw--b`kaOpeK9lFWT^BM^*SLLgyCI6_EZID`x#86X;yn2SR>lq<;~ zqN{=milVNr_nl=GIg*SA_aY)HB9{puA|fC{=Bw^E6B3tQ*YEdt`SI$#?yjn?uCA`G zt~Ys$?a11*=Tzzc$aK%>%wbbq9F7?}YPe_E*zrBnva|nMqeBR3#;5g5F%K&(FU~J1 zG^cgzW=`(e`$~-rp!uNS^fJEq8b@#hh8vE+ljX`BJ-lbe%HLs^ zHhyw8pdI)fcDdtoK;Jzx?)zQ5bg+h=8Ea}f1;sPnP`nX2L$fn7(_kuunm&Lz&8RkY zZHGBFXY|ml^t7orwyuo$8WEur7@?IlN`#K-kbtxVO{|GR=%jq6r!c>=v_hv85UP?8 zMYOyo0uU1grWFk`;&@J�V8Aix(1DArTF(846rzwRb*2m_#Bx0!4Vs%S+2W#omI- zs`7k7ehpw3lFuwEnC&euO(0hTcsLZ>b-RQa_;>5k4{diNLT5o<5rrc)(jo`yj>e$b zs1&V2kD$j8mE>d;(inog*%&INw&&1yH8VgmRZ&TSXIN=vX^FQ&AeRI9cBITLn&O4J z@ugXU0>`3LSdil)q^R`XS>`FJx>HH61n_Jm!XpT*WCG7dq+m87fdHO$eI%^6%UtA4 z`JlGD4uk0H(R1h}^eWnizC=HutB7C$$KnKR!kzJ8oQ_B0>9`bE;k)r8_(l9C{s`~F z`|&CK3l3lzQISrh2T3NGWD?0Eh2(bfGhIYxdV3K~f@G?Cs)(`Y93 z&=Oin=hMaX8TtZ!l{V0S(l6*Y^aNE1k%C6(D)bkI2*ZU@LWxi*%okP*PYKTnF9~l5 z`-MZo5#gdBlc{9UvUu45S*pw>n<~3Qc9(39Y=LZp?0MPCvTd@xvd?8-%Z|xJFF@6JWQGx zrYmlaEZ1A$$%QGo1-*b^N<{oJ*XmF5hiXjB$a1}D0%;9^E(LhZ z2h5w%2S}h8W6CkZ6?5C}PG&-x@^SKs@+tBe@>%i<`9k?(d7b>I{G|Ll`A_mo@+)#t zktWH&DAmwMaMA@fx1UK(8bw*nFlfR>&|w_viUfiUIJT@DEUT!jsMJ&8EvWLsGZQEl z^+W>3dK_Y;zzQGh+g;Bj3|D9ri3)?lqHrj>D0(T96@3-`6ay54rOp|C zEG$L6a!mdm%xJ-o)ySwCUIWx8?C@(8pmAzFhQumC8ug^9yL92h2+HO^)bJ2`kw7y(4p`vKMH=M1$J8?+N z;*gj|@>Kxefv<}Oy!2e81CcMZ-Fq?7QdGC9(o`;0j%u5#SNPlE{_tJlkr8nb`Uq>p z$cQ-+3nE$~CPuD}d@^!xpJH)>-(%c7pjyJq)D*7bqNuOg2|o`^K4 zpOhH0mIP3{Fte!GtK;*;%)FwK&r@&(^iXGWWth+glt|vF`I^mbo5MU8z&o*$=`go4 zzp|)6Pf`Q;Q;g>ceBeh|R!~}8 zTCQNaZo;b4@*;0ZWqv_XX^Dcl>n6;nLcv^L6BcKJc~^QB#`AtyksL5gQHa7aF77(|GENpaFu5SH7;sm)U>Gi zQH!INN3Dx`De8@=_o6SWZ_C{=WHbbPcSdO&n)v@3dQ^c~T6MbC*|5dC=c zhUn*`-;e$@dT;dS(O*YjiAFJEj6SAYOz)UmVs4F@5;Hw!X3RY?zL*DN*2Juj*&Ndl z^GVFnnC6(XG3R4&tUNX%Ha50bY)b5)*qqq>*jcf6##Y2W82fna)3NWxeh|Ao_KVo& z*t4-0Vz0z%HF}Lz(@!%(Ge(oEnXIYO+^xA+vqtm0=4H*BntIKC%^}SZ%|(qYP8Am& z7ax}#*FSDZ+=RHoxZC5(;;Q2wid!4^WZc_v+v7ft+a32=+{HMR)}Xa%yJ&CHrf3&w zmuVl?uGhYzeOLQ;ZLwr{OuyWs*+jrr#_jDXsm-r_jm46ZOS7O!2rOhi5z4@RxPzTX z=s+CADM+7>N|m&J?m3Gs`h4j3*t;FGd6W@ds?fsl;* zE`hCp4$Q|(6g}cI_!2O4f6%99Bv1z(l$q=g;QQK%ckgxa6j+7&qHr<9UV$UgPy*)G zuIJ8N?7D=OwmTQ!6yGC0IX)$RMEunFg82L6yCp15SS<;|aQ~g|9!mJOCKrSYY717# zdqkF9Ra{XDtL-&Bkbo}VC493Of(A<^;STS-K75J1Lnu7+NaCIAqhPy@lS}tm(z>?$ zXr|=4gohH=COnbwUc%M{f5OKJ2NEtOki`CpsfqcCe@T2aaZTbYiEkzP6TeLSI`MQO zPKrq~C3Q>cmsFHgmh@oKwxq_Srlg%oyOS)^$QXZ^ffM-4q(^y-XAyFSkI0QeruZ{8 z(Xdrm6%)tiq)T(Nc}kdZTd3(J^Cg375azuPw1c0Kc|0P|F(XUzES_NeviIP>W0z6>E$Gu z*GEu7^h@T#9n6u;>&xlCpVV3kj$T3oMhMI2Vd>$cn)ww+iBzG3?*MFrysz0HRGt?SZ8y+{TH#}>2$?%=QVC-$|YYa{=!{*veHTGoV zI4KDT^E8Ei!ub^#Rc&{^V+}B-8ePUrqsO>FB4rqyN0Cw1k;e?Wjnl3)9&NjG9tFlC zW2v#+SYv!$B4rp%>tQ3x^UG$BDJ}GJWvh5Gy}YQ}Th6sUT|$4r_)SfJhR#n81q@w* zyF$RHXV30@%-fAk#vR7p#(;5~M9x~c-a@F!rU9IU-8l(1$xTXAw5gBDCt9)3c`6Oz)WfVLD(6Ge?+X%?W0s*=%;2`AHskruT@W6@a>EJlmP(#g`p z(#O)*GQcv%GRtzi4p_dh zd}BFbIb}IxId73!O;)SbX6`W- z>x0%c*7eqBtj}8iX8pkWx%H6sOY0Hqaq9`|DeL#vpRB)FTdl|@+7fKZwiMefwn4U3 z+fbX!mT4Pnn_!z_n`)b3tFk>{d&u?|+gjT?+j`qGw&!dw+1{|dYpb_yw(Yf@ww<;8 zV7p+uZ2QI5YD0F>9&V4e$J!I@-R&-WrhTM+tUcF0-agsxv3u>e+l%ex_GR{`?9bRY z+F!80Y=6c6roG<2*?z$Owf(Za)h;*`j!1{bp>r4=c1LGNPe)%zKgS@)3CU{M-1Pvf z5y3zzOJRox|0XLhnl&4OOK@?tvb2mZJE7P+Q;IjUB*F=fm>Lfd$|rl~6ctv^4rhML zF32Z^iePtkK_XLNCF+L4iNsEUBhWAuPDA}Da1?9BC?o?r0s(@Ec60OE;PAKI6WOX9 z=9u8P&5`Gr;V5#HIOaJPJC-?~aHL3bF>JmbLS&a5Wt^Pd`4ZaTc;4}%<8{YHM-K^; zwQ!OU>Q3iloP^!EAGqYW=0Hxt8SdQS46HMejfb+Byb&BiM zwNuYdV>{(`n$QW?$Pv0?pa_yD09yFb=#)$~@6pbndC&Oalg0~aW7CJrJn2Kn4;47@ z49m@>aEa+7a>h=`-n&+gI=ed&ir`4wt5ZVM8>d!BK8ZCh<5Qe}C@x`*euMvtACig@~v zqer0#IILDydgoSFRL(2*qIWr8C*z9+G>CI>qB~ax5sQl;X~Gfz$q^w*#SsT`#7?L< zga~JwVhM3SM+9wfMDG8NbVhfq3`b$CYkulLk8q?eK_qE7UC`|-BaqTl4q2o8l35^J zCdcX;#OlZU?23vwtFo%fvZA@(Vzi7SbqgZh!jZb6*&(E&JM(9G(X$+>dk`swBXvi! zcz>l;Tpx4ip>rGy))N=~W{%YZ&E!}`B}J99*j9%6ajc#}EWSq{>5056)hOJ2G3qf`EE)Za1OAmC-0t!sA=rofWfC1?LFy4YKJ3l*BQ6p#naHS>8%%2p@2y z-ob8rbEMvA21jDrFDosc7t|{x2>A%4KKr2jm2mj-%*Zc?ga$LCz!Lv37I{H09gWHfKVTf&=+}DDv{ii4`u@>RUGAJh5|chPmXdk%44SJsVuE3EAy74 zpEyoR5T^&nNkP*%8AT*J8R8U-AQBaQV<|wx^6wsX1(XGh664s(;W`23O zH@~>Jv;Y<TWjs3__loR4qAaR<=u^^Sj`#Z@w4MXGjFoK<}7%nu1V-$Le z^XH*UyqgihZcH3w1RBi;4Y`v$AmxB!c&!rEu7*??j!PY00k)U#8SgD9&gb!t{jO@Q z9>sB18NtqynBV_4Lx*~=26u{$sgOM@FS;|BS@RUx@9N#_dZsN!g${A@%%CI&PM)bl zy;esfOqCuu6?n>7a0M}XBtO88M2jKU_G}Goz~7EUxIa>@jsny$Pqq|=^@ZH_54<%A z;l5}{$JS)neJ=dl);?Nz5%h0cdqZg3dV|({NbM9C=fnQ_ciuV#;bf#=ZHDnDq^9MU z&&u~?LnaV%-JYQ(;BE>_L32Bu!QEk0P;)vy^iew0b2S{>aCApXpt$5f?{HT^7?5NvnI}F*-(OB$v6}7jO!3vbZhd(wreE!zu+p#*- zb+rws^{MGz$<#90rqt2U4n(4xIB|B6Sj%;ntwUW_gGJ!j)MBsKQ##{zZzW7lNniF} zW<5d|In6jm17nHdG~;xrGuRZuVX4_{tRQB%0uA7pIYG>5j+vuFoq}^YoV~FbTToC1 zo~jTiwj0q&P63$?K9{kaB3Fl;tHWW2WS*f@CX9wWz}s9&3WNutk*neD50QH&WR1!i zJ24y~Rr@y3EfGCg!yyO)Usct<38sapJR@>4b3JLJhvtk0`#9RZU1B>7UU8+3g>3fF z_HAHTMB$kytw9LRq_qR{*$?F~tAob5QX|AnmpEmxQ3H(;A;ahX0#taJV}OyRAU87y z5Sg!T2=?}enr=oDgF48rs+bMlerl-2hKg20FojL25HG;{fa0S0`4TO-9tV^omxxs<*IN^jKp)`>bbjZFs9tfjS zhn9f%E0+jiO@5YyCUXLJkRXcBqg#h;!JgWCO;2eXVX_HrgL~w%1I%HlAo(`*1Ga>Hc zdW7{-RJ76<)Z3IGz9iHX9Wn)lf)}7XUScm2BwY`4p!awmw=o*9O2qrPO^1xkg%hP` ze0h}@?4V*cw2co zrOG=a|GKXMVd@gl4o)|X(Sb@uPB%>lzBmc!H0|6=IcS&5Z;D4noG35YnSvAL=}=N| z+Y4=AZ7vY#KGX)O;E>0cubfkPbl?Of0}D|Nui&o~N?C6u^9w9$^d#?YdQe9GruEzD zI+SpI+RKWIys&5R*T$faOgUP_Y4U@e$#`e^I`HO_?<(MX49{Y)VL?BD`6;KF5$p$Z zni)D2&#M^%3#2G76$X(4yyOj*T6t+^up|Y8vx0OICYw>lMZzp%CD=%=a=P1tbidTx z#}2}C3TDHysU)Jj8{%)h6GgEn5@(i`R(L8!Q8Xcu*_5YJDGFUsSXpIxVbRQ)tVyt< zcJJo&a;!yC?$9nLjfiJgEpoC2wdGK4a`HZE%d%SKq#oSi81Q*WR_v|z77Iu=vp9cN zg%XjOg#-z+ON$F3LZ89<7vP-DU%$YscyQKbNk}ZJVDGJ!NLE>Thqpx70?Ai2j-}6! zA~FH$h0$>Mhg*8-oD#swVd()SqG^RQ6#!@S=CF?fu@`QLWCNg?6$S8^TcFqiuSDS( z0K3Uigy&ijo^9I#1@u4-1oyx{e=Z0)gMk7D3K^&1{cV@{M zu|IgpDFjl&p`;9!nnbV= zW4#(>2dc$DwZL%{weHqh*HzWFDtWz#d?%)D4^+1Xs;@RXfU8jB`ZZW&od~KemGXKy z$EtJvx|U&c;S}zPZQ>;d{I1J^K=PJN&{57N3?SH%HXLnKBIqfsUWPn*jGBpr+erf* z27Io|Kziwv?_A43aq+@H*DAwl^>1*XT3N{&163yg+A3+wy~yvniqLNmPxprAUiat$ z_Ftr}a|PCB`&?HyDS`hKx~)eq1Y`dV3802}ZwK6s0@`~dsN`Dsg~&#c4MAh9k493h z&^8*Nw16ZO|6fWH4qO9#tlg_V0C{R%SN=ryS2Fe+YSWb2a zYf{vgAS{qjaShmbj-h8@t-@G*d;+uWw5FS}{OU$xk=beUVXbh2C9FqYwr1h6#CZEQ$o$b%U2&2CFW zA6DwgKqrP^cE>j8$KwVaBZ+1;5x`9W+^RNEaDf7MMS=g{#oS>DwYM3eqoV)Md#Qsp zR5L>HKj|gxf6|Ncf6|NUf6`0%|D>0Q|4A>Ae3!VvHW>gX{QfWXIJn_Tu|&J=8un(t ztCfK(2>D#C14RMdLtFj=8)<9vUsz<}JD42c+W>5pr>F7dlXunkle2C_I5>yerQBLl&)B;<`ct zu2wG6&ULGhzXjaIim%;q{x85m_?dt57qhC{+(|1Yxv4)F+{KEUz!}Cv?ebs2yL|-C z@C{aY1PU{tFp3obW!Y7CeB%iyEc+M=k3xZaxdJHkf*0Q zJwN)kdh&v?lhNHqQ0Iz<_-FCL7*bW{b179g`IOJ4taY6M z{I`+M9o}t^?@+D#Y_O>8wx`y8t~T#{uq;yEd?8p=P-wnbn|GP_aD{Wddb;G_^#>tS zu#Z~zsbC?<5&GwCz|r>!^k18It~LvL<&|8D3!LjkE^UYY>Rf8Dh{quWW)>!uz(zwg z0(;I*-V!Q{+WTEcvmx?qtKdp1?kK>~j^Z7!%{qBq7~lC?cXO}^3WLGaR-fU@Jj=y9 z$3;EQpWDO+B3R6$F#;n+btQfC+(#YMYRdLiluq6v6sFcfD^mS?6o3FVyB; zye@IA8x#aR1Sh1<71cpOtn`Nzv}B=xDks&s*c!dAXI5&@=DL1H=3E!B?HML|Sg0Om zd00-6lLEXADNo*@LjS`3`lJbgYGt50oJZG+5FwBHxf8Otw|h0W`zUVrp!BbNE}_;1 zfgLFL2!95}!!xV|P&UjeSdY&QCdO0=v&xGKX;$;VEO}Xw>>ic{FTz-)Wx*{TrWks- z$n5^c{ax2gt^0Ve5abxLDv_Gj%|1>gR13e%-w3%=IBPbEaIig{8b~28!B~OzK(3c zoOQ_GF#iV*@2iexakw_?$n|lsH6LMEZks$X$@8^Y%rP*- z1l->&g!Ws4v=F$9;iesOZZJ`-?~tz!E|N2~)yzL%ml#|S@1f01*e-tEQLs{bNAbI6 za$}FcVuB7HLBX8@xCZfGJpyUl2s=y-tlnCP1K1o6W0Oc-t=H!&2m})!Ab=Q3e4K|B!_yIBFgglUpAS@@lX!tgYH`S6Si$^5hZd*~xZKiS#dMCqFyWvN^l$fTJReF7y!G&+{&gO;GyX>faS;CwCNi_+V!bhvFkl>N6)+E zO&gfMdI)^fz2Kwnf=Ungs1mobaXgSTW&_wc6iUoFHFjoz9n~7yQEjKft#0@Xsv7n( z@Cj5kY-3L!0$5t_HZ;5rRXgr*N9~y6mhBkn7I*Y>%irPdObw&DpZ3<&oI@jfzC6kptT22-}R^xfXQ!t1T-rv+b{T+xYkDf$)g$_xF0Nc<-Wg1vE*=_t95O5 z^XnIuG{k^B_rR(=K?Yue+hNG6{fUdm_2s$=XvMeS!d``InVYPb0{2dETDt<*J8&(9 zYaCp5IGV9URRdfP!Uc!1WpEB#CcwdLFI>;Ubr)Rea7DZ0Tey3Pz4+%!f8kGK&uqYT z?ayU@_0MJh>z~X1O4IV}0Aww0V4ak%k&^D)RY=|z{R#zWo0bD zKxG8Sk>9)U@}sDHOB-rRlN{E@l@5{7RVcyB4-T(gZ-FB!bO3KwE(EGChGHAe8SwCIN!2wv@t>Go)R%22L#*+0A`_ghMmLM9CMW7bTZZ8+?$B ze;ShEerZ9oaIJX=pv5flt6jc4Vec`PfuNAtclMvtx@b>3{@o!|sup|;ufJjPH9;r4 z&qB++F!?_6 zxi7PG&xKky91t&d+se=87x)qJ3f=14!xJVytXqlvk3$@?Vu73ZE8)Rk#y}1OS*$)3 zG4Vjj9|={fYGfN`D;REN&U1Rj4U z^xog$gmweH){Wpwa{9&-IEhIoUw2T+l6DUGT<1W^LB%rtK{R|QsC`z1qX*Q$865P_ zRLm6&Qw3*mc!r}4JVWvWWQTD8t21y2{XZOpbMYb-DWBXi#qisaLJpE;7TcXLev1J% z7MK%EJN9Ln$I#Mjw*Z883ykg1(jxPo<@SHId5H`bCvCA~*eKyppxjc$4iGhL`GFFG zE3joNJHx^z$`e}LzQ6H(>a3d>@h%#;4anCcmM|UQYK7+q5j*~3pr%bXUOCOtuy&*B z`vkM2@OGD-b304tT+4qVoC}+H6hB@62Q0QQ-}@dGrmrbgQp642#6sHA1=5iLRHcz3 z1U|U>KrrFiZou`e!8*{%U?pf!(hI%JybgCi-1YcIwEFh6G@?~vICA=ilYycPRnwN& zSwUol3fi&}3bKKsoHeXr4FW4bLmhJ6Ky6fnx9~p(B!|;{=m!{ma|OI3|M&XpNRjc= zjrG+5i|K2{8LqGE>Kb?e^wSq!bhk65sJ0`l-*t{6NL!xE)@Iiy2j@`^j3x7g@n56NzMV-H4TVWmho5MF}=;rDPLJnWV?OohrFnNZmeDmz1Ef?K|P z1N=RFAPL=yQ6>1D^Lv{em=`{8`{{wEP2O(uaTqIj2)M zLRvgnK!sJ&%|pY$8Ade0OCsFtQJkjDQxv?ZGL79(<)D>$5OiO#vQdNqILY2Dfl~w# ztW5|IHRls*gRdyH?7YG0*18>R>L5&o{HjSPN! z6WoSKPPVcB$)I;o80+5*KC<8D@EDGJ+-cj}NdMcP`AEOZ$!KR@Y-ek7U4ttS)LdBe z`&T93wRkZ62((hs{7b9fRSzb{ieO{?WiYJz4r{5-waJcQ@AJ7f?QLdH*PfQ4fv)$f zR8Py{z8R>fjBgntbc9bQf$I#UL_v}_5-vGhG87y;IK%h(y4(!wGK3?GLvV2_HBkEyBVOvZEx!v2#jJ1} z6f&TY#tJ>$wkGDZmq)m5jaT8J@n-F8&eT7el-+gm^#9 zc&j+?aK`(b#2aGL^S-?EtH7gEW8!}$_xTX-b0OaS7;h!#tzx{-NW9OmqLnwco#F?GR|9Mybnse53*Bc-l0Fj`%sAY!4U5###`XLWsLWJiT8du z(faZZ{1N*;5aPW*#QSa7^8>VM0<24c@!lix-c#$^=gZsoM|kfG@!rFEKesLd?{0R7 z`HzBw@PEa?r_A;F0qkB0^~+h+Vg^cC{T-~n7u0uURq&3I_+weU8UXmgu%=y5)$|bq z??F}5TdaOA)H5gC#A4W{+gSZXRxZyL0#yyneKwqis)p|X?0DH7*1)!c2Ie^%9$@u8R-X;^ z>{n?G=?o;Z`kPoia;sn5kVo-V+dcKCCxgaGRW4|pGL7$$G`^$Owab^cYn7;hl^OG2 zt;}5^jqeD~CNRdFF=329k{Ewf>-xl(_sJh&{7H!MM{SH-Q5EE(uc0d44T4(Om>+}p zv236JPkS<_S1w)%yda9b3YK>bS6wfIl>>iP#=IRoL9ksaQ~1T(+IHt5g&W@6`SL_x zmcm!9Y>Q$B?p-MNZR@r*^|Z{lwcEDT$D|)24?GOj+q*Tf>ZWenSv8~=F8i`teR)^G zJIVyKWFO)`A!uVI1*VYF(?ARn)AqY(9h9_fB|Vf9+e&6A8QV%yYy#Zj*MHaJtPKKM z%T67%Wef6)R_%4@pw)}AP!^NYQZda+;ZgO&j7i!i_x6m{7z z_CrxMesKVb1~>>&s2_~v08=^sFxZIwVmd+#{h|w@d;DSshww{xs2PpWEWelq-}Uf| z*&H(ml@0cb<533GxKTR5NoW|rDJb3Q7pI~OfO#BeI^bU)RsC@s%uv*7HE3fDyo#?J z(!NrMHfmXA*Y=fqv@wxY#t?^w3UIU)X zUIL!aGoEYQc-eF)+y;dmKf9F;&;e0=6K?b@q!-)WqAA8r>dIe zH~umx;PFp%GQ`z2odHqtd*A3}s8?$QK*hd?7by{DuFC})tr2zhpb1N$x~=6*?^kJGw5@&5&c4*Mhf~IN~C{9o#+dwJN+BFmA-^L^hH!c zUqOrMYiK2X9X&|jM9Af{gb|fPSE$zd0LMy(M?Dp`~!6r{*L+!AD~gfhiH

8F!Y63I@F}_|e2iqWohV+m8`))hP#4)gG(h%G zG*z}2-68u7zKHWVs*@c=56BLo4YDuMHrW?wuk34dO!f^rCp&_EmK{Z+cnozGzeTr* zCs3yN9dbkJ`Zn3|GiSyil&db#e_{30PDl!51I(*q|_AlfsC*C@i?2 z!iEPZI>84OyW%WG4?JGc6Higxgl8&x;c`W9yim~xKdwl|FDv@u_Z2tej}$5R6U8m~ zfTABhs_2hf6$5Zo*g$L!8-%-u4Z;1wQn4#+D4rBH49^Zr$MeF5<3(XEygqCMel08m ze;AgDKMfm+KMxy)kA;oKEn#Eu>98z(DQqnKMSC_@E63q(${c*FG8d0gy76S?L_AA5 z3C~kb#|XNNDv)5BNbyTa@6E8#x;cKH2xSNLii8Sx<2M?8eB5r4rWA|A#g zBi7(K5o_^+h{x~~5s%|nBA&n>M6AOfN36%6MLdbWjd%)w7qJ1iL_Cduj(7&+$c;E6 z@>$#^@;N*(@_9Te@&!CG@M!xD z>aXw~^&$L?`Y`@c{Vl$rK8A&;<2WqpBu&N^)X50*%&=}CB{fL$C${`7&AE^V<0%zN@8Q}Br(=OOtGCv zuh`BcC)P>wW4n@y*luKgY!C8a>`mn9*k0uM*goXF*ktlWY;V#Wdo#HbdkaCDenh4j zK(v~Hq@Sig8KJqAOx6q`9!)AK)C?n4nl!RTGn7298BXdoBgke=2HCC|N%m_-k&Bv4 zB8wYC;^W2=LtHko#^sRYxLh(JZX79$n?S1LCX##NCXsvNrjUo?ZX<8UO(xsprjgI$ zJmkx`>EuXUJ~NwQ4$6nR{? zfxN7Hn$+u_Aq~2XWRLDS@`dhsa$NUU@{{fbLKFT*Gzl+}ZV4}w{t2&;+Y(+UOB3EA zbqVi~ClcNzPbItu*FVTB2_KO65;ntIj}OU#ge`<5ZYA=>ZKQMJcG4%Yf#fGPl9`E3 zq%QGe@=D?-#GkmEe3`h1;H159{gd=d+E4l?eMSZ+9Uz{h&&iCWgXF=aFUX@whsdU+ zugT7&!(?~Tx8$>=iB^A(IP^b}&iad_hyE8bSbv42>#vfL z`fysNkDx2`k@P9On!c@%rXTBL=nj1>-J{ph{rV(<{np>#g*>-cChBCmL?(O5+UO zXriGzH5qzPyWu9<&(MqBYUoYV41H*(p)Z|gxS7r{q|n)hTWE=)KfTW|fYurY(#H+A z()EVH^d-X(`j#P;)*FV>4-CWTHbWZq8`9}6!wCAFA%mVVWYQlDBk4uMDEf<3jqbaS`2QypL`*E~VRz%jj<7a{8Td1wC)9p+6gIX~5{C*tC)=P50Ai(<*8* zJwSVy9;AIt57T7RTAFTJM@O4B&}`E)bh>FHon?BK-fnt3!x8=r;3a+Gzfe?ly0s2h3aPVe>X>v}~sqO9Sm@X{3EDO>}_8Pv=`cq6;h^ z(-oFa=qk&n^ij(Wdcd-ieqq@~k6CupQt{5}dVsF7 zeoh~>9;8oLzo5@p57EC_zoe(EU(xTaU(-w0!?e}<4Ha!isLS>(&9oh*xwd0;itRX^ zVLL&ev7MyP*}kK%*_!FQwideCc8a#zPE%w*LzVXLX|(+;O|bt+C)>}{0{c(&cKZcd z4qq^P(=G}J>~i62yH>btj~5gUouG3h2%Q~9p`XJf402e7VGgH|=jbFW{ z96f~%j^4tHjy}Tcj$~o8qpz^TakFs9ks>rZ`U@8w1BFYDTLt7CCWJfFgcxVKpmPov zj82zeca9LcIx~b`&XGcjbCfX1Ia(Oz93x~nvxF??SYf;~TbSY;Cro$d2s54Ig<|If zq1@>f<~k<|3!RgMrOwGhopXw?+BsEt)HzL9=gbqHae9OooYRF@o%zDs&KbfcXMwQA xStv9)XA3)=w+lO+CBgycU2v5PT{~3?Jv&tkV>_*s<#xJXHlb6$Is)m8{|6N>Tj2lz literal 0 HcmV?d00001 diff --git a/PLC.CFG b/PLC.CFG new file mode 100644 index 0000000000000000000000000000000000000000..d48156a392a25f980e311f08a0301d27105b6319 GIT binary patch literal 6 NcmZSL<7QxB0001l02}}S literal 0 HcmV?d00001 diff --git a/PLC.CPP b/PLC.CPP new file mode 100644 index 0000000..efe1bc0 --- /dev/null +++ b/PLC.CPP @@ -0,0 +1,97 @@ +#include + + +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON +#include "plc.h" + +extern void CFG_File( char Cargar_Salvar ); +#define Salvar 1 +#define Cargar 2 + +MemoriaRam *Ram; +FirmWare far *Programa; + +int main(void){ + + InicializaMemoria( ); + CargaEntornoGrafico(); + CFG_File( Cargar ); + + Menu_Edicion( ); + + restorecrtmode( ); + free (Ram ); + farfree(Programa ); + +return 0; + +} + +int CargaEntornoGrafico(void) { + + int errorcode = registerfarbgidriver(EGAVGA_driver_far); + +/* report any registration errors */ +if (errorcode < 0) +{ + printf("Graphics error: %s\n", grapherrormsg(errorcode)); + printf("Press any key to halt:"); + getch(); + exit(1); /* terminate with an error code */ +} +errorcode = registerfarbgifont(small_font_far); + +/* report any registration errors */ +if (errorcode < 0) +{ + printf("Graphics error: %s\n", grapherrormsg(errorcode)); + printf("Press any key to halt:"); + getch(); + exit(1); /* terminate with an error code */ +} + + Initialize( 9, 2 ); // Inicializa el Modo Grfico + + setfillstyle(6, 57); + floodfill(0, 0, 1); + +// Fichero_bot(0); + carga_botones("PLC.dat"); // Carga botones del fichero "botones.p1" + +// Fichero_bot(1); + Imprime_Estaticos( 1, "PLC.dat"); // Imprime botones estaticos 'Seccion 1' + + Imprime_Secuencia(1); // Imprime secuencia 1. + +// Fichero_bot(2); + Imprime_Estaticos( 2, "PLC.dat"); // Imprime Estaticos, secuencia 2. + + Imprime_Bordes(1, B_Ch00_In , 4); + Imprime_Bordes(1, B_Ch00_Out, 4); + + PunteroRaton = 1; + inicializa_raton_grafico( 0, 0, 640, 480); + + return 1; +} + +int InicializaMemoria(void){ + + if ( (Ram = (MemoriaRam *)malloc( sizeof(MemoriaRam) ) ) == NULL ) + Abandona_Programa("Imposible inicializar RAM PLC --> MEMORY OUT!!! ", sizeof(MemoriaRam) ); + + Resetea_Memoria(); + + if ( (Programa = (FirmWare far *)farmalloc( (long)(sizeof(FirmWare) * 10005) ) ) == NULL ) + Abandona_Programa("Imposible inicializar programa --> MEMORY OUT!!! ", (long)(sizeof(FirmWare)*11005) ); + + Reset_Programa(); + return 1; +} + diff --git a/PLC.DAT b/PLC.DAT new file mode 100644 index 0000000..47480bc --- /dev/null +++ b/PLC.DAT @@ -0,0 +1,694 @@ +********************************************************************************* +* * +* JD _SOFT_ * +* FuTuRe ViSiOn * +* * +* Este es el cdigo fuente necesario para ejecutar el emulador si no se * +* utiliza la utilidad MB2SRC ( creada por JD ) para compilar este fuente * +* con el programa .EXE ( la compilacin es automatizada para mayor facilidad ) * +* * +* * +* Make_Boton ( Generador de entornos grfico ) es un programa realizado * +* por JD _SOFT_ * +********************************************************************************* +****************************************************************************** +* * +* Fuente para el lenguaje generador de entornos grficos Make_Boton * +* * +****************************************************************************** + + +#5 + +!1, 91 +1 + +*&211, 95, 231, 135, 7, 56, 63, 2, 1 +*|214, 97, 2, 4, 1, 63, Ayuda, + *|215, 98, 2, 4, 1, 0, Ayuda, +*|216, 97, 2, 4, 1, 4, _ , + *|217, 98, 2, 4, 1, 0, _ , + +* Cuadro original LCD +&236, 95, 425, 135, 7, 56, 63, -2, 1 +&239, 98, 422, 132, 0, 63, 56, 2, 1 + +* Cuadro ampliando LCD -- Mejor ViSiOn !!! -- FuTuRe is an great GENIUS, isn't it ? +& 1, 140, 91, 165, 7, 56, 63, -2, 1, 65, 00 + & 4, 143, 87, 162, 7, 63, 56, 2, 1, 65, 00 + & 1, 170, 91, 359, 7, 56, 63, -2, 1, 65, 00 + & 4, 173, 87, 356, 0, 63, 56, 2, 1, 65, 00 + +& 96, 140, 231, 165, 7, 56, 63, -2, 1, 65, 00 + & 99, 143, 228, 162, 7, 63, 56, 2, 1, 65, 00 + & 96, 170, 231, 359, 7, 56, 63, -2, 1, 65, 00 + & 99, 173, 228, 356, 0, 63, 56, 2, 1, 65, 00 + +&236, 140, 425, 165, 7, 56, 63, -2, 1, 65, 00 + &239, 143, 422, 162, 7, 63, 56, 2, 1, 65, 00 + &236, 170, 425, 359, 7, 56, 63, -2, 1, 65, 00 + &239, 173, 422, 356, 0, 63, 56, 2, 1, 65, 00 + +| 4, 143, 2, 5, 0, 63, Direccin Instruccin Dato, + | 5, 144, 2, 5, 0, 0, Direccin Instruccin Dato, + + +// Barra de mensaje +& 0, 0, 565, 26, 7, 56, 63, -2, 1 +& 3, 3, 562, 23, 0, 63, 56, 2, 1 + + +$565, 0, 640, 26, 7, 56, 63, 2, 1, 00, 30 + +*!2, 44 +// Cuadro para entradas +& 0, 30, 320, 90, 7, 56, 63, -2, 1 +& 4, 34, 18, 86, 7, 63, 56, 0, 1 +| 4, 34, 2, 4, 1, 63, Entradas, +| 5, 35, 2, 4, 1, 0, Entradas, + + $ 20, 34, 45, 59, 7, 56, 63, 2, 1, 00, 00 * 48, 00 + $ 47, 34, 72, 59, 7, 56, 63, 2, 1, 00, 00 * 49, 00 + $ 74, 34, 99, 59, 7, 56, 63, 2, 1, 00, 00 * 50, 00 + $101, 34, 126, 59, 7, 56, 63, 2, 1, 00, 00 * 51, 00 + $128, 34, 153, 59, 7, 56, 63, 2, 1, 00, 00 * 52, 00 + $155, 34, 180, 59, 7, 56, 63, 2, 1, 00, 00 * 53, 00 + $182, 34, 207, 59, 7, 56, 63, 2, 1, 00, 00 * 54, 00 + $209, 34, 234, 59, 7, 56, 63, 2, 1, 00, 00 * 55, 00 + + $ 20, 61, 45, 86, 7, 56, 63, 2, 1, 00, 00 * 97, 00 + $ 47, 61, 72, 86, 7, 56, 63, 2, 1, 00, 00 * 98, 00 + $ 74, 61, 99, 86, 7, 56, 63, 2, 1, 00, 00 * 99, 00 + $101, 61, 126, 86, 7, 56, 63, 2, 1, 00, 00 *100, 00 + $128, 61, 153, 86, 7, 56, 63, 2, 1, 00, 00 *101, 00 + $155, 61, 180, 86, 7, 56, 63, 2, 1, 00, 00 *102, 00 + $182, 61, 207, 86, 7, 56, 63, 2, 1, 00, 00 *103, 00 + $209, 61, 234, 86, 7, 56, 63, 2, 1, 00, 00 *104, 00 + + + $236, 34, 261, 59, 3, 56, 63, 3, 1, 00, 00 + $263, 34, 288, 59, 3, 56, 63, 3, 1, 00, 00 + $290, 34, 315, 59, 3, 56, 63, 3, 1, 00, 00 + + $236, 61, 261, 86, 3, 56, 63, 3, 1, 00, 00 + $263, 61, 288, 86, 3, 56, 63, 3, 1, 00, 00 + $290, 61, 315, 86, 3, 56, 63, 3, 1, 00, 00 + + +// Cuadro para salidas +&321, 30, 640, 90, 7, 56, 63, -2, 1 +&325, 34, 339, 86, 7, 63, 56, 0, 1 +|325, 34, 2, 4, 1, 63, Salidas , +|326, 35, 2, 4, 1, 0, Salidas , + + $341, 34, 366, 59, 7, 56, 63, 2, 1, 00, 00 *00, 129 + $368, 34, 393, 59, 7, 56, 63, 2, 1, 00, 00 *00, 120 + $395, 34, 420, 59, 7, 56, 63, 2, 1, 00, 00 *00, 121 + $422, 34, 447, 59, 7, 56, 63, 2, 1, 00, 00 *00, 122 + $449, 34, 474, 59, 7, 56, 63, 2, 1, 00, 00 *00, 123 + $476, 34, 499, 59, 7, 56, 63, 2, 1, 00, 00 *00, 124 + $501, 34, 526, 59, 7, 56, 63, 2, 1, 00, 00 *00, 125 + $528, 34, 553, 59, 7, 56, 63, 2, 1, 00, 00 *00, 126 + + $341, 61, 366, 86, 7, 56, 63, 2, 1, 00, 00 *00, 127 + $368, 61, 393, 86, 7, 56, 63, 2, 1, 00, 00 *00, 128 + $395, 61, 420, 86, 7, 56, 63, 2, 1, 00, 00 *00, 30 + $422, 61, 447, 86, 7, 56, 63, 2, 1, 00, 00 *00, 48 + $449, 61, 474, 86, 7, 56, 63, 2, 1, 00, 00 *00, 46 + $476, 61, 499, 86, 7, 56, 63, 2, 1, 00, 00 *00, 32 + $501, 61, 526, 86, 7, 56, 63, 2, 1, 00, 00 *00, 18 + $528, 61, 553, 86, 7, 56, 63, 2, 1, 00, 00 *00, 33 + + $555, 34, 580, 59, 3, 56, 63, 3, 1, 00, 00 + $582, 34, 607, 59, 3, 56, 63, 3, 1, 00, 00 + $609, 34, 634, 59, 3, 56, 63, 3, 1, 00, 00 + + $555, 61, 580, 86, 3, 56, 63, 3, 1, 00, 00 + $582, 61, 607, 86, 3, 56, 63, 3, 1, 00, 00 + $609, 61, 634, 86, 3, 56, 63, 3, 1, 00, 00 + + + +*Boton Reset +$582, 364, 634, 388, 7, 56, 63, 2, 1, 00, 19 +*Boton Salvar + $582, 390, 607, 451, 7, 56, 63, 2, 1, 00, 38 +*Boton Cargar + $609, 390, 634, 451, 7, 56, 63, 2, 1, 00, 34 +*Boton Salir +$582, 453, 634, 478, 7, 56, 63, 2, 1, 00, 31 +*Boton Configurar + $555, 364, 580, 478, 7, 56, 63, 2, 1, 00, 46 + +*Recuadro para diagramas de tiempo y mensajes varios +& 1, 364, 550, 478, 12, 56, 63, 2, 1 +& 6, 369, 545, 473, 0, 63, 56, 2, 1 +&535, 100, 635, 130, 7, 56, 63, -2, 1, 00, 00 +$538, 103, 632, 127, 9, 56, 63, 2, 1, 00, 22 + +$500, 100, 530, 130, 7, 56, 63, 2, 1, 78, 00 +$465, 100, 495, 130, 7, 56, 63, 2, 1, 83, 00 +$430, 100, 460, 130, 7, 56, 63, 2, 1, 70, 00 + +$605, 135, 635, 165, 7, 56, 63, 2, 1, 72, 00 +$570, 135, 600, 165, 7, 56, 63, 2, 1, 82, 00 +$535, 135, 565, 165, 7, 56, 63, 2, 1, 84, 00 +$500, 135, 530, 165, 7, 56, 63, 2, 1, 67, 00 +$465, 135, 495, 165, 7, 56, 63, 2, 1, 79, 00 +$430, 135, 460, 165, 7, 56, 63, 2, 1, 65, 00 + +$605, 170, 635, 200, 7, 56, 63, 2, 1, 00, 24 +$570, 170, 600, 200, 7, 56, 63, 2, 1, 00, 35 +$535, 170, 565, 200, 7, 56, 63, 2, 1, 68, 00 +$500, 170, 530, 200, 7, 56, 63, 2, 1, 77, 00 +$465, 170, 495, 200, 7, 56, 63, 2, 1, 85, 00 +$430, 170, 460, 200, 7, 56, 63, 2, 1, 76, 00 + +$605, 205, 635, 235, 14, 56, 63, 2, 1, 00, 00 +$570, 205, 600, 235, 14, 56, 63, 2, 1, 00, 00 +$535, 205, 565, 235, 14, 56, 63, 2, 1, 00, 00 +$500, 205, 530, 235, 63, 56, 7, 2, 1, 57, 00 +$465, 205, 495, 235, 63, 56, 7, 2, 1, 56, 00 +$430, 205, 460, 235, 63, 56, 7, 2, 1, 55, 00 + +$605, 240, 635, 270, 14, 56, 63, 2, 1, 00, 00 +$570, 240, 600, 270, 14, 56, 63, 2, 1, 00, 83 +$535, 240, 565, 270, 14, 56, 63, 2, 1, 00, 00 +$500, 240, 530, 270, 63, 56, 7, 2, 1, 54, 00 +$465, 240, 495, 270, 63, 56, 7, 2, 1, 53, 00 +$430, 240, 460, 270, 63, 56, 7, 2, 1, 52, 00 + +$605, 275, 635, 305, 14, 56, 63, 2, 1, 00, 72 +$570, 275, 600, 305, 14, 56, 63, 2, 1, 00, 82 +$535, 275, 565, 305, 14, 56, 63, 2, 1, 00, 00 +$500, 275, 530, 305, 63, 56, 7, 2, 1, 51, 00 +$465, 275, 495, 305, 63, 56, 7, 2, 1, 50, 00 +$430, 275, 460, 305, 63, 56, 7, 2, 1, 49, 00 + +$605, 310, 635, 340, 14, 56, 63, 2, 1, 00, 80 +$570, 310, 600, 340, 14, 56, 63, 2, 1, 13, 00 +$535, 310, 565, 340, 14, 56, 63, 2, 1, 00, 00 +$500, 310, 530, 340, 63, 56, 7, 2, 1, 08, 00 +$430, 310, 460, 340, 63, 56, 7, 2, 1, 48, 00 + + * + * + * + * + * + * + * + * + +$430, 345, 530, 359, 7, 56, 63, 2, 1, 00, 00 +$535, 345, 635, 359, 7, 56, 63, 2, 1, 00, 00 + + +2 + +|570, 5, 2, 4, 0, 63, Acerca de..., +|571, 6, 2, 4, 0, 0, Acerca de..., + |570, 8, 2, 4, 0, 12, _, + |571, 9, 2, 4, 0, 0, _, + +|538, 104, 2, 6, 0, 12, R U N, +|539, 105, 2, 6, 0, 4, R U N, + |538, 107, 2, 6, 0, 12, _, + |539, 108, 2, 6, 0, 4, _, + + |582, 366, 2, 5, 0, 63, Reset, + |583, 367, 2, 5, 0, 0, Reset, + |582, 368, 2, 5, 0, 12, _, + |583, 369, 2, 5, 0, 0, _, + + |585, 395, 2, 5, 1, 63, Salvar, + |586, 396, 2, 5, 1, 0, Salvar, + |587, 395, 2, 5, 1, 12, _ , + |588, 396, 2, 5, 1, 0, _ , + + |612, 395, 2, 5, 1, 63, Cargar, + |613, 396, 2, 5, 1, 0, Cargar, + |616, 395, 2, 5, 1, 12, _ , + |617, 396, 2, 5, 1, 0, _ , + + |582, 455, 2, 5, 0, 63, Salir, + |583, 456, 2, 5, 0, 0, Salir, + |582, 457, 2, 5, 0, 12, _, + |583, 459, 2, 5, 0, 0, _, + + |558, 369, 2, 5, 1, 63, Configurar , + |559, 370, 2, 5, 1, 0, Configurar , + |560, 369, 2, 5, 1, 12, _ , + |561, 370, 2, 5, 1, 0, _ , + +* Comentario Botones Entradas +| 18, 37, 2, 5, 0, 63, 0, + | 19, 38, 2, 5, 0, 0, 0, +| 45, 37, 2, 5, 0, 63, 1, + | 46, 38, 2, 5, 0, 0, 1, +| 72, 37, 2, 5, 0, 63, 2, + | 73, 38, 2, 5, 0, 0, 2, +| 99, 37, 2, 5, 0, 63, 3, + |100, 38, 2, 5, 0, 0, 3, +|126, 37, 2, 5, 0, 63, 4, + |127, 38, 2, 5, 0, 0, 4, +|153, 37, 2, 5, 0, 63, 5, + |154, 38, 2, 5, 0, 0, 5, +|180, 37, 2, 5, 0, 63, 6, + |181, 38, 2, 5, 0, 0, 6, +|207, 37, 2, 5, 0, 63, 7, + |208, 38, 2, 5, 0, 0, 7, +|234, 37, 2, 5, 0, 63, 00, + |235, 38, 2, 5, 0, 0, 00, +|261, 37, 2, 5, 0, 63, 01, + |262, 38, 2, 5, 0, 0, 01, +|288, 37, 2, 5, 0, 63, 02, + |289, 38, 2, 5, 0, 0, 02, + +| 18, 64, 2, 5, 0, 63, 8, + | 19, 65, 2, 5, 0, 0, 8, +| 45, 64, 2, 5, 0, 63, 9, + | 46, 65, 2, 5, 0, 0, 9, +| 72, 64, 2, 5, 0, 63, 10, + | 73, 65, 2, 5, 0, 0, 10, +| 99, 64, 2, 5, 0, 63, 11, + |100, 65, 2, 5, 0, 0, 11, +|126, 64, 2, 5, 0, 63, 12, + |127, 65, 2, 5, 0, 0, 12, +|153, 64, 2, 5, 0, 63, 13, + |154, 65, 2, 5, 0, 0, 13, +|180, 64, 2, 5, 0, 63, 14, + |181, 65, 2, 5, 0, 0, 14, +|207, 64, 2, 5, 0, 63, 15, + |208, 65, 2, 5, 0, 0, 15, +|234, 64, 2, 5, 0, 63, 03, + |235, 65, 2, 5, 0, 0, 03, +|261, 64, 2, 5, 0, 63, 04, + |262, 65, 2, 5, 0, 0, 04, +|288, 64, 2, 5, 0, 63, 19, + |289, 65, 2, 5, 0, 0, 19, + +* Comentario Botones Salidas +|339, 37, 2, 5, 0, 63, 0, + |340, 38, 2, 5, 0, 0, 0, +|366, 37, 2, 5, 0, 63, 1, + |367, 38, 2, 5, 0, 0, 1, +|393, 37, 2, 5, 0, 63, 2, + |394, 38, 2, 5, 0, 0, 2, +|420, 37, 2, 5, 0, 63, 3, + |421, 38, 2, 5, 0, 0, 3, +|447, 37, 2, 5, 0, 63, 4, + |448, 38, 2, 5, 0, 0, 4, +|474, 37, 2, 5, 0, 63, 5, + |475, 38, 2, 5, 0, 0, 5, +|499, 37, 2, 5, 0, 63, 6, + |500, 38, 2, 5, 0, 0, 6, +|526, 37, 2, 5, 0, 63, 7, + |527, 38, 2, 5, 0, 0, 7, +|553, 37, 2, 5, 0, 63, 05, + |554, 38, 2, 5, 0, 0, 05, +|580, 37, 2, 5, 0, 63, 06, + |581, 38, 2, 5, 0, 0, 06, +|607, 37, 2, 5, 0, 63, 07, + |608, 38, 2, 5, 0, 0, 07, + +|339, 64, 2, 5, 0, 63, 8, + |340, 65, 2, 5, 0, 0, 8, +|366, 64, 2, 5, 0, 63, 9, + |367, 65, 2, 5, 0, 0, 9, +|393, 64, 2, 5, 0, 63, 10, + |394, 65, 2, 5, 0, 0, 10, +|420, 64, 2, 5, 0, 63, 11, + |421, 65, 2, 5, 0, 0, 11, +|447, 64, 2, 5, 0, 63, 12, + |448, 65, 2, 5, 0, 0, 12, +|474, 64, 2, 5, 0, 63, 13, + |475, 65, 2, 5, 0, 0, 13, +|499, 64, 2, 5, 0, 63, 14, + |500, 65, 2, 5, 0, 0, 14, +|526, 64, 2, 5, 0, 63, 15, + |527, 65, 2, 5, 0, 0, 15, +|553, 64, 2, 5, 0, 63, 08, + |554, 65, 2, 5, 0, 0, 08, +|580, 64, 2, 5, 0, 63, 09, + |581, 65, 2, 5, 0, 0, 09, +|607, 64, 2, 5, 0, 63, 10, + |608, 65, 2, 5, 0, 0, 10, + +* Texto Botones consola de mandos + +|434, 105, 2, 5, 0, 63, FUN, + |435, 106, 2, 5, 0, 0, FUN, + |434, 107, 2, 5, 0, 63, _, + |435, 108, 2, 5, 0, 0, _, +|469, 105, 2, 5, 0, 63, SFT, + |470, 106, 2, 5, 0, 0, SFT, + |469, 107, 2, 5, 0, 63, _, + |470, 108, 2, 5, 0, 0, _, +|505, 105, 2, 5, 0, 63, NOT, + |506, 106, 2, 5, 0, 0, NOT, + |505, 107, 2, 5, 0, 63, _, + |506, 108, 2, 5, 0, 0, _, + +|433, 140, 2, 5, 0, 63, AND OR CNT, + |434, 141, 2, 5, 0, 0, AND OR CNT, + |433, 142, 2, 5, 0, 63, _ _ _, + |434, 143, 2, 5, 0, 0, _ _ _, + +|544, 140, 2, 5, 0, 63, TR LR, + |545, 141, 2, 5, 0, 0, TR LR, + |544, 142, 2, 5, 0, 63, _ _, + |545, 143, 2, 5, 0, 0, _ _, + +|614, 140, 2, 5, 0, 63, HR, + |614, 141, 2, 5, 0, 0, HR, + |614, 142, 2, 5, 0, 63, _, + |614, 143, 2, 5, 0, 0, _, + +|430, 175, 2, 5, 0, 63, LD OUT, + |431, 176, 2, 5, 0, 0, LD OUT, + |430, 177, 2, 5, 0, 63, _ _, + |431, 178, 2, 5, 0, 0, _ _, + +|505, 175, 2, 5, 0, 63, TIM, + |506, 176, 2, 5, 0, 0, TIM, + |505, 175, 2, 5, 0, 63, _, + |506, 176, 2, 5, 0, 0, _, +|544, 175, 2, 5, 0, 63, DM CH, + |545, 176, 2, 5, 0, 0, DM CH, + |544, 177, 2, 5, 0, 63, _, + |545, 178, 2, 5, 0, 0, _, + |544, 177, 2, 5, 0, 12, _, + |545, 178, 2, 5, 0, 0, _, + +|609, 177, 2, 4, 0, 63, CONT, + |609, 178, 2, 4, 0, 0, CONT, + |609, 179, 2, 4, 0, 12, _, + |609, 180, 2, 4, 0, 0, _, + +|440, 215, 2, 5, 0, 22, 7 9, + |441, 216, 2, 5, 0, 0, 7 9, +|437, 215, 2, 5, 0, 22, 8, + |438, 216, 2, 5, 0, 0, 8, + +|539, 210, 2, 5, 0, 22, EXT, + |540, 211, 2, 5, 0, 0, EXT, + +|543, 210, 2, 5, 0, 22, CHG, + |544, 211, 2, 5, 0, 0, CHG, +|609, 212, 2, 4, 0, 22, SCRH, + |609, 213, 2, 4, 0, 0, SCRH, + +|428, 242, 2, 4, 0, 0, E F, + |429, 243, 2, 4, 0, 7, E F, +|440, 250, 2, 5, 0, 22, 4 6, + |441, 251, 2, 5, 0, 0, 4 6, +|437, 250, 2, 5, 0, 22, 5, + |438, 251, 2, 5, 0, 0, 5, + +|539, 242, 2, 4, 0, 22, PLAY, + |540, 243, 2, 4, 0, 0, PLAY, + |538, 248, 2, 4, 0, 22,, + |538, 249, 2, 4, 0, 0,, +|542, 255, 2, 4, 0, 22, SET, + |543, 256, 2, 4, 0, 0, SET, + +|543, 245, 2, 5, 0, 22, DEL, + |544, 246, 2, 5, 0, 0, DEL, +|609, 247, 2, 4, 0, 22, MONT, + |609, 248, 2, 4, 0, 0, MONT, + +|428, 277, 2, 4, 0, 0, B C D, + |429, 278, 2, 4, 0, 7, B C D, +|440, 285, 2, 5, 0, 22, 1 3, + |441, 286, 2, 5, 0, 0, 1 3, +|437, 285, 2, 5, 0, 22, 2, + |438, 286, 2, 5, 0, 0, 2 , + +|539, 280, 2, 5, 0, 22, REC, + |540, 281, 2, 5, 0, 0, REC, + + +|535, 280, 2, 5, 0, 22, INS UP, + |536, 281, 2, 5, 0, 0, INS UP, + +|428, 312, 2, 4, 0, 0, A, + |429, 313, 2, 4, 0, 7, A, +|440, 320, 2, 5, 0, 22, 0, + |441, 321, 2, 5, 0, 0, 0, + +|505, 315, 2, 5, 0, 22, CLR, + |506, 316, 2, 5, 0, 0, CLR, +|507, 315, 2, 5, 0, 22, VER, + |508, 316, 2, 5, 0, 0, VER, +|538, 317, 2, 4, 0, 22, WRIT DOWN, + |539, 318, 2, 4, 0, 0, WRIT DOWN, + +|538, 317, 2, 4, 0, 22, DOWN, + |539, 318, 2, 4, 0, 0, DOWN, + +|430, 345, 2, 4, 0, 63, Debug Code, + |431, 346, 2, 4, 0, 0, Debug Code, +|533, 345, 2, 4, 0, 63, Reset Valores, + |534, 346, 2, 4, 0, 0, Reset Valores, + + + +*********>>>>>> <<<<<<<<>>>>>>>>>> <<<<<<<********** +*|242, 100, 2, 5, 0, 6, 0000 And Not Tim xxxx, +*|373, 115, 2, 5, 0, 6, n 0000, +**&239, 98, 422, 132, 0, 63, 56, 2, 1 +**********>>>>>> <<<<<<<<>>>>>>>>>> <<<<<<<********** + + +!2, 31 + + * Botones para seleccionar Entrada en canal + $ 20, 34, 45, 59, 7, 56, 63, 2, 1, 00, 00 + $ 47, 34, 72, 59, 7, 56, 63, 2, 1, 00, 00 + $ 74, 34, 99, 59, 7, 56, 63, 2, 1, 00, 00 + $101, 34, 126, 59, 7, 56, 63, 2, 1, 00, 00 + $128, 34, 153, 59, 7, 56, 63, 2, 1, 00, 00 + $155, 34, 180, 59, 7, 56, 63, 2, 1, 00, 00 + $182, 34, 207, 59, 7, 56, 63, 2, 1, 00, 00 + $209, 34, 234, 59, 7, 56, 63, 2, 1, 00, 00 + + $ 20, 61, 45, 86, 7, 56, 63, 2, 1, 00, 00 + $ 47, 61, 72, 86, 7, 56, 63, 2, 1, 00, 00 + $ 74, 61, 99, 86, 7, 56, 63, 2, 1, 00, 00 + $101, 61, 126, 86, 7, 56, 63, 2, 1, 00, 00 + $128, 61, 153, 86, 7, 56, 63, 2, 1, 00, 00 + $155, 61, 180, 86, 7, 56, 63, 2, 1, 00, 00 + $182, 61, 207, 86, 7, 56, 63, 2, 1, 00, 00 + $209, 61, 234, 86, 7, 56, 63, 2, 1, 00, 00 + + + * Botones de secuencia para Entrada + $236, 34, 261, 59, 3, 56, 63, 3, 1, 00, 00 + $263, 34, 288, 59, 3, 56, 63, 3, 1, 00, 00 + $290, 34, 315, 59, 3, 56, 63, 3, 1, 00, 00 + + $236, 61, 261, 86, 3, 56, 63, 3, 1, 00, 00 + $263, 61, 288, 86, 3, 56, 63, 3, 1, 00, 00 + $290, 61, 315, 86, 3, 56, 63, 3, 1, 00, 00 + + + * Botones de secuencia para Salidas + $555, 34, 580, 59, 3, 56, 63, 3, 1, 00, 00 + $582, 34, 607, 59, 3, 56, 63, 3, 1, 00, 00 + $609, 34, 634, 59, 3, 56, 63, 3, 1, 00, 00 + + $555, 61, 580, 86, 3, 56, 63, 3, 1, 00, 00 + $582, 61, 607, 86, 3, 56, 63, 3, 1, 00, 00 + $609, 61, 634, 86, 3, 56, 63, 3, 1, 00, 00 + + * Boton STOP + $538, 103, 632, 127, 9, 56, 63, 2, 1, 00, 31 + * Botones Up / Down + $605, 275, 635, 305, 14, 56, 63, 2, 1, 00, 72 + $605, 310, 635, 340, 14, 56, 63, 2, 1, 00, 80 + + +// Secuencia que reescribe STOP +3 + &538, 103, 632, 127, 9, 56, 63, 2, 1, 00, 22 + |538, 104, 2, 6, 0, 12, S T O P, + |539, 105, 2, 6, 0, 4, S T O P, + |538, 107, 2, 6, 0, 12, _, + |539, 108, 2, 6, 0, 4, _, + +// Secuencia que reescribe RUN +4 + &538, 103, 632, 127, 9, 56, 63, 2, 1, 00, 22 + |538, 104, 2, 6, 0, 12, R U N, + |539, 105, 2, 6, 0, 4, R U N, + |538, 107, 2, 6, 0, 12, _, + |539, 108, 2, 6, 0, 4, _, + + + + +100 +& 200, 212, 440, 267, 7, 56, 63, 2, 1 +& 205, 217, 435, 262, 7, 63, 56, -2, 1 + +* Boton Aceptar +& 200, 270, 280, 295, 7, 63, 56, 2, 1 +* Boton Cancelar +& 360, 270, 440, 295, 7, 63, 56, 2, 1 + +101 +| 200, 274, 2, 5, 0, 63, Aceptar, +| 201, 275, 2, 5, 0, 0, Aceptar, + | 200, 274, 2, 5, 0, 14, A, + | 201, 275, 2, 5, 0, 0, A, + + +| 340, 274, 2, 5, 0, 63, Cancelar, +| 341, 275, 2, 5, 0, 0, Cancelar, + | 340, 274, 2, 5, 0, 14, C, + | 341, 275, 2, 5, 0, 0, C, + + +!3,2 +* Boton Aceptar +$ 204, 274, 276, 291, 7, 56, 63, -2, 1, 00, 30 +* Boton Cancelar +$ 364, 274, 436, 291, 7, 56, 63, -2, 1, 00, 46 + + + +* Men para Cargar o Salvar +10 + +*Cuadro Total +& 240, 140, 400, 340, 7, 63, 56, 2, 1 +& 243, 143, 397, 337, 7, 56, 63, -2, 1 +*Cuadro Informativo +& 250, 150, 391, 164, 7, 56, 63, -0, 1 +*Cuadro introduccion nuevos datos +& 250, 169, 375, 180, 0, 56, 63, 0, 1 +*Cuadro de muestreo +& 250, 185, 375, 330, 0, 56, 63, 0, 1 + +*Cuadro Cancelar +& 377, 169, 391, 221, 7, 56, 63, 0, 1 +*Boton Aceptar +& 377, 223, 391, 276, 7, 56, 63, 0, 1 + +* Subir +& 377, 278, 391, 303, 7, 56, 63, 0, 1 +* Bajar +& 377, 305, 391, 330, 7, 56, 63, 0, 1 + +|377, 169, 2, 4, 1, 63, Cancelar, + |378, 170, 2, 4, 1, 0, Cancelar, + |377, 169, 2, 4, 1, 2, C , + |378, 170, 2, 4, 1, 0, C , +|377, 223, 2, 4, 1, 63, Aceptar , + |378, 224, 2, 4, 1, 0, Aceptar , + |377, 223, 2, 4, 1, 2, A , + |378, 224, 2, 4, 1, 0, A , + +|377, 288, 2, 4, 0, 63, -, + |378, 289, 2, 4, 0, 0, -, +|377, 315, 2, 4, 0, 63, +, + |378, 316, 2, 4, 0, 0, +, + + + +!4,4 + +*Cuadro Cancelar +$ 377, 169, 391, 221, 7, 56, 63, 0, 1, 00, 46 +*Boton Aceptar +$ 377, 223, 391, 276, 7, 56, 63, 0, 1, 00, 30 + +* Subir +$ 377, 278, 391, 303, 7, 56, 63, 0, 1, 00, 72 +* Bajar +$ 377, 305, 391, 330, 7, 56, 63, 0, 1, 00, 80 + +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** +* Configuracin +!5,22 +20 +$ 15, 380, 25, 390, 0, 7, 7, 3, 0, 82, 00 +$ 15, 405, 25, 415, 0, 7, 7, 3, 0, 73, 00 +$ 15, 430, 25, 440, 0, 7, 7, 3, 0, 80, 00 +$ 15, 455, 25, 465, 0, 7, 7, 3, 0, 77, 00 + |15, 380, 2, 5, 0, 4, RETROCEDER... Colores >>> >> >, + |14, 383, 2, 5, 0, 63, _, + |15, 405, 2, 5, 0, 4, Usar INT 8 [ Ejecucin TURBO ], + |14, 408, 2, 5, 0, 63, _, + |15, 430, 2, 5, 0, 4, Usar PC_Out [ Interfaz PC <> Out ], + |14, 433, 2, 5, 0, 63, _, + |15, 455, 2, 5, 0, 4, Mostrar Diagramas de Tiempo, + |14, 458, 2, 5, 0, 63, _, + +$315, 380, 325, 390, 0, 7, 7, 3, 0, 84, 00 +$315, 395, 325, 405, 0, 7, 7, 3, 0, 83, 00 +$315, 410, 325, 420, 0, 7, 7, 3, 0, 86, 00 + |315, 380, 2, 5, 0, 12, Texto >, + |314, 383, 2, 5, 0, 63, _, + |315, 395, 2, 5, 0, 12, Texto Sealado >, + |314, 398, 2, 5, 0, 63, _, + |315, 410, 2, 5, 0, 12, Visor LCD >, + |314, 413, 2, 5, 0, 63, _, + + + +$ 496, 380, 506, 390, 1, 56, 63, 0, 0, 00, 00 +$ 496, 392, 506, 402, 2, 56, 63, 0, 0, 00, 00 +$ 496, 402, 506, 412, 3, 56, 63, 0, 0, 00, 00 +$ 496, 414, 506, 424, 4, 56, 63, 0, 0, 00, 00 +$ 496, 426, 506, 436, 5, 56, 63, 0, 0, 00, 00 + +$ 508, 380, 518, 390, 6, 56, 63, 0, 0, 00, 00 +$ 508, 392, 518, 402, 7, 56, 63, 0, 0, 00, 00 +$ 508, 402, 518, 412, 8, 56, 63, 0, 0, 00, 00 +$ 508, 414, 518, 424, 9, 56, 63, 0, 0, 00, 00 +$ 508, 426, 518, 436, 10, 56, 63, 0, 0, 00, 00 + +$ 520, 380, 530, 390, 11, 56, 63, 0, 0, 00, 00 +$ 520, 392, 530, 402, 12, 56, 63, 0, 0, 00, 00 +$ 520, 402, 530, 412, 13, 56, 63, 0, 0, 00, 00 +$ 520, 414, 530, 424, 14, 56, 63, 0, 0, 00, 00 +$ 520, 426, 530, 436, 15, 56, 63, 0, 0, 00, 00 + +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** +***************************************************************************** + + +200 +& 200, 212, 440, 267, 12, 63, 56, 2, 1 +& 205, 217, 435, 262, 7, 56, 63, 2, 1 +| 210, 222, 2, 5, 0, 240, ERROR ABRIENDO FICHERO, +| 210, 242, 2, 5, 0, 240, OPERACION ABORTADA, + +300 +& 200, 212, 440, 267, 12, 63, 56, 2, 1 +& 205, 217, 435, 262, 7, 56, 63, 2, 1 +| 210, 222, 2, 5, 0, 240, P L C (c) 1995 v 2.0, +| 210, 242, 2, 5, 0, 240, Jos David Guilln.., + +500 +& 200, 212, 440, 267, 12, 63, 56, 2, 1 +& 205, 217, 435, 262, 7, 56, 63, 2, 1 +| 210, 222, 2, 5, 0, 240, Programa no tiene FUN, +| 210, 242, 2, 5, 0, 240, ERROR EN LA EJECUCIN..., + +501 +& 200, 212, 440, 267, 12, 63, 56, 2, 1 +& 205, 217, 435, 262, 7, 56, 63, 2, 1 +| 210, 222, 2, 5, 0, 240, Se encontro una funcin, +| 210, 242, 2, 5, 0, 240, no reconocida por PLC..., diff --git a/PLC.DSK b/PLC.DSK new file mode 100644 index 0000000000000000000000000000000000000000..c9966c7121f0ee6bf484309415691683b781e929 GIT binary patch literal 529 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 + +// Estas macros son para los botones a cada +// boton, Make_Boton le asigna un nmero ID +// y es mucho mas sencillo utilizar un nombre +// que un nmero... +#define B_In0 2 +#define B_In1 3 +#define B_In2 4 +#define B_In3 5 +#define B_In4 6 +#define B_In5 7 +#define B_In6 8 +#define B_In7 9 +#define B_In8 10 +#define B_In9 11 +#define B_In10 12 +#define B_In11 13 +#define B_In12 14 +#define B_In13 15 +#define B_In14 16 +#define B_In15 17 + // Seleccin de canales de entrada ( 19xx Datos internos ) + #define B_Ch00_In 18 + #define B_Ch01_In 19 + #define B_Ch02_In 20 + #define B_Ch03_In 21 + #define B_Ch04_In 22 + #define B_Ch19_In 23 +#define B_Out0 24 +#define B_Out1 25 +#define B_Out2 26 +#define B_Out3 27 +#define B_Out4 28 +#define B_Out5 29 +#define B_Out6 30 +#define B_Out7 31 +#define B_Out8 32 +#define B_Out9 33 +#define B_Out10 34 +#define B_Out11 35 +#define B_Out12 36 +#define B_Out13 37 +#define B_Out14 38 +#define B_Out15 39 + // Seleccin de canales de entrada ( 19xx Datos internos ) + #define B_Ch00_Out 40 + #define B_Ch01_Out 41 + #define B_Ch02_Out 42 + #define B_Ch03_Out 43 + #define B_Ch04_Out 44 + #define B_Ch19_Out 45 +#define B_AcercaDe 1 +#define B_Fun 54 +#define B_Sft 53 +#define B_Not 52 +#define B_Run 51 +#define B_And 60 +#define B_Or 59 +#define B_Cnt 58 +#define B_Tr 57 +#define B_Lr 56 +#define B_Hr 55 +#define B_Ld 66 +#define B_Out 65 +#define B_Tim 64 +#define B_Dm 63 +#define B_Ch 62 +#define B_Cont 61 +#define B_7 72 +#define B_8 71 +#define B_9 70 +#define B_Ext 69 +#define B_Chg 68 +#define B_Scrh 67 +#define B_4 78 +#define B_5 77 +#define B_6 76 +#define B_Play 75 +#define B_Del 74 +#define B_Mont 73 +#define B_1 84 +#define B_2 83 +#define B_3 82 +#define B_Rec 81 +#define B_Ins 80 +#define B_Up 79 +#define B_0 89 +#define B_Clr 88 +#define B_Ver 87 +#define B_Write 86 +#define B_Down 85 +#define B_DebugCode 90 +#define B_ResetValores 91 +#define B_Configurar 50 +#define B_Reset 46 +#define B_Salvar 47 +#define B_Cargar 48 +#define B_Salir 49 + +///////////////// Una vez que estemos en el modo RUN +#define R_In0 1 +#define R_In1 2 +#define R_In2 3 +#define R_In3 4 +#define R_In4 5 +#define R_In5 6 +#define R_In6 7 +#define R_In7 8 +#define R_In8 9 +#define R_In9 10 +#define R_In10 11 +#define R_In11 12 +#define R_In12 13 +#define R_In13 14 +#define R_In14 15 +#define R_In15 16 + // Seleccin de canales de entrada ( 19xx Datos internos ) + #define R_Ch00_In 17 + #define R_Ch01_In 18 + #define R_Ch02_In 19 + #define R_Ch03_In 20 + #define R_Ch04_In 21 + #define R_Ch19_In 22 + // Seleccin de canales de entrada ( 19xx Datos internos ) + #define R_Ch00_Out 23 + #define R_Ch01_Out 24 + #define R_Ch02_Out 25 + #define R_Ch03_Out 26 + #define R_Ch04_Out 27 + #define R_Ch19_Out 28 +#define R_Stop 29 +#define R_Up 30 +#define R_Down 31 + + + + +// +// Nmero de Entradas y Salidas +// +#define Numero_In 16 +#define Numero_Out 16 +#define Numero_Tim 48 +#define Numero_Tmp 8 + +// +// Aqui estan definido los nombres de todos los comandos +// y su _ID correspondiente. El programa debe guiarse por +// estos cdigos... +// +#define ReadNop 0 // No Opera +#define Ld 1 // Inicio de bloque +#define Or 2 // Funcion Or +#define And 3 // Funcion And +#define _Out 4 // Inicia salida +#define Tim 5 // Temporizador +#define Cnt 6 // Contador +// #define _Tr 7 // Rel Temporal (No se considera FUNCION) +#define Fun 99 // Las siguientes macros son las + // funciones dentro de FUN + #define End 101 // Final de programa + // No he tenido ocacin de comprobar el funcionamiento + // de las dos siguientes instrucciones en un Automata. + // Por lo que no comprendo bien su funcionamiento lgico. + #define Il 102 // Instruccin de condicin + #define Ilc 103 // Instruccin fin de condicin + + #define Sft 110 // Registro de desplazamiento + #define Keep 111 // Switch biestable ( Rel Latch ) + + #define DifU 113 // Activador en el flanco de subida + #define DifD 114 // Activador en el flanco de bajada + #define TimH 115 // Temporizador de alta velocidad + #define Cmp 120 // Comparador + #define Mov 121 // Move + #define Mvn 122 // Move Not + #define Add 130 // Add (Suma en BCD) + #define Sub 131 // Subtract ( Resta en BCD ) + #define Stc 140 // Introduce un 1 en el flag de acarreo + #define Clc 141 // Borra el flag de acarreo +// Macros para los parametros y parametros compuestos +#define P_void 0 // Sin parametro activo +#define P_Ld 1 // Fusin de bloques +#define P_Tr 2 // +#define P_Hr 3 // Reles internos +#define P_Cnt 4 // +#define P_Tim 5 // Utiliza estado del temporizador +#define P_Keep 6 // Utiliza estado del biestable ( Rel Latch ) +#define P_Not 7 // Negacin del dato Entrada +#define P_Not_Tr 8 // Negacin del dato Rel Temporal +#define P_Not_Hr 9 // Negacin del dato Rel Interno +#define P_Not_Cnt 10 // Negacin del dato Contador +#define P_Not_Tim 11 // Negacin del dato Temporizador +#define P_Keep_Hr 12 // Keep Guardando valores +#define P_Tim_Data 13 // Dato TIM/TIMH/CNT (inutil en v2.0) +#define P_Out 14 // Carga una salida + + +int Menu_Edicion(void) ; +void Reset_Programa(void) ; +void Resetea_Memoria(void) ; +int InicializaMemoria(void) ; +int CargaEntornoGrafico(void) ; +void ReImprimeCanal_In(int Canal) ; +void ReImprimeCanal_Out(int Canal) ; +void Abandona_Programa(char *texto, long valor) ; + +typedef struct { + unsigned int Bit : 1; // Bariable de tamao 1 bit +} Puertas; + +typedef struct { + + Puertas In [Numero_In] [6]; // 16 Entradas x 6 canales.. + Puertas Out [Numero_Out] [6]; // 16 Salidas x 6 canales.. + Puertas Hr [Numero_Out] [10]; // 16 Reles internos x 9 canales.. + Puertas Ri [Numero_Out][10]; // Reles internos volatiles....... + Puertas Tr [Numero_Tmp] ; // 8 Reles temporales............... + Puertas _Ld [200]; //200 Ld's........................... + Puertas _Cnt [Numero_Tim] ; // 47 Biestable lgico con pulsacin. + Puertas _Tim [Numero_Tim] ; // 47 Logica temporizacin........... +// Puertas Bt [3]; // 3 Preestados lgicos de Tiempo... + clock_t Contador_de_Tiempo[3]; // 3 Cronmetros de inicio para Bt.. + int Tim_Cnt [Numero_Tim] ; // 47 Comprobadores temporizacin.... + + Puertas Pre_Ld [9999]; // Preestados lgicos a los LD's.... + +} MemoriaRam; + +typedef struct { + + unsigned char Comando; + unsigned char Parametros; + + unsigned int Dato; + unsigned int SubDato; + +} FirmWare; + + +struct Colores { + char Texto; + char F_Texto; + char VisorLCD; +}; + +typedef struct { + + struct Colores Colores; + Puertas PcOut; + Puertas TimeFlow; + Puertas Int8; + +} Configuracion; + +// extern int Fichero_bot(char Dinamicos_Estaticos); diff --git a/PLC.PRJ b/PLC.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..a16824891f1cbeb038e903f9d073715ab03ad8ec GIT binary patch literal 21255 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 + +#include +#include +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON +//extern int Fichero_bot(char Dinamicos_Estaticos); + +void Acerca_de( void ); +void Circulos3(int PosX, int PosY, int RadioX, int RadioY, int Velocidad); + +void Acerca_de( void ) +{ + + void *Imagen; + +while(kbhit()) getch(); + setfillstyle(SOLID_FILL, 0); + bar( 9, 372, 542, 471); + + if ( (Imagen = malloc( JD_imagesize(200, 212, 440, 267) ) ) == NULL ) { + Espera_Tecla_o_Raton(); + Anclar_Raton(); + return; + } else { + getimage( 200, 212, 440, 267, Imagen ); + Imprime_Estaticos( 300, "PLC.DAT"); +// Fichero_bot(300); + + +Circulos3( 269 + 6, 52 + 369, /*48*/80, 48, 5); + + putimage( 200, 212, Imagen, COPY_PUT); + free(Imagen); + + setfillstyle(SOLID_FILL, 0); + bar( 9, 372, 542, 471); + + while(kbhit()) getch(); + + return; + } + + +} + +void Circulos3(int PosX, int PosY, int RadioX, int RadioY, int Velocidad){ + +// Circulo con apariencia de 3D, por: Jos David Guilln + +int x=RadioX, + y=0, + oldx=RadioX, oldx2 = RadioX, oldx3 = RadioX, + oldy=RadioY, oldy2 = RadioY, oldy3 = RadioY, + // giroX = 0, + // vezX = 0, + cicloX = 1, + // giroY = 0, + // vezY = 0, + cicloY = 1, + Angulo = 0; + char c=8; + + +do{ + setcolor(0); + ellipse(PosX, PosY, 0+ Angulo, 360+ Angulo, abs(oldx), RadioY ); + ellipse(PosX, PosY, 0/*+*/- Angulo, 360/*+*/- Angulo, RadioX, abs(oldy) ); + + +/*if(giroX==1)*//*{*/ setcolor(c/*56*/);// else setcolor(c+1/*63*/); +/// ellipse(PosX, PosY, 90+ Angulo, 270+ Angulo, abs(x), /*abs(y)*/50 ); +ellipse(PosX, PosY, 0+ Angulo, 90+ Angulo, abs(x), RadioY ); +ellipse(PosX, PosY, 180+ Angulo, 270+ Angulo, abs(x), RadioY ); +/*if(giroY==1)*/ setcolor(c/*56*/);// else setcolor(c+1/*63*/); +/// ellipse(PosX, PosY, 0+ Angulo, 180+ Angulo, /*abs(y)*/50, abs(x) ); +ellipse(PosX, PosY, 90/*+*/- Angulo, 180/*+*/- Angulo, RadioX, abs(y)); +ellipse(PosX, PosY, 270/*+*/- Angulo, 360/*+*/- Angulo, RadioX, abs(y) ); + + +/*if(giroX==1) */ setcolor(c+1/*63*/); // else setcolor(c/*56*/); +/// ellipse(PosX, PosY, 270+ Angulo, 90+ Angulo, abs(x), /*abs(y)*/50 ); +ellipse(PosX, PosY, 90+ Angulo, 180+ Angulo, abs(x), RadioY ); +ellipse(PosX, PosY, 270+ Angulo, 360+ Angulo, abs(x), RadioY ); + +/*if(giroY==1) */setcolor(c+1/*63*/);// else setcolor(c/*56*/); +/// ellipse(PosX, PosY, 180+ Angulo, 360+ Angulo, /*abs(y)*/50, abs(x) ); +ellipse(PosX, PosY, 0/*+*/- Angulo, 90/*+*/- Angulo, RadioX, abs(y) ); +ellipse(PosX, PosY, 180/*+*/- Angulo, 270/*+*/- Angulo, RadioX, abs(y) ); + + oldx = oldx2; + oldx2 = oldx3; + oldx3 = x; + + oldy = oldy2; + oldy2 = oldy3; + oldy3 = y; + + x--; + if(x<=-(RadioX-1) ) x=RadioX; + y--; + if(y<=-(RadioY-1) ) y=RadioY; + +if(cicloX == 0 && x == RadioX ) { cicloX = 1; //vezX = 0; + c++; if (c==14) c=9; +} else +if(cicloX == 1 && x == RadioX ) { cicloX = 0;// vezX = 1; +} + + +//if(vezX==0){ +// if(x<0) giroX=1; else giroX=0; +//} +//if(vezX==1){ +// if(x<0) giroX=0; else giroX=1; +//} + +if(cicloY == 0 && y == RadioY ) { cicloY = 1; //vezY = 0; // c++; if (c==14) c=1; +} else +if(cicloY == 1 && y == RadioY ) { cicloY = 0; //vezY = 1; +} + +/* +if(vezY==0){ + if(y<0) giroY=1; else giroY=0; +} +if(vezY==1){ + if(y<0) giroY=0; else giroY=1; +} +*/ + + + +// delay(20); + Angulo++; + Angulo+= Velocidad; if( Angulo== (360 + 180) ) Angulo=0; + +//////////////////////////////////////////////////////// +//////////////////////////////////////////////////////// +//giroX = 1; +//giroY = 1; +//////////////////////////////////////////////////////// +//////////////////////////////////////////////////////// + +}while(!kbhit()); + +} diff --git a/PLC_EDIT.CPP b/PLC_EDIT.CPP new file mode 100644 index 0000000..dfbeed6 --- /dev/null +++ b/PLC_EDIT.CPP @@ -0,0 +1,1804 @@ +#include + +#include + +#include +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON +#include "PLC.h" + + +extern void Acerca_de( void ); +extern MemoriaRam *Ram; +extern FirmWare far *Programa; + +extern void Run(void); +extern char Optar( char *texto1, char *texto2, char *texto3 ); +char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ); + +int Muestra_Mensaje(int Mensaje, char *file); + +void BEEP(void) ; +void UpRow(void) ; +void DownRow(void) ; +void Configurar(void) ; +void BuscarItem(void) ; +void GetProgram(void) ; +void SendProgram(void) ; +void LoadProgram(void) ; +void WriteProgram(void) ; +void PrintWholeScreen (void) ; +int Select_Columna_Up(void) ; +int Select_Columna_Down(void) ; +void Numero_Pulsado(char numero) ; +void DelRow( void ) ; +void AddRow( char Arriba_Abajo ) ; +void PrintCurrLine ( char Oculta_Mark, char Ultima ) ; +void PrintVisorLCD ( char Ultima ) ; +void MuestraLCD( char *texto1, char *texto2) ; + +Configuracion CFG; + +void CFG_File( char Cargar_Salvar ); +#define Salvar 1 +#define Cargar 2 + + +char Buffer_Teclado[16], BT = 0; + +Puertas DebugCode; + + + int CurrRow = 0, + CurrTopLine = 0; + char CurrCol = 0; + + char CurrCh_In = 0, + CurrCh_Out = 0; + +int Menu_Edicion(void){ + + int Boton_Pulsado, ok = 0; + + + +PrintWholeScreen (); +CurrRow = 0; CurrTopLine = 0; +PrintCurrLine(1, 0); +PrintVisorLCD ( 0 ); + +do{ + Boton_Pulsado = Comprueba_Secuencia( 1 ); + switch( Boton_Pulsado ) { // Iniciamos comprobacion + + case 0: // No se pulso ningun BOTON + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + Anclar_Raton(); + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + case -2: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + case B_In0 : + case B_In1 : + case B_In2 : + case B_In3 : + case B_In4 : + case B_In5 : + case B_In6 : + case B_In7 : + case B_In8 : + case B_In9 : + case B_In10 : + case B_In11 : + case B_In12 : + case B_In13 : + case B_In14 : + case B_In15 : + if ( CurrCh_In != (5) ) { + if ( Ram -> In[Boton_Pulsado - B_In0][CurrCh_In].Bit == 1 ) { +// Ram -> CoIn[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit; + Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = 0; + Imprime_Bordes(1, Boton_Pulsado, -1); + } else { +// Ram -> CoIn[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit; + Ram -> In[Boton_Pulsado - B_In0 ][CurrCh_In].Bit = 1; + Imprime_Bordes(1, Boton_Pulsado, 2); + } + } + break; + case B_Ch00_In : + case B_Ch01_In : + case B_Ch02_In : + case B_Ch03_In : + case B_Ch04_In : + case B_Ch19_In : + Imprime_Bordes(1, (CurrCh_In + B_Ch00_In ), -1); + CurrCh_In = ( Boton_Pulsado - B_Ch00_In ); + Imprime_Bordes(1, Boton_Pulsado, 4); + ReImprimeCanal_In(CurrCh_In); + break; + case B_Ch00_Out : + case B_Ch01_Out : + case B_Ch02_Out : + case B_Ch03_Out : + case B_Ch04_Out : + case B_Ch19_Out : + Imprime_Bordes(1, (CurrCh_Out + B_Ch00_Out ), -1); + CurrCh_Out = ( Boton_Pulsado - B_Ch00_Out ); + Imprime_Bordes(1, Boton_Pulsado, 4); + ReImprimeCanal_Out(CurrCh_Out); + break; + case B_AcercaDe : + Acerca_de(); + break; + case B_Fun : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + Programa[10000].Comando = Fun; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } + break; + case B_Sft : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + Programa[10000].Comando = Sft; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + CurrCol = 1; + } + break; + case B_Not : +// gotoxy(1,1); printf("Not %3d", Boton_Pulsado); + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un NOT + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + case _Out : + Programa[10000].Parametros = P_Not; + break; + default: + break; + } + } + break; + case B_Run : + BT = 0; + Run(); +// gotoxy(1,1); printf("Run %3d", Boton_Pulsado); + break; + case B_And : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + Programa[10000].Comando = And; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } + break; + case B_Or : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + Programa[10000].Comando = Or; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } + break; + case B_Cnt : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un Cnt + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + if ( Programa[10000].Parametros == P_Not ) + Programa[10000].Parametros = P_Not_Cnt; + else if ( Programa[10000].Parametros == 0 ) + Programa[10000].Parametros = P_Cnt; + else { + Programa[10000].Comando = Cnt; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + CurrCol = 1; + } + break; + default: + Programa[10000].Comando = Cnt; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + CurrCol = 1; + break; + } + } + break; + case B_Tr : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un Tr + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + case _Out : + if ( Programa[10000].Parametros == P_Not ) + Programa[10000].Parametros = P_Not_Tr; + else if ( Programa[10000].Parametros == 0 ) + Programa[10000].Parametros = P_Tr; +/* + else { + Programa[10000].Comando = _Tr; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } +*/ + break; + default: + break; + } + } + break; + case B_Lr : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + } + break; + case B_Hr : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; +// gotoxy(1,1); printf("Hr %3d", Boton_Pulsado); + // Funciones que admiten un Hr + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + case _Out : + case Keep : + case DifU : + case DifD : + case Sft : + case Cmp : + case Mov : + case Mvn : + case Add : + case Sub : + if ( Programa[10000].Parametros == P_Not ) + Programa[10000].Parametros = P_Not_Hr; + else + Programa[10000].Parametros = P_Hr; + break; + default: + break; + } + } + break; + case B_Ld : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un Ld + switch( Programa[10000].Comando ) { + case And : + case Or : + if( Programa[10000].Parametros == 0 ) + Programa[10000].Parametros = P_Ld; + else { + Programa[10000].Comando = Ld; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } + break; + default: + Programa[10000].Comando = Ld; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + break; + } + } + break; + case B_Out : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + Programa[10000].Comando =_Out; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + } + break; + case B_Tim : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un Tim + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + if ( Programa[10000].Parametros == P_Not ) + Programa[10000].Parametros = P_Not_Tim; + else if ( Programa[10000].Parametros == 0 ) + Programa[10000].Parametros = P_Tim; + else { + Programa[10000].Comando = Tim; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + CurrCol = 1; + } + break; + default: + Programa[10000].Comando = Tim; + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + CurrCol = 1; + break; + } + } + break; + case B_Dm : + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + } + break; + case B_Ch : +/* + if ( CurrCol == 0 || CurrCol == 1 ) { + BT = 0; + // Funciones que admiten un Tim + switch( Programa[10000].Comando ) { + case Ld : + case And : + case Or : + if ( Programa[10000].Parametros == P_Not ) + Programa[10000].Parametros = P_Not_Tim; + else + Programa[10000].Parametros = P_Tim; + break; + default: + break; + } + } +*/ + break; + case B_Cont : + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + break; + case B_Ext : + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + break; + case B_Chg : + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + break; + case B_Scrh : + BT = 0; + BuscarItem(); + break; + case B_Play : + BT = 0; + GetProgram(); + break; + case B_Del : + Buffer_Teclado[BT] = B_Del; + BT++; + break; + case B_Mont : + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + break; + case B_Rec : + BT = 0; + SendProgram(); + break; + case B_Ins : + Buffer_Teclado[BT] = B_Ins; + BT++; + break; + case B_Up : + if ( Buffer_Teclado[0] == B_Ins ) { + BT = 0; + MuestraLCD( "", " Insert Line ?"); + if ( Comprueba_Secuencia( 1 ) == B_Up ) + AddRow( 0 ); + } + else + if ( Buffer_Teclado[0] == B_Del ) { + BT = 0; + MuestraLCD( "", " Delete Line ?"); + if ( Comprueba_Secuencia( 1 ) == B_Up ) + DelRow( ); + } else { + BT = 0; + PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior + UpRow(); + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + } + break; + case B_Clr : + BT = 0; + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + break; + case B_Ver : + BT = 0; + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + // ۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱۱ + // + break; + case B_Write : + BT = 0; + if ( Programa[ 10000 ].Comando == Fun ) { + switch ( Programa[ 10000 ].Dato + 100) { + + case Sft : // Registro de desplazamiento + case Add : // Add (Suma en BCD) + case Sub : // Subtract ( Resta en BCD ) + case TimH : // Temporizador de alta velocidad + case Cmp : // Comparador + case Mov : // Move + case Mvn : // Move Not + Programa[ 10000 ].Comando = 100 + Programa[ 10000 ].Dato; + Programa[ 10000 ].Dato = 0; + CurrCol = 1; + break; + + case End : // Final de programa + + case Il : // Instruccin de condicin + case Ilc : // Instruccin fin de condicin + + case Keep : // Switch biestable ( Rel Latch ) + case DifU : // Activador en el flanco de subida + case DifD : // Activador en el flanco de bajada + case Stc : // Introduce un 1 en el flag de acarreo + case Clc : // Borra el flag de acarreo + Programa[ 10000 ].Comando = 100 + Programa[ 10000 ].Dato; + Programa[ 10000 ].Dato = 0; + break; + default: + break; + } + Programa[10000].Parametros = 0; + Programa[10000].Dato = 0; + Programa[10000].SubDato = 0; + +// // Confirma linea editada y la copia en la DIRECCION REAL +// Programa[ CurrRow + CurrTopLine ] = Programa[ 10000 ]; + } else { + // Confirma linea editada y la copia en la DIRECCION REAL + Programa[ CurrRow + CurrTopLine ] = Programa[ 10000 ]; + PrintCurrLine ( 0, 1 ); // Ocultamos linea anterior + DownRow(); + Programa[10000] = Programa[ CurrRow + CurrTopLine ]; + } + + break; + case B_Down : + if ( Buffer_Teclado[0] == B_Ins ) { + BT = 0; + MuestraLCD( "", " Insert Line ?"); + if ( Comprueba_Secuencia( 1 ) == B_Down ) + AddRow( 1 ); + } + else + if ( Buffer_Teclado[0] == B_Del ) { + BT = 0; + MuestraLCD( "", " Delete Line ?"); + if ( Comprueba_Secuencia( 1 ) == B_Down ) + DelRow( ); + } else { + PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior + DownRow(); + Programa[10000] = Programa[ CurrRow + CurrTopLine ]; + } + break; + case B_DebugCode : + DebugCode.Bit = ( DebugCode.Bit ? 0 : 1 ) ; + break; + case B_ResetValores : + Resetea_Memoria(); + ReImprimeCanal_In (CurrCh_In ); + ReImprimeCanal_Out(CurrCh_Out); + break; + case B_Configurar : + Configurar(); + break; + case B_Reset : + if ( Optar( "Confirme borrado", "total de DATOS","" ) == 1 ) { + Resetea_Memoria(); + ReImprimeCanal_In (CurrCh_In ); + ReImprimeCanal_Out(CurrCh_Out); + Reset_Programa(); + CurrRow = 0; CurrTopLine = 0; + PrintWholeScreen(); + PrintCurrLine( 1, 0 ); + } + break; + case B_Salvar : + WriteProgram(); + break; + case B_Cargar : + LoadProgram(); + break; + case B_Salir : + ok = 1; + break; + case B_0 : + BT = 0; + Numero_Pulsado( 0 ); + break; + case B_1 : + BT = 0; + Numero_Pulsado( 1 ); + break; + case B_2 : + BT = 0; + Numero_Pulsado( 2 ); + break; + case B_3 : + BT = 0; + Numero_Pulsado( 3 ); + break; + case B_4 : + BT = 0; + Numero_Pulsado( 4 ); + break; + case B_5 : + BT = 0; + Numero_Pulsado( 5 ); + break; + case B_6 : + BT = 0; + Numero_Pulsado( 6 ); + break; + case B_7 : + BT = 0; + Numero_Pulsado( 7 ); + break; + case B_8 : + BT = 0; + Numero_Pulsado( 8 ); + break; + case B_9 : + BT = 0; + Numero_Pulsado( 9 ); + break; + default: + break; + } + + PrintCurrLine( 1, 1 ); + PrintVisorLCD ( 1 ); + if ( BT == 0 ) { + for ( BT = 0; BT < 16; BT ++ ) + Buffer_Teclado[BT] = 0; + BT = 0; + } + + + +}while(!ok); + +return ok; + +} + +void Resetea_Memoria(void){ + + int i, ch; + + // Resetea Salidas + for( ch = 0;ch < 6 ;ch++ ) + for( i = 0; i < Numero_Out ; i++ ) + Ram -> Out [i][ch].Bit = 0; + + + // Resetea Entradas + for( ch = 0;ch < 6 ;ch++ ) + for( i = 0; i < Numero_Out ; i++ ) + Ram -> In [i][ch].Bit = 0; + +/* + // Resetea Salidas Internas + for( ch = 0;ch < 9 ;ch++ ) + for( i = 0; i < Numero_Out ; i++ ) + Ram -> Out2 [i][ch].Bit = 0; +*/ + // Resetea Salidas no volatiles + for( ch = 0;ch < 9 ;ch++ ) + for( i = 0; i < Numero_Out ; i++ ) + Ram -> Hr [i][ch].Bit = 0; + + for( i = 0; i < Numero_Tmp ; i++ ) + Ram -> Tr [i] .Bit = 0; + + for( i = 0; i < Numero_Tim ; i++ ) + Ram -> Tim_Cnt [i] = 0; + + +} + + +void Reset_Programa(void){ + + int i=0; + for ( i; i<10001; i++ ) + { + Programa[i].Comando = 0; + Programa[i].Parametros = 0; + + Programa[i].Dato = 0; + Programa[i].SubDato = 0; + } + +} + + +void Abandona_Programa(char *texto, long valor){ + + // Comprobar donde estamos. ( Texto / Grfico ) + closegraph(); + cprintf("\n%s <%ld>", texto, valor ); + + exit(valor); +} + +void ReImprimeCanal_In(int Canal){ + + int i; + for ( i = 0; i < Numero_In; i++ ) + if ( Ram -> In[i][Canal].Bit == 1 ) { + Imprime_Bordes(1, (i+B_In0), 2); + } else { + Imprime_Bordes(1, (i+B_In0), -1); + } + +} + +void ReImprimeCanal_Out(int Canal){ + + int i; + for ( i = 0; i < Numero_Out; i++ ) + if ( Ram -> Out[i][Canal].Bit == 1 ) { + Imprime_Bordes(1, (i+B_Out0), 2); + } else { + Imprime_Bordes(1, (i+B_Out0), -1); + } + + +} + + +void PrintWholeScreen (void) +{ + + int OldCurrRow = CurrRow ; + char Contador; + PrintCurrLine ( 0, 0 ); + for ( Contador = 0; Contador < 10; Contador++ ) + DownRow(); + + CurrRow = OldCurrRow; + +} + +void PrintCurrLine ( char Oculta_Mark, char Ultima ) +{ + char Buffer[80] ; + int Buff_int ; + settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); +// Solo 11 Lineas de 5 puntos + if ( Oculta_Mark == 0 ) { + setfillstyle( SOLID_FILL, 0 ); + bar( 7, (176 + ( ( CurrRow ) * 15 ) ), 84, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + bar( 102, (176 + ( ( CurrRow ) * 15 ) ), 225, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + setcolor(CFG.Colores.Texto ); + Buff_int = (CurrRow + CurrTopLine); + }else{ + setfillstyle( SOLID_FILL, 0 ); + bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + setfillstyle( SOLID_FILL, CFG.Colores.F_Texto ); + bar( 7, (176 + ( ( CurrRow ) * 15 ) ), 84, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + bar( 102, (176 + ( ( CurrRow ) * 15 ) ), 225, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + switch( CurrCol ) { + case 1: // Primera Zona + bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 301, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + break; + case 2: // Segunda Zona + bar( 301, (176 + ( ( CurrRow ) * 15 ) ), 360, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + break; + case 3: // Tercera Zona + bar( 360, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + break; + default: + bar( 242, (176 + ( ( CurrRow ) * 15 ) ), 419, ( (176 + 15) + ( ( CurrRow ) * 15 ) ) ); + break; + } + setcolor(0); + Buff_int = (CurrRow + CurrTopLine); + } + if ( Ultima == 1 ) + Buff_int = 10000; + + sprintf( Buffer, " %04d", ( CurrRow + CurrTopLine ) ); + outtextxy( 10, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + switch ( Programa[Buff_int].Comando ) { + case ReadNop : + sprintf( Buffer, "ReadNop" ); + break; + case Fun : + sprintf( Buffer, "FUN " ); + break; + case Ld : + sprintf( Buffer, "Ld " ); + break; + case Or : + sprintf( Buffer, "Or " ); + break; + case And : + sprintf( Buffer, "And " ); + break; + case _Out : + sprintf( Buffer, "Out " ); + break; + case Tim : + sprintf( Buffer, "Tim " ); + break; + case Cnt : + sprintf( Buffer, "Cnt " ); + break; +/* + case _Tr : + sprintf( Buffer, "Tr " ); + break; +*/ + case End : + sprintf( Buffer, "End (01)" ); + break; + case Il : + sprintf( Buffer, "Il (02)" ); + break; + case Ilc : + sprintf( Buffer, "Ilc (03)" ); + break; + case Sft : + sprintf( Buffer, "Sft (10)" ); + break; + case Keep : + sprintf( Buffer, "Keep (11)" ); + break; + case DifU : + sprintf( Buffer, "DifU (13)" ); + break; + case DifD : + sprintf( Buffer, "DifD (14)" ); + break; + case TimH : + sprintf( Buffer, "TimH (15)" ); + break; + case Cmp : + sprintf( Buffer, "Cmp (15)" ); + break; + case Mov : + sprintf( Buffer, "Mov (21)" ); + break; + case Mvn : + sprintf( Buffer, "Mvn (22)" ); + break; + case Add : + sprintf( Buffer, "Add (30)" ); + break; + case Sub : + sprintf( Buffer, "Sub (31)" ); + break; + case Stc : + sprintf( Buffer, "Stc (40)" ); + break; + case Clc : + sprintf( Buffer, "Clc (41)" ); + break; + default : + sprintf( Buffer, "Error " ); + break; + } +if ( Programa[Buff_int].Comando != Add && Programa[Buff_int].Comando != Sub ) + switch ( Programa[Buff_int].Parametros ) { + case 0 : + break; + case P_Ld : + strcat( Buffer, "Ld " ); + break; + case P_Tr : + strcat( Buffer, "Tr " ); + break; + case P_Hr : + strcat( Buffer, "Hr " ); + break; + case P_Cnt : + strcat( Buffer, "Cnt " ); + break; + case P_Tim : + strcat( Buffer, "Tim " ); + break; + case P_Keep : + strcat( Buffer, "Keep " ); + break; + case P_Not : + strcat( Buffer, "Not " ); + break; + case P_Not_Tr : + strcat( Buffer, "Not Tr" ); + break; + case P_Not_Hr : + strcat( Buffer, "Not Hr" ); + break; + case P_Not_Cnt : + strcat( Buffer, "Not Cnt" ); + break; + case P_Not_Tim : + strcat( Buffer, "Not Tim" ); + break; + case P_Keep_Hr : + strcat( Buffer, "Keep Hr" ); + break; + case P_Tim_Data : + strcat( Buffer, "Tim Data" ); + break; + case P_Out : + strcat( Buffer, "Out " ); + break; + default : + strcat( Buffer, "Error " ); + break; + } + outtextxy( 105, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + switch( Programa[Buff_int].Comando ) { + case ReadNop : + case End : + case Il : + case Ilc : + break; + case Tim : + case TimH: + case Cnt : + case Cmp : + case Sft : + case Mov : + case Mvn : + switch( CurrCol ) { + case 1: + sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); + outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + setcolor(CFG.Colores.Texto ); +// sprintf( Buffer, "# % 4d", Programa[Buff_int].SubDato ); +// outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + sprintf( Buffer, " #% 5d", Programa[Buff_int].SubDato ); + outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + break; + case 3: +// sprintf( Buffer, "# % 4d", Programa[Buff_int].SubDato ); + sprintf( Buffer, " #% 5d", Programa[Buff_int].SubDato ); + outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + +// outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + setcolor(CFG.Colores.Texto ); + sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); + outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + break; + default: + break; + } + break; + case Add : + case Sub : + switch( CurrCol ) { + case 1: + sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); + outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + setcolor(CFG.Colores.Texto ); + sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); + outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); + outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + break; + case 2: + sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); + outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + setcolor(CFG.Colores.Texto ); + sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); + outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); + outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + break; + case 3: + sprintf( Buffer, "Ch %02d", Programa[Buff_int].Parametros ); + outtextxy( /*334*/360, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + setcolor(CFG.Colores.Texto ); + sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); + outtextxy( /*334*/242, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); + outtextxy( /*334*/301, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + + break; + default: + break; + } + + break; + + + default: + sprintf( Buffer, " %04d", Programa[Buff_int].Dato ); + outtextxy( /*334*/331, (176 + ( ( CurrRow ) * 15 ) ), Buffer ); + break; + } + + + + + + + +} + +void PrintVisorLCD ( char Ultima ) +{ + char Buffer[80] ; + int Buff_int ; + settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); +// Solo 11 Lineas de 5 puntos + + setfillstyle( SOLID_FILL, 0 ); + bar( 242, 101, 419, 129 ); + setcolor(CFG.Colores.VisorLCD ); + + + if ( Ultima == 1 ) + Buff_int = 10000; + else + Buff_int = (CurrRow + CurrTopLine); + + // Direccin + sprintf( Buffer, "%04d", ( CurrRow + CurrTopLine ) ); + outtextxy( 243, 100, Buffer ); + + switch ( Programa[Buff_int].Comando ) { + case ReadNop : + outtextxy( 243, 100, " Read" ); + sprintf( Buffer, " Nop (00)" ); + break; + case Fun : + sprintf( Buffer, " FUN" ); + break; + case Ld : + sprintf( Buffer, " Ld " ); + break; + case Or : + sprintf( Buffer, " Or " ); + break; + case And : + sprintf( Buffer, " And " ); + break; + case _Out : + sprintf( Buffer, " Out " ); + break; + case Tim : + if ( CurrCol == 1 ) + sprintf( Buffer, " Tim " ); + else + sprintf( Buffer, " Tim Data" ); + break; + case Cnt : + if ( CurrCol == 1 ) + sprintf( Buffer, " Cnt " ); + else + sprintf( Buffer, " Cnt Data" ); + break; +/* + case _Tr : + sprintf( Buffer, " Tr " ); + break; +*/ + case End : + sprintf( Buffer, " End (01)" ); + break; + case Il : + sprintf( Buffer, " Il (02)" ); + break; + case Ilc : + sprintf( Buffer, " Ilc (03)" ); + break; + case Sft : + if ( CurrCol == 1 ) + sprintf( Buffer, " Sft (10)" ); + else + sprintf( Buffer, " Sft ]Ch" ); + break; + case Keep : + sprintf( Buffer, " Keep (11)" ); + break; + case DifU : + sprintf( Buffer, " DifU (13)" ); + break; + case DifD : + sprintf( Buffer, " DifD (14)" ); + break; + case TimH : + if ( CurrCol == 1 ) + sprintf( Buffer, " TimH (15)" ); + else + sprintf( Buffer, " TimH Data" ); + break; + case Cmp : + if ( CurrCol == 1 ) + sprintf( Buffer, " Cmp (15)" ); + else + sprintf( Buffer, " Cmp Data" ); + break; + case Mov : + if ( CurrCol == 1 ) + sprintf( Buffer, " Mov (21)" ); + else + sprintf( Buffer, " Mov Data" ); + break; + case Mvn : + if ( CurrCol == 1 ) + sprintf( Buffer, " Mvn (22)" ); + else + sprintf( Buffer, " Mvn Data" ); + break; + case Add : + if ( CurrCol == 1 ) + sprintf( Buffer, " Add (30)" ); + else + if ( CurrCol == 2 ) + sprintf( Buffer, " Add Data" ); + else + sprintf( Buffer, " Add to Channel" ); + break; + case Sub : + if ( CurrCol == 1 ) + sprintf( Buffer, " Sub (31)" ); + else + if ( CurrCol == 2 ) + sprintf( Buffer, " Sub Data" ); + else + sprintf( Buffer, " Sub to Channel" ); + break; + case Stc : + sprintf( Buffer, " Stc (40)" ); + break; + case Clc : + sprintf( Buffer, " Clc (41)" ); + break; + default : + sprintf( Buffer, " Error " ); + break; + } +if ( Programa[Buff_int].Comando != Add && Programa[Buff_int].Comando != Sub ) { + switch ( Programa[Buff_int].Parametros ) { + case 0 : + break; + case P_Ld : + strcat( Buffer, "Ld" ); + break; + case P_Tr : + strcat( Buffer, "Tr" ); + break; + case P_Hr : + strcat( Buffer, "Hr" ); + break; + case P_Cnt : + strcat( Buffer, "Cnt" ); + break; + case P_Tim : + strcat( Buffer, "Tim" ); + break; + case P_Keep : + strcat( Buffer, "Keep" ); + break; + case P_Not : + strcat( Buffer, "Not" ); + break; + case P_Not_Tr : + strcat( Buffer, "Not Tr" ); + break; + case P_Not_Hr : + strcat( Buffer, "Not Hr" ); + break; + case P_Not_Cnt : + strcat( Buffer, "Not Cnt" ); + break; + case P_Not_Tim : + strcat( Buffer, "Not Tim" ); + break; + case P_Keep_Hr : + strcat( Buffer, "Keep Hr" ); + break; + case P_Tim_Data : + strcat( Buffer, "Tim Data" ); + break; + case P_Out : + strcat( Buffer, "Out" ); + break; + default : + strcat( Buffer, "Error" ); + break; + } +} + outtextxy( 243, 115, Buffer ); + switch( Programa[Buff_int].Comando ) { + case ReadNop : + case End : + case Il : + case Ilc : + sprintf( Buffer, " "); + break; + case Tim : + case TimH : + case Cnt : + case Cmp : + case Sft : + case Mov : + case Mvn : + switch( CurrCol ) { + case 1: + sprintf( Buffer, " %02d", Programa[Buff_int].Dato ); + break; + case 3: + sprintf( Buffer, "#% 5d", Programa[Buff_int].SubDato ); + break; + default: + break; + } + break; + case Add : + case Sub : + switch( CurrCol ) { + case 1: + sprintf( Buffer, "# %04d", Programa[Buff_int].Dato ); + break; + case 2: + sprintf( Buffer, "# %04d", Programa[Buff_int].SubDato ); + break; + case 3: + sprintf( Buffer, " Ch %02d", Programa[Buff_int].Parametros ); + break; + default: + break; + } + + break; + + + default : + sprintf( Buffer, " %04d", Programa[Buff_int].Dato ); + break; + } + + outtextxy( 373, 115, Buffer ); + + + + + + + +} + +void BuscarItem(void) +{ +} +void GetProgram(void) +{ +} +void SendProgram(void) +{ +} +void AddRow( char Arriba_Abajo ) +{ + + int avance, Stop; + + if ( Arriba_Abajo == 0 && (CurrRow+CurrTopLine) == 0 ) return; + if ( Arriba_Abajo == 1 && (CurrRow+CurrTopLine) == 9999 ) return; + + if ( Arriba_Abajo == 0 ) + Stop = CurrRow + CurrTopLine - 1; + else + Stop = CurrRow + CurrTopLine + 1; + // Comienza proceso de eliminacin + avance = 9999; + do{ + Programa[avance + 1] = Programa[avance]; + avance--; + }while(avance >= Stop ); + + + if ( Arriba_Abajo == 0 ) + Stop++; + + Programa[Stop].Comando = 0; + Programa[Stop].Parametros = 0; + Programa[Stop].Dato = 0; + Programa[Stop].SubDato = 0; + + avance = CurrRow; CurrRow = 0; + PrintWholeScreen(); + if ( (CurrRow = avance + ( (Arriba_Abajo==0) ? (0) : (1) )) <0 ) + { + CurrRow = 0; + UpRow(); + } + if ( CurrRow > 10 ) + { + CurrRow = 10; + DownRow(); + } + + + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + +} + +void DelRow(void) +{ + + int avance; + // Comienza proceso de eliminacin + avance = CurrRow + CurrTopLine; + do{ + Programa[avance] = Programa[avance+1]; + avance++; + }while(avance < 10000 ); + + Programa[9999].Comando = 0; + Programa[9999].Parametros = 0; + Programa[9999].Dato = 0; + Programa[9999].SubDato = 0; + + avance = CurrRow; CurrRow = 0; + PrintWholeScreen(); + CurrRow = avance; + Programa[10000] = Programa[CurrRow + CurrTopLine ]; +} + + +void UpRow(void) +{ + + if( CurrCol > 1 ) Select_Columna_Up(); + else + if ( ( CurrRow + CurrTopLine ) <= 0 ) BEEP(); // Rebasado n de lineas + else { + + if ( Select_Columna_Up() == 1 ) { + if ( ( CurrRow ) <= 0 ) + { + CurrTopLine -= 11; + if ( CurrTopLine < 0 ) CurrTopLine = 0; + CurrRow = 0; + PrintWholeScreen(); + CurrRow = 10; + Select_Columna_Up(); + PrintCurrLine ( 1, 0 ); + }else{ + CurrRow--; + Select_Columna_Up(); + PrintCurrLine ( 0, 0 ); + } + } else + PrintCurrLine ( 0, 0 ); + + } + +} + + + +void DownRow(void) +{ + + if ( ( CurrRow + CurrTopLine ) >= 9999 ) BEEP(); // Rebasado n de lineas + else { + + if ( Select_Columna_Down() == 1 ) { + if ( ( CurrRow ) >= 10 ) + { + CurrRow = 0; + CurrTopLine += 11; + if ( CurrTopLine + CurrRow > 9999 ) CurrTopLine = ( 9999 - 10 ); + PrintWholeScreen(); + Select_Columna_Down(); + PrintCurrLine ( 1, 0 ); + }else{ + CurrRow++; + Select_Columna_Down(); + PrintCurrLine ( 0, 0 ); + } + } else { + PrintCurrLine ( 0, 0 ); + } + + } + +} +void LoadProgram(void) +{ + char Buffer[500] = "*.PLC"; + +struct Cabecera { + char Nombre_del_Programa[70]; + char Comentario_Inicial[70]; + char VerHi, VerLow; + char Register; + long Records; +}; +Cabecera C_PLC; + + if ( file_browser( Buffer, "Cargar Programa PLC", 0 ) ) { + FILE *handle_Load; + + if ( (handle_Load = fopen( Buffer, "rb") ) == NULL ) Muestra_Mensaje(200, "PLC.DAT"); + fread ( &C_PLC, sizeof( struct Cabecera ), 1, handle_Load ); + if ( C_PLC.VerHi == 2 && C_PLC.VerLow == 0 ) { + fread ( Programa, sizeof(FirmWare), 10000, handle_Load ); + fread ( Ram, sizeof(MemoriaRam), 1, handle_Load ); + } + fclose(handle_Load); + + CurrRow = 0; CurrTopLine = 0; + PrintWholeScreen(); + PrintCurrLine( 1, 0 ); + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + ReImprimeCanal_Out(CurrCh_Out); + ReImprimeCanal_In(CurrCh_In); + } +/* +char drive[MAXDRIVE]; +char dir[MAXDIR]; +char file[MAXFILE]; +char ext[MAXEXT]; +int flags; + +flags=fnsplit(Buffer,drive,dir,file,ext); + + if( !strcmpi( file, "SFT" ) || !strcmpi( file, "CNT" ) + ||!strcmpi( file, "KEEP(11)") || !strcmpi( file, "DIFD(14)" ) + ||!strcmpi( file, "DIFU(13)") ) + Run(); +*/ + +} +void WriteProgram(void) +{ + char Buffer[500] = "*.PLC"; + char Buffer2[13]; +struct Cabecera { + char Nombre_del_Programa[70]; + char Comentario_Inicial[70]; + char VerHi, VerLow; + char Register; + long Records; +}; +Cabecera C_PLC; + +sprintf( C_PLC.Nombre_del_Programa, "P.L.C\nJse David Guilln\n%c", 26 ); +C_PLC.VerHi = 2; C_PLC.VerLow = 0; +C_PLC.Register = 1; C_PLC.Records = 1; + + if ( file_browser( Buffer, "Salvar Programa PLC", 1 ) ) { + +char drive[MAXDRIVE]; +char dir[MAXDIR]; +char file[MAXFILE]; +char ext[MAXEXT]; +int flags; + +flags=fnsplit(Buffer,drive,dir,file,ext); +if( !(flags & EXTENSION) ) + strcpy( ext, ".PLC" ); +fnmerge(Buffer ,drive,dir,file,ext); + + + FILE *handle_Save; + + if ( (handle_Save = fopen( Buffer, "wb") ) == NULL ) Muestra_Mensaje(200, "PLC.DAT"); + fwrite( &C_PLC, sizeof( struct Cabecera ), 1, handle_Save ); + fwrite( Programa, sizeof(FirmWare), 10000, handle_Save ); + fwrite( Ram, sizeof(MemoriaRam), 1, handle_Save ); + fclose(handle_Save); + + CurrRow = 0; CurrTopLine = 0; + PrintWholeScreen(); + PrintCurrLine( 1, 0 ); + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + } +} +void Configurar(void) +{ + +/* +struct Colores { + char Texto; + char F_Texto; + char VisorLCD; +}; + +typedef struct { + + struct Colores Colores; + char PcOut.Bit; + char TimeFlow.Bit; + char Int8.Bit; + +} Configuracion; +Configuracion CFG; +*/ + char Boton_Pulsado, ok = 0, C_Texto = 5; + + setfillstyle(SOLID_FILL, 0); + bar( 9, 372, 542, 471); + + Imprime_Secuencia(5); +// Fichero_bot(20); + Imprime_Estaticos(20, "PLC.dat"); + + Imprime_Bordes(5, 5, CFG.Colores.Texto); + if ( CFG.Int8.Bit ) Imprime_Bordes(5, 2, 4); + if ( CFG.PcOut.Bit ) Imprime_Bordes(5, 3, 4); + if ( CFG.TimeFlow.Bit ) Imprime_Bordes(5, 4, 4); + + +do{ + Boton_Pulsado = Comprueba_Secuencia( 5 ); + switch(Boton_Pulsado ) { // Iniciamos comprobacion + + case 0: // No se pulso ningun BOTON + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + case -2: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + // Retroceder + case 1 : + ok = 1; + break; + // Usar Int8.Bit + case 2 : + if ( CFG.Int8.Bit ) { + CFG.Int8.Bit = 0; + Imprime_Bordes(5, 2, -1); + } else { + CFG.Int8.Bit = 1; + Imprime_Bordes(5, 2, 4); + } + break; + // Usar Pc_Out + case 3 : + if ( CFG.PcOut.Bit ) { + CFG.PcOut.Bit = 0; + Imprime_Bordes(5, 3, -1); + } else { + CFG.PcOut.Bit = 1; + Imprime_Bordes(5, 3, 4); + } + break; + // Usar TimeFlow.Bit + case 4 : + if ( CFG.TimeFlow.Bit ) { + CFG.TimeFlow.Bit = 0; + Imprime_Bordes(5, 4, -1); + } else { + CFG.TimeFlow.Bit = 1; + Imprime_Bordes(5, 4, 4); + } + break; + // Texto + case 5 : + C_Texto = 5; + Imprime_Bordes(5, 5, CFG.Colores.Texto); + Imprime_Bordes(5, 6, -1); + Imprime_Bordes(5, 7, -1); + break; + // Texto Sealado + case 6 : + C_Texto = 6; + Imprime_Bordes(5, 5, -1); + Imprime_Bordes(5, 6, CFG.Colores.F_Texto); + Imprime_Bordes(5, 7, -1); + break; + // Visor LCD + case 7 : + C_Texto = 7; + Imprime_Bordes(5, 5, -1); + Imprime_Bordes(5, 6, -1); + Imprime_Bordes(5, 7, CFG.Colores.VisorLCD); + break; + + case 8 : + case 9 : + case 10 : + case 11 : + case 12 : + + case 13 : + case 14 : + case 15 : + case 16 : + case 17 : + + case 18 : + case 19 : + case 20 : + case 21 : + case 22 : + switch ( C_Texto ) { + case 5: + CFG.Colores.Texto = ( Boton_Pulsado - 7); + Imprime_Bordes(5, 5, CFG.Colores.Texto); + break; + case 6: + CFG.Colores.F_Texto = ( Boton_Pulsado - 7 ); + Imprime_Bordes(5, 6, CFG.Colores.F_Texto); + break; + case 7: + CFG.Colores.VisorLCD = ( Boton_Pulsado - 7 ); + Imprime_Bordes(5, 7, CFG.Colores.VisorLCD); + break; + } + + break; + + default: + break; + } + +}while(!ok); + + + if ( Optar( "Cambios en la configuracin.", " SALVAR ?", "") == 1 ) + CFG_File( Salvar ); + else + CFG_File( Cargar ); + + setfillstyle(SOLID_FILL, 0); + bar( 9, 372, 542, 471); + +} + +void BEEP(void) +{ +} + +int Select_Columna_Up(void){ + +int back = 0; + // Antes de Bajar una linea, mira si se ha de bajar una linea REAL + // o una linea VIRTUAL + switch( Programa[CurrRow + CurrTopLine].Comando ){ + case Tim: + case Cnt: + case Sft: + case Cmp: + case Mov: + case Mvn: + case TimH: + if ( CurrCol == 3 ) { CurrCol = 1; } + else + if ( CurrCol == 1 ) { CurrCol = 0; back = 1; } + else + if ( CurrCol == 0 ) { CurrCol = 3; } + break; + case Add: + case Sub: + if ( CurrCol == 3 ) { CurrCol = 2; } + else + if ( CurrCol == 2 ) { CurrCol = 1; } + else + if ( CurrCol == 1 ) { CurrCol = 0; back = 1; } + else + if ( CurrCol == 0 ) { CurrCol = 3; } + break; + default: + CurrCol = 0; + back = 1; + break; + } +return back; +} + + + +int Select_Columna_Down(void){ + +int back = 0; + // Antes de Bajar una linea, mira si se ha de bajar una linea REAL + // o una linea VIRTUAL + switch( Programa[CurrRow + CurrTopLine].Comando ){ + case Tim: + case Cnt: + case Sft: + case Cmp: + case Mov: + case Mvn: + case TimH: + if ( CurrCol == 0 ) { CurrCol = 1; } + else + if ( CurrCol == 1 ) { CurrCol = 3; } + else + if ( CurrCol == 3 ) { CurrCol = 0; back = 1; } + break; + case Add: + case Sub: + if ( CurrCol == 0 ) { CurrCol = 1; } + else + if ( CurrCol == 1 ) { CurrCol = 2; } + else + if ( CurrCol == 2 ) { CurrCol = 3; } + else + if ( CurrCol == 3 ) { CurrCol = 0; back = 1; } + break; + default: + CurrCol = 0; + back = 1; + break; + } + +return back; +} + + + +void Numero_Pulsado(char numero) { + // Vemos si posee dato secundario... + // y lo canalizamos a su posicin correcta + switch( Programa[10000].Comando ) { + case Tim : + case TimH: + case Cnt : + case Cmp : + case Sft : + case Mov : + case Mvn : + if ( CurrCol == 1 ) + Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 10 ) * 10 ) ) * 10 ) + numero ); + else + if ( CurrCol == 3 ) + Programa[10000].SubDato = ( ( ( Programa[10000].SubDato - ( ( Programa[10000].SubDato / 1000 ) * 1000 ) ) * 10 ) + numero ); + break; + case Add : + case Sub : + if ( CurrCol == 1 ) + Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 1000 ) * 1000 ) ) * 10 ) + numero ); + else + if ( CurrCol == 2 ) + Programa[10000].SubDato = ( ( ( Programa[10000].SubDato - ( ( Programa[10000].SubDato / 1000 ) * 1000 ) ) * 10 ) + numero ); + else + if ( CurrCol == 3 ) + Programa[10000].Parametros = ( ( ( Programa[10000].Parametros - ( ( Programa[10000].Parametros / 10 ) * 10 ) ) * 10 ) + numero ); + break; + default: + CurrCol = 0; + Programa[10000].Dato = ( ( ( Programa[10000].Dato - ( ( Programa[10000].Dato / 1000 ) * 1000 ) ) * 10 ) + numero ); + break; + } +} + + +void MuestraLCD( char *texto1, char *texto2) +{ + char Buffer[20]; + setfillstyle( SOLID_FILL, 0 ); + bar( 242, 101, 419, 129 ); + setcolor(CFG.Colores.VisorLCD ); + + sprintf( Buffer, "%04d", ( CurrRow + CurrTopLine ) ); + outtextxy( 243, 100, Buffer ); + outtextxy( 243, 100, texto1 ); + outtextxy( 243, 115, texto2 ); + +} + + + +void CFG_File( char Cargar_Salvar ) { + + FILE *handle_CFG; + +if ( Cargar_Salvar == Cargar ) { + if ( ( handle_CFG = fopen( "PLC.CFG", "rb") ) == NULL ) { + + ( handle_CFG = fopen( "PLC.CFG", "wb") ); + CFG.Colores.Texto = 2; + CFG.Colores.F_Texto =14; + CFG.Colores.VisorLCD= 6; + CFG.PcOut.Bit = 0; + CFG.TimeFlow.Bit = 0; + CFG.Int8.Bit = 0; + fwrite( &CFG, sizeof(Configuracion), 1, handle_CFG ); + fclose( handle_CFG ); + } else { + fread( &CFG, sizeof(Configuracion), 1, handle_CFG ); + fclose( handle_CFG ); + } +} else { + + if ( ( handle_CFG = fopen( "PLC.CFG", "wb") ) == NULL ) { + CFG.Colores.Texto = 2; + CFG.Colores.F_Texto =14; + CFG.Colores.VisorLCD= 6; + CFG.PcOut.Bit = 0; + CFG.TimeFlow.Bit = 0; + CFG.Int8.Bit = 0; + } else { + fwrite( &CFG, sizeof(Configuracion), 1, handle_CFG ); + fclose( handle_CFG ); + } +} + +} \ No newline at end of file diff --git a/PLC_FILE.CPP b/PLC_FILE.CPP new file mode 100644 index 0000000..52dfd65 --- /dev/null +++ b/PLC_FILE.CPP @@ -0,0 +1,595 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON + +//extern int Fichero_bot(char Dinamicos_Estaticos); + + +//////////////////////////////////////////////////////////////////////////// +/***************************************************************************\ +| Critical Disk Error handling routines (C) 1995 Jason Speight. | +| void interrupt critical_error_handler(__CPPARGS) is the interrupt which | +| captures disk io errors. (int 0x24, if you're interested!) Such errors | +| are : Disk not inserted in drive, seek error reading from a drive, general| +| disk failure etc. The only things the interrupt does is : | +| Suppress the dos ABORT,RETRY,FAIL,IGNORE statement | +| Sets a variable erroroccurred to the dos error statement. (!=0) | +| | +| StartCEH() and StopCEH() start and stop the error handler. YOU MUST | +| STOPCEH BEFORE THE EXIT OF THE PROGRAM. or else when you get a disk | +| error, the int 24 issued bu DOS points to the middle of nowhere! *HANG* | +| | +| diskerror() is my routine to display a disk IO error. It also sets the | +| global variable erroroccurred to 0 for future use. This procedure also | +| needs access to "SCRNHNDL.H" and "BOXES.H" | +| | +| BTW, anybody know how to trap the message "PLEASE INSERT DISK FOR DRIVE x"| +\***************************************************************************/ + +//for interrupt handlers +void interrupt critical_error_handler(.../*__CPPARGS*/); // interrupt prototype +void interrupt (*old_int24)(.../*__CPPARGS*/); // interrupt function pointer +void startceh(); +void stopceh(); + +int erroroccurred=0; + +//////////////////////////////////////////////////////////////////////////// +struct Colores { + char Texto; + char F_Texto; + char VisorLCD; +}; + +typedef struct { + + struct Colores Colores; + +} Configuracion; +extern Configuracion CFG; + +typedef struct { + char files[13] ; //200 files, 12 byte filename (+1 for terminator!) + long filesize ; //Try as static.. free up that ram, bud. (Use HUGE mem model) + unsigned char attrs ; +} SFile; + +SFile *S_File; + +void FileDownRow(void); +void FileUpRow(void) ; +void PrintWholeScreen_Files(void); +void PrintSelectRow( char Hide_Show ); + +unsigned char FileRow = 0; int FileCurrTopRow = 0; +unsigned int maxfiles=0; +unsigned int rasterscan(char *fm); +char Archivo[13]; +void PrintVisor(void); + +char Optar( char *texto1, char *texto2, char *texto3 ); + +int InputCadenaG(char *s, int numalp, int lmax, int cc, int cf, int left, int up, int right, int down); + +char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ); + +char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ){ + + int ok = 0, inst = 0; + struct textsettingstype textinfo; + char oldpath[229]=" -- NONE -- "; //internal. do not change + unsigned char olddrive=255; //impossible drive name + char olddisk, key; + + startceh(); + + FileRow = FileCurrTopRow = 0; + + olddrive = getdisk(); + getcwd( oldpath, 229 ); + + void *C_Texto; + +C_Texto = malloc( JD_imagesize(240, 140, 400, 340) ); +S_File = (SFile *)malloc( sizeof(SFile) * 201 ); + +if( C_Texto == NULL || S_File == NULL ) { + closegraph(); + cprintf("\n\rSALIENDO"); + cprintf("\n\rImposible encontrar %ldKbytes en el Heap", ( JD_imagesize(240, 140, 400, 340) + sizeof(SFile)*201 ) ); + return 0; +} + +rasterscan( comodin_name ); + +gettextsettings(&textinfo); + +getimage( 240, 140, 400, 340, C_Texto); + + + Imprime_Estaticos( 10, "PLC.DAT"); // Imprime botones estaticos 'Seccion 20' +//Fichero_bot(10); + + +settextstyle( SMALL_FONT, HORIZ_DIR, 4); + +setcolor( 1 ); +outtextxy( 250+( ( 141 - textwidth(texto1) ) / 2 ), 150, texto1 ); + +PrintWholeScreen_Files(); +PrintSelectRow( 1 ); + + +while(!ok){ // Bucle infinito + + switch( Comprueba_Secuencia( 4 ) ) { // Iniciamos comprobacion de 2 sec + + case 0: // No se pulso ningun BOTON + // Pero el raton fue presionado en + // algun sitio... + break; + case -2: // Hay una tecla normal en BUFFER + switch( key = getch() ) { // La utilizamos + // ESC ( CANCELAR ) + case 27: + inst = 0; + ok = 1; + break; + case 13: + switch( S_File[FileRow + FileCurrTopRow].attrs ) + { + // Si directorio: cambiamos simplemente + case FA_DIREC: + chdir( S_File[FileRow + FileCurrTopRow].files ); + FileRow = FileCurrTopRow = 0; + rasterscan( comodin_name ); + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + break; + // Si unidad comprobamos que podemos cambiar y como directorio... + case 255: + erroroccurred=0; + olddisk=getdisk(); + setdisk( (S_File[FileRow + FileCurrTopRow].files[0] - 'A') ); + if (erroroccurred) { + setdisk(olddisk); + } else { + FileRow = FileCurrTopRow = 0; + rasterscan( comodin_name ); + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + } + break; + default: + if ( strcmp(Archivo, S_File[FileRow+FileCurrTopRow].files) == 0 ) + { + if ( Cargar_Salvar == 0 ) { + if ( access(Archivo, 0) != 0) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + } + } + strcpy(Archivo, S_File[FileRow+FileCurrTopRow].files); + PrintVisor(); + break; + } + + break; + default: + strcpy( Archivo, "\0" ); + ungetch(key); + InputCadenaG(Archivo, 0, 12, 0, CFG.Colores.F_Texto, 252, 171, 373, 178); + if (Cargar_Salvar == 0) + { + // Comprobamos que existe el fichero + if ( access(Archivo, 0) != 0) + strcpy( Archivo, "\0" ); + } + PrintVisor(); + break; + } + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + // Boton Aceptar + case 2: + if ( Cargar_Salvar == 0 ) { + if ( access(Archivo, 0) != 0) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + } else { + if ( access(Archivo, 0) == 0) + if ( Optar( "Fichero Existe", " Reemplazarlo ?","" ) == 0 ) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + + } + break; + // Boton Cancelar + case 1: + inst = 0; + ok = 1; + break; + // Boton Subir + case 3: + FileUpRow(); + break; + // Boton Bajar + case 4: + FileDownRow(); + break; + default: + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + } + +} + +putimage( 240, 140, C_Texto, COPY_PUT); + +free ( C_Texto ); +free ( S_File ); + +settextstyle(textinfo.font, textinfo.direction, textinfo.charsize ); +settextjustify(textinfo.horiz, textinfo.vert); + + + setdisk(olddrive); + chdir(oldpath); + + +stopceh(); + +return inst; + +} + + + +unsigned int rasterscan(char *fm) { + struct ffblk ffblk; + char done=0; + unsigned int olddisk; + maxfiles = 0; + +// build a disk drive availiable list + olddisk=getdisk(); + for (int i=1;i<27;i++) if (_chdrive(i) == 0) + { + sprintf( S_File[maxfiles].files, "%c:", (char)('A' + i - 1) ); + S_File[maxfiles].filesize=0; + S_File[maxfiles].attrs=255; // Unidad + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + + } + setdisk(olddisk); + +// drivelist[2]='N'; //stop access to B drive until I sort out pahntom dive probs +//Ok, Drive B may be a phantom drive. If you try to access drive B, then +//the program looses controll. Bummer! +// needs debugging. (always ignores drive b...) +// asm int 0x11 +// asm mov equipmentlist,ax +// drivelist[2]='N'; +// if ((equipmentlist & 16)) drivelist[2]='Y'; + + + done = findfirst("*.*",&ffblk,FA_DIREC); + while (!done) { + if (ffblk.ff_attrib == 0x10) { + strcpy(S_File[maxfiles].files,ffblk.ff_name); + S_File[maxfiles].filesize=ffblk.ff_fsize; + S_File[maxfiles].attrs=ffblk.ff_attrib; + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + } + done = findnext(&ffblk); + if (maxfiles==200) done=!done; //stop to prevent internal crashes. + } + + done = findfirst(fm,&ffblk,FA_DIREC); + while (!done) { + if (ffblk.ff_attrib != 0x10) { + strcpy(S_File[maxfiles].files,ffblk.ff_name); + S_File[maxfiles].filesize=ffblk.ff_fsize; + S_File[maxfiles].attrs=ffblk.ff_attrib; + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + } + done = findnext(&ffblk); + if (maxfiles==200) done=!done; //stop to prevent internal crashes. + } + if (maxfiles==0) { //no files to browse + strcpy(S_File[0].files," -- NONE -- "); + S_File[0].filesize=-1; + maxfiles=1;} + strcpy(S_File[200].files," -- NONE -- "); + S_File[200].filesize=-1; + return maxfiles; +} + + + +void PrintWholeScreen_Files(void ) +{ + + int OldFileRow = FileRow ; + char Contador; + + setfillstyle( SOLID_FILL, 0 ); + bar(252, 187, 372, 327); + + PrintSelectRow ( 0 ); + for ( FileRow = 0; FileRow < 14; FileRow++ ) + if ( ( FileRow + FileCurrTopRow ) < maxfiles ) + PrintSelectRow ( 0 ); + + + FileRow = OldFileRow; + + +} + +void PrintSelectRow( char Hide_Show ) +{ + + char Buffer[80]; + char Buff1[10]; + char Buff2[10]; + if ( Hide_Show==0 ) + { + setfillstyle( SOLID_FILL, 0 ); + bar(252, 188 + ( FileRow * 10 ) , 373, 187 + 10 + ( FileRow * 10 ) ); + setcolor( CFG.Colores.Texto ); + } else { + setfillstyle( SOLID_FILL, CFG.Colores.F_Texto ); + bar(252, 188 + ( FileRow * 10 ) , 373, 187 + 10 + ( FileRow * 10 ) ); + setcolor(0); + } + +switch( S_File[FileRow + FileCurrTopRow].attrs ) +{ + case FA_DIREC: + sprintf(Buffer, "%-13s < DIR >", S_File[FileRow+FileCurrTopRow].files +// strncpy( Buff1, S_File[FileRow+FileCurrTopRow].files, 8)//, +// strrev(strncpy( Buff2, strrev(S_File[FileRow+FileCurrTopRow].files), 3)) +); + break; + case 255: + sprintf(Buffer, "%-8s >DRIVER<", strncpy( Buff1, S_File[FileRow+FileCurrTopRow].files, 8) ); + break; + default: + + sprintf(Buffer, "%-13s", S_File[FileRow+FileCurrTopRow].files); + outtextxy( 252 , 187 + ( FileRow * 10 ) , Buffer ); + sprintf(Buffer, " %7lu", S_File[FileRow+FileCurrTopRow].filesize ); + +// sprintf(Buffer, "%-13s%7lu", S_File[FileRow+FileCurrTopRow].files, +// S_File[FileRow+FileCurrTopRow].filesize ); + break; +} + + outtextxy( 252 , 187 + ( FileRow * 10 ) , Buffer ); + +} + +void FileDownRow(void) +{ + + // Estoy en la linea fisica 000 ??? + if ( (FileRow + FileCurrTopRow) != (maxfiles - 1) ) { + + // Linea 0, Baja Con retroceso multiple + if ( FileRow == 13 ) { + FileCurrTopRow += 14; + while ( (FileCurrTopRow + FileRow) > maxfiles ) FileCurrTopRow--; + FileRow = 0; + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + } else { + PrintSelectRow( 0 ); + FileRow++; + PrintSelectRow( 1 ); + } + + } +} + +void FileUpRow(void) +{ + + // Estoy en la linea fisica 000 ??? + if ( (FileRow + FileCurrTopRow) != 0 ) { + + // Linea 0, Baja Con retroceso multiple + if ( FileRow == 0 ) { + FileCurrTopRow -= 14; + if ( FileCurrTopRow < 0 ) FileCurrTopRow = 0; + FileRow = 0; + PrintWholeScreen_Files(); + FileRow = 13; + PrintSelectRow( 1 ); + } else { + PrintSelectRow( 0 ); + FileRow--; + PrintSelectRow( 1 ); + } + + } +} + + + +/* +void diskerror(void) { +char message[30]; + pushscreen(); + draw3dboxup(19,10,43,6); + draw3dboxdn(21,11,39,4); + switch (erroroccurred) { + case 1 : strcpy(message,"Write Protected Disk"); break; + case 2 : strcpy(message,"Drive Not Ready"); break; + case 3 : strcpy(message,"Unknown Command"); break; + case 4 : strcpy(message,"Data Error (CRC)"); break; + case 5 : strcpy(message,"Bad Request Structure Length"); break; + case 6 : strcpy(message,"Seek Error"); break; + case 7 : strcpy(message,"Unknown Media Type"); break; + case 8 : strcpy(message,"Sector Not Found"); break; + case 9 : strcpy(message,"Printer Out Of Paper"); break; + case 10: strcpy(message,"Write Fault"); break; + case 11: strcpy(message,"Read Fault"); break; + case 12: strcpy(message,"General Failure"); break; + default: strcpy(message,"Unknown Error"); + } + + printcentered(12,"Error - Press any key to continue",0x74); + printcentered(13,message,0x70); + getch(); + popscreen(); + erroroccurred=0; +} +*/ + +void interrupt critical_error_handler(.../*__CPPARGS*/) { + asm push ax //preserve only modified register + asm mov ax,di //di holds error code ranging from 0 to 0x0c +// asm inc ax + asm mov erroroccurred,ax //increase erroroccurred for ease of programming + asm mov al,0x20 + asm out 0x20,al //send interrupt clear flag +// asm pushf // I think I dont need this line in.... + asm pop ax //restore ax +} + +void startceh() { + old_int24 = _dos_getvect( 0x24 ); + _dos_setvect( 0x24, critical_error_handler); + } + +void stopceh() { + _dos_setvect(0x24,old_int24); + } + +void PrintVisor(void) +{ + + setfillstyle( SOLID_FILL, 0 ); + bar(252, 171, 373, 178); + setcolor( CFG.Colores.Texto ); + outtextxy(252, 169, strupr(Archivo) ); + +} + + + +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +int InputCadenaG(char *s, int numalp, int lmax, int cc, int cf, int left, int up, int right, int down) +{ + + int ls; // longitud cadena + char *s1; // puntero a cadena inicial + int c, ok = 0; + + s1 = s; // inicio cadena + ls = strlen ( s ); // Longitud de actual + s += ls; // se coloca en el final + + setfillstyle(SOLID_FILL, cf); + do{ + bar(left, up, right, down); + setcolor(cc); + outtextxy( left, up-2, s1 ); + if ( ls < lmax ) { + setcolor(4); + outtextxy( left+textwidth( s1 ), up-2, "<"); + } + + + switch( c = getch() ) // obtiene tecla + { + case 0: + case 13: + ok = 1; // 13 = INTRO || Especiales + break; + case 8: + if ( ls > 0 ) { // 8 = Back Space + ls--; + s--; + *s = '\0'; + } + break; + case 27: + *s='\0'; + ok = 1; + break; + default: + if ( !numalp && c >= 32 && c <= 254 && ls < lmax) + { + *s++ = toupper(c); + ls++; + *s = '\0'; + } else + if ( numalp && isdigit(c) && ls < lmax) { + *s++ = c; + ls++; + *s = '\0'; + } + break; + } + + }while(!ok); + + ok = 1; + *s = ' '; + while( ok ) { + if(*s==' ') { *s = '\0'; s--; + } else { s++; ok = 0; } + } + + *s = '\0'; + + while(kbhit()) getch(); // Vacia Buffer impidiendo falsas + // pulsaciones... + + return ls; +} diff --git a/PLC_RUN.CPP b/PLC_RUN.CPP new file mode 100644 index 0000000..9f7a376 --- /dev/null +++ b/PLC_RUN.CPP @@ -0,0 +1,1423 @@ +#include +#include + +#include + +#include +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON +#include "PLC.H" + + + + +// +// +// +// +// +// +// +// +// +// + + + struct Make_Boton { + unsigned int Up, Left, Down, Right; + unsigned char Cdf, Cb1, Cb2; + unsigned char Ab, Pb; + unsigned char Isc, Sc; + }; + + extern struct Make_Boton far *Botones; // Puntero a estructura + extern void Imprime_Boton_i(struct Make_Boton Bot_Imp); + extern int P_Sec(int numero); + extern int lee_objeto(FILE *); + extern void Deprime_Image(struct Make_Boton Bot_Imp); + extern void Imprime_Boton(int D_Bord, struct Make_Boton Bot_Imp); + extern char True_Push, // Parametros para el TRUE_PUSH + Push; // PRESION REAL !!! + extern void far *arrow; // YA !!! + extern int Secuencias, *n_Botones_Secuencia; + extern char memoria_asignada, vez; + extern struct Make_Boton far *Botones; // Puntero a estructura + +void Anclar_Raton_PLC(void); +// +// +// +// +// +// +// +// + +// +//#define Comprueba_Secuencia_PLC(2) Comprueba_Secuencia(2) +// +extern int Muestra_Mensaje(int Mensaje, char *file) ; +extern Puertas DebugCode ; +extern void UpRow(void) ; +extern void DownRow(void) ; +extern void PrintCurrLine ( char Oculta_Mark, char Ultima ) ; +extern void PrintVisorLCD ( char Ultima ) ; +extern void MuestraLCD( char *texto1, char *texto2) ; +extern void redefine_cursor_raton(int r_e) ; +int Comprueba_Secuencia_PLC(char Sec_num ) ; + + +extern int CurrRow , + CurrTopLine ; +extern char CurrCol ; + + +extern MemoriaRam *Ram; +extern FirmWare far *Programa; + +extern char CurrCh_In , + CurrCh_Out ; + +extern Configuracion CFG; + +char Running = 0; + +void Run(void); +void Instala_Int8(void); +void DesInstala_Int8(void); +void Ejecuta_Programa(void); +void Ejecuta_Programa_BETA(void); +void remapea_relojes(void); + +void Ejecuta_Programa(void) +{ +} + +void Instala_Int8(void){ +} +void DesInstala_Int8(void){ +} + + +void Run(void) +{ + char ok = 0, Boton_Pulsado/*, Tipo_Run = 0*/; + Running = 1; + // + CFG.Int8.Bit = 0; + // + + Imprime_Estaticos( 3, "PLC.dat"); +// Fichero_bot(3); + + redefine_cursor_raton(1); // Modo RUN + remapea_relojes(); + if ( CFG.Int8.Bit ) Instala_Int8(); +/* + else + Tipo_Run = 1; +*/ + activa_raton(); +do{ + if ( CFG.Int8.Bit == 0 ) Ejecuta_Programa_BETA(); + Boton_Pulsado = ( CFG.Int8.Bit ? Comprueba_Secuencia( 2 ) : Comprueba_Secuencia_PLC( 2 ) ); + switch( Boton_Pulsado ) { // Iniciamos comprobacion + + case 0: // No se pulso ningun BOTON + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + case -2: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + case R_In0 : + case R_In1 : + case R_In2 : + case R_In3 : + case R_In4 : + case R_In5 : + case R_In6 : + case R_In7 : + case R_In8 : + case R_In9 : + case R_In10 : + case R_In11 : + case R_In12 : + case R_In13 : + case R_In14 : + case R_In15 : + if ( CurrCh_In != (5) ) { + if ( Ram -> In[Boton_Pulsado - R_In0][CurrCh_In].Bit == 1 ) { +// Ram -> CoIn[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit; + Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = 0; + desactiva_raton(); + Imprime_Bordes(2, Boton_Pulsado, -1); + activa_raton(); + } else { +// Ram -> CoIn[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit; + Ram -> In[Boton_Pulsado - R_In0 ][CurrCh_In].Bit = 1; + desactiva_raton(); + Imprime_Bordes(2, Boton_Pulsado, 2); + activa_raton(); + } + } + break; + case R_Ch00_In : + case R_Ch01_In : + case R_Ch02_In : + case R_Ch03_In : + case R_Ch04_In : + case R_Ch19_In : + desactiva_raton(); + Imprime_Bordes(2, (CurrCh_In + R_Ch00_In ), -1); + CurrCh_In = ( Boton_Pulsado - R_Ch00_In ); + Imprime_Bordes(2, Boton_Pulsado, 4); + ReImprimeCanal_In(CurrCh_In); + activa_raton(); + break; + case R_Ch00_Out : + case R_Ch01_Out : + case R_Ch02_Out : + case R_Ch03_Out : + case R_Ch04_Out : + case R_Ch19_Out : + desactiva_raton(); + Imprime_Bordes(2, (CurrCh_Out + R_Ch00_Out ), -1); + CurrCh_Out = ( Boton_Pulsado - R_Ch00_Out ); + Imprime_Bordes(2, Boton_Pulsado, 4); + ReImprimeCanal_Out(CurrCh_Out); + activa_raton(); + break; + case R_Stop : + desactiva_raton(); + Running = 0; + ok = 1; + break; + + case R_Up : + desactiva_raton(); + PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior + UpRow(); + Programa[10000] = Programa[CurrRow + CurrTopLine ]; + PrintCurrLine( 1, 1 ); + PrintVisorLCD ( 1 ); + activa_raton(); + break; + case R_Down : + desactiva_raton(); + PrintCurrLine ( 0, 0 ); // Ocultamos linea anterior + DownRow(); + Programa[10000] = Programa[ CurrRow + CurrTopLine ]; + PrintCurrLine( 1, 1 ); + PrintVisorLCD ( 1 ); + activa_raton(); + break; + + default: + break; + } + + if ( !Running ) ok = 1; + +}while(!ok); + + if ( CFG.Int8.Bit ) DesInstala_Int8(); + Imprime_Estaticos( 4, "PLC.dat"); +// Fichero_bot(4); + +redefine_cursor_raton(2); // Modo Edit + + +} + + + +void Ejecuta_Programa_BETA(void){ + + int pq_LD=0; // por cual LD va ? + // Hemos considerado cada LD un bloque de + // resultados lgicos entre las operaciones + // a realizar... + int i = 0; // Variable que ha de avanzar en el contador. + int Cpar; + Puertas ch; + + for( i ; (Programa[i].Comando != End && i != 9999); i++ ) + { + // Primero comprobamos el comando y ejecutamos el subcomando asociado. + switch( Programa[i].Comando) + { + // + // + case 0 : + /*READ NOP Tambien es una funcin !!!! */ + break; + // + // + case Ld : + if( i > 0 && Programa[i-1].Comando == _Out ) pq_LD = 0; + pq_LD++; + switch ( Cpar = Programa[i].Parametros ) { + case 0 : // Sin Parametros + case P_Not : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Entrada... + case 0: case 1: case 2: case 3: case 4: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ); + break; + + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + : + !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + ); + + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: case 19: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + : + !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + ); + break; + } + break; + case P_Tr : + case P_Not_Tr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? + Ram ->Tr[ Programa[i].Dato ].Bit + : + !Ram ->Tr[ Programa[i].Dato ].Bit + ); + break; + case P_Hr : + case P_Not_Hr : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ); + break; + case P_Cnt : + case P_Not_Cnt : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ); + break; + case P_Tim : + case P_Not_Tim : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ); + break; + } + break; + // + // + case Or : + switch ( Cpar = Programa[i].Parametros ) { + case 0 : + case P_Not : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Entrada... + case 0: case 1: case 2: case 3: case 4: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + : + !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: case 19: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + : + !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + } + break; + case P_Ld : + Ram ->_Ld[1].Bit = ( Ram ->_Ld[1].Bit || Ram ->_Ld[2].Bit ); + for(Cpar=2; Cpar<=pq_LD; Cpar++) + Ram ->_Ld[Cpar].Bit = Ram ->_Ld[ Cpar + 1 ].Bit; + pq_LD--; + break; + case P_Tr : + case P_Not_Tr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? + Ram ->Tr[ Programa[i].Dato ].Bit + : + !Ram ->Tr[ Programa[i].Dato ].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + case P_Hr : + case P_Not_Hr : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + case P_Cnt : + case P_Not_Cnt : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + case P_Tim : + case P_Not_Tim : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ) + || + Ram ->_Ld[pq_LD].Bit; + break; + + } + break; + // + // + case And : + switch ( Cpar = Programa[i].Parametros ) { + case 0 : + case P_Not : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Entrada... + case 0: case 1: case 2: case 3: case 4: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->In [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + : + !Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: case 19: + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == 0 ) ? + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + : + !Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [ (Programa[i].Dato / 100 ) - 10 ].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + } + break; + case P_Ld : + Ram ->_Ld[1].Bit = ( Ram ->_Ld[1].Bit && Ram ->_Ld[2].Bit ); + for(Cpar=2; Cpar<=pq_LD; Cpar++) + Ram ->_Ld[Cpar].Bit = Ram ->_Ld[ Cpar + 1 ].Bit; + pq_LD--; + break; + case P_Tr : + case P_Not_Tr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Tmp ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tr ) ? + Ram ->Tr[ Programa[i].Dato ].Bit + : + !Ram ->Tr[ Programa[i].Dato ].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + case P_Hr : + case P_Not_Hr : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) <= 9 ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Hr ) ? + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + : + !Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + case P_Cnt : + case P_Not_Cnt : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Cnt ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + case P_Tim : + case P_Not_Tim : + if ( ( Programa[i].Dato ) < Numero_Tim ) + Ram ->_Ld[pq_LD].Bit = ( ( Cpar == P_Tim ) ? + Ram ->_Tim [Programa[i].Dato].Bit + : + !Ram ->_Tim [Programa[i].Dato].Bit + ) + && + Ram ->_Ld[pq_LD].Bit; + break; + + } + break; + // + // + case _Out : + switch ( Cpar = Programa[i].Parametros ) { + case 0 : + case P_Not : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit != ( ( Cpar == 0 ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ) ) + { + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = ( ( Cpar == 0 ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ); + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + if ( ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit != ( ( Cpar == 0 ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ) ) + { +// Ram ->CoRi[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit; + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = ( ( Cpar == 0 ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ); + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + if ( ( ( Cpar == 0 ) ? Ram ->_Ld[1].Bit : !Ram ->_Ld[1].Bit ) && ( Programa[i].Dato / 100) == 10 ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + } + break; + case P_Tr : + case P_Not_Tr : + if ( Programa[i].Dato < Numero_Tmp ) + { + if ( Ram ->Tr [Programa[i].Dato].Bit != ( ( Cpar == P_Tr ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ) ) + Ram ->Tr [Programa[i].Dato].Bit = ( ( Cpar == P_Tr ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ); + } + break; + case P_Hr : + case P_Not_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + if ( Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit != ( ( Cpar == P_Hr ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ) ) + { +// Ram ->CoHr[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit; + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = ( ( Cpar == P_Hr ) ? + Ram ->_Ld[1].Bit + : + !Ram ->_Ld[1].Bit + ); + } + break; + } + break; + // + // + case Tim : + if ( Programa[i].Dato < Numero_Tim ) + if ( Ram -> _Ld[1].Bit == 0 ) + { + Ram -> _Tim[ Programa[i].Dato ].Bit = 0; + Ram -> Tim_Cnt[ Programa[i].Dato ] = -1; + } else { + if ( Ram -> Tim_Cnt[ Programa[i].Dato ] < 0 ) + Ram -> Tim_Cnt[ Programa[i].Dato ] = clock(); + if ( ( ( ( clock() - Ram -> Tim_Cnt[ Programa[i].Dato ] ) / CLK_TCK ) * 10 ) >= Programa[i].SubDato ) + Ram -> _Tim[ Programa[i].Dato ].Bit = 1; + } + pq_LD = 0; + break; + // + // + case Cnt : + if ( pq_LD >= 2 && Programa[i].Dato < Numero_Tim ) + { + if ( Ram -> _Ld[1].Bit && !Ram -> _Ld[2].Bit ) + { + if ( Ram -> _Cnt[ Programa[i].Dato ].Bit != Ram -> _Ld[1].Bit ) + if ( Ram -> Tim_Cnt[ Programa[i].Dato ] >= (Programa[i].SubDato - 1) ) + Ram -> _Tim[ Programa[i].Dato ].Bit = 1; + else { + Ram -> Tim_Cnt[ Programa[i].Dato ]++; + Ram -> _Tim[ Programa[i].Dato ].Bit = 0; + } + } + if ( Ram -> _Ld[2].Bit ) + { + Ram -> Tim_Cnt[ Programa[i].Dato ] = 0; + Ram -> _Tim[ Programa[i].Dato ].Bit = 0; + } + Ram -> _Cnt[ Programa[i].Dato ].Bit = Ram -> _Ld[1].Bit; + } + pq_LD = 0; + break; + // + // + case Sft : + // Registro de desplazamiento v2.0 + if ( pq_LD >= 3 ) + { + // Entrada de Reposicin + if ( Ram -> _Ld[3].Bit ) + { + switch ( Programa[i].Parametros ) + { + case 0 : + if ( (Programa[i].Dato - 5) <= 4 && (Programa[i].SubDato - 5) <= 4 ) + for ( Cpar = (Programa[i].Dato - 5); Cpar <= (Programa[i].SubDato - 5); Cpar ++ ) + for ( auto char Prop = 0; Prop < 16; Prop ++ ) + if( Ram ->Out[ Prop ] [ Cpar ].Bit ) + { + desactiva_raton(); + Ram ->Out[ Prop ] [ Cpar ].Bit = 0; + if ( CurrCh_Out == Cpar ) + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + else + if ( (Programa[i].Dato - 10) <= 8 && (Programa[i].SubDato - 10) <= 8 ) + for ( Cpar = (Programa[i].Dato - 10); Cpar <= (Programa[i].SubDato - 10); Cpar ++ ) + for ( auto char Prop = 0; Prop < 16; Prop ++ ) + + if ( Ram ->Ri [ Prop ] [ Cpar ].Bit ) + { + Ram ->Ri [ Prop ] [ Cpar ].Bit = 0; + if ( CurrCh_Out == Cpar ) + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + } + break; + case P_Hr: + if ( Programa[i].Dato <= 9 ) + for ( Cpar = (Programa[i].Dato - 5); Cpar <= (Programa[i].SubDato - 5); Cpar ++ ) + for ( auto char Prop = 0; Prop < 16; Prop ++ ) + { + Ram ->Hr [ Prop ] [ Cpar ].Bit = 0; + if ( CurrCh_Out == Cpar ) + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + } + break; + } + } else { + if ( !Ram -> Pre_Ld[i].Bit && Ram -> _Ld[2].Bit ) + { + auto char Prop; + switch ( Programa[i].Parametros ) + { + case 0 : + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( (Programa[i].SubDato-5) < (Numero_Out - 1) ) + { + for ( Cpar = (Programa[i].SubDato - 5); Cpar >=(signed int)(Programa[i].Dato - 5); Cpar -- ) + for ( Prop = 15; Prop >= 0; Prop-- ) + { + if ( Prop != 0 ) + { + if(Ram ->Out[ Prop ] [ Cpar ].Bit != Ram -> Out[Prop - 1][Cpar].Bit) + { + Ram ->Out[ Prop ] [ Cpar ].Bit = Ram -> Out[Prop - 1][Cpar].Bit; + if ( CurrCh_Out == Cpar ) + { + desactiva_raton(); + if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( Prop + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + } + } + else if( Cpar != 0 ) + if(Ram ->Out[ Prop ] [ Cpar ].Bit != Ram -> Out[15][Cpar-1].Bit) + { + Ram ->Out[ Prop ] [ Cpar ].Bit = Ram -> Out[15][Cpar-1].Bit; + if ( CurrCh_Out == Cpar ) + { + desactiva_raton(); + if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( Prop + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + } + } + if (Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit != Ram -> _Ld[1].Bit ) + { + Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit = Ram -> _Ld[1].Bit; + if ( CurrCh_Out == (signed int)(Programa[i].Dato - 5) ) + { + desactiva_raton(); + if ( Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato - 5) ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( B_Out0 ), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( B_Out0 ), -1); + activa_raton(); + } + } + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + if ( (Programa[i].SubDato-10) <= 8 ) + { + for ( Cpar = (Programa[i].SubDato - 10); Cpar >= (signed int)(Programa[i].Dato - 10); Cpar -- ) + for ( Prop = 8; Prop >= 0; Prop-- ) + { + if ( Prop != 0 ) + if ( Ram ->Ri [ Prop ] [ Cpar ].Bit != Ram -> Ri [Prop - 1][Cpar].Bit ) + { + Ram ->Ri [ Prop ] [ Cpar ].Bit = Ram -> Ri [Prop - 1][Cpar].Bit; + if ( CurrCh_Out == 5 ) + { + desactiva_raton(); + if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( Prop + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + } + else if( Cpar != 0 ) + if ( Ram ->Ri [ Prop ] [ Cpar ].Bit != Ram -> Ri [16][Cpar-1].Bit ) + { + Ram ->Ri [ Prop ] [ Cpar ].Bit = Ram -> Ri [16][Cpar-1].Bit; + if ( CurrCh_Out == 5 ) + { + desactiva_raton(); + if ( Ram ->Out[ Prop ] [ Cpar ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( Prop + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + } + } + if(Ram ->Ri [ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit != Ram -> _Ld[1].Bit) + { + desactiva_raton(); + Ram ->Ri [ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit = Ram -> _Ld[1].Bit; + if ( CurrCh_Out == 5 ) + if ( Ram ->Out[ 0 ] [ (signed int)(Programa[i].Dato-10) ].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ( Prop + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ( Prop + B_Out0), -1); + activa_raton(); + } + } + break; + } + break; + case P_Hr : + // Canales de Internos no volatiles. ( HR ). + if ( (Programa[i].SubDato) <= 9 && (Programa[i].SubDato-9) <= 9 ) + { + for ( Cpar = (Programa[i].SubDato - 9); Cpar >= (signed int)(Programa[i].Dato - 9); Cpar -- ) + for ( Prop = 8; Prop >= 0; Prop-- ) + { + if ( Prop != 0 ) + Ram ->Hr [ Prop ] [ Cpar ].Bit = Ram -> Hr [Prop - 1][Cpar].Bit; + else if( Cpar != 0 ) + Ram ->Hr [ Prop ] [ Cpar ].Bit = Ram -> Hr [16][Cpar-1].Bit; + } + Ram ->Hr [ 0 ] [ (signed int)(Programa[i].Dato-9) ].Bit = Ram -> _Ld[1].Bit; + } + break; + } + } + + } + + pq_LD = 0; + } + + { + Ram -> Pre_Ld[i].Bit = Ram -> _Ld[2].Bit; + ch.Bit = 0; + } + break; + // + // + case Keep : + if ( pq_LD >= 2 ) + { + char ok; + switch ( Programa[i].Parametros ) { + case 0 : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + ok = Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit; + if( Ram -> _Ld[ 1 ].Bit && !Ram -> _Ld[ 2 ].Bit ) Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; + if( Ram -> _Ld[ 2 ].Bit ) Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; + if( ok != Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) + { + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + if ( Ram -> Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + ok = Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )].Bit; + if( Ram -> _Ld[ 1 ].Bit && !Ram -> _Ld[ 2 ].Bit ) Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit = 1; + if( Ram -> _Ld[ 2 ].Bit ) Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit = 0; + if( ok != Ram -> Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-10].Bit ) + { + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )) ) + { + desactiva_raton(); + if ( ( Ram ->_Ld[ 1 ].Bit ) && ( Programa[i].Dato / 100) == 10 ) + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + else + // Ponemos el borde correspondiente a OFF + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + } + break; + case P_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + { + if( Ram -> _Ld[1].Bit && !Ram -> _Ld[2].Bit ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; + if( Ram -> _Ld[2].Bit ) Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; + } + break; + } + } + pq_LD = 0; + break; + + // + // + case DifU : +// printf("%d %d\n",Ram -> Pre_Ld[i].Bit, Ram -> _Ld[1].Bit); + if ( !Ram -> Pre_Ld[i].Bit && Ram -> _Ld[1].Bit ) + { + switch ( Programa[i].Parametros ) { + case 0 : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + activa_raton(); + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit = 1; + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + activa_raton(); + } + break; + } + case P_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; + break; + } + } + else + // Si el Dato esta activo se desactiva... + switch ( Programa[i].Parametros ) { + case 0 : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) + { + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; + + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit ) + { + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100) - 10].Bit = 0; + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + } + case P_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 0; + break; + } + + pq_LD = 0; + break; + // + // + case DifD : + if ( Ram -> Pre_Ld[i].Bit && !Ram -> _Ld[1].Bit ) + { + switch ( Programa[i].Parametros ) { + case 0 : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 1; + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + activa_raton(); + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit = 1; + if ( CurrCh_Out == 5 ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), 2); + activa_raton(); + } + break; + } + case P_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 1; + break; + } + } + else + // Si el Dato esta activo se desactiva... + switch ( Programa[i].Parametros ) { + case 0 : + // Miro si esta en el rango de Ch(xx00-15) [N IO's] + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out ) + // Miro que canal esta usando para canalizarlo correctamente + switch ( Programa[i].Dato / 100) + { + // Canales de Salida... + case 5: case 6: case 7: case 8: case 9: + if ( Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit ) + { + Ram ->Out[( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100 )-5].Bit = 0; + + if ( CurrCh_Out == ( (Programa[i].Dato / 100 )-5) ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + // Canales de Internos ( Reles Internos ). + case 10: case 11: case 12: case 13: case 14: + case 15: case 16: case 17: case 18: // case 19: + if ( Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit ) + { + Ram ->Ri [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [(Programa[i].Dato / 100)-10 ].Bit = 0; + if ( CurrCh_Out == 5 ) + { + desactiva_raton(); + // Ponemos el borde correspondiente a ON + Imprime_Bordes(1, ((( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )) + B_Out0), -1); + activa_raton(); + } + } + break; + } + case P_Hr : + if ( ( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 ) < Numero_Out && ( Programa[i].Dato / 100) < 9 ) + Ram ->Hr [( Programa[i].Dato - ( Programa[i].Dato / 100 ) * 100 )] [Programa[i].Dato / 100 ].Bit = 0; + break; + } + pq_LD = 0; + break; + // + // + case TimH : + if ( Programa[i].Dato < Numero_Tim ) + if ( Ram -> _Ld[1].Bit == 0 ) + { + Ram -> _Tim[ Programa[i].Dato ].Bit = 0; + Ram -> Tim_Cnt[ Programa[i].Dato ] = -1; + } else { + if ( Ram -> Tim_Cnt[ Programa[i].Dato ] < 0 ) + Ram -> Tim_Cnt[ Programa[i].Dato ] = clock(); + if ( ( ( ( clock() - Ram -> Tim_Cnt[ Programa[i].Dato ] ) / CLK_TCK ) * 100 ) >= Programa[i].SubDato ) + Ram -> _Tim[ Programa[i].Dato ].Bit = 1; + } + pq_LD = 0; + break; +// +// +// +// +// +// +// +// + // + // + case Cmp : + pq_LD = 0; + break; + // + // + case Mov : + pq_LD = 0; + break; + // + // + case Mvn : + pq_LD = 0; + break; + // + // + case Add : + pq_LD = 0; + break; + // + // + case Sub : + pq_LD = 0; + break; + // + // + case Stc : + pq_LD = 0; + break; + // + // + case Clc : + pq_LD = 0; + break; + // + // + case End : + pq_LD = 0; + break; + // + // + case Il : + break; + // + // + case Ilc : + break; + + default: + Muestra_Mensaje(501, "PLC.DAT"); + Running = 0; + break; + } + + ////// Mantiene los relojes de TIEMPO + ///////////////////////////////////////////////////////////////////// + /////////////////// Contadores internos 1900 a 1902 ///////////////// + ///////////////////////////////////////////////////////////////////// + /* 1900 0'1s 0'05s */ + /* 1901 0'2s 0'1 s */ + /* 1902 1 s 0'5 */ + ////////////////////////////////////// +// 1900 + if ( ( ( (clock() - Ram ->Contador_de_Tiempo[0] ) / CLK_TCK) ) >= 0.05 ) + if ( Ram ->Ri [ 0 ] [ 9 ].Bit == 0 ) + { + Ram ->Ri [ 0 ] [ 9 ].Bit = 1; +Ram ->Contador_de_Tiempo[0] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 0), -1); + activa_raton(); + } + } else { + Ram ->Ri [ 0 ] [ 9 ].Bit = 0; +Ram ->Contador_de_Tiempo[0] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 0), 2); + activa_raton(); + } + } +// 1901 + if ( ( ( (clock() - Ram ->Contador_de_Tiempo[1] ) / CLK_TCK) ) >= 0.1 ) + if ( Ram ->Ri [ 1 ] [ 9 ].Bit == 0 ) + { + Ram ->Ri [ 1 ] [ 9 ].Bit = 1; +Ram ->Contador_de_Tiempo[1] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 1), -1); + activa_raton(); + } + } else { + Ram ->Ri [ 1 ] [ 9 ].Bit = 0; +Ram ->Contador_de_Tiempo[1] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 1), 2); + activa_raton(); + } + } + +// 1902 + if ( ( ( (clock() - Ram ->Contador_de_Tiempo[2] ) / CLK_TCK) ) >= 0.5 ) + + if ( Ram ->Ri [ 2 ] [ 9 ].Bit == 0 ) + { + Ram ->Ri [ 2 ] [ 9 ].Bit = 1; +Ram ->Contador_de_Tiempo[2] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 2), -1); + activa_raton(); + } + } else { + Ram ->Ri [ 2 ] [ 9 ].Bit = 0; +Ram ->Contador_de_Tiempo[2] = clock(); + if ( CurrCh_In == 5 ) + { + desactiva_raton(); + Imprime_Bordes(2, (R_In0 + 2), 2); + activa_raton(); + } + } + ///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////// + if ( ch.Bit ) + Ram -> Pre_Ld[i].Bit = Ram -> _Ld[1].Bit; + else + ch.Bit = 1; + + + } + + if ( i == 9999 ) + { + Muestra_Mensaje(500, "PLC.DAT"); + Running = 0; + return; + } + +} + + + + +// Esta funcin se diferencia de la original, en no ser fija: es decir que +// tras cada llamada vuelve, se pulse o no un boton, para poder continuar +// utilizando MB y otras cosas a la vez.... +int Comprueba_Secuencia_PLC(char Sec_num ) +{ + +// char boton_izq=0, boton_der=0; + char key, key2=0; + char i, Pulso = 0; + int psec = P_Sec(Sec_num-1); + + union REGS io; + io.x.ax = 3; + + + + if ( kbhit() ) { + + if ( (key = getch())==0) key2 = getch(); + for(i=0; i> 1) & 1; + x_raton = io.x.cx; + y_raton = io.x.dx; + + + for(i = 0; i < n_Botones_Secuencia[Sec_num-1]; i++) + if( (x_raton >= Botones[psec+i].Left) && (x_raton <= Botones[psec+i].Right) && + (y_raton >= Botones[psec+i].Up) && (y_raton <= Botones[psec+i].Down) ) { + + Pulso = i + 1; + Push = ON; + desactiva_raton(); + Imprime_Boton_i(Botones[psec+Pulso-1]); + Anclar_Raton_PLC(); +// delay(10); + if( Push == ON && True_Push == ON ) Deprime_Image(Botones[psec+Pulso-1]); + Push = OFF; + Imprime_Boton(0, Botones[psec+Pulso-1]); + activa_raton(); + return Pulso; + } + } + + return (0); +} + +void Anclar_Raton_PLC(void){ + + union REGS io; + io.x.ax = 3; + do { + int86(0x33, &io, &io); + Ejecuta_Programa_BETA(); + } while( (io.x.bx & 1)==1 || ((io.x.bx >> 1) & 1)==1); +} + +void remapea_relojes(void) +{ + int i, ch; + for( i=0; i<200; i++ ) + Ram -> _Ld[i].Bit = 0; + for( i=0; i<9999; i++ ) + Ram -> Pre_Ld[i].Bit = 0; + for(ch=0;ch<10;ch++ ) + for( i=0; iHr[i][ch].Bit; + for(ch=0;ch<10;ch++ ) + for( i=0; iRi[i][ch].Bit; + for(ch=0;chTr[ch].Bit; + for(ch=0;ch_Cnt[ch].Bit; + for(ch=0;ch_Tim[ch].Bit; +/* + for(ch=0;ch<3;ch++ ) + Ram ->Bt[i].Bit = 1; +*/ + for(ch=0;chTim_Cnt[ch] = 0; + for(ch=0;ch<3;ch++ ) + Ram ->Contador_de_Tiempo[ch] = clock(); + +} diff --git a/PLC_UTIL.CPP b/PLC_UTIL.CPP new file mode 100644 index 0000000..285d7a7 --- /dev/null +++ b/PLC_UTIL.CPP @@ -0,0 +1,221 @@ +#include + +#include + +#include +#include +#include +#include +#include + + +#include "..\..\..\jd_lib\f_lib\make_bot.h" // Fuciones de MAKE_BOTON + +//extern int Fichero_bot(char Dinamicos_Estaticos); + +struct Colores { + char Texto; + char F_Texto; + char VisorLCD; +}; + +typedef struct { + + struct Colores Colores; + +} Configuracion; +extern Configuracion CFG; + + + +char Optar( char *texto1, char *texto2, char *texto3 ); +int Muestra_Mensaje(int Mensaje, char *file); +void redefine_cursor_raton(int r_e); + +char Optar( char *texto1, char *texto2, char *texto3 ){ + + int ok = 0, inst = 0; + struct textsettingstype textinfo; + + void *C_Texto, *C_Aceptar, *C_Cancelar; + +C_Texto = malloc( JD_imagesize(200, 212, 440, 267) ); +C_Aceptar = malloc( JD_imagesize(200, 270, 280, 295) ); +C_Cancelar = malloc( JD_imagesize(360, 270, 440, 295) ); + +if( C_Texto == NULL || C_Aceptar == NULL || C_Cancelar == NULL) { + closegraph(); + cprintf("\n\rSALIENDO"); + cprintf("\n\rImposible encontrar %ldKbytes en el Heap", + ( JD_imagesize(118, 160, 521, 335) + + JD_imagesize(118, 160, 521, 335) + + JD_imagesize(118, 160, 521, 335) + ) + ); + exit(SIN_MEMORIA); +} + +gettextsettings(&textinfo); + +settextstyle(SMALL_FONT, HORIZ_DIR, 5 ); +// settextjustify(CENTER_TEXT, CENTER_TEXT); + +getimage(200, 212, 440, 267, C_Texto); +getimage(200, 270, 280, 295, C_Aceptar); +getimage(360, 270, 440, 295, C_Cancelar); + + + Imprime_Estaticos(100, "PLC.DAT"); // Imprime botones estaticos 'Seccion 20' +// Fichero_bot(100); + Imprime_Secuencia(3); // Imprime secuencia 4. + Imprime_Estaticos(101, "PLC.DAT"); // Imprime textos estaticos 'Seccion 5' +// Fichero_bot(101); + +outtextxy( 210+( ( 230 - textwidth(texto1) ) / 2 ), 220, texto1 ); +outtextxy( 210+( ( 230 - textwidth(texto2) ) / 2 ), 235, texto2 ); +outtextxy( 210+( ( 230 - textwidth(texto3) ) / 2 ), 250, texto3 ); + +while(!ok){ // Bucle infinito + + switch( Comprueba_Secuencia( 3 ) ) { // Iniciamos comprobacion de 2 sec + + case 0: // No se pulso ningun BOTON + // Pero el raton fue presionado en + // algun sitio... + break; + case -2: // Hay una tecla normal en BUFFER + switch( getch() ) { // La utilizamos + // ESC ( CANCELAR ) + case 14: + inst = 0; + ok = 1; + break; + default: + break; + } + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + // Boton Aceptar + case 1: + inst = 1; + ok = 1; + break; + // Boton Cancelar + case 2: + inst = 0; + ok = 1; + break; + default: + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + } + +} + + +putimage(200, 212, C_Texto, COPY_PUT); +putimage(200, 270, C_Aceptar, COPY_PUT); +putimage(360, 270, C_Cancelar, COPY_PUT); + +free ( C_Texto ); +free ( C_Aceptar ); +free ( C_Cancelar ); + + +settextstyle(textinfo.font, textinfo.direction, textinfo.charsize ); +settextjustify(textinfo.horiz, textinfo.vert); + +return inst; + + + +} + + + +int Muestra_Mensaje(int Mensaje, char *file) { + void *Imagen; + + + if ( (Imagen = malloc( JD_imagesize(200, 212, 440, 267) ) ) == NULL ) { + Espera_Tecla_o_Raton(); + Anclar_Raton(); + return -1; + } else { + getimage( 200, 212, 440, 267, Imagen ); + Imprime_Estaticos( Mensaje, file); +// Fichero_bot( Mensaje ); + + Espera_Tecla_o_Raton(); + Anclar_Raton(); + putimage( 200, 212, Imagen, COPY_PUT); + free(Imagen); + return 1; + } +} + +void redefine_cursor_raton(int r_e){ + + struct SREGS seg; + union REGS ent, sal; + long dir; + +extern int dir_raton [32+32]; + +if(r_e==1) { //// Cursor mientras se ejecuta +int dir_rton [32+32] = { + + 0x0808, /* 1 1 */ + 0x0000, /* */ + 0x0000, /* */ + 0x0000, /* */ + 0x0800, /* 1 */ + 0x0000, /* */ + 0x0000, /* */ + 0x8000, /*1 */ + 0x8083, /*1 1 1*/ + 0x8001, /*1 1*/ + 0xF810, /*1 1 1 1 1 1 1*/ + 0x8810, /*1 1 1 1*/ + 0x8811, /*1 1 1 1*/ + 0x8003, /*1 1 1*/ + 0x8007, /*1 1 1 1*/ + 0x800F, /*1 1 1 1 1*/ + + 0x0000, /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x7252, /*0 0 0 0 0 0 0 0 0*/ + 0x4A5A, /*0 0 0 0 0 0 0 0 0*/ + 0x725A, /*0 0 0 0 0 0 0 0*/ + 0x6256, /*0 0 0 0 0 0 0 0 0*/ + 0x5256, /*0 0 0 0 0 0 0 0 0*/ + 0x4992, /*0 0 0 0 0 0 0 0 0 0*/ + 0x0000, /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x3E70, /*0 0 0 0 0 0 0 0*/ + 0x0248, /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x0244, /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x0242, /*0 0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x2244, /*0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x2248, /*0 0 0 0 0 0 0 0 0 0 0 0*/ + 0x3E70, /*0 0 0 0 0 0 0 0*/ + 0x0000 /*0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0*/ + }; + dir = (long)dir_rton; + +} else { //// Cursor mientras se edita + dir = (long)dir_raton; +} + + ent.x.ax = 9; + ent.x.bx = 0; + ent.x.cx = 0; + ent.x.dx = (int) dir; + seg.es = (int) (dir >> 16); + int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */ + + ent.x.ax = 3; + int86(0x33, &ent, &sal); + + +} diff --git a/R.BAT b/R.BAT new file mode 100644 index 0000000..031ee0a --- /dev/null +++ b/R.BAT @@ -0,0 +1 @@ +edit plc.dat diff --git a/README.md b/README.md new file mode 100644 index 0000000..de6ec34 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#PLC + + +*05/11/1995* + +ToDo: wwtcf? + + +![screenshot](/PLC.png "Screenshot") diff --git a/SFT.PLC b/SFT.PLC new file mode 100644 index 0000000000000000000000000000000000000000..3808165dddd40d33f318a413720e4ef73d6612ce GIT binary patch literal 71073 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 literal 0 HcmV?d00001