Home » Archimedes archive » Archimedes World » archimedes_world_volume_14_issue_12_scp.adf » !AcornAns_AcornAns » !Brolly/c/main

!Brolly/c/main

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Archimedes World » archimedes_world_volume_14_issue_12_scp.adf » !AcornAns_AcornAns
Filename: !Brolly/c/main
Read OK:
File size: F599 bytes
Load address: 0000
Exec address: 0000
File contents
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <stdarg.h>

#include "xfersend.h"  /* note the location of this line is crucial; it ensures !Brolly.h.xfersend is used */
                       /* & not RISC_OSLib.h.xfersend, as would be the case if the include should occur nested */
                       /* within say the saveas.h include below */
#include "wimp.h"
#include "wimpt.h"
#include "win.h"
#include "event.h"
#include "baricon.h"
#include "res.h"
#include "menu.h"
#include "template.h"
#include "dbox.h"
#include "werr.h"
#include "sprite.h"
#include "os.h"
#include "kernel.h"
#include "akbd.h"
#include "saveas.h"
#include "xferrecv.h"
#include "msgs.h"
#include "bbc.h"
#include "visdelay.h"
#include "pointer.h"

#include "swis.h"
#include "mdbx.h"
#include "wimp_misc.h"

#define one (1<<16)
#define fptod(i) ( (int)(0.5+i/6.5536)/10000.0 )
#define dtofp(i) ( (int)(0.5+i*one) )
typedef enum {multi, nonmulti} monitor;

#define werrterm 0

extern int rbbcinc(int r, int k);
extern int div_frac16(int number, int divisor);
extern int mul_frac16(int x, int a);
extern int mul_frac16c(int x, int a);
extern int sqrt_frac16(unsigned int x);
extern int gauss16(void);
extern void sgauss16(int seed);
extern int rand16(void);
extern int randu16(void);
extern void srand16(int seed);
extern int cos16(int a);
extern int sin16(int a);
extern int exp16(int a);
extern int ln16(int a);
extern int pow16(int a, int b);
extern int acs16(int a);
extern int asn16(int a);
extern int sig16(int a);
extern void plot_brolly(sprite_area *area, void *spr, int x, int y);
extern void plot_hand(sprite_area *area, void *spr, int x, int y);
extern void plot_number(sprite_area *area, void *spr, int x, int y);
extern void plot_bar(int x, int y, int w, int h, int c);
extern void erase_brolly(void *spr, int x, int y);
extern void erase_hand(sprite_area *area, void *spr, int x, int y);
extern void erase_number(sprite_area *area, void *spr, int x, int y);
extern void erase_bar(int h, void *spr, int x, int y);

void netparams_to_gui(void);
BOOL gui_to_netparams1(void);
BOOL gui_to_netparams2(void);
BOOL parameters_load_file(void);

#define by (-4*48)
#define bh 12
#define bci 12
#define gny (-4*82)
#define lowgen 0

/********************************************************************************************************/

#define VERSIONNUMBER "1.00"
#define VERSION VERSIONNUMBER ## " (" ## __DATE__ ## ")"

/* Menu items */
#define bar_menu_info     1
#define bar_menu_quit     2

typedef enum { MMinfo=1,
               MMsave
             } MMTypes;

/* Info box field for the version string */
#define brolly_auth_field    3
#define brolly_info_field    4

typedef enum { key_escape=27,
               key_RETURN=13,
               key_TAB=0x18a,
               key_downarrow=0x18e,
               key_uparrow=0x18f
             } key_TYPES;

#define maxpath 256

typedef enum { pit_p=0,
               pit_nohln=12,
               pit_a,
               pit_lr,
               pit_et,
               pit_noti,
               pit_rf,
               pit_sf,
               pit_uf,
	       pit_ztt,
	       pit_rw,
	       pit_tn,
	       pit_cc,
	       pit_s,
	       pit_f
             } paramicon_TYPES;

static void brolly_info_about_program(void);
static void para_open(void);

/********************************************************************************************************/

menu main_menu, bar_menu;
wimp_i brolly_icon;
wimp_w para_win_handle;
BOOL para_window_open=FALSE;
BOOL wtssafe=TRUE;
int pfile_length=0;
char filepath_parameters[maxpath]="Weights";
char *pfile=0;
/* PCH - parameters caret hop. Used to sequence caret hops between writable icons */
char PCHfor[32] = {255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
                          255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
char PCHaft[32] = {255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
                          255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};

/********************************************************************************************************/

BOOL vga;
int mode, sarea, osy, gy, gwy;
int m, l, mb, g;
int p1, p2, p3;
sprite_area *area;
sprite_id handp, wall, getready;
sprite_ptr spr[1025];
sprite_ptr nums[10];
sprite_ptr numbacks[6];
sprite_ptr bar;
int sprx[1025];
int ox, vox, oi, voi;
int bank;
void *scrst[2];
int originx, originy, lx, ly, goriginx, goriginy;
int hscore = 0;
int gamec  = 0;
int totgen = 0;
int spri, ix;
int gen, ti, ti2;
int f;
int of, vof;
BOOL quit;
int speed=4; /*2 for fast, 4 for slow*/
int d[6] = {0, 0, 0, 0, 0, 0};
int ncd, oncd;			/*number of changed digits & old*/
int tnd=0, otnd=0, votnd=0;	/*total number of digits & old*/
int gx[6], gox[6];		/*x coord of each digit in gen, & old*/

int *oldmode=0;	/* Remember desktop mode in use prior to taking over screen -

		NB This will usually point to a 4 byte malloced block containing the mode number, however
		   to permit support of arbitrary RISC PC modes it may point to a larger malloced block,
		   the first word of which points to a mode selector (which will itself be stored from
		   address oldmode+1 onwards, ie we will have *oldmode = (int)(oldmode+1), & the selector
		   stored from oldmode+1).
		   This permits reselection of desktop mode on a RISC PC by passing *oldmode as a
		   mode specifier to SWI OS_ScreenMode (r0=0).
		   On an older machine this SWI isn't available and *oldmode will always be a mode number;
		   in that case must select mode via VDU 22,<mode number>.
		   Thus generic code achieved by using VDU 22 iff *oldmode is less than 256, otherwise
		   OS_ScreenMode used.
*/
char oldpalette[20*4];
wimp_mousestr oldmouse;
char palette[20*4];

#define frame_freq 50

/********************************************************************************************************/
/********************************* NEURAL NET DECLARATIONS **********************************************/

#define low_limit 1
#define rows_low_lim 1
#define cols_low_lim 1

#define MAXNOOFNODES 1000

typedef int fp;		/*fixed point type represented within an integer*/
typedef fp unit;	/*we will use fixed point for our data*/

typedef unit *vector;

typedef struct {
  BOOL allocated;
  vector x_inp, y_out;
  vector h1;
  int si, so, sh;
} network_rec;

typedef unit **weights;

typedef struct {
  BOOL allocated;
  weights wi, wo;
  int si, so, sh;
} weights_rec;

typedef struct {
  unit error_threshold;
  int  start_iter;
  int  no_of_inputs,
       no_of_h1_nodes,
       no_of_outputs;
  BOOL sigmoid_out;
  unit alpha,
       learning_rate,
       norm_in_min,
       norm_in_range;
} ff_setup_rec;

typedef struct {
  int high_water, count_max, last_right, last_wrong, right_count, wrong_count, nbr_tr_items;
  int iter;
} display_rec;

typedef void (*get_data_proc) (vector x_in, vector desired_out, ff_setup_rec *setup);

BOOL g_user_terminated_learning;

/********************************************************************************************************/
/**************************************** MISC FUNCTIONS ************************************************/

void seed_rand16(void)
{
  int v=clock() & 0xff;
  v|=v<<8;
  srand16(v | v<<16);
}

monitor read_monitor_type(void)
{
  int r2;
  os_swi3r(6, 161,133,0, 0,0,&r2);
  if ((r2/4 & 3) == 1) return multi;
  else return nonmulti;
}

void press(int i)
{
  for (;bbc_inkey(i)!=-1;);
  return;
}

void release(int i)
{
  for (;bbc_inkey(i)!=0;);
  return;
}

BOOL kbhit(void)
{
  return bbc_inkey(-99)==-1;
}

void select_speed(BOOL allow_space)
{
  int s=0, f=0;
  for (;s!=-1 && f!=-1 && (bbc_inkey(-99)!=-1 || !allow_space);) {
    s=bbc_inkey(-82);
    f=bbc_inkey(-68);
  }
  release(-82);
  release(-68);
  release(-99);
  if (f==-1) speed=2;
  if (s==-1) speed=4;
}

void tidy(void)
{
  os_swi2(OS_Byte, 112, 1);
  os_swi2(OS_Byte, 113, 1);
  /*printf("Bye bye!\n");*/
}

void pause(void)
{
  for (;clock()-ti<speed;);
  ti=clock();
  /*printf(" %i ",clock()-ti);*/
  os_swi1(OS_Byte, 19);
}

void swap_banks(void)
{
  os_swi2(OS_Byte, 113, bank);
  os_swi2(OS_Byte, 112, bank=3-bank);
}

void *get_screen_base(void)
{
  int a[2] = {148, -1};
  os_swi2(OS_ReadVduVariables, (int)a, (int)a);
  return (void *)a[0];
}

/********************************************************************************************************/
/*********************************** NEURAL NET FUNCTIONS ***********************************************/

/****************************************** misc ********************************************************/

/*create a dynamic 1d array of units with indices 1,...,up_limit*/
vector allocate_vector(int up_limit)
{
  vector v;
  int vlen = up_limit - low_limit + 1;
  v = calloc(vlen, sizeof(unit));
  if (v==0) {
    werr(werrterm, "allocate_vector failed");
    return 0;
  }
  return v-low_limit;
}

void copy_vector(vector source, vector dest, int len)
{
  memmove(dest+low_limit, source+low_limit, len*sizeof(unit));
}

void free_vector(vector v)
{
  free(v+low_limit);
}

/*create a dynamic 2d array of units with indices 1,...,rows_up_lim and 1,...,cols_up_lim*/
weights allocate_weights(int rows_up_lim, int cols_up_lim)
{
  int i;
  int no_of_rows = rows_up_lim - rows_low_lim + 1;
  int no_of_cols = cols_up_lim - cols_low_lim + 1;
  weights a = calloc(no_of_rows, sizeof(unit *));
  if (a==0) {
    werr(werrterm, "allocate_weights [1] failed");
    return 0;
  }
  a -= rows_low_lim;
  a[rows_low_lim] = calloc(no_of_rows*no_of_cols, sizeof(unit));
  if (a[rows_low_lim]==0) {
    free(a+rows_low_lim);
    werr(werrterm, "allocate_weights [2] failed");
    return 0;
  }
  a[rows_low_lim] -= cols_low_lim;
  for (i=rows_low_lim+1; i<=rows_up_lim; i++) a[i] = a[i-1] + no_of_cols;
  return a;
}

void copy_weights(weights source, weights dest, int no_of_rows, int no_of_cols)
{
  memmove(dest[rows_low_lim]+cols_low_lim, source[rows_low_lim]+cols_low_lim, no_of_rows*no_of_cols*sizeof(unit));
}

void free_weights(weights a)
{
  free(a[rows_low_lim]+cols_low_lim);
  free(a+rows_low_lim);
}

weights_rec *allocate_network_weights(weights_rec *w, ff_setup_rec *setup)
{
  w->wi = allocate_weights(setup->no_of_inputs+1, setup->no_of_h1_nodes);
  w->wo = allocate_weights(setup->no_of_h1_nodes, setup->no_of_outputs);
  if (w->wi==0 || w->wo==0) {
    if (w->wi) free_weights(w->wi);
    if (w->wo) free_weights(w->wo);
    werr(werrterm, "allocate_network_weights failed");
    return 0;
  }
  w->allocated = TRUE;
  w->si = setup->no_of_inputs+1;
  w->so = setup->no_of_outputs;
  w->sh = setup->no_of_h1_nodes;
  return w;
}

void free_network_weights(weights_rec *w)
{
  if (w->allocated) {
    free_weights(w->wi);
    free_weights(w->wo);
    w->si = w->so = w->sh = 0;
  }
  w->allocated = FALSE;
}

weights_rec *reinitialise_weights(weights_rec *w, BOOL random_init, ff_setup_rec *setup)
{
  unit *p, *pe;
  if (random_init) {				/*initialise weights randomly in range (-1,1)*/
    p  = w->wi[rows_low_lim]+cols_low_lim;
    pe = p + (setup->no_of_inputs+1)*setup->no_of_h1_nodes;
    for (;p<pe;) *p++ = rand16();
    p  = w->wo[rows_low_lim]+cols_low_lim;
    pe = p + setup->no_of_h1_nodes*setup->no_of_outputs;
    for (;p<pe;) *p++ = rand16();
    setup->start_iter = 0;
  }
  else {
    memset(w->wi[rows_low_lim]+cols_low_lim, 0, (setup->no_of_inputs+1)*setup->no_of_h1_nodes*sizeof(unit));
    memset(w->wo[rows_low_lim]+cols_low_lim, 0, setup->no_of_h1_nodes*setup->no_of_outputs*sizeof(unit));
  }
  return w;
}

weights_rec *initialise_weights(weights_rec *w, BOOL random_init, ff_setup_rec *setup)
{
  if (w->allocated==FALSE) {
    if (allocate_network_weights(w, setup)==0) goto initw1;
  }
  else
    if (w->si!=setup->no_of_inputs+1 || w->so!=setup->no_of_outputs || w->sh!=setup->no_of_h1_nodes) {
      free_network_weights(w);
      if (allocate_network_weights(w, setup)==0) goto initw1;
    }
  return reinitialise_weights(w, random_init, setup);
  initw1:
  werr(werrterm, "initialise_weights failed");
  return 0;
}

/*************************************** display functions *********************************************/

int start_hor_pos, display_factor;

int scale(unit v)
{
  v = v*5/2048;
  return v>160 ? 160 : (v<0 ? 0 : v);
}

void setup_screen(display_rec *display, ff_setup_rec *setup)
{
  int ys = 1<<(2-ly);
  bbc_cls();
  bbc_tab(6, 1*ys);	printf("Iteration: %i", display->iter);
  bbc_tab(49, 1*ys);	printf("Error threshold: %8.6f", (int)setup->error_threshold/65536.0);
  bbc_tab(18, 22*ys);	printf("High water mark: %3i Right (out of %i).", display->high_water, display->nbr_tr_items);
  bbc_tab(18, 24*ys);	printf("Hit <Space> to prematurely end learning.");
  display_factor = setup->no_of_outputs<=40 ? 2 : 1;
  start_hor_pos = 35 - setup->no_of_outputs/2*display_factor;
  if (start_hor_pos<0) start_hor_pos = 0;
  bbc_tab(start_hor_pos-2, 7*ys);	 printf("Desired output: ");
  bbc_tab(start_hor_pos-2, 14*ys); printf("Error: ");
}

void display_results(display_rec *display, vector d_out, vector net_out, ff_setup_rec *setup)
{
  int i, k, x, y;
  int ys = 1<<(2-ly);
  bbc_tab(17, 1*ys);	printf("%i", display->iter);
  bbc_tab(35, 22*ys);	printf("%3i", display->high_water);
  bbc_tab(24, 3*ys);	printf("Right:  %3i              Wrong:  %3i", display->right_count, display->wrong_count);
  bbc_tab(19, 5*ys);	printf("Last Right:  %3i         Last Wrong:  %3i", display->last_right, display->last_wrong);
  for (i=1; i<=setup->no_of_outputs; i++) {
    x = (start_hor_pos + display_factor*(i-1))*16 - goriginx;
    k = scale(d_out[i]);
    y = osy-16-13*32 - goriginy;
    bbc_gcol(0, 11);
    bbc_rectanglefill(x, y, 16, k);
    bbc_gcol(0, 9);
    bbc_rectanglefill(x, y+k, 16, 160-k);
    k = scale(abs(d_out[i]-net_out[i]));
    y = osy-16-20*32 - goriginy;
    bbc_gcol(0, 11);
    bbc_rectanglefill(x, y, 16, k);
    bbc_gcol(0, 9);
    bbc_rectanglefill(x, y+k, 16, 160-k);
  }
}

/********************************* feedforward network functions ****************************************/

network_rec *allocate_network(network_rec *network, ff_setup_rec *setup)
{
  /*nb the +1 is the threshold node*/
  if (network->x_inp=allocate_vector(setup->no_of_inputs+1), network->x_inp==0) goto allocate_network_3;
  if (network->y_out=allocate_vector(setup->no_of_outputs),  network->y_out==0) goto allocate_network_2;
  if (   network->h1=allocate_vector(setup->no_of_h1_nodes),    network->h1==0) goto allocate_network_1;
  network->allocated = TRUE;
  network->si = setup->no_of_inputs+1;
  network->so = setup->no_of_outputs;
  network->sh = setup->no_of_h1_nodes;
  return network;
  allocate_network_1:
  free_vector(network->y_out);
  allocate_network_2:
  free_vector(network->x_inp);
  allocate_network_3:
  return 0;
}

void free_network(network_rec *network)
{
  if (network->allocated) {
    free_vector(network->h1);
    free_vector(network->y_out);
    free_vector(network->x_inp);
    network->si = network->so = network->sh = 0;
  }
  network->allocated = FALSE;
}

BOOL ensure_network_exists(network_rec *net, ff_setup_rec *setup)
{
  if (net->allocated==FALSE) {
    if (allocate_network(net, setup)==0) return FALSE;
  }
  else
    if (net->si!=setup->no_of_inputs+1 || net->so!=setup->no_of_outputs || net->sh!=setup->no_of_h1_nodes) {
      free_network(net);
      if (allocate_network(net, setup)==0) return FALSE;
    }
  return TRUE;
}

unit ff_error(vector desired, vector net_out, ff_setup_rec *setup)
{
  int i;
  unit sum=0;
  for (i=1; i<=setup->no_of_outputs; i++) sum += mul_frac16( desired[i]-net_out[i], desired[i]-net_out[i] );
  return (sum+1)/2;
}

BOOL feedforward(network_rec *n, weights_rec *w, ff_setup_rec *s)
{
  int i, j;
  unit wx=0;
  unit wh1=0;
  if (!n->allocated) {
    werr(werrterm, "feedforward: network not allocated");
    return FALSE;
  }
  if (!w->allocated) {
    werr(werrterm, "feedforward: weights not allocated");
    return FALSE;
  }
  n->x_inp[s->no_of_inputs+1] = one;	/*threshold node*/
  for (i=1; i<=s->no_of_h1_nodes; i++) {
    for (wx=0, j=1; j<=s->no_of_inputs+1; j++) wx += mul_frac16c(n->x_inp[j], w->wi[j][i]);
    n->h1[i] = sig16(wx);
  }
  for (i=1; i<=s->no_of_outputs; i++) {
    for (wh1=0, j=1; j<=s->no_of_h1_nodes; j++) wh1 += mul_frac16c(n->h1[j], w->wo[j][i]);
    n->y_out[i] = s->sigmoid_out ? sig16(wh1) : wh1;
  }
  return TRUE;
}

BOOL backpropagation(network_rec *net, vector desired_out, weights_rec *wts,
		     weights_rec *momentum, ff_setup_rec *setup		     )
{
  int i, j, k;
  BOOL retcode=FALSE;
  unit sum=0, term=0, wt_change=0;
  vector i_delta=NULL, o_delta=NULL;
  unit lroma = mul_frac16(setup->learning_rate, one-setup->alpha);
  if (i_delta=allocate_vector(setup->no_of_h1_nodes), i_delta==0) goto backpropagation_2;
  if (o_delta=allocate_vector(setup->no_of_outputs),  o_delta==0) goto backpropagation_1;
  for (k=1; k<=setup->no_of_outputs; k++) o_delta[k] = desired_out[k] - net->y_out[k];
  /*adjust input weights*/
  for (j=1; j<=setup->no_of_h1_nodes; j++) {
    for (sum=0, k=1; k<=setup->no_of_outputs; k++) {
      term = mul_frac16c(o_delta[k], wts->wo[j][k]);
      if (setup->sigmoid_out) term = mul_frac16( mul_frac16(net->y_out[k], one-net->y_out[k]), term );
      sum += term;
    }
    i_delta[j] = sum;
  }
  for (i=1; i<=setup->no_of_inputs+1; i++)
    for (j=1; j<=setup->no_of_h1_nodes; j++) {
      wt_change = mul_frac16( mul_frac16( mul_frac16(net->h1[j], one-net->h1[j]), net->x_inp[i]), i_delta[j] );
      if (!setup->sigmoid_out) wt_change /= 10;
      wts->wi[i][j] += mul_frac16(lroma, wt_change) + mul_frac16(setup->alpha, momentum->wi[i][j]);
      momentum->wi[i][j] = wt_change;
    }
  /*adjust output weights*/
  for (j=1; j<=setup->no_of_h1_nodes; j++)
    for (k=1; k<=setup->no_of_outputs; k++) {
      wt_change = mul_frac16(net->h1[j], o_delta[k]);
      if (setup->sigmoid_out) wt_change = mul_frac16( mul_frac16(net->y_out[k], one-net->y_out[k]), wt_change );
      else wt_change /= 10;
      wts->wo[j][k] += mul_frac16(lroma, wt_change) + mul_frac16(setup->alpha, momentum->wo[j][k]);
      momentum->wo[j][k] = wt_change;
    }
  retcode=TRUE;
  free_vector(o_delta);
  backpropagation_1:
  free_vector(i_delta);
  backpropagation_2:
  return retcode;
}

BOOL backpropagation_training(network_rec *net, weights_rec *wts, int no_of_training_items,
			      get_data_proc get_network_input_output, BOOL verbose, ff_setup_rec *setup)
{
  int i;
  unit err;
  weights_rec momentum = {0, NULL, NULL, 0, 0, 0};
  vector d_out = NULL;
  display_rec display = {0,0,0,0,0,0,0,0};
  if (!ensure_network_exists(net, setup)) goto bpt3;
  if (initialise_weights(&momentum, FALSE, setup)==0) goto bpt2;
  if (d_out=allocate_vector(setup->no_of_outputs), d_out==0) goto bpt1;
  display.iter = setup->start_iter;
  display.nbr_tr_items = no_of_training_items;
  if (verbose) setup_screen(&display, setup);
  while ( display.count_max<1 && !kbhit() ) {
    display.right_count = 0;
    display.wrong_count = 0;
    display.iter++;
    for (i=1; i<=no_of_training_items; i++) {
      get_network_input_output(net->x_inp, d_out, setup);
      feedforward(net, wts, setup);
      err = ff_error(d_out, net->y_out, setup);
      if (err > setup->error_threshold) {
        display.wrong_count++;
        backpropagation(net, d_out, wts, &momentum, setup);
      }
      else display.right_count++;
      if (verbose && (i&31)==0) display_results(&display, d_out, net->y_out, setup);
    }
    if (display.right_count > display.high_water) display.high_water = display.right_count;
    if (display.right_count >=no_of_training_items) display.count_max++;
    else display.count_max=0;
    display.last_right = display.right_count;
    display.last_wrong = display.wrong_count;
  }
  setup->start_iter = display.iter;
  if (display.count_max==1) bbc_vdu(7);
  else g_user_terminated_learning = TRUE;
  if (verbose) {
    bbc_cls();
    bbc_tab(21,4<<(2-ly));  printf("Total number of iterations used: %i", display.iter);
    bbc_tab(21,6<<(2-ly));  printf("  High water mark: %3i out of %3i.", display.high_water, no_of_training_items);
    bbc_tab(22,17<<(2-ly)); printf("Hit <Space> to return to Desktop.");
    release(-99);
    press(-99);
    release(-99);
    bbc_cls();
  }
  free_vector(d_out);
  free_network_weights(&momentum);
  return TRUE;
  bpt1:
  free_network_weights(&momentum);
  bpt2:
  free_network(net);
  bpt3:
  return FALSE;
}

/**************************** brolly controller specific net functions ***********************************/

#define X_POS_INDEX 1
#define X_DOT_INDEX 2
#define THETA_INDEX 3
#define THETA_DOT_INDEX 4
#define FORCE_INDEX 5
#define MAX_FORCE (10*one)

typedef struct {
  unit x_pos,
       x_dot,
       theta,
       theta_dot;
} state_rec;

typedef struct {
  unit rand_force,
       system_force_incr,
       user_force_incr,
       zero_theta;
} tbrm_setup_rec;

unit x_pos_min = (int)(-2.4*one);
unit x_pos_max = (int)(2.4*one);
unit x_dot_min = (int)(-0.63*one);
unit x_dot_max = (int)(0.63*one);
unit theta_min = (int)(-1.22*one);
unit theta_max = (int)(1.22*one);
unit theta_low_lim = (int)(-0.2094*one);
unit theta_up_lim  = (int)(0.2094*one);
unit theta_dot_min = (int)(-1.35*one);
unit theta_dot_max = (int)(1.35*one);
unit force_mag = (int)(10.0*one);
unit x_pos_factor;
unit x_dot_factor;
unit theta_factor;
unit theta_dot_factor;
unit force_factor;

tbrm_setup_rec g_brm_setup;
state_rec g_brm_state;
int no_of_training_items;
ff_setup_rec g_ff_setup;
network_rec g_network = {FALSE, NULL, NULL, NULL, 0, 0, 0};
weights_rec g_weights = {FALSE, NULL, NULL, 0, 0, 0};

typedef unit (*controller) (state_rec *state);
controller get_force;

void initialise_brm_setup(tbrm_setup_rec *s)
{
  s->rand_force = (int)(5.0*one);
  s->system_force_incr = (int)(3.0*one);
  s->user_force_incr = (int)(5.0*one);
  s->zero_theta = (int)(0.005*one);
}

void set_brolly_at_start_position(state_rec *state)
{
  state->x_pos = 0;
  state->x_dot = 0;
  state->theta = 0;
  state->theta_dot = 0;
}

/*nb old_state=new_state permitted*/
void evolve(unit f, state_rec *old_state, state_rec *new_state)
{
  int thm = mul_frac16c(old_state->theta, 41722); /*converts from theta in rads*one to thm in rads*one*2/PI, required by sin16 & cos16*/
  int thdd, xdd, sint, cost, thd2st;
  sint   = sin16(thm);
  cost   = cos16(thm);
  thd2st = mul_frac16c(mul_frac16(old_state->theta_dot, old_state->theta_dot), sint);
  thdd   = div_frac16( mul_frac16c(p2, sint) - mul_frac16c(f+mul_frac16(p1,thd2st), cost) , p3 - mul_frac16c(p1, mul_frac16c(cost, cost)) );
  xdd    = div_frac16( f + mul_frac16(thd2st-mul_frac16c(thdd,cost), p1) , m );
  new_state->x_pos	= old_state->x_pos + old_state->x_dot / frame_freq;
  new_state->theta	= old_state->theta + old_state->theta_dot / frame_freq;
  new_state->x_dot	= old_state->x_dot + xdd / frame_freq;
  new_state->theta_dot	= old_state->theta_dot + thdd / frame_freq;
  return;
}

/*this fn is used during net training, since application of evolve alone isn't sufficient for net to
  learn effect of f on theta - nature of Euler is such that need 2 applications for effect to filter down
  to position variables*/
void force_effect(unit f, state_rec *in, state_rec *out)
{
  evolve(f, in, out);
  evolve(0, out, out);
}

BOOL create_max_min_data(void)
{
  state_rec state, new_state, min_state, max_state;
  unit force;
  int i;
  min_state.x_pos	=	x_pos_min;
  max_state.x_pos	=	x_pos_max;
  min_state.theta	=	theta_low_lim;
  max_state.theta	=	theta_up_lim;
  min_state.x_dot	=	0;
  max_state.x_dot	=	0;
  min_state.theta_dot	=	0;
  max_state.theta_dot	=	0;
  /*run the brolly dynamics to collect observations on max/min data*/
  set_brolly_at_start_position(&state);
  for (i=1; i<=no_of_training_items; i++) {
    force = mul_frac16c(force_mag, rand16());
    evolve(force, &state, &new_state);
    if (new_state.x_dot < min_state.x_dot) min_state.x_dot = new_state.x_dot;
    if (new_state.x_dot > max_state.x_dot) max_state.x_dot = new_state.x_dot;
    if (new_state.theta_dot < min_state.theta_dot) min_state.theta_dot = new_state.theta_dot;
    if (new_state.theta_dot > max_state.theta_dot) max_state.theta_dot = new_state.theta_dot;
    if ( new_state.x_pos>x_pos_min && new_state.x_pos<x_pos_max &&
	 new_state.theta>theta_low_lim && new_state.theta<theta_up_lim ) state = new_state;
    else set_brolly_at_start_position(&state);
  }
  if (max_state.x_dot+min_state.x_dot < 0) max_state.x_dot = -min_state.x_dot;
  min_state.x_dot = -max_state.x_dot;
  if (max_state.theta_dot+min_state.theta_dot < 0) max_state.theta_dot = -min_state.theta_dot;
  min_state.theta_dot = -max_state.theta_dot;
  /*compute the factors involved in converting between a state_rec & normalised network input*/
  if (max_state.x_dot-min_state.x_dot<3 || max_state.theta_dot-min_state.theta_dot<3) {
    werr(werrterm, "Create max min data: too low a range on x or theta dot data");
    return FALSE;
  }
  x_dot_min	= min_state.x_dot;
  x_dot_max	= max_state.x_dot;
  theta_dot_min	= min_state.theta_dot;
  theta_dot_max	= max_state.theta_dot;
  x_pos_factor = div_frac16(one, x_pos_max-x_pos_min);
  x_dot_factor = div_frac16(one, x_dot_max-x_dot_min);
  theta_factor = div_frac16(one, theta_up_lim-theta_low_lim);
  theta_dot_factor = div_frac16(one, theta_dot_max-theta_dot_min);
  force_factor = div_frac16(one, 2*force_mag);
  return TRUE;
}

/*the use_old bodge ensures the net gets 'symmetric' training - see article for why this is important*/
void get_random_brolly_state(state_rec *state)
{
  static BOOL use_old=FALSE;
  static state_rec s;
  if (use_old) {
    s.x_pos = -s.x_pos;
    s.x_dot = -s.x_dot;
    s.theta = -s.theta;
    s.theta_dot = -s.theta_dot;
  }
  else {
    s.x_pos = mul_frac16c(x_pos_max-x_pos_min, randu16()) + x_pos_min;
    s.x_dot = mul_frac16c(x_dot_max-x_dot_min, randu16()) + x_dot_min;
    s.theta = mul_frac16c(theta_up_lim-theta_low_lim, randu16()) + theta_low_lim;
    s.theta_dot = mul_frac16c(theta_dot_max-theta_dot_min, randu16()) + theta_dot_min;
  }
  *state = s;
  use_old = !use_old;
}

void get_network_input(state_rec *s, vector x_in, unit force, ff_setup_rec *setup)
{
  int i;
  unit norm_in_max;
  x_in[X_POS_INDEX]	= mul_frac16(setup->norm_in_range, mul_frac16(s->x_pos-x_pos_min, x_pos_factor)) + setup->norm_in_min;
  x_in[X_DOT_INDEX]	= mul_frac16(setup->norm_in_range, mul_frac16(s->x_dot-x_dot_min, x_dot_factor)) + setup->norm_in_min;
  x_in[THETA_INDEX]	= mul_frac16(setup->norm_in_range, mul_frac16(s->theta-theta_low_lim, theta_factor)) + setup->norm_in_min;
  x_in[THETA_DOT_INDEX]	= mul_frac16(setup->norm_in_range, mul_frac16(s->theta_dot-theta_dot_min, theta_dot_factor)) + setup->norm_in_min;
  x_in[FORCE_INDEX]	= mul_frac16(setup->norm_in_range, mul_frac16(force*0+force_mag, force_factor)) + setup->norm_in_min;
  norm_in_max = setup->norm_in_min + setup->norm_in_range;
  for (i=1; i<=5; i++) {
    if (x_in[i] > norm_in_max) x_in[i] = norm_in_max;
    if (x_in[i] < setup->norm_in_min) x_in[i] = setup->norm_in_min;
  }
}

void brolly_dynamics_input(vector x_in, vector desired_out, ff_setup_rec *setup)
{
  state_rec state, new_state;
  unit force = mul_frac16c(force_mag, rand16());
  get_random_brolly_state(&state);
  force_effect(force, &state, &new_state);
  get_network_input(&state, x_in, force, setup);
  desired_out[1] = mul_frac16(new_state.theta-theta_low_lim, theta_factor);
}

/********************************* various possible controllers! ****************************************/

/*an elementary strategy doomed to failure!*/
unit control(state_rec *s)
{
  if (s->theta>g_brm_setup.zero_theta)  return g_brm_setup.system_force_incr;
  if (s->theta<-g_brm_setup.zero_theta) return -g_brm_setup.system_force_incr;
  return 0;
}

/*the null 'do nothing' controller for use when you want a manual game*/
unit null_control(state_rec *s)
{
  return 0;
}

/********                         our neural network controller !!!                              ********/

unit neural_control(state_rec *s)
{
  unit out_angle;
  get_network_input(s, g_network.x_inp, 0, &g_ff_setup);
  feedforward(&g_network, &g_weights, &g_ff_setup);
  out_angle = mul_frac16(g_network.y_out[1], theta_up_lim-theta_low_lim) + theta_low_lim;
  if (out_angle>g_brm_setup.zero_theta)  return  g_brm_setup.system_force_incr;
  if (out_angle<-g_brm_setup.zero_theta) return -g_brm_setup.system_force_incr;
  return 0;
}

/************************************ initialise network data *******************************************/

BOOL network_initialise_parameters(void)
{
  get_force = neural_control;
  speed = 2;
  initialise_brm_setup(&g_brm_setup);
  no_of_training_items		=	100;
  g_ff_setup.error_threshold	=	(int)(0.0065*one);
  g_ff_setup.start_iter		=	0;
  g_ff_setup.no_of_inputs	=	5;
  g_ff_setup.no_of_h1_nodes	=	20;
  g_ff_setup.no_of_outputs	=	1;
  g_ff_setup.sigmoid_out	=	TRUE;
  g_ff_setup.alpha		=	(int)(0.9*one);
  g_ff_setup.learning_rate	=	(int)(1.0*one);
  g_ff_setup.norm_in_min	=	(int)(-5.0*one);
  g_ff_setup.norm_in_range	=	-2*g_ff_setup.norm_in_min;
  g_user_terminated_learning	=	FALSE;
  return TRUE;
}

/********************************************************************************************************/
/************************************** MAIN GAME CODE **************************************************/

BOOL init(void)
{
  sprite_ptr bsp[47];
  char filepath[maxpath] = "<Brolly$Dir>.Graphics.Sprites";
  char sname[3];
  int i;
  sprite_id sid;
  int th1, th2,thi,thi2,thc;
  int ang;
  int x[] = {  192, 186, 179, 170, 160, 149, 139, 129, 119, 108,  99,  90,  81,  73,  65,
  	        57,  51,  46,  41,  38,  34,  32,  30,  30,  28,  27,  25,  21,  17,  13,   7,
	         3,   2,   3,   3,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   1,   1  };

  vga = read_monitor_type()==multi ? TRUE : FALSE;
  /*nb assembler graphics code assumes mode is 640 pixels wide*/
  if (vga) {
    mode  = 27;
    strcat(filepath, "22");
    osy   = 960;
    gwy   = -394;
    gy    = 51;
    lx    = 1;
    ly    = 1;
    sarea = 418084+6*556+(44+160*(bh>>ly))+4;
  }
  else {
    mode  = 12;
    strcat(filepath, "24");
    osy   = 1024;
    gwy   = -456;
    gy    = 26;
    lx    = 1;
    ly    = 2;
    sarea = 215392+6*300+(44+160*(bh>>ly))+4;
  }
  originx  = 640;
  originy  = 564;
  area = malloc(sarea);
  if (area==0) {
    werr(0, "Insufficient memory");
    return FALSE;
  }
  sprite_area_initialise(area, sarea);
  wimpt_noerr(sprite_area_load(area, filepath));
  sid.tag  = sprite_id_name;
  sid.s.name = sname;
  for (i=1; i<=47; i++) {
    sprintf(sname, "%02i", i);
    wimpt_noerr(sprite_select_rp(area, &sid, bsp+i-1));
  }
  for (i=0; i<=9; i++) {
    sprintf(sname, "%01i", i);
    wimpt_noerr(sprite_select_rp(area, &sid, nums+i));
  }
  handp.tag  = sprite_id_name;
  handp.s.name = "hand";
  wimpt_noerr(sprite_select_rp(area, &handp, &handp.s.addr));
  handp.tag  = sprite_id_addr;
  wall.tag  = sprite_id_name;
  wall.s.name = "wall";
  wimpt_noerr(sprite_select_rp(area, &wall, &wall.s.addr));
  wall.tag  = sprite_id_addr;
  getready.tag  = sprite_id_name;
  getready.s.name = "getready";
  wimpt_noerr(sprite_select_rp(area, &getready, &getready.s.addr));
  getready.tag  = sprite_id_addr;

  th1=-999*one, th2=-69*one, thi=23*one/4, thi2=-one/4, thc=0;
  for (i=0; i<=1024; i++) {
    ang = 180*i*(one/1024) - 90*one;
    if (ang>th2 && ang<69*one) {
      thc++, th1=th2, th2+=thi, thi+=thi2;
      if (thi==0) {
        thi2=-thi2;
        thi+=thi2;
      }
    }
    if (thi2-ang<ang-th1) {
      spr[i]  = bsp[thc];
      sprx[i] = -2*x[thc];
    }
    else {
      spr[i]  = bsp[thc-1];
      sprx[i] = -2*x[thc-1];
    }
  }
  m  = 11*one/10;
  l  = one;
  mb = one/10;
  g  = 98*one/10;
  p1 = mul_frac16(mb, l)/2;
  p2 = mul_frac16(m, g);
  p3 = 2*mul_frac16(m, l)/3;

  goriginx = originx;
  goriginy = (osy-1-originy)&~((1<<ly)-1);

  network_initialise_parameters();
  if (!create_max_min_data()) return FALSE;
  netparams_to_gui();

  PCHfor[12] = 13;
  PCHfor[13] = 14;
  PCHfor[14] = 15;
  PCHfor[15] = 16;
  PCHfor[16] = 12;
  PCHfor[17] = 18;
  PCHfor[18] = 19;
  PCHfor[19] = 20;
  PCHfor[20] = 17;
  PCHaft[12] = 16;
  PCHaft[13] = 12;
  PCHaft[14] = 13;
  PCHaft[15] = 14;
  PCHaft[16] = 15;
  PCHaft[17] = 20;
  PCHaft[18] = 17;
  PCHaft[19] = 18;
  PCHaft[20] = 19;

  return TRUE;
}

void lose(void)
{
  bank = 3-bank;
  os_swi2(OS_Byte, 112, bank);
  /*printf("\nTotal time: %i\n", clock()-ti2);*/
  bbc_vdu(7);
  release(-26);
  release(-122);
  release(-99);
  bbc_cursor(0);
  os_swi2(OS_Byte, 15, 1);
  bbc_tab(get_force==null_control?20:16,3);
			printf("       You%s survived for %i steps.", get_force==null_control?"":"r network", gen);
  bbc_tab(25,11);	printf("Hit <Space> to return to Desktop.");
  if (gen>hscore) {
    hscore = gen;
    bbc_tab(26,7);	printf("You have set a new high score!");
  }
  else {
    bbc_tab(26,7);	printf("      High score: %i", hscore);
  }
  gamec++;
  totgen+=gen;
  bbc_tab(26,5);	printf("      Average score: %i", (totgen+gamec/2)/gamec);
  press(-99);
  release(-99);
  quit=TRUE;
  srand(0x55555555+clock());
}

void plot_background(void)
{
  bbc_cls();
  wimpt_complain(sprite_put_given(area, &wall, 0, -640, gwy));
}

void init_genandbar(void)
{
  int i, j;
  char sname[3];
  sprite_id sid;
  j=gen=lowgen;
  tnd=0;
  for (i=0; i<6; i++) {
    d[i] = j%10;
    if (d[i]!=0) tnd=i+1;
    j=j/10;
  }
  otnd=votnd=tnd;
  if (tnd!=0) {
    for (i=0; i<tnd; i++) {
      gx[i] = 32*tnd - 64*(i+1);
      sprintf(sname, "d%01i", i);
      wimpt_complain(sprite_get_given(area, sname, FALSE, gx[i], gny, gx[i]+63, gny+63));
    }
    sid.tag  = sprite_id_name;
    sid.s.name = sname;
    for (i=0; i<tnd; i++) {
      sprintf(sname, "d%01i", i);
      wimpt_complain(sprite_select_rp(area, &sid, numbacks+i));
    }
  }
  wimpt_complain(sprite_get_given_rp(area, "bar", FALSE, -320, by, -320+639, by+bh-1  ,&bar));
}

void gennumber(void)
{
  int ncdd;			/*number of changed digits to be displayed (nb bank swapping implies overprinting on screen 2 frames back)*/
  int ncde;			/*number of changed digits to be erased*/
  int i;
  char sname[3];
  sprite_id sid;
  votnd=otnd;
  oncd=ncd;
  otnd=tnd;
  for (i=0; i<6; i++) if (d[i]!=9) break;
  ncd = i+1;
  if (ncd>tnd) tnd=ncd;
  if (ncd==7) ncd=tnd=1;
  ncdd = ncd>oncd ? ncd : oncd;
  ncde = tnd!=votnd ? votnd : ncdd;
  /*erase old numbers (ncde at coords in ox[]), except on 1st 2 frames where are none*/
  if (gen-lowgen>1) for (i=0; i<ncde; i++) erase_number(area, numbacks[i], gox[i], gny);
  else ncdd=tnd;
  for (i=5; i>=0; i--) gox[i]=gx[i];
  if (tnd!=otnd) {
    for (i=0; i<tnd; i++) {
      gx[i] = 32*tnd - 64*(i+1);
    }
  }
  else if (tnd!=votnd) {
    for (i=0; i<tnd; i++) {
      sprintf(sname, "d%01i", i);
      wimpt_complain(sprite_get_given(area, sname, FALSE, gx[i], gny, gx[i]+63, gny+63));
    }
    sid.tag  = sprite_id_name;
    sid.s.name = sname;
    for (i=0; i<tnd; i++) {
      sprintf(sname, "d%01i", i);
      wimpt_complain(sprite_select_rp(area, &sid, numbacks+i));
    }
    sid.s.name = "bar";
    wimpt_complain(sprite_select_rp(area, &sid, &bar));
  }
  /*now inc each digit stored individually and plot as many as have changed since 2 frames back*/
  for (i=0; i<6; i++) {
    if (++d[i]==10) d[i]=0;
    else break;
  }
  for (i=0; i<ncdd; i++) plot_number(area, nums[d[i]], gx[i], gny);
  gen++;
}

void plot_objects(void)
{
  erase_brolly(spr[voi], vox+sprx[voi], -64);
  erase_hand(area, handp.s.addr, vox-72, -64-64);
  if (vof!=0) erase_bar(bh, bar, -320, by);
  plot_brolly(area, spr[spri], ix+sprx[spri], 0-64);
  plot_hand(area, handp.s.addr, ix-72, -64-64);
  if (f!=0) plot_bar(0, by, f/(one/32), bh, bci);
  vof=of;
  of=f;
  gennumber();
}

void start_game(void)
{
  quit = FALSE;
  ti   = clock();
  f = of = vof = 0;
  set_brolly_at_start_position(&g_brm_state);
  vox = ox = ix = (g_brm_state.x_pos+140)/280;
  voi = oi = spri = 512 + (g_brm_state.theta+101)/201;
  plot_background();
  swap_banks();
  plot_background();
  init_genandbar();
  wimpt_complain(sprite_put_given(area, &getready, 0, -270, 400));
  plot_objects();
  swap_banks();
  for (ti=clock(); clock()-ti<=200;);
  bank = 3-bank;
  plot_bar(-272, 400, 544, 64, 0);
  bank = 3-bank;
  bbc_vdu(7);
  f = rand()>RAND_MAX/2 ? g_brm_setup.rand_force : -g_brm_setup.rand_force;
  evolve(f, &g_brm_state, &g_brm_state);
  ti2=clock();
}

void play_game(void)
{
  start_game();
  for (;!quit;) {
    vox = ox;
    voi = oi;
    ox  = ix;
    oi  = spri;
    ix = (g_brm_state.x_pos+140)/280; /* (7/8 * 640)*(x/one)/2.4 */
    spri = 512 + (g_brm_state.theta+101)/201; /* 1024*(th/one)/PI + 512 */
    if (spri<0)    spri=0;
    if (spri>1024) spri=1024;
    plot_objects();
    pause();
    swap_banks();
    if (abs(g_brm_state.x_pos)>x_pos_max || abs(g_brm_state.theta)>theta_max || bbc_inkey(-99)) {
      lose();
      break;
    }
    f = get_force(&g_brm_state);
    if (bbc_inkey(-26))  f-=g_brm_setup.user_force_incr;
    if (bbc_inkey(-122)) f+=g_brm_setup.user_force_incr;
    if (f>MAX_FORCE)  f=MAX_FORCE;
    if (f<-MAX_FORCE) f=-MAX_FORCE;
    evolve(f, &g_brm_state, &g_brm_state);
  }
}

/********************************************************************************************************/
/************************************** WIMP FUNCTIONS  *************************************************/

/*************************** file functions *********************************/

static int pbp_lastchunksize;

BOOL parameters_buffer_processor(char **buffer, int *size)
{
  int extension = 4096;
  int offset = *buffer - pfile;
  char *newblock = realloc(pfile, offset+*size+1+extension);
  if (newblock==0) {
    werr(0, msgs_lookup("MemRL1"));
    return FALSE;
  }
  pfile = newblock;
  pfile_length += extension;
  *buffer = pfile+offset+*size;
  pbp_lastchunksize = *size = extension;
  return TRUE;
}

BOOL parameters_load_ram(void)
{
  int estsize;
  int filetype=xferrecv_checkimport(&estsize);
  if (pfile) {
    free(pfile);
    pfile=0;
  }
  if (filetype!=-1) {
    int final_size;
    if (filetype!=0xfff) {
      werr(0, "Illegal attempt to load a non-text file");
      return FALSE;
    }
    pfile = malloc(estsize+1);
    if (pfile==0) {
      werr(0, "Insufficient memory for data transfer");
      return FALSE;
    }
    pfile_length = pbp_lastchunksize = estsize;
    if (final_size=xferrecv_doimport(pfile, estsize, parameters_buffer_processor),
        final_size>=0) {
      pfile_length += final_size - pbp_lastchunksize;
      pfile[pfile_length]='\0';
      if (strstr(pfile, "Neural Net Weights File")) return TRUE;
      werr(0, "Illegal attempt to load a file which does not contain weights data");
      return FALSE;
    }
    werr(0, "Weights load failed");
    return FALSE;
  }
  return parameters_load_file();
}

BOOL parameters_load_file(void)
{
  os_regset r;
  os_error *e;
  char *filename;
  int filetype=xferrecv_checkinsert(&filename);
  if (pfile) {
    free(pfile);
    pfile=0;
  }
  if (filetype!=0xfff) {
    werr(0, "Illegal attempt to load a non-text file");
    return FALSE;
  }
  r.r[0]=5;              /*check file size*/
  r.r[1]=(int)filename;
  wimpt_complain(e=os_swix(OS_File | XOS_Bit, &r));
  if (e) return FALSE;
  pfile_length = r.r[4];
  pfile = malloc(pfile_length+1);
  if (pfile==0) {
    werr(0, "Insufficient memory to load file");
    return FALSE;
  }
  r.r[0]=255;            /*load file*/
  r.r[2]=(int)pfile;
  r.r[3]=0;
  wimpt_complain(e=os_swix(OS_File | XOS_Bit, &r));
  if (e) return FALSE;
  pfile[pfile_length]='\0';
  if (strstr(pfile, "Neural Net Weights File")) {
    if (xferrecv_file_is_safe()) {
      strncpy(filepath_parameters, filename, maxpath);
      wtssafe = TRUE;
    }
    xferrecv_insertfileok();
    return TRUE;
  }
  werr(0, "Illegal attempt to load a file which does not contain weights data");
  return FALSE;
}

BOOL pld_readd(char *s, char *k, fp *f)
{
  char *ptr;
  double d;
  if (ptr=strstr(s, k), ptr) {
    if (sscanf(ptr+strlen(k), "%lg", &d)!=EOF) {
      *f = dtofp(d);
      return TRUE;
    }
  }
  return FALSE;
}

BOOL pld_readi(char *s, char *k, int *i)
{
  char *ptr;
  if (ptr=strstr(s, k), ptr) {
    if (sscanf(ptr+strlen(k), "%i", i)!=EOF) return TRUE;
  }
  return FALSE;
}

BOOL pld_readb(char *s, char *k, char *a, BOOL *b)
{
  char *ptr;
  char buf[256];
  if (ptr=strstr(s, k), ptr) {
    if (sscanf(ptr+strlen(k), "%256s", buf)!=EOF) {
      *b = strncmp(a, buf, 256)==0;
      return TRUE;
    }
  }
  return FALSE;
}

BOOL parameters_load_decode(void)
{
  char *ptr;         /*read values from text buffer to variables*/
  BOOL b;
  BOOL retcode = FALSE;
  int i, j, c;
  double d;
  pld_readi(pfile, "# hidden layer nodes:", &g_ff_setup.no_of_h1_nodes);
  pld_readd(pfile, "alpha:", &g_ff_setup.alpha);
  pld_readd(pfile, "learning rate:", &g_ff_setup.learning_rate);
  pld_readi(pfile, "start iteration:", &g_ff_setup.start_iter);
  pld_readi(pfile, "# training items:", &no_of_training_items);
  pld_readd(pfile, "error threshold:", &g_ff_setup.error_threshold);
  pld_readd(pfile, "random force:", &g_brm_setup.rand_force);
  pld_readd(pfile, "system force:", &g_brm_setup.system_force_incr);
  pld_readd(pfile, "user force:", &g_brm_setup.user_force_incr);
  pld_readd(pfile, "zero theta tollerance:", &g_brm_setup.zero_theta);
  if (pld_readb(pfile, "speed:", "fast", &b)) speed = b ? 2 : 4;
  if (pld_readb(pfile, "neural controller:", "on", &b)) get_force = b ? neural_control : null_control;
  netparams_to_gui();			/*copy data into window*/
  if (!gui_to_netparams1()) goto pld1;  /*quick bodge to range check the items &  ... */
  if (!gui_to_netparams2()) goto pld1;  /* ... also create weights & net data storage */
  if (ptr=strstr(pfile, "input weights:"), ptr)
    if (ptr=strchr(ptr, '\n'), ptr)
      for (i=1; i<=g_weights.si; i++)
        for (j=1; j<=g_weights.sh; j++)
          if (sscanf(ptr, " %lg%n", &d, &c)!=EOF) {
            g_weights.wi[i][j] = dtofp(d);
            ptr+=c;
          }
  if (ptr=strstr(pfile, "output weights:"), ptr)
    if (ptr=strchr(ptr, '\n'), ptr)
      for (i=1; i<=g_weights.sh; i++)
        for (j=1; j<=g_weights.so; j++)
          if (sscanf(ptr, " %lg%n", &d, &c)!=EOF) {
            g_weights.wo[i][j] = dtofp(d);
            ptr+=c;
          }
  retcode = TRUE;
  pld1:
  free(pfile);
  pfile = 0;
  return retcode;
}

char *bpf_out(char *ptr, BOOL write, char *format, ...)
{
  char buf[256];
  int len;
  va_list arg_pointer;
  va_start(arg_pointer, format);
  len = vsprintf(buf, format, arg_pointer);
  if (len>=256) werr(0, "Internal error: bpf_out, buf overflow");
  if (write) memcpy(ptr, buf, len);
  ptr += len;
  va_end(arg_pointer);
  return ptr;
}

int bpf_intern(BOOL write)
{
  int i, j;
  char *ptr=pfile;
  ptr = bpf_out(ptr, write, "Neural Net Weights File:\n\n");
  ptr = bpf_out(ptr, write, "# input nodes: %i\n", g_ff_setup.no_of_inputs);
  ptr = bpf_out(ptr, write, "# hidden layer nodes: %i\n", g_ff_setup.no_of_h1_nodes);
  ptr = bpf_out(ptr, write, "# output nodes: %i\n\n", g_ff_setup.no_of_outputs);
  ptr = bpf_out(ptr, write, "alpha: %g\n", fptod(g_ff_setup.alpha));
  ptr = bpf_out(ptr, write, "learning rate: %g\n\n", fptod(g_ff_setup.learning_rate));
  ptr = bpf_out(ptr, write, "start iteration: %i\n", g_ff_setup.start_iter);
  ptr = bpf_out(ptr, write, "# training items: %i\n", no_of_training_items);
  ptr = bpf_out(ptr, write, "error threshold: %g\n\n", fptod(g_ff_setup.error_threshold));
  ptr = bpf_out(ptr, write, "random force: %g\n", fptod(g_brm_setup.rand_force));
  ptr = bpf_out(ptr, write, "system force: %g\n", fptod(g_brm_setup.system_force_incr));
  ptr = bpf_out(ptr, write, "user force: %g\n\n", fptod(g_brm_setup.user_force_incr));
  ptr = bpf_out(ptr, write, "zero theta tollerance: %g\n", fptod(g_brm_setup.zero_theta));
  ptr = bpf_out(ptr, write, "speed: %s\n", speed<=2 ? "fast" : "slow");
  ptr = bpf_out(ptr, write, "neural controller: %s\n\n", get_force==null_control ? "off" : "on");
  ptr = bpf_out(ptr, write, "input weights:\n");
  for (i=1; i<=g_weights.si; i++) {
    for (j=1; j<=g_weights.sh; j++) ptr = bpf_out(ptr, write, "%7g ", fptod(g_weights.wi[i][j]));
    if (write) ptr[-1]='\n';
  }
  ptr = bpf_out(ptr, write, "\noutput weights:\n");
  for (i=1; i<=g_weights.sh; i++) {
    for (j=1; j<=g_weights.so; j++) ptr = bpf_out(ptr, write, "%7g ", fptod(g_weights.wo[i][j]));
    if (write) ptr[-1]='\n';
  }
  ptr = bpf_out(ptr, write, "\nend:\n");
  return ptr-pfile;
}

BOOL build_parameters_file(void)
{
  if (pfile) {
    free(pfile);
    pfile=0;
  }
  if (!gui_to_netparams1()) return FALSE;
  if (!gui_to_netparams2()) return FALSE;
  pfile_length = bpf_intern(FALSE);
  pfile = malloc(pfile_length+1);
  if (pfile==0) return FALSE;
  bpf_intern(TRUE);
  return TRUE;
}

BOOL parameters_saver_proc(char *filename, void *handle)
{
  os_regset r;
  os_error *e;
  handle=handle;
  r.r[0]=10;
  r.r[1]=(int)filename;
  r.r[2]=0xfff;
  r.r[4]=(int)pfile;
  r.r[5]=r.r[4]+pfile_length;
  wimpt_complain((e=os_swix(OS_File | XOS_Bit, &r), e));
  free(pfile);
  pfile = 0;
  if (e) return FALSE;
  if (xfersend_file_is_safe()) {
    strncpy(filepath_parameters, filename, maxpath);
    wtssafe=TRUE;
  }
  return TRUE;
}

BOOL parameters_sender_proc(void *handle, int *maxbuf)
{
  char *data=pfile;
  int data_remaining=pfile_length;
  int length=*maxbuf;
  BOOL done=FALSE;
  handle=handle;
  while (!done) {
    if (length>data_remaining) {length=data_remaining; done=TRUE;}
    if (!xfersend_sendbuf(data, length)) return FALSE;
    data+=length;
    data_remaining-=length;
    length=*maxbuf;
  }
  free(pfile);
  pfile = 0;
  return TRUE;
}

/*************************** misc functions *********************************/

void netparams_to_gui(void)
{
  mdbx_setnumeric(para_win_handle, pit_nohln, g_ff_setup.no_of_h1_nodes);
  mdbx_setdouble (para_win_handle, pit_a, fptod(g_ff_setup.alpha));
  mdbx_setdouble (para_win_handle, pit_lr, fptod(g_ff_setup.learning_rate));
  mdbx_setdouble (para_win_handle, pit_et, fptod(g_ff_setup.error_threshold));
  mdbx_setnumeric(para_win_handle, pit_noti, no_of_training_items);
  mdbx_setdouble (para_win_handle, pit_rf, fptod(g_brm_setup.rand_force));
  mdbx_setdouble (para_win_handle, pit_sf, fptod(g_brm_setup.system_force_incr));
  mdbx_setdouble (para_win_handle, pit_uf, fptod(g_brm_setup.user_force_incr));
  mdbx_setdouble (para_win_handle, pit_ztt, fptod(g_brm_setup.zero_theta));
  wimpt_complain(wimp_set_icon_state(para_win_handle, pit_cc, get_force==null_control?0:wimp_ISELECTED, wimp_ISELECTED));
  wimpt_complain(wimp_set_icon_state(para_win_handle, pit_s, speed<=2?0:wimp_ISELECTED, wimp_ISELECTED));
  wimpt_complain(wimp_set_icon_state(para_win_handle, pit_f, speed>2?0:wimp_ISELECTED, wimp_ISELECTED));
}

BOOL gui_to_netparams1(void)
{
  double d;
  int i;
  BOOL blank;

  blank=!mdbx_getnumeric(para_win_handle, pit_nohln, &i);
  if (blank || i<1 || i>MAXNOOFNODES) {
    if (i<1) i=1;
    if (i>MAXNOOFNODES) i=MAXNOOFNODES;
    mdbx_setnumeric(para_win_handle, pit_nohln, i);
  }
  g_ff_setup.no_of_h1_nodes=i;

  blank=!mdbx_getnumeric(para_win_handle, pit_noti, &i);
  if (blank || i<1 || i>1000) {
    if (i<1) i=1;
    if (i>1000) i=1000;
    mdbx_setnumeric(para_win_handle, pit_noti, i);
  }
  no_of_training_items=i;

  blank=!mdbx_getdouble(para_win_handle, pit_a, &d);
  if (blank || d<0.0 || d>2.0) {
    if (d<0.0) d=0.0;
    if (d>2.0) d=2.0;
    mdbx_setdouble(para_win_handle, pit_a, d);
  }
  g_ff_setup.alpha = dtofp(d);

  blank=!mdbx_getdouble(para_win_handle, pit_lr, &d);
  if (blank || d<0.0 || d>2.0) {
    if (d<0.0) d=0.0;
    if (d>2.0) d=2.0;
    mdbx_setdouble(para_win_handle, pit_lr, d);
  }
  g_ff_setup.learning_rate = dtofp(d);

  blank=!mdbx_getdouble(para_win_handle, pit_et, &d);
  if (blank || d<0.0 || d>1.0) {
    if (d<0.0) d=0.0;
    if (d>1.0) d=1.0;
    mdbx_setdouble(para_win_handle, pit_et, d);
  }
  g_ff_setup.error_threshold = dtofp(d);

  if (!g_weights.allocated || g_weights.sh!=g_ff_setup.no_of_h1_nodes) {
    if (!ensure_network_exists(&g_network, &g_ff_setup)) return FALSE;
    if (!initialise_weights(&g_weights, TRUE, &g_ff_setup)) return FALSE;
    wtssafe=TRUE;
  }
  return TRUE;
}

BOOL gui_to_netparams2(void)
{
  double d;
  BOOL blank;
  wimp_icon icon;

  blank=!mdbx_getdouble(para_win_handle, pit_rf, &d);
  if (blank || d<0.0 || d>fptod(MAX_FORCE)) {
    if (d<0.0) d=0.0;
    if (d>fptod(MAX_FORCE)) d=fptod(MAX_FORCE);
    mdbx_setdouble(para_win_handle, pit_rf, d);
  }
  g_brm_setup.rand_force = dtofp(d);

  blank=!mdbx_getdouble(para_win_handle, pit_sf, &d);
  if (blank || d<0.0 || d>fptod(MAX_FORCE)) {
    if (d<0.0) d=0.0;
    if (d>fptod(MAX_FORCE)) d=fptod(MAX_FORCE);
    mdbx_setdouble(para_win_handle, pit_sf, d);
  }
  g_brm_setup.system_force_incr = dtofp(d);

  blank=!mdbx_getdouble(para_win_handle, pit_uf, &d);
  if (blank || d<0.0 || d>fptod(MAX_FORCE)) {
    if (d<0.0) d=0.0;
    if (d>fptod(MAX_FORCE)) d=fptod(MAX_FORCE);
    mdbx_setdouble(para_win_handle, pit_uf, d);
  }
  g_brm_setup.user_force_incr = dtofp(d);

  blank=!mdbx_getdouble(para_win_handle, pit_ztt, &d);
  if (blank || d<0.0 || d>1.0) {
    if (d<0.0) d=0.0;
    if (d>1.0) d=1.0;
    mdbx_setdouble(para_win_handle, pit_ztt, d);
  }
  g_brm_setup.zero_theta = dtofp(d);

  wimpt_complain(wimp_get_icon_info(para_win_handle, pit_cc, &icon));
  get_force = icon.flags&wimp_ISELECTED ? neural_control : null_control;

  wimpt_complain(wimp_get_icon_info(para_win_handle, pit_f, &icon));
  speed = icon.flags&wimp_ISELECTED ? 2 : 4;

  return TRUE;
}

BOOL read_mode(int **p)
{
  int x, y;
  int size;
  int *ms, *mse, *d;
  os_byte(135, &x, &y);
  if (y<256) size=4;		/*we've been given a mode number*/
  else {			/*we're on a RISC PC and have been given a pointer to a mode selector*/
    ms = (int *)y;
    d  = ms+5;
    for (;*d!=-1;d+=2);
    mse = d+1;
    size = 4 + (mse-ms)*sizeof(int);
  }
  if (*p) {
    free(*p);
    *p = 0;
  }
  *p = malloc(size);
  if (*p==0) return FALSE;
  if (size==4) **p = y;		/*store mode number in block*/
  else {
    **p = (int)(1+*p);		/*make first word in block a pointer to next word, and copy to there the mode selector*/
    memcpy(1+*p, ms, size-4);
  }
  return TRUE;
}

BOOL set_mode(int *p)
{
  if (*p<256) bbc_mode(*p);
  else {
    if (os_swi2(os_X | 0x65, 0, *p)) return FALSE;	/*nb this line would also work on a RISC PC if *p<256*/
  }
  return TRUE;
}

BOOL read_wimppalette(char *p)
{
  int i;
  if (os_swi2(os_X | Wimp_ReadPalette, 0, (int)p)) return FALSE;
  for (i=0; i<20*4; i+=4) p[i]=0;
  return TRUE;
}

void prepare_screen_init(void)
{
  read_mode(&oldmode);
  read_wimppalette(oldpalette);
  wimp_get_point_info(&oldmouse);
  bbc_mode(mode+128);
  scrst[1] = get_screen_base();
  bbc_mode(mode);
  scrst[0] = get_screen_base();
  bbc_cursor(0);
  wimpt_complain(os_swi2(os_X | Wimp_SetPalette, 0, (int)palette));
  bbc_origin(goriginx, goriginy);
}

void prepare_screen_train(void)
{
  prepare_screen_init();
}

void prepare_screen_play(void)
{
  prepare_screen_init();
  bank=1;
  os_swi2(OS_Byte, 112, bank);
  os_swi2(OS_Byte, 113, 3-bank);
}

void reset_screen(void)
{
  char block[5] = {3, 0, 0, 0, 0};
  wimp_redrawstr r;
  set_mode(oldmode);
  tidy();
  wimpt_complain(os_swi2(os_X | Wimp_SetPalette, 0, (int)oldpalette));
  os_swi2(os_X | OS_Byte, 15, 1);
  pointer_reset_shape();
  block[1] = oldmouse.x&255;
  block[2] = oldmouse.x>>8&255;
  block[3] = oldmouse.y&255;
  block[4] = oldmouse.y>>8&255;
  os_word(21, block);
  r.w = -1;
  r.box.x0 = 0;
  r.box.y0 = 0;
  r.box.x1 = 65535;
  r.box.y1 = 65535;
  wimpt_complain(wimp_force_redraw(&r));
}

BOOL brolly_create_window(char *name, wimp_w *handle)
{
  wimp_wind *window;
  window = template_syshandle(name);
  if (window == 0)  return FALSE;
  return (wimpt_complain(wimp_create_wind(window, handle)) == 0);
}

void caret_hop(wimp_caretstr *c, wimp_i i)
{
  c->i = i;
  c->height = -1;
  c->index = -1;
  c->x=65535;
  wimpt_noerr(wimp_set_caret_pos(c));
}

BOOL do_train(void)
{
  if (!ensure_network_exists(&g_network, &g_ff_setup)) return FALSE;
  if (!gui_to_netparams1()) return FALSE;
  prepare_screen_train();
  backpropagation_training(&g_network, &g_weights, no_of_training_items, brolly_dynamics_input, TRUE, &g_ff_setup);
  wtssafe=FALSE;
  reset_screen();
  return TRUE;
}

BOOL do_play(void)
{
  gui_to_netparams2();
  if (get_force!=null_control && !g_weights.allocated) {
    werr(0, msgs_lookup("NoNet"));
    return FALSE;
  }
  prepare_screen_play();
  play_game();
  reset_screen();
  return TRUE;
}

void brolly_event_handler(wimp_eventstr *e, void *handle)
{
  wimp_i i;
  wimp_icon icon;
  handle = handle;

  switch (e->e)
  {
    case wimp_EBUT:
      if (e->data.but.m.w != para_win_handle) break;
      i = e->data.but.m.i;
      switch (i)
      {
        case pit_s:
        case pit_f:
          wimpt_complain(wimp_get_icon_info(para_win_handle, i, &icon));
          if ((icon.flags&wimp_ISELECTED) == 0)
            wimpt_complain(wimp_set_icon_state(para_win_handle, i==pit_s?pit_f:pit_s, wimp_ISELECTED, wimp_ISELECTED));
          break;

	case pit_rw:
          if (!ensure_network_exists(&g_network, &g_ff_setup)) break;
          initialise_weights(&g_weights, TRUE, &g_ff_setup);
          wtssafe=TRUE;
          break;

        case pit_tn:
	  do_train();
          break;

	case pit_p:
          do_play();
          break;
      }
      break;

    case wimp_EOPEN:
      if (e->data.o.w != para_win_handle) break;
      open_window(&e->data.o);
      break;

    case wimp_ECLOSE:
      if (e->data.o.w != para_win_handle) break;
      wimpt_noerr(wimp_close_wind(e->data.o.w));
      para_window_open = FALSE;
      break;

    case wimp_EKEY:
      if (e->data.key.c.w==para_win_handle) {
        if (e->data.key.chcode==key_RETURN) {
          if (e->data.key.c.i==16) {
            do_train();
            break;
          }
          if (e->data.key.c.i==20) {
            do_play();
            break;
          }
        }
        switch (e->data.key.chcode)
        {
          char hopto;
          case key_RETURN:
          case key_TAB:
          case key_downarrow:
            if (hopto = PCHfor[e->data.key.c.i], hopto != 255) caret_hop(&e->data.key.c, hopto);
            break;

	  case key_TAB+akbd_Sh:
          case key_uparrow:
            if (hopto = PCHaft[e->data.key.c.i], hopto != 255) caret_hop(&e->data.key.c, hopto);
            break;

          default:
            wimpt_noerr(wimp_processkey(e->data.key.chcode));
            break;
        }
      }
      else wimpt_noerr(wimp_processkey(e->data.key.chcode));
      break;

    case wimp_ESEND:
    case wimp_ESENDWANTACK:
      switch (e->data.msg.hdr.action)
      {
        case wimp_MDATASAVE:
          if (e->data.msg.hdr.task==wimpt_task()) break;
          if (e->data.msg.data.datasave.w!=para_win_handle) break;
          if (e->data.msg.data.datasave.type == 0xfff) {
            if (parameters_load_ram()) parameters_load_decode();
          }
          break;

        case wimp_MDATALOAD:
        case wimp_MDATAOPEN:
          if (e->data.msg.hdr.task==wimpt_task()) break;
          if (e->data.msg.data.dataload.w!=para_win_handle) break;
          if (e->data.msg.data.dataload.type == 0xfff) {
            if (parameters_load_file()) parameters_load_decode();
          }
          break;

        case wimp_MPREQUIT:
          if (wtssafe) break;
          e->data.msg.hdr.your_ref=e->data.msg.hdr.my_ref;
          wimpt_complain(wimp_sendmessage(wimp_EACK, &e->data.msg, 0));
          {
            mdbxquery_REPLY reply =
              mdbx_query(msgs_lookup("QuerySM"), msgs_lookup("QueryD"), msgs_lookup("QueryC"), msgs_lookup("QueryS"), 3);
            if (reply==mdbxquery_YES || reply==mdbxquery_ALT) {
              /*NB A prequit will be received from the task manager when either a shutdown is commenced, or
                when the user tries to quit the application via the task manager.
                Under RISC OS 2, quitting application via task manager will behave incorrectly when a
                modified file exists (ie user responding with 'discard' to the confirmation prompt
                first generated, will result in desktop shutdown instead of just the application quitting).
                This is necessary so that behaviour will be correct when a genuine shutdown results in this
                same prompt, & as under old os, application doesn't know whether prequit is due to application
                quit from task manager, or global shutdown.
                This problem doesn't arise under RISC OS 3.10, as wimp flags nature of prequit via low bit of
                first word following message header.
                IE on a user discard response, use pseudo code:
                if size!=20 & bit is set then just quit the app, else resume the shutdown
               */
              int data=*(5+(int *)&e->data.msg.hdr);
              BOOL shutdown = (e->data.msg.hdr.size!=20 && data&1) ? FALSE : TRUE ;
              if (reply==mdbxquery_ALT) {
                if (build_parameters_file()) saveas(0xfff, filepath_parameters, pfile_length, parameters_saver_proc, parameters_sender_proc, 0, 0);
                if (!wtssafe) break;
              }
              if (shutdown) {
                wimp_processkey(0x1fc);
                wtssafe=TRUE;
              }
              else exit(0);
            }
          }
          break;

      }
      break;

    default:   /* Ignore any other event */
      break;
  }
}

/*************************** menu functions *********************************/

static void main_menu_handler(void *handle, char *hit)
{
  handle = handle;

  switch (hit[0])
  {
    case MMinfo:
      brolly_info_about_program();
      break;

    case MMsave:
      if (build_parameters_file()) saveas(0xfff, filepath_parameters, pfile_length, parameters_saver_proc, parameters_sender_proc, 0, 0);
      break;
  }
}

/*************************** icon bar functions *****************************/

/*--- Event handler called on a left click on the icon. ---*/
static void brolly_iconclick(wimp_i icon)
{
  icon = icon; /* We don't need the handle: this stops compiler warning */
  para_open();
}

static void para_open(void)
{
  wimp_wstate  state;
  if (wimpt_complain(wimp_get_wind_state(para_win_handle, &state)) == 0)
  {
    state.o.behind = -1;
    wimpt_noerr(wimp_open_wind(&state.o));
    para_window_open = TRUE;
  }
}

static void brolly_iconload(wimp_eventstr *e, void *h)
{
  wimp_w w;
  wimp_i i;
  int t;
  h=h;
  switch (e->e)
  {
    case wimp_ESEND:
    case wimp_ESENDWANTACK:
      switch (e->data.msg.hdr.action)
      {
        case wimp_MDATASAVE:
          if (e->data.msg.hdr.task==wimpt_task()) break;
          w=e->data.msg.data.datasave.w;
          i=e->data.msg.data.datasave.i;
          t=e->data.msg.data.datasave.type;
          if (w!=-2 || i!=brolly_icon) break;
          if (t == 0xfff) {
            if (parameters_load_ram()) {
              parameters_load_decode();
              brolly_iconclick(i);
            }
          }
          break;

        case wimp_MDATALOAD:
        case wimp_MDATAOPEN:
          if (e->data.msg.hdr.task==wimpt_task()) break;
          w=e->data.msg.data.dataload.w;
          i=e->data.msg.data.dataload.i;
          t=e->data.msg.data.dataload.type;
          if (w!=-2 || i!=brolly_icon) break;
          if (t == 0xfff) {
            if (parameters_load_file()) {
              parameters_load_decode();
              brolly_iconclick(i);
            }
          }
          break;
      }
      break;
  }
}

/*--- Event handler for the menu. ---*/
static void bar_menu_handler(void *handle, char *hit)
{
  mdbxquery_REPLY reply;
  handle = handle;

  switch (hit[0])
  {
    case bar_menu_info:
      brolly_info_about_program();
      break;

    case bar_menu_quit:
      /* Exit from the program if wtssafe or user confirms. The wimp gets rid of the window and icon */
      if (wtssafe) exit(0);
      reply = mdbx_query(msgs_lookup("QuerySM"), msgs_lookup("QueryD"), msgs_lookup("QueryC"), msgs_lookup("QueryS"), 3);
      if (reply==mdbxquery_YES) exit(0);
      if (reply==mdbxquery_ALT) if (build_parameters_file()) saveas(0xfff, filepath_parameters, pfile_length, parameters_saver_proc, parameters_sender_proc, 0, 0);
      if (wtssafe) exit(0);
      break;
  }
}

/*--- Display the program info box - called from the menu processor. ---*/
static void brolly_info_about_program(void)
{
  dbox  d;  /* Dialogue box handle */
  if (d = dbox_new("ProgInfo"), d != NULL)
  {
    dbox_setfield(d, brolly_info_field, VERSION);
    dbox_show(d);
    dbox_fillin(d);
    dbox_dispose(&d);
  }
}

/****************************** initialisation ******************************/

/*--- Initialise the program, returning TRUE if it was all OK. ---*/
static BOOL brolly_initialise(void)
{
  char *main_menu_string;
  os_filestr f;
  char p[120], *ptr;
  os_error *e;
  int i;
  wimp_paletteword *d;

  wimpt_init("Brolly");   /* Main Wimp initialisation */
  res_init("Brolly");              /* Resources */
  template_init();                 /* Templates */
  visdelay_init();
  dbox_init();                     /* Dialogue boxes */
  msgs_init();

  atexit(tidy);

  f.action=255;
  f.name="<Brolly$Dir>.Graphics.Palette";
  f.loadaddr=(int)p;
  f.execaddr=0;
  e = os_file(&f);
  if (e || f.start!=120) {
    werr(0, "Internal: Graphics.Palette file absent or corrupt");
    return FALSE;
  }
  for (i=0, ptr=p, d=(wimp_paletteword *)palette; i<20; i++, ptr+=6) (d++)->word=(ptr[3] << 8)+(ptr[4] << 16)+(ptr[5] << 24);

  main_menu_string=msgs_lookup("MenuM");
  main_menu = menu_new(msgs_lookup("MentM"), main_menu_string);
  if (bar_menu = menu_new(msgs_lookup("MentB"), msgs_lookup("MenuB")), bar_menu == NULL) return FALSE;
  brolly_icon=baricon("!brolly", 1, brolly_iconclick);
  win_register_event_handler(win_ICONBARLOAD, brolly_iconload, 0);
  if (!event_attachmenu(win_ICONBAR, bar_menu, bar_menu_handler, 0)) return FALSE;
  if (!brolly_create_window("inputs", &para_win_handle)) return FALSE;
  win_register_event_handler(para_win_handle, brolly_event_handler, 0);
  win_claim_unknown_events(para_win_handle);
  if (!event_attachmenu(para_win_handle, main_menu, main_menu_handler, 0)) return FALSE;

  wimp_save_fp_state_on_poll();
  if (!init()) return FALSE;
  return TRUE;
}

/******************************* main program ********************************/

/*--- Main entry point. ---*/
int main(void)
{
  if (brolly_initialise()) {
    while (TRUE) event_process();
  }

  return 0;
}
00000000  0a 23 69 6e 63 6c 75 64  65 20 3c 73 74 64 69 6f  |.#include <stdio|
00000010  2e 68 3e 0a 23 69 6e 63  6c 75 64 65 20 3c 73 74  |.h>.#include <st|
00000020  64 6c 69 62 2e 68 3e 0a  23 69 6e 63 6c 75 64 65  |dlib.h>.#include|
00000030  20 3c 73 74 72 69 6e 67  2e 68 3e 0a 23 69 6e 63  | <string.h>.#inc|
00000040  6c 75 64 65 20 3c 74 69  6d 65 2e 68 3e 0a 23 69  |lude <time.h>.#i|
00000050  6e 63 6c 75 64 65 20 3c  6d 61 74 68 2e 68 3e 0a  |nclude <math.h>.|
00000060  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 61 72 67  |#include <stdarg|
00000070  2e 68 3e 0a 0a 23 69 6e  63 6c 75 64 65 20 22 78  |.h>..#include "x|
00000080  66 65 72 73 65 6e 64 2e  68 22 20 20 2f 2a 20 6e  |fersend.h"  /* n|
00000090  6f 74 65 20 74 68 65 20  6c 6f 63 61 74 69 6f 6e  |ote the location|
000000a0  20 6f 66 20 74 68 69 73  20 6c 69 6e 65 20 69 73  | of this line is|
000000b0  20 63 72 75 63 69 61 6c  3b 20 69 74 20 65 6e 73  | crucial; it ens|
000000c0  75 72 65 73 20 21 42 72  6f 6c 6c 79 2e 68 2e 78  |ures !Brolly.h.x|
000000d0  66 65 72 73 65 6e 64 20  69 73 20 75 73 65 64 20  |fersend is used |
000000e0  2a 2f 0a 20 20 20 20 20  20 20 20 20 20 20 20 20  |*/.             |
000000f0  20 20 20 20 20 20 20 20  20 20 2f 2a 20 26 20 6e  |          /* & n|
00000100  6f 74 20 52 49 53 43 5f  4f 53 4c 69 62 2e 68 2e  |ot RISC_OSLib.h.|
00000110  78 66 65 72 73 65 6e 64  2c 20 61 73 20 77 6f 75  |xfersend, as wou|
00000120  6c 64 20 62 65 20 74 68  65 20 63 61 73 65 20 69  |ld be the case i|
00000130  66 20 74 68 65 20 69 6e  63 6c 75 64 65 20 73 68  |f the include sh|
00000140  6f 75 6c 64 20 6f 63 63  75 72 20 6e 65 73 74 65  |ould occur neste|
00000150  64 20 2a 2f 0a 20 20 20  20 20 20 20 20 20 20 20  |d */.           |
00000160  20 20 20 20 20 20 20 20  20 20 20 20 2f 2a 20 77  |            /* w|
00000170  69 74 68 69 6e 20 73 61  79 20 74 68 65 20 73 61  |ithin say the sa|
00000180  76 65 61 73 2e 68 20 69  6e 63 6c 75 64 65 20 62  |veas.h include b|
00000190  65 6c 6f 77 20 2a 2f 0a  23 69 6e 63 6c 75 64 65  |elow */.#include|
000001a0  20 22 77 69 6d 70 2e 68  22 0a 23 69 6e 63 6c 75  | "wimp.h".#inclu|
000001b0  64 65 20 22 77 69 6d 70  74 2e 68 22 0a 23 69 6e  |de "wimpt.h".#in|
000001c0  63 6c 75 64 65 20 22 77  69 6e 2e 68 22 0a 23 69  |clude "win.h".#i|
000001d0  6e 63 6c 75 64 65 20 22  65 76 65 6e 74 2e 68 22  |nclude "event.h"|
000001e0  0a 23 69 6e 63 6c 75 64  65 20 22 62 61 72 69 63  |.#include "baric|
000001f0  6f 6e 2e 68 22 0a 23 69  6e 63 6c 75 64 65 20 22  |on.h".#include "|
00000200  72 65 73 2e 68 22 0a 23  69 6e 63 6c 75 64 65 20  |res.h".#include |
00000210  22 6d 65 6e 75 2e 68 22  0a 23 69 6e 63 6c 75 64  |"menu.h".#includ|
00000220  65 20 22 74 65 6d 70 6c  61 74 65 2e 68 22 0a 23  |e "template.h".#|
00000230  69 6e 63 6c 75 64 65 20  22 64 62 6f 78 2e 68 22  |include "dbox.h"|
00000240  0a 23 69 6e 63 6c 75 64  65 20 22 77 65 72 72 2e  |.#include "werr.|
00000250  68 22 0a 23 69 6e 63 6c  75 64 65 20 22 73 70 72  |h".#include "spr|
00000260  69 74 65 2e 68 22 0a 23  69 6e 63 6c 75 64 65 20  |ite.h".#include |
00000270  22 6f 73 2e 68 22 0a 23  69 6e 63 6c 75 64 65 20  |"os.h".#include |
00000280  22 6b 65 72 6e 65 6c 2e  68 22 0a 23 69 6e 63 6c  |"kernel.h".#incl|
00000290  75 64 65 20 22 61 6b 62  64 2e 68 22 0a 23 69 6e  |ude "akbd.h".#in|
000002a0  63 6c 75 64 65 20 22 73  61 76 65 61 73 2e 68 22  |clude "saveas.h"|
000002b0  0a 23 69 6e 63 6c 75 64  65 20 22 78 66 65 72 72  |.#include "xferr|
000002c0  65 63 76 2e 68 22 0a 23  69 6e 63 6c 75 64 65 20  |ecv.h".#include |
000002d0  22 6d 73 67 73 2e 68 22  0a 23 69 6e 63 6c 75 64  |"msgs.h".#includ|
000002e0  65 20 22 62 62 63 2e 68  22 0a 23 69 6e 63 6c 75  |e "bbc.h".#inclu|
000002f0  64 65 20 22 76 69 73 64  65 6c 61 79 2e 68 22 0a  |de "visdelay.h".|
00000300  23 69 6e 63 6c 75 64 65  20 22 70 6f 69 6e 74 65  |#include "pointe|
00000310  72 2e 68 22 0a 0a 23 69  6e 63 6c 75 64 65 20 22  |r.h"..#include "|
00000320  73 77 69 73 2e 68 22 0a  23 69 6e 63 6c 75 64 65  |swis.h".#include|
00000330  20 22 6d 64 62 78 2e 68  22 0a 23 69 6e 63 6c 75  | "mdbx.h".#inclu|
00000340  64 65 20 22 77 69 6d 70  5f 6d 69 73 63 2e 68 22  |de "wimp_misc.h"|
00000350  0a 0a 23 64 65 66 69 6e  65 20 6f 6e 65 20 28 31  |..#define one (1|
00000360  3c 3c 31 36 29 0a 23 64  65 66 69 6e 65 20 66 70  |<<16).#define fp|
00000370  74 6f 64 28 69 29 20 28  20 28 69 6e 74 29 28 30  |tod(i) ( (int)(0|
00000380  2e 35 2b 69 2f 36 2e 35  35 33 36 29 2f 31 30 30  |.5+i/6.5536)/100|
00000390  30 30 2e 30 20 29 0a 23  64 65 66 69 6e 65 20 64  |00.0 ).#define d|
000003a0  74 6f 66 70 28 69 29 20  28 20 28 69 6e 74 29 28  |tofp(i) ( (int)(|
000003b0  30 2e 35 2b 69 2a 6f 6e  65 29 20 29 0a 74 79 70  |0.5+i*one) ).typ|
000003c0  65 64 65 66 20 65 6e 75  6d 20 7b 6d 75 6c 74 69  |edef enum {multi|
000003d0  2c 20 6e 6f 6e 6d 75 6c  74 69 7d 20 6d 6f 6e 69  |, nonmulti} moni|
000003e0  74 6f 72 3b 0a 0a 23 64  65 66 69 6e 65 20 77 65  |tor;..#define we|
000003f0  72 72 74 65 72 6d 20 30  0a 0a 65 78 74 65 72 6e  |rrterm 0..extern|
00000400  20 69 6e 74 20 72 62 62  63 69 6e 63 28 69 6e 74  | int rbbcinc(int|
00000410  20 72 2c 20 69 6e 74 20  6b 29 3b 0a 65 78 74 65  | r, int k);.exte|
00000420  72 6e 20 69 6e 74 20 64  69 76 5f 66 72 61 63 31  |rn int div_frac1|
00000430  36 28 69 6e 74 20 6e 75  6d 62 65 72 2c 20 69 6e  |6(int number, in|
00000440  74 20 64 69 76 69 73 6f  72 29 3b 0a 65 78 74 65  |t divisor);.exte|
00000450  72 6e 20 69 6e 74 20 6d  75 6c 5f 66 72 61 63 31  |rn int mul_frac1|
00000460  36 28 69 6e 74 20 78 2c  20 69 6e 74 20 61 29 3b  |6(int x, int a);|
00000470  0a 65 78 74 65 72 6e 20  69 6e 74 20 6d 75 6c 5f  |.extern int mul_|
00000480  66 72 61 63 31 36 63 28  69 6e 74 20 78 2c 20 69  |frac16c(int x, i|
00000490  6e 74 20 61 29 3b 0a 65  78 74 65 72 6e 20 69 6e  |nt a);.extern in|
000004a0  74 20 73 71 72 74 5f 66  72 61 63 31 36 28 75 6e  |t sqrt_frac16(un|
000004b0  73 69 67 6e 65 64 20 69  6e 74 20 78 29 3b 0a 65  |signed int x);.e|
000004c0  78 74 65 72 6e 20 69 6e  74 20 67 61 75 73 73 31  |xtern int gauss1|
000004d0  36 28 76 6f 69 64 29 3b  0a 65 78 74 65 72 6e 20  |6(void);.extern |
000004e0  76 6f 69 64 20 73 67 61  75 73 73 31 36 28 69 6e  |void sgauss16(in|
000004f0  74 20 73 65 65 64 29 3b  0a 65 78 74 65 72 6e 20  |t seed);.extern |
00000500  69 6e 74 20 72 61 6e 64  31 36 28 76 6f 69 64 29  |int rand16(void)|
00000510  3b 0a 65 78 74 65 72 6e  20 69 6e 74 20 72 61 6e  |;.extern int ran|
00000520  64 75 31 36 28 76 6f 69  64 29 3b 0a 65 78 74 65  |du16(void);.exte|
00000530  72 6e 20 76 6f 69 64 20  73 72 61 6e 64 31 36 28  |rn void srand16(|
00000540  69 6e 74 20 73 65 65 64  29 3b 0a 65 78 74 65 72  |int seed);.exter|
00000550  6e 20 69 6e 74 20 63 6f  73 31 36 28 69 6e 74 20  |n int cos16(int |
00000560  61 29 3b 0a 65 78 74 65  72 6e 20 69 6e 74 20 73  |a);.extern int s|
00000570  69 6e 31 36 28 69 6e 74  20 61 29 3b 0a 65 78 74  |in16(int a);.ext|
00000580  65 72 6e 20 69 6e 74 20  65 78 70 31 36 28 69 6e  |ern int exp16(in|
00000590  74 20 61 29 3b 0a 65 78  74 65 72 6e 20 69 6e 74  |t a);.extern int|
000005a0  20 6c 6e 31 36 28 69 6e  74 20 61 29 3b 0a 65 78  | ln16(int a);.ex|
000005b0  74 65 72 6e 20 69 6e 74  20 70 6f 77 31 36 28 69  |tern int pow16(i|
000005c0  6e 74 20 61 2c 20 69 6e  74 20 62 29 3b 0a 65 78  |nt a, int b);.ex|
000005d0  74 65 72 6e 20 69 6e 74  20 61 63 73 31 36 28 69  |tern int acs16(i|
000005e0  6e 74 20 61 29 3b 0a 65  78 74 65 72 6e 20 69 6e  |nt a);.extern in|
000005f0  74 20 61 73 6e 31 36 28  69 6e 74 20 61 29 3b 0a  |t asn16(int a);.|
00000600  65 78 74 65 72 6e 20 69  6e 74 20 73 69 67 31 36  |extern int sig16|
00000610  28 69 6e 74 20 61 29 3b  0a 65 78 74 65 72 6e 20  |(int a);.extern |
00000620  76 6f 69 64 20 70 6c 6f  74 5f 62 72 6f 6c 6c 79  |void plot_brolly|
00000630  28 73 70 72 69 74 65 5f  61 72 65 61 20 2a 61 72  |(sprite_area *ar|
00000640  65 61 2c 20 76 6f 69 64  20 2a 73 70 72 2c 20 69  |ea, void *spr, i|
00000650  6e 74 20 78 2c 20 69 6e  74 20 79 29 3b 0a 65 78  |nt x, int y);.ex|
00000660  74 65 72 6e 20 76 6f 69  64 20 70 6c 6f 74 5f 68  |tern void plot_h|
00000670  61 6e 64 28 73 70 72 69  74 65 5f 61 72 65 61 20  |and(sprite_area |
00000680  2a 61 72 65 61 2c 20 76  6f 69 64 20 2a 73 70 72  |*area, void *spr|
00000690  2c 20 69 6e 74 20 78 2c  20 69 6e 74 20 79 29 3b  |, int x, int y);|
000006a0  0a 65 78 74 65 72 6e 20  76 6f 69 64 20 70 6c 6f  |.extern void plo|
000006b0  74 5f 6e 75 6d 62 65 72  28 73 70 72 69 74 65 5f  |t_number(sprite_|
000006c0  61 72 65 61 20 2a 61 72  65 61 2c 20 76 6f 69 64  |area *area, void|
000006d0  20 2a 73 70 72 2c 20 69  6e 74 20 78 2c 20 69 6e  | *spr, int x, in|
000006e0  74 20 79 29 3b 0a 65 78  74 65 72 6e 20 76 6f 69  |t y);.extern voi|
000006f0  64 20 70 6c 6f 74 5f 62  61 72 28 69 6e 74 20 78  |d plot_bar(int x|
00000700  2c 20 69 6e 74 20 79 2c  20 69 6e 74 20 77 2c 20  |, int y, int w, |
00000710  69 6e 74 20 68 2c 20 69  6e 74 20 63 29 3b 0a 65  |int h, int c);.e|
00000720  78 74 65 72 6e 20 76 6f  69 64 20 65 72 61 73 65  |xtern void erase|
00000730  5f 62 72 6f 6c 6c 79 28  76 6f 69 64 20 2a 73 70  |_brolly(void *sp|
00000740  72 2c 20 69 6e 74 20 78  2c 20 69 6e 74 20 79 29  |r, int x, int y)|
00000750  3b 0a 65 78 74 65 72 6e  20 76 6f 69 64 20 65 72  |;.extern void er|
00000760  61 73 65 5f 68 61 6e 64  28 73 70 72 69 74 65 5f  |ase_hand(sprite_|
00000770  61 72 65 61 20 2a 61 72  65 61 2c 20 76 6f 69 64  |area *area, void|
00000780  20 2a 73 70 72 2c 20 69  6e 74 20 78 2c 20 69 6e  | *spr, int x, in|
00000790  74 20 79 29 3b 0a 65 78  74 65 72 6e 20 76 6f 69  |t y);.extern voi|
000007a0  64 20 65 72 61 73 65 5f  6e 75 6d 62 65 72 28 73  |d erase_number(s|
000007b0  70 72 69 74 65 5f 61 72  65 61 20 2a 61 72 65 61  |prite_area *area|
000007c0  2c 20 76 6f 69 64 20 2a  73 70 72 2c 20 69 6e 74  |, void *spr, int|
000007d0  20 78 2c 20 69 6e 74 20  79 29 3b 0a 65 78 74 65  | x, int y);.exte|
000007e0  72 6e 20 76 6f 69 64 20  65 72 61 73 65 5f 62 61  |rn void erase_ba|
000007f0  72 28 69 6e 74 20 68 2c  20 76 6f 69 64 20 2a 73  |r(int h, void *s|
00000800  70 72 2c 20 69 6e 74 20  78 2c 20 69 6e 74 20 79  |pr, int x, int y|
00000810  29 3b 0a 0a 76 6f 69 64  20 6e 65 74 70 61 72 61  |);..void netpara|
00000820  6d 73 5f 74 6f 5f 67 75  69 28 76 6f 69 64 29 3b  |ms_to_gui(void);|
00000830  0a 42 4f 4f 4c 20 67 75  69 5f 74 6f 5f 6e 65 74  |.BOOL gui_to_net|
00000840  70 61 72 61 6d 73 31 28  76 6f 69 64 29 3b 0a 42  |params1(void);.B|
00000850  4f 4f 4c 20 67 75 69 5f  74 6f 5f 6e 65 74 70 61  |OOL gui_to_netpa|
00000860  72 61 6d 73 32 28 76 6f  69 64 29 3b 0a 42 4f 4f  |rams2(void);.BOO|
00000870  4c 20 70 61 72 61 6d 65  74 65 72 73 5f 6c 6f 61  |L parameters_loa|
00000880  64 5f 66 69 6c 65 28 76  6f 69 64 29 3b 0a 0a 23  |d_file(void);..#|
00000890  64 65 66 69 6e 65 20 62  79 20 28 2d 34 2a 34 38  |define by (-4*48|
000008a0  29 0a 23 64 65 66 69 6e  65 20 62 68 20 31 32 0a  |).#define bh 12.|
000008b0  23 64 65 66 69 6e 65 20  62 63 69 20 31 32 0a 23  |#define bci 12.#|
000008c0  64 65 66 69 6e 65 20 67  6e 79 20 28 2d 34 2a 38  |define gny (-4*8|
000008d0  32 29 0a 23 64 65 66 69  6e 65 20 6c 6f 77 67 65  |2).#define lowge|
000008e0  6e 20 30 0a 0a 2f 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |n 0../**********|
000008f0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00000940  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2f 0a  |**************/.|
00000950  0a 23 64 65 66 69 6e 65  20 56 45 52 53 49 4f 4e  |.#define VERSION|
00000960  4e 55 4d 42 45 52 20 22  31 2e 30 30 22 0a 23 64  |NUMBER "1.00".#d|
00000970  65 66 69 6e 65 20 56 45  52 53 49 4f 4e 20 56 45  |efine VERSION VE|
00000980  52 53 49 4f 4e 4e 55 4d  42 45 52 20 23 23 20 22  |RSIONNUMBER ## "|
00000990  20 28 22 20 23 23 20 5f  5f 44 41 54 45 5f 5f 20  | (" ## __DATE__ |
000009a0  23 23 20 22 29 22 0a 0a  2f 2a 20 4d 65 6e 75 20  |## ")"../* Menu |
000009b0  69 74 65 6d 73 20 2a 2f  0a 23 64 65 66 69 6e 65  |items */.#define|
000009c0  20 62 61 72 5f 6d 65 6e  75 5f 69 6e 66 6f 20 20  | bar_menu_info  |
000009d0  20 20 20 31 0a 23 64 65  66 69 6e 65 20 62 61 72  |   1.#define bar|
000009e0  5f 6d 65 6e 75 5f 71 75  69 74 20 20 20 20 20 32  |_menu_quit     2|
000009f0  0a 0a 74 79 70 65 64 65  66 20 65 6e 75 6d 20 7b  |..typedef enum {|
00000a00  20 4d 4d 69 6e 66 6f 3d  31 2c 0a 20 20 20 20 20  | MMinfo=1,.     |
00000a10  20 20 20 20 20 20 20 20  20 20 4d 4d 73 61 76 65  |          MMsave|
00000a20  0a 20 20 20 20 20 20 20  20 20 20 20 20 20 7d 20  |.             } |
00000a30  4d 4d 54 79 70 65 73 3b  0a 0a 2f 2a 20 49 6e 66  |MMTypes;../* Inf|
00000a40  6f 20 62 6f 78 20 66 69  65 6c 64 20 66 6f 72 20  |o box field for |
00000a50  74 68 65 20 76 65 72 73  69 6f 6e 20 73 74 72 69  |the version stri|
00000a60  6e 67 20 2a 2f 0a 23 64  65 66 69 6e 65 20 62 72  |ng */.#define br|
00000a70  6f 6c 6c 79 5f 61 75 74  68 5f 66 69 65 6c 64 20  |olly_auth_field |
00000a80  20 20 20 33 0a 23 64 65  66 69 6e 65 20 62 72 6f  |   3.#define bro|
00000a90  6c 6c 79 5f 69 6e 66 6f  5f 66 69 65 6c 64 20 20  |lly_info_field  |
00000aa0  20 20 34 0a 0a 74 79 70  65 64 65 66 20 65 6e 75  |  4..typedef enu|
00000ab0  6d 20 7b 20 6b 65 79 5f  65 73 63 61 70 65 3d 32  |m { key_escape=2|
00000ac0  37 2c 0a 20 20 20 20 20  20 20 20 20 20 20 20 20  |7,.             |
00000ad0  20 20 6b 65 79 5f 52 45  54 55 52 4e 3d 31 33 2c  |  key_RETURN=13,|
00000ae0  0a 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
00000af0  6b 65 79 5f 54 41 42 3d  30 78 31 38 61 2c 0a 20  |key_TAB=0x18a,. |
00000b00  20 20 20 20 20 20 20 20  20 20 20 20 20 20 6b 65  |              ke|
00000b10  79 5f 64 6f 77 6e 61 72  72 6f 77 3d 30 78 31 38  |y_downarrow=0x18|
00000b20  65 2c 0a 20 20 20 20 20  20 20 20 20 20 20 20 20  |e,.             |
00000b30  20 20 6b 65 79 5f 75 70  61 72 72 6f 77 3d 30 78  |  key_uparrow=0x|
00000b40  31 38 66 0a 20 20 20 20  20 20 20 20 20 20 20 20  |18f.            |
00000b50  20 7d 20 6b 65 79 5f 54  59 50 45 53 3b 0a 0a 23  | } key_TYPES;..#|
00000b60  64 65 66 69 6e 65 20 6d  61 78 70 61 74 68 20 32  |define maxpath 2|
00000b70  35 36 0a 0a 74 79 70 65  64 65 66 20 65 6e 75 6d  |56..typedef enum|
00000b80  20 7b 20 70 69 74 5f 70  3d 30 2c 0a 20 20 20 20  | { pit_p=0,.    |
00000b90  20 20 20 20 20 20 20 20  20 20 20 70 69 74 5f 6e  |           pit_n|
00000ba0  6f 68 6c 6e 3d 31 32 2c  0a 20 20 20 20 20 20 20  |ohln=12,.       |
00000bb0  20 20 20 20 20 20 20 20  70 69 74 5f 61 2c 0a 20  |        pit_a,. |
00000bc0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 70 69  |              pi|
00000bd0  74 5f 6c 72 2c 0a 20 20  20 20 20 20 20 20 20 20  |t_lr,.          |
00000be0  20 20 20 20 20 70 69 74  5f 65 74 2c 0a 20 20 20  |     pit_et,.   |
00000bf0  20 20 20 20 20 20 20 20  20 20 20 20 70 69 74 5f  |            pit_|
00000c00  6e 6f 74 69 2c 0a 20 20  20 20 20 20 20 20 20 20  |noti,.          |
00000c10  20 20 20 20 20 70 69 74  5f 72 66 2c 0a 20 20 20  |     pit_rf,.   |
00000c20  20 20 20 20 20 20 20 20  20 20 20 20 70 69 74 5f  |            pit_|
00000c30  73 66 2c 0a 20 20 20 20  20 20 20 20 20 20 20 20  |sf,.            |
00000c40  20 20 20 70 69 74 5f 75  66 2c 0a 09 20 20 20 20  |   pit_uf,..    |
00000c50  20 20 20 70 69 74 5f 7a  74 74 2c 0a 09 20 20 20  |   pit_ztt,..   |
00000c60  20 20 20 20 70 69 74 5f  72 77 2c 0a 09 20 20 20  |    pit_rw,..   |
00000c70  20 20 20 20 70 69 74 5f  74 6e 2c 0a 09 20 20 20  |    pit_tn,..   |
00000c80  20 20 20 20 70 69 74 5f  63 63 2c 0a 09 20 20 20  |    pit_cc,..   |
00000c90  20 20 20 20 70 69 74 5f  73 2c 0a 09 20 20 20 20  |    pit_s,..    |
00000ca0  20 20 20 70 69 74 5f 66  0a 20 20 20 20 20 20 20  |   pit_f.       |
00000cb0  20 20 20 20 20 20 7d 20  70 61 72 61 6d 69 63 6f  |      } paramico|
00000cc0  6e 5f 54 59 50 45 53 3b  0a 0a 73 74 61 74 69 63  |n_TYPES;..static|
00000cd0  20 76 6f 69 64 20 62 72  6f 6c 6c 79 5f 69 6e 66  | void brolly_inf|
00000ce0  6f 5f 61 62 6f 75 74 5f  70 72 6f 67 72 61 6d 28  |o_about_program(|
00000cf0  76 6f 69 64 29 3b 0a 73  74 61 74 69 63 20 76 6f  |void);.static vo|
00000d00  69 64 20 70 61 72 61 5f  6f 70 65 6e 28 76 6f 69  |id para_open(voi|
00000d10  64 29 3b 0a 0a 2f 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |d);../**********|
00000d20  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00000d70  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2f 0a  |**************/.|
00000d80  0a 6d 65 6e 75 20 6d 61  69 6e 5f 6d 65 6e 75 2c  |.menu main_menu,|
00000d90  20 62 61 72 5f 6d 65 6e  75 3b 0a 77 69 6d 70 5f  | bar_menu;.wimp_|
00000da0  69 20 62 72 6f 6c 6c 79  5f 69 63 6f 6e 3b 0a 77  |i brolly_icon;.w|
00000db0  69 6d 70 5f 77 20 70 61  72 61 5f 77 69 6e 5f 68  |imp_w para_win_h|
00000dc0  61 6e 64 6c 65 3b 0a 42  4f 4f 4c 20 70 61 72 61  |andle;.BOOL para|
00000dd0  5f 77 69 6e 64 6f 77 5f  6f 70 65 6e 3d 46 41 4c  |_window_open=FAL|
00000de0  53 45 3b 0a 42 4f 4f 4c  20 77 74 73 73 61 66 65  |SE;.BOOL wtssafe|
00000df0  3d 54 52 55 45 3b 0a 69  6e 74 20 70 66 69 6c 65  |=TRUE;.int pfile|
00000e00  5f 6c 65 6e 67 74 68 3d  30 3b 0a 63 68 61 72 20  |_length=0;.char |
00000e10  66 69 6c 65 70 61 74 68  5f 70 61 72 61 6d 65 74  |filepath_paramet|
00000e20  65 72 73 5b 6d 61 78 70  61 74 68 5d 3d 22 57 65  |ers[maxpath]="We|
00000e30  69 67 68 74 73 22 3b 0a  63 68 61 72 20 2a 70 66  |ights";.char *pf|
00000e40  69 6c 65 3d 30 3b 0a 2f  2a 20 50 43 48 20 2d 20  |ile=0;./* PCH - |
00000e50  70 61 72 61 6d 65 74 65  72 73 20 63 61 72 65 74  |parameters caret|
00000e60  20 68 6f 70 2e 20 55 73  65 64 20 74 6f 20 73 65  | hop. Used to se|
00000e70  71 75 65 6e 63 65 20 63  61 72 65 74 20 68 6f 70  |quence caret hop|
00000e80  73 20 62 65 74 77 65 65  6e 20 77 72 69 74 61 62  |s between writab|
00000e90  6c 65 20 69 63 6f 6e 73  20 2a 2f 0a 63 68 61 72  |le icons */.char|
00000ea0  20 50 43 48 66 6f 72 5b  33 32 5d 20 3d 20 7b 32  | PCHfor[32] = {2|
00000eb0  35 35 2c 32 35 35 2c 32  35 35 2c 32 35 35 2c 32  |55,255,255,255,2|
*
00000ef0  35 35 2c 0a 20 20 20 20  20 20 20 20 20 20 20 20  |55,.            |
00000f00  20 20 20 20 20 20 20 20  20 20 20 20 20 20 32 35  |              25|
00000f10  35 2c 32 35 35 2c 32 35  35 2c 32 35 35 2c 32 35  |5,255,255,255,25|
*
00000f40  35 2c 32 35 35 2c 32 35  35 7d 3b 0a 63 68 61 72  |5,255,255};.char|
00000f50  20 50 43 48 61 66 74 5b  33 32 5d 20 3d 20 7b 32  | PCHaft[32] = {2|
00000f60  35 35 2c 32 35 35 2c 32  35 35 2c 32 35 35 2c 32  |55,255,255,255,2|
*
00000fa0  35 35 2c 0a 20 20 20 20  20 20 20 20 20 20 20 20  |55,.            |
00000fb0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 32 35  |              25|
00000fc0  35 2c 32 35 35 2c 32 35  35 2c 32 35 35 2c 32 35  |5,255,255,255,25|
*
00000ff0  35 2c 32 35 35 2c 32 35  35 7d 3b 0a 0a 2f 2a 2a  |5,255,255};../**|
00001000  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00001060  2a 2a 2a 2a 2a 2a 2f 0a  0a 42 4f 4f 4c 20 76 67  |******/..BOOL vg|
00001070  61 3b 0a 69 6e 74 20 6d  6f 64 65 2c 20 73 61 72  |a;.int mode, sar|
00001080  65 61 2c 20 6f 73 79 2c  20 67 79 2c 20 67 77 79  |ea, osy, gy, gwy|
00001090  3b 0a 69 6e 74 20 6d 2c  20 6c 2c 20 6d 62 2c 20  |;.int m, l, mb, |
000010a0  67 3b 0a 69 6e 74 20 70  31 2c 20 70 32 2c 20 70  |g;.int p1, p2, p|
000010b0  33 3b 0a 73 70 72 69 74  65 5f 61 72 65 61 20 2a  |3;.sprite_area *|
000010c0  61 72 65 61 3b 0a 73 70  72 69 74 65 5f 69 64 20  |area;.sprite_id |
000010d0  68 61 6e 64 70 2c 20 77  61 6c 6c 2c 20 67 65 74  |handp, wall, get|
000010e0  72 65 61 64 79 3b 0a 73  70 72 69 74 65 5f 70 74  |ready;.sprite_pt|
000010f0  72 20 73 70 72 5b 31 30  32 35 5d 3b 0a 73 70 72  |r spr[1025];.spr|
00001100  69 74 65 5f 70 74 72 20  6e 75 6d 73 5b 31 30 5d  |ite_ptr nums[10]|
00001110  3b 0a 73 70 72 69 74 65  5f 70 74 72 20 6e 75 6d  |;.sprite_ptr num|
00001120  62 61 63 6b 73 5b 36 5d  3b 0a 73 70 72 69 74 65  |backs[6];.sprite|
00001130  5f 70 74 72 20 62 61 72  3b 0a 69 6e 74 20 73 70  |_ptr bar;.int sp|
00001140  72 78 5b 31 30 32 35 5d  3b 0a 69 6e 74 20 6f 78  |rx[1025];.int ox|
00001150  2c 20 76 6f 78 2c 20 6f  69 2c 20 76 6f 69 3b 0a  |, vox, oi, voi;.|
00001160  69 6e 74 20 62 61 6e 6b  3b 0a 76 6f 69 64 20 2a  |int bank;.void *|
00001170  73 63 72 73 74 5b 32 5d  3b 0a 69 6e 74 20 6f 72  |scrst[2];.int or|
00001180  69 67 69 6e 78 2c 20 6f  72 69 67 69 6e 79 2c 20  |iginx, originy, |
00001190  6c 78 2c 20 6c 79 2c 20  67 6f 72 69 67 69 6e 78  |lx, ly, goriginx|
000011a0  2c 20 67 6f 72 69 67 69  6e 79 3b 0a 69 6e 74 20  |, goriginy;.int |
000011b0  68 73 63 6f 72 65 20 3d  20 30 3b 0a 69 6e 74 20  |hscore = 0;.int |
000011c0  67 61 6d 65 63 20 20 3d  20 30 3b 0a 69 6e 74 20  |gamec  = 0;.int |
000011d0  74 6f 74 67 65 6e 20 3d  20 30 3b 0a 69 6e 74 20  |totgen = 0;.int |
000011e0  73 70 72 69 2c 20 69 78  3b 0a 69 6e 74 20 67 65  |spri, ix;.int ge|
000011f0  6e 2c 20 74 69 2c 20 74  69 32 3b 0a 69 6e 74 20  |n, ti, ti2;.int |
00001200  66 3b 0a 69 6e 74 20 6f  66 2c 20 76 6f 66 3b 0a  |f;.int of, vof;.|
00001210  42 4f 4f 4c 20 71 75 69  74 3b 0a 69 6e 74 20 73  |BOOL quit;.int s|
00001220  70 65 65 64 3d 34 3b 20  2f 2a 32 20 66 6f 72 20  |peed=4; /*2 for |
00001230  66 61 73 74 2c 20 34 20  66 6f 72 20 73 6c 6f 77  |fast, 4 for slow|
00001240  2a 2f 0a 69 6e 74 20 64  5b 36 5d 20 3d 20 7b 30  |*/.int d[6] = {0|
00001250  2c 20 30 2c 20 30 2c 20  30 2c 20 30 2c 20 30 7d  |, 0, 0, 0, 0, 0}|
00001260  3b 0a 69 6e 74 20 6e 63  64 2c 20 6f 6e 63 64 3b  |;.int ncd, oncd;|
00001270  09 09 09 2f 2a 6e 75 6d  62 65 72 20 6f 66 20 63  |.../*number of c|
00001280  68 61 6e 67 65 64 20 64  69 67 69 74 73 20 26 20  |hanged digits & |
00001290  6f 6c 64 2a 2f 0a 69 6e  74 20 74 6e 64 3d 30 2c  |old*/.int tnd=0,|
000012a0  20 6f 74 6e 64 3d 30 2c  20 76 6f 74 6e 64 3d 30  | otnd=0, votnd=0|
000012b0  3b 09 2f 2a 74 6f 74 61  6c 20 6e 75 6d 62 65 72  |;./*total number|
000012c0  20 6f 66 20 64 69 67 69  74 73 20 26 20 6f 6c 64  | of digits & old|
000012d0  2a 2f 0a 69 6e 74 20 67  78 5b 36 5d 2c 20 67 6f  |*/.int gx[6], go|
000012e0  78 5b 36 5d 3b 09 09 2f  2a 78 20 63 6f 6f 72 64  |x[6];../*x coord|
000012f0  20 6f 66 20 65 61 63 68  20 64 69 67 69 74 20 69  | of each digit i|
00001300  6e 20 67 65 6e 2c 20 26  20 6f 6c 64 2a 2f 0a 0a  |n gen, & old*/..|
00001310  69 6e 74 20 2a 6f 6c 64  6d 6f 64 65 3d 30 3b 09  |int *oldmode=0;.|
00001320  2f 2a 20 52 65 6d 65 6d  62 65 72 20 64 65 73 6b  |/* Remember desk|
00001330  74 6f 70 20 6d 6f 64 65  20 69 6e 20 75 73 65 20  |top mode in use |
00001340  70 72 69 6f 72 20 74 6f  20 74 61 6b 69 6e 67 20  |prior to taking |
00001350  6f 76 65 72 20 73 63 72  65 65 6e 20 2d 0a 0a 09  |over screen -...|
00001360  09 4e 42 20 54 68 69 73  20 77 69 6c 6c 20 75 73  |.NB This will us|
00001370  75 61 6c 6c 79 20 70 6f  69 6e 74 20 74 6f 20 61  |ually point to a|
00001380  20 34 20 62 79 74 65 20  6d 61 6c 6c 6f 63 65 64  | 4 byte malloced|
00001390  20 62 6c 6f 63 6b 20 63  6f 6e 74 61 69 6e 69 6e  | block containin|
000013a0  67 20 74 68 65 20 6d 6f  64 65 20 6e 75 6d 62 65  |g the mode numbe|
000013b0  72 2c 20 68 6f 77 65 76  65 72 0a 09 09 20 20 20  |r, however...   |
000013c0  74 6f 20 70 65 72 6d 69  74 20 73 75 70 70 6f 72  |to permit suppor|
000013d0  74 20 6f 66 20 61 72 62  69 74 72 61 72 79 20 52  |t of arbitrary R|
000013e0  49 53 43 20 50 43 20 6d  6f 64 65 73 20 69 74 20  |ISC PC modes it |
000013f0  6d 61 79 20 70 6f 69 6e  74 20 74 6f 20 61 20 6c  |may point to a l|
00001400  61 72 67 65 72 20 6d 61  6c 6c 6f 63 65 64 20 62  |arger malloced b|
00001410  6c 6f 63 6b 2c 0a 09 09  20 20 20 74 68 65 20 66  |lock,...   the f|
00001420  69 72 73 74 20 77 6f 72  64 20 6f 66 20 77 68 69  |irst word of whi|
00001430  63 68 20 70 6f 69 6e 74  73 20 74 6f 20 61 20 6d  |ch points to a m|
00001440  6f 64 65 20 73 65 6c 65  63 74 6f 72 20 28 77 68  |ode selector (wh|
00001450  69 63 68 20 77 69 6c 6c  20 69 74 73 65 6c 66 20  |ich will itself |
00001460  62 65 20 73 74 6f 72 65  64 20 66 72 6f 6d 0a 09  |be stored from..|
00001470  09 20 20 20 61 64 64 72  65 73 73 20 6f 6c 64 6d  |.   address oldm|
00001480  6f 64 65 2b 31 20 6f 6e  77 61 72 64 73 2c 20 69  |ode+1 onwards, i|
00001490  65 20 77 65 20 77 69 6c  6c 20 68 61 76 65 20 2a  |e we will have *|
000014a0  6f 6c 64 6d 6f 64 65 20  3d 20 28 69 6e 74 29 28  |oldmode = (int)(|
000014b0  6f 6c 64 6d 6f 64 65 2b  31 29 2c 20 26 20 74 68  |oldmode+1), & th|
000014c0  65 20 73 65 6c 65 63 74  6f 72 0a 09 09 20 20 20  |e selector...   |
000014d0  73 74 6f 72 65 64 20 66  72 6f 6d 20 6f 6c 64 6d  |stored from oldm|
000014e0  6f 64 65 2b 31 29 2e 0a  09 09 20 20 20 54 68 69  |ode+1)....   Thi|
000014f0  73 20 70 65 72 6d 69 74  73 20 72 65 73 65 6c 65  |s permits resele|
00001500  63 74 69 6f 6e 20 6f 66  20 64 65 73 6b 74 6f 70  |ction of desktop|
00001510  20 6d 6f 64 65 20 6f 6e  20 61 20 52 49 53 43 20  | mode on a RISC |
00001520  50 43 20 62 79 20 70 61  73 73 69 6e 67 20 2a 6f  |PC by passing *o|
00001530  6c 64 6d 6f 64 65 20 61  73 20 61 0a 09 09 20 20  |ldmode as a...  |
00001540  20 6d 6f 64 65 20 73 70  65 63 69 66 69 65 72 20  | mode specifier |
00001550  74 6f 20 53 57 49 20 4f  53 5f 53 63 72 65 65 6e  |to SWI OS_Screen|
00001560  4d 6f 64 65 20 28 72 30  3d 30 29 2e 0a 09 09 20  |Mode (r0=0).... |
00001570  20 20 4f 6e 20 61 6e 20  6f 6c 64 65 72 20 6d 61  |  On an older ma|
00001580  63 68 69 6e 65 20 74 68  69 73 20 53 57 49 20 69  |chine this SWI i|
00001590  73 6e 27 74 20 61 76 61  69 6c 61 62 6c 65 20 61  |sn't available a|
000015a0  6e 64 20 2a 6f 6c 64 6d  6f 64 65 20 77 69 6c 6c  |nd *oldmode will|
000015b0  20 61 6c 77 61 79 73 20  62 65 20 61 20 6d 6f 64  | always be a mod|
000015c0  65 20 6e 75 6d 62 65 72  3b 0a 09 09 20 20 20 69  |e number;...   i|
000015d0  6e 20 74 68 61 74 20 63  61 73 65 20 6d 75 73 74  |n that case must|
000015e0  20 73 65 6c 65 63 74 20  6d 6f 64 65 20 76 69 61  | select mode via|
000015f0  20 56 44 55 20 32 32 2c  3c 6d 6f 64 65 20 6e 75  | VDU 22,<mode nu|
00001600  6d 62 65 72 3e 2e 0a 09  09 20 20 20 54 68 75 73  |mber>....   Thus|
00001610  20 67 65 6e 65 72 69 63  20 63 6f 64 65 20 61 63  | generic code ac|
00001620  68 69 65 76 65 64 20 62  79 20 75 73 69 6e 67 20  |hieved by using |
00001630  56 44 55 20 32 32 20 69  66 66 20 2a 6f 6c 64 6d  |VDU 22 iff *oldm|
00001640  6f 64 65 20 69 73 20 6c  65 73 73 20 74 68 61 6e  |ode is less than|
00001650  20 32 35 36 2c 20 6f 74  68 65 72 77 69 73 65 0a  | 256, otherwise.|
00001660  09 09 20 20 20 4f 53 5f  53 63 72 65 65 6e 4d 6f  |..   OS_ScreenMo|
00001670  64 65 20 75 73 65 64 2e  0a 2a 2f 0a 63 68 61 72  |de used..*/.char|
00001680  20 6f 6c 64 70 61 6c 65  74 74 65 5b 32 30 2a 34  | oldpalette[20*4|
00001690  5d 3b 0a 77 69 6d 70 5f  6d 6f 75 73 65 73 74 72  |];.wimp_mousestr|
000016a0  20 6f 6c 64 6d 6f 75 73  65 3b 0a 63 68 61 72 20  | oldmouse;.char |
000016b0  70 61 6c 65 74 74 65 5b  32 30 2a 34 5d 3b 0a 0a  |palette[20*4];..|
000016c0  23 64 65 66 69 6e 65 20  66 72 61 6d 65 5f 66 72  |#define frame_fr|
000016d0  65 71 20 35 30 0a 0a 2f  2a 2a 2a 2a 2a 2a 2a 2a  |eq 50../********|
000016e0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00001740  2f 0a 2f 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |/./*************|
00001750  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00001760  2a 2a 2a 2a 20 4e 45 55  52 41 4c 20 4e 45 54 20  |**** NEURAL NET |
00001770  44 45 43 4c 41 52 41 54  49 4f 4e 53 20 2a 2a 2a  |DECLARATIONS ***|
00001780  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000017a0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2f 0a 0a 23 64  |***********/..#d|
000017b0  65 66 69 6e 65 20 6c 6f  77 5f 6c 69 6d 69 74 20  |efine low_limit |
000017c0  31 0a 23 64 65 66 69 6e  65 20 72 6f 77 73 5f 6c  |1.#define rows_l|
000017d0  6f 77 5f 6c 69 6d 20 31  0a 23 64 65 66 69 6e 65  |ow_lim 1.#define|
000017e0  20 63 6f 6c 73 5f 6c 6f  77 5f 6c 69 6d 20 31 0a  | cols_low_lim 1.|
000017f0  0a 23 64 65 66 69 6e 65  20 4d 41 58 4e 4f 4f 46  |.#define MAXNOOF|
00001800  4e 4f 44 45 53 20 31 30  30 30 0a 0a 74 79 70 65  |NODES 1000..type|
00001810  64 65 66 20 69 6e 74 20  66 70 3b 09 09 2f 2a 66  |def int fp;../*f|
00001820  69 78 65 64 20 70 6f 69  6e 74 20 74 79 70 65 20  |ixed point type |
00001830  72 65 70 72 65 73 65 6e  74 65 64 20 77 69 74 68  |represented with|
00001840  69 6e 20 61 6e 20 69 6e  74 65 67 65 72 2a 2f 0a  |in an integer*/.|
00001850  74 79 70 65 64 65 66 20  66 70 20 75 6e 69 74 3b  |typedef fp unit;|
00001860  09 2f 2a 77 65 20 77 69  6c 6c 20 75 73 65 20 66  |./*we will use f|
00001870  69 78 65 64 20 70 6f 69  6e 74 20 66 6f 72 20 6f  |ixed point for o|
00001880  75 72 20 64 61 74 61 2a  2f 0a 0a 74 79 70 65 64  |ur data*/..typed|
00001890  65 66 20 75 6e 69 74 20  2a 76 65 63 74 6f 72 3b  |ef unit *vector;|
000018a0  0a 0a 74 79 70 65 64 65  66 20 73 74 72 75 63 74  |..typedef struct|
000018b0  20 7b 0a 20 20 42 4f 4f  4c 20 61 6c 6c 6f 63 61  | {.  BOOL alloca|
000018c0  74 65 64 3b 0a 20 20 76  65 63 74 6f 72 20 78 5f  |ted;.  vector x_|
000018d0  69 6e 70 2c 20 79 5f 6f  75 74 3b 0a 20 20 76 65  |inp, y_out;.  ve|
000018e0  63 74 6f 72 20 68 31 3b  0a 20 20 69 6e 74 20 73  |ctor h1;.  int s|
000018f0  69 2c 20 73 6f 2c 20 73  68 3b 0a 7d 20 6e 65 74  |i, so, sh;.} net|
00001900  77 6f 72 6b 5f 72 65 63  3b 0a 0a 74 79 70 65 64  |work_rec;..typed|
00001910  65 66 20 75 6e 69 74 20  2a 2a 77 65 69 67 68 74  |ef unit **weight|
00001920  73 3b 0a 0a 74 79 70 65  64 65 66 20 73 74 72 75  |s;..typedef stru|
00001930  63 74 20 7b 0a 20 20 42  4f 4f 4c 20 61 6c 6c 6f  |ct {.  BOOL allo|
00001940  63 61 74 65 64 3b 0a 20  20 77 65 69 67 68 74 73  |cated;.  weights|
00001950  20 77 69 2c 20 77 6f 3b  0a 20 20 69 6e 74 20 73  | wi, wo;.  int s|
00001960  69 2c 20 73 6f 2c 20 73  68 3b 0a 7d 20 77 65 69  |i, so, sh;.} wei|
00001970  67 68 74 73 5f 72 65 63  3b 0a 0a 74 79 70 65 64  |ghts_rec;..typed|
00001980  65 66 20 73 74 72 75 63  74 20 7b 0a 20 20 75 6e  |ef struct {.  un|
00001990  69 74 20 65 72 72 6f 72  5f 74 68 72 65 73 68 6f  |it error_thresho|
000019a0  6c 64 3b 0a 20 20 69 6e  74 20 20 73 74 61 72 74  |ld;.  int  start|
000019b0  5f 69 74 65 72 3b 0a 20  20 69 6e 74 20 20 6e 6f  |_iter;.  int  no|
000019c0  5f 6f 66 5f 69 6e 70 75  74 73 2c 0a 20 20 20 20  |_of_inputs,.    |
000019d0  20 20 20 6e 6f 5f 6f 66  5f 68 31 5f 6e 6f 64 65  |   no_of_h1_node|
000019e0  73 2c 0a 20 20 20 20 20  20 20 6e 6f 5f 6f 66 5f  |s,.       no_of_|
000019f0  6f 75 74 70 75 74 73 3b  0a 20 20 42 4f 4f 4c 20  |outputs;.  BOOL |
00001a00  73 69 67 6d 6f 69 64 5f  6f 75 74 3b 0a 20 20 75  |sigmoid_out;.  u|
00001a10  6e 69 74 20 61 6c 70 68  61 2c 0a 20 20 20 20 20  |nit alpha,.     |
00001a20  20 20 6c 65 61 72 6e 69  6e 67 5f 72 61 74 65 2c  |  learning_rate,|
00001a30  0a 20 20 20 20 20 20 20  6e 6f 72 6d 5f 69 6e 5f  |.       norm_in_|
00001a40  6d 69 6e 2c 0a 20 20 20  20 20 20 20 6e 6f 72 6d  |min,.       norm|
00001a50  5f 69 6e 5f 72 61 6e 67  65 3b 0a 7d 20 66 66 5f  |_in_range;.} ff_|
00001a60  73 65 74 75 70 5f 72 65  63 3b 0a 0a 74 79 70 65  |setup_rec;..type|
00001a70  64 65 66 20 73 74 72 75  63 74 20 7b 0a 20 20 69  |def struct {.  i|
00001a80  6e 74 20 68 69 67 68 5f  77 61 74 65 72 2c 20 63  |nt high_water, c|
00001a90  6f 75 6e 74 5f 6d 61 78  2c 20 6c 61 73 74 5f 72  |ount_max, last_r|
00001aa0  69 67 68 74 2c 20 6c 61  73 74 5f 77 72 6f 6e 67  |ight, last_wrong|
00001ab0  2c 20 72 69 67 68 74 5f  63 6f 75 6e 74 2c 20 77  |, right_count, w|
00001ac0  72 6f 6e 67 5f 63 6f 75  6e 74 2c 20 6e 62 72 5f  |rong_count, nbr_|
00001ad0  74 72 5f 69 74 65 6d 73  3b 0a 20 20 69 6e 74 20  |tr_items;.  int |
00001ae0  69 74 65 72 3b 0a 7d 20  64 69 73 70 6c 61 79 5f  |iter;.} display_|
00001af0  72 65 63 3b 0a 0a 74 79  70 65 64 65 66 20 76 6f  |rec;..typedef vo|
00001b00  69 64 20 28 2a 67 65 74  5f 64 61 74 61 5f 70 72  |id (*get_data_pr|
00001b10  6f 63 29 20 28 76 65 63  74 6f 72 20 78 5f 69 6e  |oc) (vector x_in|
00001b20  2c 20 76 65 63 74 6f 72  20 64 65 73 69 72 65 64  |, vector desired|
00001b30  5f 6f 75 74 2c 20 66 66  5f 73 65 74 75 70 5f 72  |_out, ff_setup_r|
00001b40  65 63 20 2a 73 65 74 75  70 29 3b 0a 0a 42 4f 4f  |ec *setup);..BOO|
00001b50  4c 20 67 5f 75 73 65 72  5f 74 65 72 6d 69 6e 61  |L g_user_termina|
00001b60  74 65 64 5f 6c 65 61 72  6e 69 6e 67 3b 0a 0a 2f  |ted_learning;../|
00001b70  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00001bd0  2a 2a 2a 2a 2a 2a 2a 2a  2f 0a 2f 2a 2a 2a 2a 2a  |********/./*****|
00001be0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00001c00  2a 2a 2a 20 4d 49 53 43  20 46 55 4e 43 54 49 4f  |*** MISC FUNCTIO|
00001c10  4e 53 20 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |NS *************|
00001c20  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00001c40  2a 2a 2a 2f 0a 0a 76 6f  69 64 20 73 65 65 64 5f  |***/..void seed_|
00001c50  72 61 6e 64 31 36 28 76  6f 69 64 29 0a 7b 0a 20  |rand16(void).{. |
00001c60  20 69 6e 74 20 76 3d 63  6c 6f 63 6b 28 29 20 26  | int v=clock() &|
00001c70  20 30 78 66 66 3b 0a 20  20 76 7c 3d 76 3c 3c 38  | 0xff;.  v|=v<<8|
00001c80  3b 0a 20 20 73 72 61 6e  64 31 36 28 76 20 7c 20  |;.  srand16(v | |
00001c90  76 3c 3c 31 36 29 3b 0a  7d 0a 0a 6d 6f 6e 69 74  |v<<16);.}..monit|
00001ca0  6f 72 20 72 65 61 64 5f  6d 6f 6e 69 74 6f 72 5f  |or read_monitor_|
00001cb0  74 79 70 65 28 76 6f 69  64 29 0a 7b 0a 20 20 69  |type(void).{.  i|
00001cc0  6e 74 20 72 32 3b 0a 20  20 6f 73 5f 73 77 69 33  |nt r2;.  os_swi3|
00001cd0  72 28 36 2c 20 31 36 31  2c 31 33 33 2c 30 2c 20  |r(6, 161,133,0, |
00001ce0  30 2c 30 2c 26 72 32 29  3b 0a 20 20 69 66 20 28  |0,0,&r2);.  if (|
00001cf0  28 72 32 2f 34 20 26 20  33 29 20 3d 3d 20 31 29  |(r2/4 & 3) == 1)|
00001d00  20 72 65 74 75 72 6e 20  6d 75 6c 74 69 3b 0a 20  | return multi;. |
00001d10  20 65 6c 73 65 20 72 65  74 75 72 6e 20 6e 6f 6e  | else return non|
00001d20  6d 75 6c 74 69 3b 0a 7d  0a 0a 76 6f 69 64 20 70  |multi;.}..void p|
00001d30  72 65 73 73 28 69 6e 74  20 69 29 0a 7b 0a 20 20  |ress(int i).{.  |
00001d40  66 6f 72 20 28 3b 62 62  63 5f 69 6e 6b 65 79 28  |for (;bbc_inkey(|
00001d50  69 29 21 3d 2d 31 3b 29  3b 0a 20 20 72 65 74 75  |i)!=-1;);.  retu|
00001d60  72 6e 3b 0a 7d 0a 0a 76  6f 69 64 20 72 65 6c 65  |rn;.}..void rele|
00001d70  61 73 65 28 69 6e 74 20  69 29 0a 7b 0a 20 20 66  |ase(int i).{.  f|
00001d80  6f 72 20 28 3b 62 62 63  5f 69 6e 6b 65 79 28 69  |or (;bbc_inkey(i|
00001d90  29 21 3d 30 3b 29 3b 0a  20 20 72 65 74 75 72 6e  |)!=0;);.  return|
00001da0  3b 0a 7d 0a 0a 42 4f 4f  4c 20 6b 62 68 69 74 28  |;.}..BOOL kbhit(|
00001db0  76 6f 69 64 29 0a 7b 0a  20 20 72 65 74 75 72 6e  |void).{.  return|
00001dc0  20 62 62 63 5f 69 6e 6b  65 79 28 2d 39 39 29 3d  | bbc_inkey(-99)=|
00001dd0  3d 2d 31 3b 0a 7d 0a 0a  76 6f 69 64 20 73 65 6c  |=-1;.}..void sel|
00001de0  65 63 74 5f 73 70 65 65  64 28 42 4f 4f 4c 20 61  |ect_speed(BOOL a|
00001df0  6c 6c 6f 77 5f 73 70 61  63 65 29 0a 7b 0a 20 20  |llow_space).{.  |
00001e00  69 6e 74 20 73 3d 30 2c  20 66 3d 30 3b 0a 20 20  |int s=0, f=0;.  |
00001e10  66 6f 72 20 28 3b 73 21  3d 2d 31 20 26 26 20 66  |for (;s!=-1 && f|
00001e20  21 3d 2d 31 20 26 26 20  28 62 62 63 5f 69 6e 6b  |!=-1 && (bbc_ink|
00001e30  65 79 28 2d 39 39 29 21  3d 2d 31 20 7c 7c 20 21  |ey(-99)!=-1 || !|
00001e40  61 6c 6c 6f 77 5f 73 70  61 63 65 29 3b 29 20 7b  |allow_space);) {|
00001e50  0a 20 20 20 20 73 3d 62  62 63 5f 69 6e 6b 65 79  |.    s=bbc_inkey|
00001e60  28 2d 38 32 29 3b 0a 20  20 20 20 66 3d 62 62 63  |(-82);.    f=bbc|
00001e70  5f 69 6e 6b 65 79 28 2d  36 38 29 3b 0a 20 20 7d  |_inkey(-68);.  }|
00001e80  0a 20 20 72 65 6c 65 61  73 65 28 2d 38 32 29 3b  |.  release(-82);|
00001e90  0a 20 20 72 65 6c 65 61  73 65 28 2d 36 38 29 3b  |.  release(-68);|
00001ea0  0a 20 20 72 65 6c 65 61  73 65 28 2d 39 39 29 3b  |.  release(-99);|
00001eb0  0a 20 20 69 66 20 28 66  3d 3d 2d 31 29 20 73 70  |.  if (f==-1) sp|
00001ec0  65 65 64 3d 32 3b 0a 20  20 69 66 20 28 73 3d 3d  |eed=2;.  if (s==|
00001ed0  2d 31 29 20 73 70 65 65  64 3d 34 3b 0a 7d 0a 0a  |-1) speed=4;.}..|
00001ee0  76 6f 69 64 20 74 69 64  79 28 76 6f 69 64 29 0a  |void tidy(void).|
00001ef0  7b 0a 20 20 6f 73 5f 73  77 69 32 28 4f 53 5f 42  |{.  os_swi2(OS_B|
00001f00  79 74 65 2c 20 31 31 32  2c 20 31 29 3b 0a 20 20  |yte, 112, 1);.  |
00001f10  6f 73 5f 73 77 69 32 28  4f 53 5f 42 79 74 65 2c  |os_swi2(OS_Byte,|
00001f20  20 31 31 33 2c 20 31 29  3b 0a 20 20 2f 2a 70 72  | 113, 1);.  /*pr|
00001f30  69 6e 74 66 28 22 42 79  65 20 62 79 65 21 5c 6e  |intf("Bye bye!\n|
00001f40  22 29 3b 2a 2f 0a 7d 0a  0a 76 6f 69 64 20 70 61  |");*/.}..void pa|
00001f50  75 73 65 28 76 6f 69 64  29 0a 7b 0a 20 20 66 6f  |use(void).{.  fo|
00001f60  72 20 28 3b 63 6c 6f 63  6b 28 29 2d 74 69 3c 73  |r (;clock()-ti<s|
00001f70  70 65 65 64 3b 29 3b 0a  20 20 74 69 3d 63 6c 6f  |peed;);.  ti=clo|
00001f80  63 6b 28 29 3b 0a 20 20  2f 2a 70 72 69 6e 74 66  |ck();.  /*printf|
00001f90  28 22 20 25 69 20 22 2c  63 6c 6f 63 6b 28 29 2d  |(" %i ",clock()-|
00001fa0  74 69 29 3b 2a 2f 0a 20  20 6f 73 5f 73 77 69 31  |ti);*/.  os_swi1|
00001fb0  28 4f 53 5f 42 79 74 65  2c 20 31 39 29 3b 0a 7d  |(OS_Byte, 19);.}|
00001fc0  0a 0a 76 6f 69 64 20 73  77 61 70 5f 62 61 6e 6b  |..void swap_bank|
00001fd0  73 28 76 6f 69 64 29 0a  7b 0a 20 20 6f 73 5f 73  |s(void).{.  os_s|
00001fe0  77 69 32 28 4f 53 5f 42  79 74 65 2c 20 31 31 33  |wi2(OS_Byte, 113|
00001ff0  2c 20 62 61 6e 6b 29 3b  0a 20 20 6f 73 5f 73 77  |, bank);.  os_sw|
00002000  69 32 28 4f 53 5f 42 79  74 65 2c 20 31 31 32 2c  |i2(OS_Byte, 112,|
00002010  20 62 61 6e 6b 3d 33 2d  62 61 6e 6b 29 3b 0a 7d  | bank=3-bank);.}|
00002020  0a 0a 76 6f 69 64 20 2a  67 65 74 5f 73 63 72 65  |..void *get_scre|
00002030  65 6e 5f 62 61 73 65 28  76 6f 69 64 29 0a 7b 0a  |en_base(void).{.|
00002040  20 20 69 6e 74 20 61 5b  32 5d 20 3d 20 7b 31 34  |  int a[2] = {14|
00002050  38 2c 20 2d 31 7d 3b 0a  20 20 6f 73 5f 73 77 69  |8, -1};.  os_swi|
00002060  32 28 4f 53 5f 52 65 61  64 56 64 75 56 61 72 69  |2(OS_ReadVduVari|
00002070  61 62 6c 65 73 2c 20 28  69 6e 74 29 61 2c 20 28  |ables, (int)a, (|
00002080  69 6e 74 29 61 29 3b 0a  20 20 72 65 74 75 72 6e  |int)a);.  return|
00002090  20 28 76 6f 69 64 20 2a  29 61 5b 30 5d 3b 0a 7d  | (void *)a[0];.}|
000020a0  0a 0a 2f 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |../*************|
000020b0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00002100  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2f 0a 2f 2a 2a  |***********/./**|
00002110  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00002130  2a 20 4e 45 55 52 41 4c  20 4e 45 54 20 46 55 4e  |* NEURAL NET FUN|
00002140  43 54 49 4f 4e 53 20 2a  2a 2a 2a 2a 2a 2a 2a 2a  |CTIONS *********|
00002150  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00002170  2a 2a 2a 2a 2a 2a 2f 0a  0a 2f 2a 2a 2a 2a 2a 2a  |******/../******|
00002180  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000021a0  2a 2a 2a 2a 20 6d 69 73  63 20 2a 2a 2a 2a 2a 2a  |**** misc ******|
000021b0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000021e0  2a 2a 2f 0a 0a 2f 2a 63  72 65 61 74 65 20 61 20  |**/../*create a |
000021f0  64 79 6e 61 6d 69 63 20  31 64 20 61 72 72 61 79  |dynamic 1d array|
00002200  20 6f 66 20 75 6e 69 74  73 20 77 69 74 68 20 69  | of units with i|
00002210  6e 64 69 63 65 73 20 31  2c 2e 2e 2e 2c 75 70 5f  |ndices 1,...,up_|
00002220  6c 69 6d 69 74 2a 2f 0a  76 65 63 74 6f 72 20 61  |limit*/.vector a|
00002230  6c 6c 6f 63 61 74 65 5f  76 65 63 74 6f 72 28 69  |llocate_vector(i|
00002240  6e 74 20 75 70 5f 6c 69  6d 69 74 29 0a 7b 0a 20  |nt up_limit).{. |
00002250  20 76 65 63 74 6f 72 20  76 3b 0a 20 20 69 6e 74  | vector v;.  int|
00002260  20 76 6c 65 6e 20 3d 20  75 70 5f 6c 69 6d 69 74  | vlen = up_limit|
00002270  20 2d 20 6c 6f 77 5f 6c  69 6d 69 74 20 2b 20 31  | - low_limit + 1|
00002280  3b 0a 20 20 76 20 3d 20  63 61 6c 6c 6f 63 28 76  |;.  v = calloc(v|
00002290  6c 65 6e 2c 20 73 69 7a  65 6f 66 28 75 6e 69 74  |len, sizeof(unit|
000022a0  29 29 3b 0a 20 20 69 66  20 28 76 3d 3d 30 29 20  |));.  if (v==0) |
000022b0  7b 0a 20 20 20 20 77 65  72 72 28 77 65 72 72 74  |{.    werr(werrt|
000022c0  65 72 6d 2c 20 22 61 6c  6c 6f 63 61 74 65 5f 76  |erm, "allocate_v|
000022d0  65 63 74 6f 72 20 66 61  69 6c 65 64 22 29 3b 0a  |ector failed");.|
000022e0  20 20 20 20 72 65 74 75  72 6e 20 30 3b 0a 20 20  |    return 0;.  |
000022f0  7d 0a 20 20 72 65 74 75  72 6e 20 76 2d 6c 6f 77  |}.  return v-low|
00002300  5f 6c 69 6d 69 74 3b 0a  7d 0a 0a 76 6f 69 64 20  |_limit;.}..void |
00002310  63 6f 70 79 5f 76 65 63  74 6f 72 28 76 65 63 74  |copy_vector(vect|
00002320  6f 72 20 73 6f 75 72 63  65 2c 20 76 65 63 74 6f  |or source, vecto|
00002330  72 20 64 65 73 74 2c 20  69 6e 74 20 6c 65 6e 29  |r dest, int len)|
00002340  0a 7b 0a 20 20 6d 65 6d  6d 6f 76 65 28 64 65 73  |.{.  memmove(des|
00002350  74 2b 6c 6f 77 5f 6c 69  6d 69 74 2c 20 73 6f 75  |t+low_limit, sou|
00002360  72 63 65 2b 6c 6f 77 5f  6c 69 6d 69 74 2c 20 6c  |rce+low_limit, l|
00002370  65 6e 2a 73 69 7a 65 6f  66 28 75 6e 69 74 29 29  |en*sizeof(unit))|
00002380  3b 0a 7d 0a 0a 76 6f 69  64 20 66 72 65 65 5f 76  |;.}..void free_v|
00002390  65 63 74 6f 72 28 76 65  63 74 6f 72 20 76 29 0a  |ector(vector v).|
000023a0  7b 0a 20 20 66 72 65 65  28 76 2b 6c 6f 77 5f 6c  |{.  free(v+low_l|
000023b0  69 6d 69 74 29 3b 0a 7d  0a 0a 2f 2a 63 72 65 61  |imit);.}../*crea|
000023c0  74 65 20 61 20 64 79 6e  61 6d 69 63 20 32 64 20  |te a dynamic 2d |
000023d0  61 72 72 61 79 20 6f 66  20 75 6e 69 74 73 20 77  |array of units w|
000023e0  69 74 68 20 69 6e 64 69  63 65 73 20 31 2c 2e 2e  |ith indices 1,..|
000023f0  2e 2c 72 6f 77 73 5f 75  70 5f 6c 69 6d 20 61 6e  |.,rows_up_lim an|
00002400  64 20 31 2c 2e 2e 2e 2c  63 6f 6c 73 5f 75 70 5f  |d 1,...,cols_up_|
00002410  6c 69 6d 2a 2f 0a 77 65  69 67 68 74 73 20 61 6c  |lim*/.weights al|
00002420  6c 6f 63 61 74 65 5f 77  65 69 67 68 74 73 28 69  |locate_weights(i|
00002430  6e 74 20 72 6f 77 73 5f  75 70 5f 6c 69 6d 2c 20  |nt rows_up_lim, |
00002440  69 6e 74 20 63 6f 6c 73  5f 75 70 5f 6c 69 6d 29  |int cols_up_lim)|
00002450  0a 7b 0a 20 20 69 6e 74  20 69 3b 0a 20 20 69 6e  |.{.  int i;.  in|
00002460  74 20 6e 6f 5f 6f 66 5f  72 6f 77 73 20 3d 20 72  |t no_of_rows = r|
00002470  6f 77 73 5f 75 70 5f 6c  69 6d 20 2d 20 72 6f 77  |ows_up_lim - row|
00002480  73 5f 6c 6f 77 5f 6c 69  6d 20 2b 20 31 3b 0a 20  |s_low_lim + 1;. |
00002490  20 69 6e 74 20 6e 6f 5f  6f 66 5f 63 6f 6c 73 20  | int no_of_cols |
000024a0  3d 20 63 6f 6c 73 5f 75  70 5f 6c 69 6d 20 2d 20  |= cols_up_lim - |
000024b0  63 6f 6c 73 5f 6c 6f 77  5f 6c 69 6d 20 2b 20 31  |cols_low_lim + 1|
000024c0  3b 0a 20 20 77 65 69 67  68 74 73 20 61 20 3d 20  |;.  weights a = |
000024d0  63 61 6c 6c 6f 63 28 6e  6f 5f 6f 66 5f 72 6f 77  |calloc(no_of_row|
000024e0  73 2c 20 73 69 7a 65 6f  66 28 75 6e 69 74 20 2a  |s, sizeof(unit *|
000024f0  29 29 3b 0a 20 20 69 66  20 28 61 3d 3d 30 29 20  |));.  if (a==0) |
00002500  7b 0a 20 20 20 20 77 65  72 72 28 77 65 72 72 74  |{.    werr(werrt|
00002510  65 72 6d 2c 20 22 61 6c  6c 6f 63 61 74 65 5f 77  |erm, "allocate_w|
00002520  65 69 67 68 74 73 20 5b  31 5d 20 66 61 69 6c 65  |eights [1] faile|
00002530  64 22 29 3b 0a 20 20 20  20 72 65 74 75 72 6e 20  |d");.    return |
00002540  30 3b 0a 20 20 7d 0a 20  20 61 20 2d 3d 20 72 6f  |0;.  }.  a -= ro|
00002550  77 73 5f 6c 6f 77 5f 6c  69 6d 3b 0a 20 20 61 5b  |ws_low_lim;.  a[|
00002560  72 6f 77 73 5f 6c 6f 77  5f 6c 69 6d 5d 20 3d 20  |rows_low_lim] = |
00002570  63 61 6c 6c 6f 63 28 6e  6f 5f 6f 66 5f 72 6f 77  |calloc(no_of_row|
00002580  73 2a 6e 6f 5f 6f 66 5f  63 6f 6c 73 2c 20 73 69  |s*no_of_cols, si|
00002590  7a 65 6f 66 28 75 6e 69  74 29 29 3b 0a 20 20 69  |zeof(unit));.  i|
000025a0  66 20 28 61 5b 72 6f 77  73 5f 6c 6f 77 5f 6c 69  |f (a[rows_low_li|
000025b0  6d 5d 3d 3d 30 29 20 7b  0a 20 20 20 20 66 72 65  |m]==0) {.    fre|
000025c0  65 28 61 2b 72 6f 77 73  5f 6c 6f 77 5f 6c 69 6d  |e(a+rows_low_lim|
000025d0  29 3b 0a 20 20 20 20 77  65 72 72 28 77 65 72 72  |);.    werr(werr|
000025e0  74 65 72 6d 2c 20 22 61  6c 6c 6f 63 61 74 65 5f  |term, "allocate_|
000025f0  77 65 69 67 68 74 73 20  5b 32 5d 20 66 61 69 6c  |weights [2] fail|
00002600  65 64 22 29 3b 0a 20 20  20 20 72 65 74 75 72 6e  |ed");.    return|
00002610  20 30 3b 0a 20 20 7d 0a  20 20 61 5b 72 6f 77 73  | 0;.  }.  a[rows|
00002620  5f 6c 6f 77 5f 6c 69 6d  5d 20 2d 3d 20 63 6f 6c  |_low_lim] -= col|
00002630  73 5f 6c 6f 77 5f 6c 69  6d 3b 0a 20 20 66 6f 72  |s_low_lim;.  for|
00002640  20 28 69 3d 72 6f 77 73  5f 6c 6f 77 5f 6c 69 6d  | (i=rows_low_lim|
00002650  2b 31 3b 20 69 3c 3d 72  6f 77 73 5f 75 70 5f 6c  |+1; i<=rows_up_l|
00002660  69 6d 3b 20 69 2b 2b 29  20 61 5b 69 5d 20 3d 20  |im; i++) a[i] = |
00002670  61 5b 69 2d 31 5d 20 2b  20 6e 6f 5f 6f 66 5f 63  |a[i-1] + no_of_c|
00002680  6f 6c 73 3b 0a 20 20 72  65 74 75 72 6e 20 61 3b  |ols;.  return a;|
00002690  0a 7d 0a 0a 76 6f 69 64  20 63 6f 70 79 5f 77 65  |.}..void copy_we|
000026a0  69 67 68 74 73 28 77 65  69 67 68 74 73 20 73 6f  |ights(weights so|
000026b0  75 72 63 65 2c 20 77 65  69 67 68 74 73 20 64 65  |urce, weights de|
000026c0  73 74 2c 20 69 6e 74 20  6e 6f 5f 6f 66 5f 72 6f  |st, int no_of_ro|
000026d0  77 73 2c 20 69 6e 74 20  6e 6f 5f 6f 66 5f 63 6f  |ws, int no_of_co|
000026e0  6c 73 29 0a 7b 0a 20 20  6d 65 6d 6d 6f 76 65 28  |ls).{.  memmove(|
000026f0  64 65 73 74 5b 72 6f 77  73 5f 6c 6f 77 5f 6c 69  |dest[rows_low_li|
00002700  6d 5d 2b 63 6f 6c 73 5f  6c 6f 77 5f 6c 69 6d 2c  |m]+cols_low_lim,|
00002710  20 73 6f 75 72 63 65 5b  72 6f 77 73 5f 6c 6f 77  | source[rows_low|
00002720  5f 6c 69 6d 5d 2b 63 6f  6c 73 5f 6c 6f 77 5f 6c  |_lim]+cols_low_l|
00002730  69 6d 2c 20 6e 6f 5f 6f  66 5f 72 6f 77 73 2a 6e  |im, no_of_rows*n|
00002740  6f 5f 6f 66 5f 63 6f 6c  73 2a 73 69 7a 65 6f 66  |o_of_cols*sizeof|
00002750  28 75 6e 69 74 29 29 3b  0a 7d 0a 0a 76 6f 69 64  |(unit));.}..void|
00002760  20 66 72 65 65 5f 77 65  69 67 68 74 73 28 77 65  | free_weights(we|
00002770  69 67 68 74 73 20 61 29  0a 7b 0a 20 20 66 72 65  |ights a).{.  fre|
00002780  65 28 61 5b 72 6f 77 73  5f 6c 6f 77 5f 6c 69 6d  |e(a[rows_low_lim|
00002790  5d 2b 63 6f 6c 73 5f 6c  6f 77 5f 6c 69 6d 29 3b  |]+cols_low_lim);|
000027a0  0a 20 20 66 72 65 65 28  61 2b 72 6f 77 73 5f 6c  |.  free(a+rows_l|
000027b0  6f 77 5f 6c 69 6d 29 3b  0a 7d 0a 0a 77 65 69 67  |ow_lim);.}..weig|
000027c0  68 74 73 5f 72 65 63 20  2a 61 6c 6c 6f 63 61 74  |hts_rec *allocat|
000027d0  65 5f 6e 65 74 77 6f 72  6b 5f 77 65 69 67 68 74  |e_network_weight|
000027e0  73 28 77 65 69 67 68 74  73 5f 72 65 63 20 2a 77  |s(weights_rec *w|
000027f0  2c 20 66 66 5f 73 65 74  75 70 5f 72 65 63 20 2a  |, ff_setup_rec *|
00002800  73 65 74 75 70 29 0a 7b  0a 20 20 77 2d 3e 77 69  |setup).{.  w->wi|
00002810  20 3d 20 61 6c 6c 6f 63  61 74 65 5f 77 65 69 67  | = allocate_weig|
00002820  68 74 73 28 73 65 74 75  70 2d 3e 6e 6f 5f 6f 66  |hts(setup->no_of|
00002830  5f 69 6e 70 75 74 73 2b  31 2c 20 73 65 74 75 70  |_inputs+1, setup|
00002840  2d 3e 6e 6f 5f 6f 66 5f  68 31 5f 6e 6f 64 65 73  |->no_of_h1_nodes|
00002850  29 3b 0a 20 20 77 2d 3e  77 6f 20 3d 20 61 6c 6c  |);.  w->wo = all|
00002860  6f 63 61 74 65 5f 77 65  69 67 68 74 73 28 73 65  |ocate_weights(se|
00002870  74 75 70 2d 3e 6e 6f 5f  6f 66 5f 68 31 5f 6e 6f  |tup->no_of_h1_no|
00002880  64 65 73 2c 20 73 65 74  75 70 2d 3e 6e 6f 5f 6f  |des, setup->no_o|
00002890  66 5f 6f 75 74 70 75 74  73 29 3b 0a 20 20 69 66  |f_outputs);.  if|
000028a0  20 28 77 2d 3e 77 69 3d  3d 30 20 7c 7c 20 77 2d  | (w->wi==0 || w-|
000028b0  3e 77 6f 3d 3d 30 29 20  7b 0a 20 20 20 20 69 66  |>wo==0) {.    if|
000028c0  20 28 77 2d 3e 77 69 29  20 66 72 65 65 5f 77 65  | (w->wi) free_we|
000028d0  69 67 68 74 73 28 77 2d  3e 77 69 29 3b 0a 20 20  |ights(w->wi);.  |
000028e0  20 20 69 66 20 28 77 2d  3e 77 6f 29 20 66 72 65  |  if (w->wo) fre|
000028f0  65 5f 77 65 69 67 68 74  73 28 77 2d 3e 77 6f 29  |e_weights(w->wo)|
00002900  3b 0a 20 20 20 20 77 65  72 72 28 77 65 72 72 74  |;.    werr(werrt|
00002910  65 72 6d 2c 20 22 61 6c  6c 6f 63 61 74 65 5f 6e  |erm, "allocate_n|
00002920  65 74 77 6f 72 6b 5f 77  65 69 67 68 74 73 20 66  |etwork_weights f|
00002930  61 69 6c 65 64 22 29 3b  0a 20 20 20 20 72 65 74  |ailed");.    ret|
00002940  75 72 6e 20 30 3b 0a 20  20 7d 0a 20 20 77 2d 3e  |urn 0;.  }.  w->|
00002950  61 6c 6c 6f 63 61 74 65  64 20 3d 20 54 52 55 45  |allocated = TRUE|
00002960  3b 0a 20 20 77 2d 3e 73  69 20 3d 20 73 65 74 75  |;.  w->si = setu|
00002970  70 2d 3e 6e 6f 5f 6f 66  5f 69 6e 70 75 74 73 2b  |p->no_of_inputs+|
00002980  31 3b 0a 20 20 77 2d 3e  73 6f 20 3d 20 73 65 74  |1;.  w->so = set|
00002990  75 70 2d 3e 6e 6f 5f 6f  66 5f 6f 75 74 70 75 74  |up->no_of_output|
000029a0  73 3b 0a 20 20 77 2d 3e  73 68 20 3d 20 73 65 74  |s;.  w->sh = set|
000029b0  75 70 2d 3e 6e 6f 5f 6f  66 5f 68 31 5f 6e 6f 64  |up->no_of_h1_nod|
000029c0  65 73 3b 0a 20 20 72 65  74 75 72 6e 20 77 3b 0a  |es;.  return w;.|
000029d0  7d 0a 0a 76 6f 69 64 20  66 72 65 65 5f 6e 65 74  |}..void free_net|
000029e0  77 6f 72 6b 5f 77 65 69  67 68 74 73 28 77 65 69  |work_weights(wei|
000029f0  67 68 74 73 5f 72 65 63  20 2a 77 29 0a 7b 0a 20  |ghts_rec *w).{. |
00002a00  20 69 66 20 28 77 2d 3e  61 6c 6c 6f 63 61 74 65  | if (w->allocate|
00002a10  64 29 20 7b 0a 20 20 20  20 66 72 65 65 5f 77 65  |d) {.    free_we|
00002a20  69 67 68 74 73 28 77 2d  3e 77 69 29 3b 0a 20 20  |ights(w->wi);.  |
00002a30  20 20 66 72 65 65 5f 77  65 69 67 68 74 73 28 77  |  free_weights(w|
00002a40  2d 3e 77 6f 29 3b 0a 20  20 20 20 77 2d 3e 73 69  |->wo);.    w->si|
00002a50  20 3d 20 77 2d 3e 73 6f  20 3d 20 77 2d 3e 73 68  | = w->so = w->sh|
00002a60  20 3d 20 30 3b 0a 20 20  7d 0a 20 20 77 2d 3e 61  | = 0;.  }.  w->a|
00002a70  6c 6c 6f 63 61 74 65 64  20 3d 20 46 41 4c 53 45  |llocated = FALSE|
00002a80  3b 0a 7d 0a 0a 77 65 69  67 68 74 73 5f 72 65 63  |;.}..weights_rec|
00002a90  20 2a 72 65 69 6e 69 74  69 61 6c 69 73 65 5f 77  | *reinitialise_w|
00002aa0  65 69 67 68 74 73 28 77  65 69 67 68 74 73 5f 72  |eights(weights_r|
00002ab0  65 63 20 2a 77 2c 20 42  4f 4f 4c 20 72 61 6e 64  |ec *w, BOOL rand|
00002ac0  6f 6d 5f 69 6e 69 74 2c  20 66 66 5f 73 65 74 75  |om_init, ff_setu|
00002ad0  70 5f 72 65 63 20 2a 73  65 74 75 70 29 0a 7b 0a  |p_rec *setup).{.|
00002ae0  20 20 75 6e 69 74 20 2a  70 2c 20 2a 70 65 3b 0a  |  unit *p, *pe;.|
00002af0  20 20 69 66 20 28 72 61  6e 64 6f 6d 5f 69 6e 69  |  if (random_ini|
00002b00  74 29 20 7b 09 09 09 09  2f 2a 69 6e 69 74 69 61  |t) {..../*initia|
00002b10  6c 69 73 65 20 77 65 69  67 68 74 73 20 72 61 6e  |lise weights ran|
00002b20  64 6f 6d 6c 79 20 69 6e  20 72 61 6e 67 65 20 28  |domly in range (|
00002b30  2d 31 2c 31 29 2a 2f 0a  20 20 20 20 70 20 20 3d  |-1,1)*/.    p  =|
00002b40  20 77 2d 3e 77 69 5b 72  6f 77 73 5f 6c 6f 77 5f  | w->wi[rows_low_|
00002b50  6c 69 6d 5d 2b 63 6f 6c  73 5f 6c 6f 77 5f 6c 69  |lim]+cols_low_li|
00002b60  6d 3b 0a 20 20 20 20 70  65 20 3d 20 70 20 2b 20  |m;.    pe = p + |
00002b70  28 73 65 74 75 70 2d 3e  6e 6f 5f 6f 66 5f 69 6e  |(setup->no_of_in|
00002b80  70 75 74 73 2b 31 29 2a  73 65 74 75 70 2d 3e 6e  |puts+1)*setup->n|
00002b90  6f 5f 6f 66 5f 68 31 5f  6e 6f 64 65 73 3b 0a 20  |o_of_h1_nodes;. |
00002ba0  20 20 20 66 6f 72 20 28  3b 70 3c 70 65 3b 29 20  |   for (;p<pe;) |
00002bb0  2a 70 2b 2b 20 3d 20 72  61 6e 64 31 36 28 29 3b  |*p++ = rand16();|
00002bc0  0a 20 20 20 20 70 20 20  3d 20 77 2d 3e 77 6f 5b  |.    p  = w->wo[|
00002bd0  72 6f 77 73 5f 6c 6f 77  5f 6c 69 6d 5d 2b 63 6f  |rows_low_lim]+co|
00002be0  6c 73 5f 6c 6f 77 5f 6c  69 6d 3b 0a 20 20 20 20  |ls_low_lim;.    |
00002bf0  70 65 20 3d 20 70 20 2b  20 73 65 74 75 70 2d 3e  |pe = p + setup->|
00002c00  6e 6f 5f 6f 66 5f 68 31  5f 6e 6f 64 65 73 2a 73  |no_of_h1_nodes*s|
00002c10  65 74 75 70 2d 3e 6e 6f  5f 6f 66 5f 6f 75 74 70  |etup->no_of_outp|
00002c20  75 74 73 3b 0a 20 20 20  20 66 6f 72 20 28 3b 70  |uts;.    for (;p|
00002c30  3c 70 65 3b 29 20 2a 70  2b 2b 20 3d 20 72 61 6e  |<pe;) *p++ = ran|
00002c40  64 31 36 28 29 3b 0a 20  20 20 20 73 65 74 75 70  |d16();.    setup|
00002c50  2d 3e 73 74 61 72 74 5f  69 74 65 72 20 3d 20 30  |->start_iter = 0|
00002c60  3b 0a 20 20 7d 0a 20 20  65 6c 73 65 20 7b 0a 20  |;.  }.  else {. |
00002c70  20 20 20 6d 65 6d 73 65  74 28 77 2d 3e 77 69 5b  |   memset(w->wi[|
00002c80  72 6f 77 73 5f 6c 6f 77  5f 6c 69 6d 5d 2b 63 6f  |rows_low_lim]+co|
00002c90  6c 73 5f 6c 6f 77 5f 6c  69 6d 2c 20 30 2c 20 28  |ls_low_lim, 0, (|
00002ca0  73 65 74 75 70 2d 3e 6e  6f 5f 6f 66 5f 69 6e 70  |setup->no_of_inp|
00002cb0  75 74 73 2b 31 29 2a 73  65 74 75 70 2d 3e 6e 6f  |uts+1)*setup->no|
00002cc0  5f 6f 66 5f 68 31 5f 6e  6f 64 65 73 2a 73 69 7a  |_of_h1_nodes*siz|
00002cd0  65 6f 66 28 75 6e 69 74  29 29 3b 0a 20 20 20 20  |eof(unit));.    |
00002ce0  6d 65 6d 73 65 74 28 77  2d 3e 77 6f 5b 72 6f 77  |memset(w->wo[row|
00002cf0  73 5f 6c 6f 77 5f 6c 69  6d 5d 2b 63 6f 6c 73 5f  |s_low_lim]+cols_|
00002d00  6c 6f 77 5f 6c 69 6d 2c  20 30 2c 20 73 65 74 75  |low_lim, 0, setu|
00002d10  70 2d 3e 6e 6f 5f 6f 66  5f 68 31 5f 6e 6f 64 65  |p->no_of_h1_node|
00002d20  73 2a 73 65 74 75 70 2d  3e 6e 6f 5f 6f 66 5f 6f  |s*setup->no_of_o|
00002d30  75 74 70 75 74 73 2a 73  69 7a 65 6f 66 28 75 6e  |utputs*sizeof(un|
00002d40  69 74 29 29 3b 0a 20 20  7d 0a 20 20 72 65 74 75  |it));.  }.  retu|
00002d50  72 6e 20 77 3b 0a 7d 0a  0a 77 65 69 67 68 74 73  |rn w;.}..weights|
00002d60  5f 72 65 63 20 2a 69 6e  69 74 69 61 6c 69 73 65  |_rec *initialise|
00002d70  5f 77 65 69 67 68 74 73  28 77 65 69 67 68 74 73  |_weights(weights|
00002d80  5f 72 65 63 20 2a 77 2c  20 42 4f 4f 4c 20 72 61  |_rec *w, BOOL ra|
00002d90  6e 64 6f 6d 5f 69 6e 69  74 2c 20 66 66 5f 73 65  |ndom_init, ff_se|
00002da0  74 75 70 5f 72 65 63 20  2a 73 65 74 75 70 29 0a  |tup_rec *setup).|
00002db0  7b 0a 20 20 69 66 20 28  77 2d 3e 61 6c 6c 6f 63  |{.  if (w->alloc|
00002dc0  61 74 65 64 3d 3d 46 41  4c 53 45 29 20 7b 0a 20  |ated==FALSE) {. |
00002dd0  20 20 20 69 66 20 28 61  6c 6c 6f 63 61 74 65 5f  |   if (allocate_|
00002de0  6e 65 74 77 6f 72 6b 5f  77 65 69 67 68 74 73 28  |network_weights(|
00002df0  77 2c 20 73 65 74 75 70  29 3d 3d 30 29 20 67 6f  |w, setup)==0) go|
00002e00  74 6f 20 69 6e 69 74 77  31 3b 0a 20 20 7d 0a 20  |to initw1;.  }. |
00002e10  20 65 6c 73 65 0a 20 20  20 20 69 66 20 28 77 2d  | else.    if (w-|
00002e20  3e 73 69 21 3d 73 65 74  75 70 2d 3e 6e 6f 5f 6f  |>si!=setup->no_o|
00002e30  66 5f 69 6e 70 75 74 73  2b 31 20 7c 7c 20 77 2d  |f_inputs+1 || w-|
00002e40  3e 73 6f 21 3d 73 65 74  75 70 2d 3e 6e 6f 5f 6f  |>so!=setup->no_o|
00002e50  66 5f 6f 75 74 70 75 74  73 20 7c 7c 20 77 2d 3e  |f_outputs || w->|
00002e60  73 68 21 3d 73 65 74 75  70 2d 3e 6e 6f 5f 6f 66  |sh!=setup->no_of|
00002e70  5f 68 31 5f 6e 6f 64 65  73 29 20 7b 0a 20 20 20  |_h1_nodes) {.   |
00002e80  20 20 20 66 72 65 65 5f  6e 65 74 77 6f 72 6b 5f  |   free_network_|
00002e90  77 65 69 67 68 74 73 28  77 29 3b 0a 20 20 20 20  |weights(w);.    |
00002ea0  20 20 69 66 20 28 61 6c  6c 6f 63 61 74 65 5f 6e  |  if (allocate_n|
00002eb0  65 74 77 6f 72 6b 5f 77  65 69 67 68 74 73 28 77  |etwork_weights(w|
00002ec0  2c 20 73 65 74 75 70 29  3d 3d 30 29 20 67 6f 74  |, setup)==0) got|
00002ed0  6f 20 69 6e 69 74 77 31  3b 0a 20 20 20 20 7d 0a  |o initw1;.    }.|
00002ee0  20 20 72 65 74 75 72 6e  20 72 65 69 6e 69 74 69  |  return reiniti|
00002ef0  61 6c 69 73 65 5f 77 65  69 67 68 74 73 28 77 2c  |alise_weights(w,|
00002f00  20 72 61 6e 64 6f 6d 5f  69 6e 69 74 2c 20 73 65  | random_init, se|
00002f10  74 75 70 29 3b 0a 20 20  69 6e 69 74 77 31 3a 0a  |tup);.  initw1:.|
00002f20  20 20 77 65 72 72 28 77  65 72 72 74 65 72 6d 2c  |  werr(werrterm,|
00002f30  20 22 69 6e 69 74 69 61  6c 69 73 65 5f 77 65 69  | "initialise_wei|
00002f40  67 68 74 73 20 66 61 69  6c 65 64 22 29 3b 0a 20  |ghts failed");. |
00002f50  20 72 65 74 75 72 6e 20  30 3b 0a 7d 0a 0a 2f 2a  | return 0;.}../*|
00002f60  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00002f80  2a 2a 2a 2a 2a 2a 20 64  69 73 70 6c 61 79 20 66  |****** display f|
00002f90  75 6e 63 74 69 6f 6e 73  20 2a 2a 2a 2a 2a 2a 2a  |unctions *******|
00002fa0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00002fc0  2a 2a 2a 2a 2a 2a 2f 0a  0a 69 6e 74 20 73 74 61  |******/..int sta|
00002fd0  72 74 5f 68 6f 72 5f 70  6f 73 2c 20 64 69 73 70  |rt_hor_pos, disp|
00002fe0  6c 61 79 5f 66 61 63 74  6f 72 3b 0a 0a 69 6e 74  |lay_factor;..int|
00002ff0  20 73 63 61 6c 65 28 75  6e 69 74 20 76 29 0a 7b  | scale(unit v).{|
00003000  0a 20 20 76 20 3d 20 76  2a 35 2f 32 30 34 38 3b  |.  v = v*5/2048;|
00003010  0a 20 20 72 65 74 75 72  6e 20 76 3e 31 36 30 20  |.  return v>160 |
00003020  3f 20 31 36 30 20 3a 20  28 76 3c 30 20 3f 20 30  |? 160 : (v<0 ? 0|
00003030  20 3a 20 76 29 3b 0a 7d  0a 0a 76 6f 69 64 20 73  | : v);.}..void s|
00003040  65 74 75 70 5f 73 63 72  65 65 6e 28 64 69 73 70  |etup_screen(disp|
00003050  6c 61 79 5f 72 65 63 20  2a 64 69 73 70 6c 61 79  |lay_rec *display|
00003060  2c 20 66 66 5f 73 65 74  75 70 5f 72 65 63 20 2a  |, ff_setup_rec *|
00003070  73 65 74 75 70 29 0a 7b  0a 20 20 69 6e 74 20 79  |setup).{.  int y|
00003080  73 20 3d 20 31 3c 3c 28  32 2d 6c 79 29 3b 0a 20  |s = 1<<(2-ly);. |
00003090  20 62 62 63 5f 63 6c 73  28 29 3b 0a 20 20 62 62  | bbc_cls();.  bb|
000030a0  63 5f 74 61 62 28 36 2c  20 31 2a 79 73 29 3b 09  |c_tab(6, 1*ys);.|
000030b0  70 72 69 6e 74 66 28 22  49 74 65 72 61 74 69 6f  |printf("Iteratio|
000030c0  6e 3a 20 25 69 22 2c 20  64 69 73 70 6c 61 79 2d  |n: %i", display-|
000030d0  3e 69 74 65 72 29 3b 0a  20 20 62 62 63 5f 74 61  |>iter);.  bbc_ta|
000030e0  62 28 34 39 2c 20 31 2a  79 73 29 3b 09 70 72 69  |b(49, 1*ys);.pri|
000030f0  6e 74 66 28 22 45 72 72  6f 72 20 74 68 72 65 73  |ntf("Error thres|
00003100  68 6f 6c 64 3a 20 25 38  2e 36 66 22 2c 20 28 69  |hold: %8.6f", (i|
00003110  6e 74 29 73 65 74 75 70  2d 3e 65 72 72 6f 72 5f  |nt)setup->error_|
00003120  74 68 72 65 73 68 6f 6c  64 2f 36 35 35 33 36 2e  |threshold/65536.|
00003130  30 29 3b 0a 20 20 62 62  63 5f 74 61 62 28 31 38  |0);.  bbc_tab(18|
00003140  2c 20 32 32 2a 79 73 29  3b 09 70 72 69 6e 74 66  |, 22*ys);.printf|
00003150  28 22 48 69 67 68 20 77  61 74 65 72 20 6d 61 72  |("High water mar|
00003160  6b 3a 20 25 33 69 20 52  69 67 68 74 20 28 6f 75  |k: %3i Right (ou|
00003170  74 20 6f 66 20 25 69 29  2e 22 2c 20 64 69 73 70  |t of %i).", disp|
00003180  6c 61 79 2d 3e 68 69 67  68 5f 77 61 74 65 72 2c  |lay->high_water,|
00003190  20 64 69 73 70 6c 61 79  2d 3e 6e 62 72 5f 74 72  | display->nbr_tr|
000031a0  5f 69 74 65 6d 73 29 3b  0a 20 20 62 62 63 5f 74  |_items);.  bbc_t|
000031b0  61 62 28 31 38 2c 20 32  34 2a 79 73 29 3b 09 70  |ab(18, 24*ys);.p|
000031c0  72 69 6e 74 66 28 22 48  69 74 20 3c 53 70 61 63  |rintf("Hit <Spac|
000031d0  65 3e 20 74 6f 20 70 72  65 6d 61 74 75 72 65 6c  |e> to prematurel|
000031e0  79 20 65 6e 64 20 6c 65  61 72 6e 69 6e 67 2e 22  |y end learning."|
000031f0  29 3b 0a 20 20 64 69 73  70 6c 61 79 5f 66 61 63  |);.  display_fac|
00003200  74 6f 72 20 3d 20 73 65  74 75 70 2d 3e 6e 6f 5f  |tor = setup->no_|
00003210  6f 66 5f 6f 75 74 70 75  74 73 3c 3d 34 30 20 3f  |of_outputs<=40 ?|
00003220  20 32 20 3a 20 31 3b 0a  20 20 73 74 61 72 74 5f  | 2 : 1;.  start_|
00003230  68 6f 72 5f 70 6f 73 20  3d 20 33 35 20 2d 20 73  |hor_pos = 35 - s|
00003240  65 74 75 70 2d 3e 6e 6f  5f 6f 66 5f 6f 75 74 70  |etup->no_of_outp|
00003250  75 74 73 2f 32 2a 64 69  73 70 6c 61 79 5f 66 61  |uts/2*display_fa|
00003260  63 74 6f 72 3b 0a 20 20  69 66 20 28 73 74 61 72  |ctor;.  if (star|
00003270  74 5f 68 6f 72 5f 70 6f  73 3c 30 29 20 73 74 61  |t_hor_pos<0) sta|
00003280  72 74 5f 68 6f 72 5f 70  6f 73 20 3d 20 30 3b 0a  |rt_hor_pos = 0;.|
00003290  20 20 62 62 63 5f 74 61  62 28 73 74 61 72 74 5f  |  bbc_tab(start_|
000032a0  68 6f 72 5f 70 6f 73 2d  32 2c 20 37 2a 79 73 29  |hor_pos-2, 7*ys)|
000032b0  3b 09 20 70 72 69 6e 74  66 28 22 44 65 73 69 72  |;. printf("Desir|
000032c0  65 64 20 6f 75 74 70 75  74 3a 20 22 29 3b 0a 20  |ed output: ");. |
000032d0  20 62 62 63 5f 74 61 62  28 73 74 61 72 74 5f 68  | bbc_tab(start_h|
000032e0  6f 72 5f 70 6f 73 2d 32  2c 20 31 34 2a 79 73 29  |or_pos-2, 14*ys)|
000032f0  3b 20 70 72 69 6e 74 66  28 22 45 72 72 6f 72 3a  |; printf("Error:|
00003300  20 22 29 3b 0a 7d 0a 0a  76 6f 69 64 20 64 69 73  | ");.}..void dis|
00003310  70 6c 61 79 5f 72 65 73  75 6c 74 73 28 64 69 73  |play_results(dis|
00003320  70 6c 61 79 5f 72 65 63  20 2a 64 69 73 70 6c 61  |play_rec *displa|
00003330  79 2c 20 76 65 63 74 6f  72 20 64 5f 6f 75 74 2c  |y, vector d_out,|
00003340  20 76 65 63 74 6f 72 20  6e 65 74 5f 6f 75 74 2c  | vector net_out,|
00003350  20 66 66 5f 73 65 74 75  70 5f 72 65 63 20 2a 73  | ff_setup_rec *s|
00003360  65 74 75 70 29 0a 7b 0a  20 20 69 6e 74 20 69 2c  |etup).{.  int i,|
00003370  20 6b 2c 20 78 2c 20 79  3b 0a 20 20 69 6e 74 20  | k, x, y;.  int |
00003380  79 73 20 3d 20 31 3c 3c  28 32 2d 6c 79 29 3b 0a  |ys = 1<<(2-ly);.|
00003390  20 20 62 62 63 5f 74 61  62 28 31 37 2c 20 31 2a  |  bbc_tab(17, 1*|
000033a0  79 73 29 3b 09 70 72 69  6e 74 66 28 22 25 69 22  |ys);.printf("%i"|
000033b0  2c 20 64 69 73 70 6c 61  79 2d 3e 69 74 65 72 29  |, display->iter)|
000033c0  3b 0a 20 20 62 62 63 5f  74 61 62 28 33 35 2c 20  |;.  bbc_tab(35, |
000033d0  32 32 2a 79 73 29 3b 09  70 72 69 6e 74 66 28 22  |22*ys);.printf("|
000033e0  25 33 69 22 2c 20 64 69  73 70 6c 61 79 2d 3e 68  |%3i", display->h|
000033f0  69 67 68 5f 77 61 74 65  72 29 3b 0a 20 20 62 62  |igh_water);.  bb|
00003400  63 5f 74 61 62 28 32 34  2c 20 33 2a 79 73 29 3b  |c_tab(24, 3*ys);|
00003410  09 70 72 69 6e 74 66 28  22 52 69 67 68 74 3a 20  |.printf("Right: |
00003420  20 25 33 69 20 20 20 20  20 20 20 20 20 20 20 20  | %3i            |
00003430  20 20 57 72 6f 6e 67 3a  20 20 25 33 69 22 2c 20  |  Wrong:  %3i", |
00003440  64 69 73 70 6c 61 79 2d  3e 72 69 67 68 74 5f 63  |display->right_c|
00003450  6f 75 6e 74 2c 20 64 69  73 70 6c 61 79 2d 3e 77  |ount, display->w|
00003460  72 6f 6e 67 5f 63 6f 75  6e 74 29 3b 0a 20 20 62  |rong_count);.  b|
00003470  62 63 5f 74 61 62 28 31  39 2c 20 35 2a 79 73 29  |bc_tab(19, 5*ys)|
00003480  3b 09 70 72 69 6e 74 66  28 22 4c 61 73 74 20 52  |;.printf("Last R|
00003490  69 67 68 74 3a 20 20 25  33 69 20 20 20 20 20 20  |ight:  %3i      |
000034a0  20 20 20 4c 61 73 74 20  57 72 6f 6e 67 3a 20 20  |   Last Wrong:  |
000034b0  25 33 69 22 2c 20 64 69  73 70 6c 61 79 2d 3e 6c  |%3i", display->l|
000034c0  61 73 74 5f 72 69 67 68  74 2c 20 64 69 73 70 6c  |ast_right, displ|
000034d0  61 79 2d 3e 6c 61 73 74  5f 77 72 6f 6e 67 29 3b  |ay->last_wrong);|
000034e0  0a 20 20 66 6f 72 20 28  69 3d 31 3b 20 69 3c 3d  |.  for (i=1; i<=|
000034f0  73 65 74 75 70 2d 3e 6e  6f 5f 6f 66 5f 6f 75 74  |setup->no_of_out|
00003500  70 75 74 73 3b 20 69 2b  2b 29 20 7b 0a 20 20 20  |puts; i++) {.   |
00003510  20 78 20 3d 20 28 73 74  61 72 74 5f 68 6f 72 5f  | x = (start_hor_|
00003520  70 6f 73 20 2b 20 64 69  73 70 6c 61 79 5f 66 61  |pos + display_fa|
00003530  63 74 6f 72 2a 28 69 2d  31 29 29 2a 31 36 20 2d  |ctor*(i-1))*16 -|
00003540  20 67 6f 72 69 67 69 6e  78 3b 0a 20 20 20 20 6b  | goriginx;.    k|
00003550  20 3d 20 73 63 61 6c 65  28 64 5f 6f 75 74 5b 69  | = scale(d_out[i|
00003560  5d 29 3b 0a 20 20 20 20  79 20 3d 20 6f 73 79 2d  |]);.    y = osy-|
00003570  31 36 2d 31 33 2a 33 32  20 2d 20 67 6f 72 69 67  |16-13*32 - gorig|
00003580  69 6e 79 3b 0a 20 20 20  20 62 62 63 5f 67 63 6f  |iny;.    bbc_gco|
00003590  6c 28 30 2c 20 31 31 29  3b 0a 20 20 20 20 62 62  |l(0, 11);.    bb|
000035a0  63 5f 72 65 63 74 61 6e  67 6c 65 66 69 6c 6c 28  |c_rectanglefill(|
000035b0  78 2c 20 79 2c 20 31 36  2c 20 6b 29 3b 0a 20 20  |x, y, 16, k);.  |
000035c0  20 20 62 62 63 5f 67 63  6f 6c 28 30 2c 20 39 29  |  bbc_gcol(0, 9)|
000035d0  3b 0a 20 20 20 20 62 62  63 5f 72 65 63 74 61 6e  |;.    bbc_rectan|
000035e0  67 6c 65 66 69 6c 6c 28  78 2c 20 79 2b 6b 2c 20  |glefill(x, y+k, |
000035f0  31 36 2c 20 31 36 30 2d  6b 29 3b 0a 20 20 20 20  |16, 160-k);.    |
00003600  6b 20 3d 20 73 63 61 6c  65 28 61 62 73 28 64 5f  |k = scale(abs(d_|
00003610  6f 75 74 5b 69 5d 2d 6e  65 74 5f 6f 75 74 5b 69  |out[i]-net_out[i|
00003620  5d 29 29 3b 0a 20 20 20  20 79 20 3d 20 6f 73 79  |]));.    y = osy|
00003630  2d 31 36 2d 32 30 2a 33  32 20 2d 20 67 6f 72 69  |-16-20*32 - gori|
00003640  67 69 6e 79 3b 0a 20 20  20 20 62 62 63 5f 67 63  |giny;.    bbc_gc|
00003650  6f 6c 28 30 2c 20 31 31  29 3b 0a 20 20 20 20 62  |ol(0, 11);.    b|
00003660  62 63 5f 72 65 63 74 61  6e 67 6c 65 66 69 6c 6c  |bc_rectanglefill|
00003670  28 78 2c 20 79 2c 20 31  36 2c 20 6b 29 3b 0a 20  |(x, y, 16, k);. |
00003680  20 20 20 62 62 63 5f 67  63 6f 6c 28 30 2c 20 39  |   bbc_gcol(0, 9|
00003690  29 3b 0a 20 20 20 20 62  62 63 5f 72 65 63 74 61  |);.    bbc_recta|
000036a0  6e 67 6c 65 66 69 6c 6c  28 78 2c 20 79 2b 6b 2c  |nglefill(x, y+k,|
000036b0  20 31 36 2c 20 31 36 30  2d 6b 29 3b 0a 20 20 7d  | 16, 160-k);.  }|
000036c0  0a 7d 0a 0a 2f 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |.}../***********|
000036d0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
000036e0  2a 2a 2a 2a 2a 2a 20 66  65 65 64 66 6f 72 77 61  |****** feedforwa|
000036f0  72 64 20 6e 65 74 77 6f  72 6b 20 66 75 6e 63 74  |rd network funct|
00003700  69 6f 6e 73 20 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |ions ***********|
00003710  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00003720  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2f 0a 0a  |*************/..|
00003730  6e 65 74 77 6f 72 6b 5f  72 65 63 20 2a 61 6c 6c  |network_rec *all|
00003740  6f 63 61 74 65 5f 6e 65  74 77 6f 72 6b 28 6e 65  |ocate_network(ne|
00003750  74 77 6f 72 6b 5f 72 65  63 20 2a 6e 65 74 77 6f  |twork_rec *netwo|
00003760  72 6b 2c 20 66 66 5f 73  65 74 75 70 5f 72 65 63  |rk, ff_setup_rec|
00003770  20 2a 73 65 74 75 70 29  0a 7b 0a 20 20 2f 2a 6e  | *setup).{.  /*n|
00003780  62 20 74 68 65 20 2b 31  20 69 73 20 74 68 65 20  |b the +1 is the |
00003790  74 68 72 65 73 68 6f 6c  64 20 6e 6f 64 65 2a 2f  |threshold node*/|
000037a0  0a 20 20 69 66 20 28 6e  65 74 77 6f 72 6b 2d 3e  |.  if (network->|
000037b0  78 5f 69 6e 70 3d 61 6c  6c 6f 63 61 74 65 5f 76  |x_inp=allocate_v|
000037c0  65 63 74 6f 72 28 73 65  74 75 70 2d 3e 6e 6f 5f  |ector(setup->no_|
000037d0  6f 66 5f 69 6e 70 75 74  73 2b 31 29 2c 20 6e 65  |of_inputs+1), ne|
000037e0  74 77 6f 72 6b 2d 3e 78  5f 69 6e 70 3d 3d 30 29  |twork->x_inp==0)|
000037f0  20 67 6f 74 6f 20 61 6c  6c 6f 63 61 74 65 5f 6e  | goto allocate_n|
00003800  65 74 77 6f 72 6b 5f 33  3b 0a 20 20 69 66 20 28  |etwork_3;.  if (|
00003810  6e 65 74 77 6f 72 6b 2d  3e 79 5f 6f 75 74 3d 61  |network->y_out=a|
00003820  6c 6c 6f 63 61 74 65 5f  76 65 63 74 6f 72 28 73  |llocate_vector(s|
00003830  65 74 75 70 2d 3e 6e 6f  5f 6f 66 5f 6f 75 74 70  |etup->no_of_outp|
00003840  75 74 73 29 2c 20 20 6e  65 74 77 6f 72 6b 2d 3e  |uts),  network->|
00003850  79 5f 6f 75 74 3d 3d 30  29 20 67 6f 74 6f 20 61  |y_out==0) goto a|
00003860  6c 6c 6f 63 61 74 65 5f  6e 65 74 77 6f 72 6b 5f  |llocate_network_|
00003870  32 3b 0a 20 20 69 66 20  28 20 20 20 6e 65 74 77  |2;.  if (   netw|
00003880  6f 72 6b 2d 3e 68 31 3d  61 6c 6c 6f 63 61 74 65  |ork->h1=allocate|
00003890  5f 76 65 63 74 6f 72 28  73 65 74 75 70 2d 3e 6e  |_vector(setup->n|
000038a0  6f 5f 6f 66 5f 68 31 5f  6e 6f 64 65 73 29 2c 20  |o_of_h1_nodes), |
000038b0  20 20 20 6e 65 74 77 6f  72 6b 2d 3e 68 31 3d 3d  |   network->h1==|
000038c0  30 29 20 67 6f 74 6f 20  61 6c 6c 6f 63 61 74 65  |0) goto allocate|
000038d0  5f 6e 65 74 77 6f 72 6b  5f 31 3b 0a 20 20 6e 65  |_network_1;.  ne|
000038e0  74 77 6f 72 6b 2d 3e 61  6c 6c 6f 63 61 74 65 64  |twork->allocated|
000038f0  20 3d 20 54 52 55 45 3b  0a 20 20 6e 65 74 77 6f  | = TRUE;.  netwo|
00003900  72 6b 2d 3e 73 69 20 3d  20 73 65 74 75 70 2d 3e  |rk->si = setup->|
00003910  6e 6f 5f 6f 66 5f 69 6e  70 75 74 73 2b 31 3b 0a  |no_of_inputs+1;.|
00003920  20 20 6e 65 74 77 6f 72  6b 2d 3e 73 6f 20 3d 20  |  network->so = |
00003930  73 65 74 75 70 2d 3e 6e  6f 5f 6f 66 5f 6f 75 74  |setup->no_of_out|
00003940  70 75 74 73 3b 0a 20 20  6e 65 74 77 6f 72 6b 2d  |puts;.  network-|
00003950  3e 73 68 20 3d 20 73 65  74 75 70 2d 3e 6e 6f 5f  |>sh = setup->no_|
00003960  6f 66 5f 68 31 5f 6e 6f  64 65 73 3b 0a 20 20 72  |of_h1_nodes;.  r|
00003970  65 74 75 72 6e 20 6e 65  74 77 6f 72 6b 3b 0a 20  |eturn network;. |
00003980  20 61 6c 6c 6f 63 61 74  65 5f 6e 65 74 77 6f 72  | allocate_networ|
00003990  6b 5f 31 3a 0a 20 20 66  72 65 65 5f 76 65 63 74  |k_1:.  free_vect|
000039a0  6f 72 28 6e 65 74 77 6f  72 6b 2d 3e 79 5f 6f 75  |or(network->y_ou|
000039b0  74 29 3b 0a 20 20 61 6c  6c 6f 63 61 74 65 5f 6e  |t);.  allocate_n|
000039c0  65 74 77 6f 72 6b 5f 32  3a 0a 20 20 66 72 65 65  |etwork_2:.  free|
000039d0  5f 76 65 63 74 6f 72 28  6e 65 74 77 6f 72 6b 2d  |_vector(network-|
000039e0  3e 78 5f 69 6e 70 29 3b  0a 20 20 61 6c 6c 6f 63  |>x_inp);.  alloc|
000039f0  61 74 65 5f 6e 65 74 77  6f 72 6b 5f 33 3a 0a 20  |ate_network_3:. |
00003a00  20 72 65 74 75 72 6e 20  30 3b 0a 7d 0a 0a 76 6f  | return 0;.}..vo|
00003a10  69 64 20 66 72 65 65 5f  6e 65 74 77 6f 72 6b 28  |id free_network(|
00003a20  6e 65 74 77 6f 72 6b 5f  72 65 63 20 2a 6e 65 74  |network_rec *net|
00003a30  77 6f 72 6b 29 0a 7b 0a  20 20 69 66 20 28 6e 65  |work).{.  if (ne|
00003a40  74 77 6f 72 6b 2d 3e 61  6c 6c 6f 63 61 74 65 64  |twork->allocated|
00003a50  29 20 7b 0a 20 20 20 20  66 72 65 65 5f 76 65 63  |) {.    free_vec|
00003a60  74 6f 72 28 6e 65 74 77  6f 72 6b 2d 3e 68 31 29  |tor(network->h1)|
00003a70  3b 0a 20 20 20 20 66 72  65 65 5f 76 65 63 74 6f  |;.    free_vecto|
00003a80  72 28 6e 65 74 77 6f 72  6b 2d 3e 79 5f 6f 75 74  |r(network->y_out|
00003a90  29 3b 0a 20 20 20 20 66  72 65 65 5f 76 65 63 74  |);.    free_vect|
00003aa0  6f 72 28 6e 65 74 77 6f  72 6b 2d 3e 78 5f 69 6e  |or(network->x_in|
00003ab0  70 29 3b 0a 20 20 20 20  6e 65 74 77 6f 72 6b 2d  |p);.    network-|
00003ac0  3e 73 69 20 3d 20 6e 65  74 77 6f 72 6b 2d 3e 73  |>si = network->s|
00003ad0  6f 20 3d 20 6e 65 74 77  6f 72 6b 2d 3e 73 68 20  |o = network->sh |
00003ae0  3d 20 30 3b 0a 20 20 7d  0a 20 20 6e 65 74 77 6f  |= 0;.  }.  netwo|
00003af0  72 6b 2d 3e 61 6c 6c 6f  63 61 74 65 64 20 3d 20  |rk->allocated = |
00003b00  46 41 4c 53 45 3b 0a 7d  0a 0a 42 4f 4f 4c 20 65  |FALSE;.}..BOOL e|
00003b10  6e 73 75 72 65 5f 6e 65  74 77 6f 72 6b 5f 65 78  |nsure_network_ex|
00003b20  69 73 74 73 28 6e 65 74  77 6f 72 6b 5f 72 65 63  |ists(network_rec|
00003b30  20 2a 6e 65 74 2c 20 66  66 5f 73 65 74 75 70 5f  | *net, ff_setup_|
00003b40  72 65 63 20 2a 73 65 74  75 70 29 0a 7b 0a 20 20  |rec *setup).{.  |
00003b50  69 66 20 28 6e 65 74 2d  3e 61 6c 6c 6f 63 61 74  |if (net->allocat|
00003b60  65 64 3d 3d 46 41 4c 53  45 29 20 7b 0a 20 20 20  |ed==FALSE) {.   |
00003b70  20 69 66 20 28 61 6c 6c  6f 63 61 74 65 5f 6e 65  | if (allocate_ne|
00003b80  74 77 6f 72 6b 28 6e 65  74 2c 20 73 65 74 75 70  |twork(net, setup|
00003b90  29 3d 3d 30 29 20 72 65  74 75 72 6e 20 46 41 4c  |)==0) return FAL|
00003ba0  53 45 3b 0a 20 20 7d 0a  20 20 65 6c 73 65 0a 20  |SE;.  }.  else. |
00003bb0  20 20 20 69 66 20 28 6e  65 74 2d 3e 73 69 21 3d  |   if (net->si!=|
00003bc0  73 65 74 75 70 2d 3e 6e  6f 5f 6f 66 5f 69 6e 70  |setup->no_of_inp|
00003bd0  75 74 73 2b 31 20 7c 7c  20 6e 65 74 2d 3e 73 6f  |uts+1 || net->so|
00003be0  21 3d 73 65 74 75 70 2d  3e 6e 6f 5f 6f 66 5f 6f  |!=setup->no_of_o|
00003bf0  75 74 70 75 74 73 20 7c  7c 20 6e 65 74 2d 3e 73  |utputs || net->s|
00003c00  68 21 3d 73 65 74 75 70  2d 3e 6e 6f 5f 6f 66 5f  |h!=setup->no_of_|
00003c10  68 31 5f 6e 6f 64 65 73  29 20 7b 0a 20 20 20 20  |h1_nodes) {.    |
00003c20  20 20 66 72 65 65 5f 6e  65 74 77 6f 72 6b 28 6e  |  free_network(n|
00003c30  65 74 29 3b 0a 20 20 20  20 20 20 69 66 20 28 61  |et);.      if (a|
00003c40  6c 6c 6f 63 61 74 65 5f  6e 65 74 77 6f 72 6b 28  |llocate_network(|
00003c50  6e 65 74 2c 20 73 65 74  75 70 29 3d 3d 30 29 20  |net, setup)==0) |
00003c60  72 65 74 75 72 6e 20 46  41 4c 53 45 3b 0a 20 20  |return FALSE;.  |
00003c70  20 20 7d 0a 20 20 72 65  74 75 72 6e 20 54 52 55  |  }.  return TRU|
00003c80  45 3b 0a 7d 0a 0a 75 6e  69 74 20 66 66 5f 65 72  |E;.}..unit ff_er|
00003c90  72 6f 72 28 76 65 63 74  6f 72 20 64 65 73 69 72  |ror(vector desir|
00003ca0  65 64 2c 20 76 65 63 74  6f 72 20 6e 65 74 5f 6f  |ed, vector net_o|
00003cb0  75 74 2c 20 66 66 5f 73  65 74 75 70 5f 72 65 63  |ut, ff_setup_rec|
00003cc0  20 2a 73 65 74 75 70 29  0a 7b 0a 20 20 69 6e 74  | *setup).{.  int|
00003cd0  20 69 3b 0a 20 20 75 6e  69 74 20 73 75 6d 3d 30  | i;.  unit sum=0|
00003ce0  3b 0a 20 20 66 6f 72 20  28 69 3d 31 3b 20 69 3c  |;.  for (i=1; i<|
00003cf0  3d 73 65 74 75 70 2d 3e  6e 6f 5f 6f 66 5f 6f 75  |=setup->no_of_ou|
00003d00  74 70 75 74 73 3b 20 69  2b 2b 29 20 73 75 6d 20  |tputs; i++) sum |
00003d10  2b 3d 20 6d 75 6c 5f 66  72 61 63 31 36 28 20 64  |+= mul_frac16( d|
00003d20  65 73 69 72 65 64 5b 69  5d 2d 6e 65 74 5f 6f 75  |esired[i]-net_ou|
00003d30  74 5b 69 5d 2c 20 64 65  73 69 72 65 64 5b 69 5d  |t[i], desired[i]|
00003d40  2d 6e 65 74 5f 6f 75 74  5b 69 5d 20 29 3b 0a 20  |-net_out[i] );. |
00003d50  20 72 65 74 75 72 6e 20  28 73 75 6d 2b 31 29 2f  | return (sum+1)/|
00003d60  32 3b 0a 7d 0a 0a 42 4f  4f 4c 20 66 65 65 64 66  |2;.}..BOOL feedf|
00003d70  6f 72 77 61 72 64 28 6e  65 74 77 6f 72 6b 5f 72  |orward(network_r|
00003d80  65 63 20 2a 6e 2c 20 77  65 69 67 68 74 73 5f 72  |ec *n, weights_r|
00003d90  65 63 20 2a 77 2c 20 66  66 5f 73 65 74 75 70 5f  |ec *w, ff_setup_|
00003da0  72 65 63 20 2a 73 29 0a  7b 0a 20 20 69 6e 74 20  |rec *s).{.  int |
00003db0  69 2c 20 6a 3b 0a 20 20  75 6e 69 74 20 77 78 3d  |i, j;.  unit wx=|
00003dc0  30 3b 0a 20 20 75 6e 69  74 20 77 68 31 3d 30 3b  |0;.  unit wh1=0;|
00003dd0  0a 20 20 69 66 20 28 21  6e 2d 3e 61 6c 6c 6f 63  |.  if (!n->alloc|
00003de0  61 74 65 64 29 20 7b 0a  20 20 20 20 77 65 72 72  |ated) {.    werr|
00003df0  28 77 65 72 72 74 65 72  6d 2c 20 22 66 65 65 64  |(werrterm, "feed|
00003e00  66 6f 72 77 61 72 64 3a  20 6e 65 74 77 6f 72 6b  |forward: network|
00003e10  20 6e 6f 74 20 61 6c 6c  6f 63 61 74 65 64 22 29  | not allocated")|
00003e20  3b 0a 20 20 20 20 72 65  74 75 72 6e 20 46 41 4c  |;.    return FAL|
00003e30  53 45 3b 0a 20 20 7d 0a  20 20 69 66 20 28 21 77  |SE;.  }.  if (!w|
00003e40  2d 3e 61 6c 6c 6f 63 61  74 65 64 29 20 7b 0a 20  |->allocated) {. |
00003e50  20 20 20 77 65 72 72 28  77 65 72 72 74 65 72 6d  |   werr(werrterm|
00003e60  2c 20 22 66 65 65 64 66  6f 72 77 61 72 64 3a 20  |, "feedforward: |
00003e70  77 65 69 67 68 74 73 20  6e 6f 74 20 61 6c 6c 6f  |weights not allo|
00003e80  63 61 74 65 64 22 29 3b  0a 20 20 20 20 72 65 74  |cated");.    ret|
00003e90  75 72 6e 20 46 41 4c 53  45 3b 0a 20 20 7d 0a 20  |urn FALSE;.  }. |
00003ea0  20 6e 2d 3e 78 5f 69 6e  70 5b 73 2d 3e 6e 6f 5f  | n->x_inp[s->no_|
00003eb0  6f 66 5f 69 6e 70 75 74  73 2b 31 5d 20 3d 20 6f  |of_inputs+1] = o|
00003ec0  6e 65 3b 09 2f 2a 74 68  72 65 73 68 6f 6c 64 20  |ne;./*threshold |
00003ed0  6e 6f 64 65 2a 2f 0a 20  20 66 6f 72 20 28 69 3d  |node*/.  for (i=|
00003ee0  31 3b 20 69 3c 3d 73 2d  3e 6e 6f 5f 6f 66 5f 68  |1; i<=s->no_of_h|
00003ef0  31 5f 6e 6f 64 65 73 3b  20 69 2b 2b 29 20 7b 0a  |1_nodes; i++) {.|
00003f00  20 20 20 20 66 6f 72 20  28 77 78 3d 30 2c 20 6a  |    for (wx=0, j|
00003f10  3d 31 3b 20 6a 3c 3d 73  2d 3e 6e 6f 5f 6f 66 5f  |=1; j<=s->no_of_|
00003f20  69 6e 70 75 74 73 2b 31  3b 20 6a 2b 2b 29 20 77  |inputs+1; j++) w|
00003f30  78 20 2b 3d 20 6d 75 6c  5f 66 72 61 63 31 36 63  |x += mul_frac16c|
00003f40  28 6e 2d 3e 78 5f 69 6e  70 5b 6a 5d 2c 20 77 2d  |(n->x_inp[j], w-|
00003f50  3e 77 69 5b 6a 5d 5b 69  5d 29 3b 0a 20 20 20 20  |>wi[j][i]);.    |
00003f60  6e 2d 3e 68 31 5b 69 5d  20 3d 20 73 69 67 31 36  |n->h1[i] = sig16|
00003f70  28 77 78 29 3b 0a 20 20  7d 0a 20 20 66 6f 72 20  |(wx);.  }.  for |
00003f80  28 69 3d 31 3b 20 69 3c  3d 73 2d 3e 6e 6f 5f 6f  |(i=1; i<=s->no_o|
00003f90  66 5f 6f 75 74 70 75 74  73 3b 20 69 2b 2b 29 20  |f_outputs; i++) |
00003fa0  7b 0a 20 20 20 20 66 6f  72 20 28 77 68 31 3d 30  |{.    for (wh1=0|
00003fb0  2c 20 6a 3d 31 3b 20 6a  3c 3d 73 2d 3e 6e 6f 5f  |, j=1; j<=s->no_|
00003fc0  6f 66 5f 68 31 5f 6e 6f  64 65 73 3b 20 6a 2b 2b  |of_h1_nodes; j++|
00003fd0  29 20 77 68 31 20 2b 3d  20 6d 75 6c 5f 66 72 61  |) wh1 += mul_fra|
00003fe0  63 31 36 63 28 6e 2d 3e  68 31 5b 6a 5d 2c 20 77  |c16c(n->h1[j], w|
00003ff0  2d 3e 77 6f 5b 6a 5d 5b  69 5d 29 3b 0a 20 20 20  |->wo[j][i]);.   |
00004000  20 6e 2d 3e 79 5f 6f 75  74 5b 69 5d 20 3d 20 73  | n->y_out[i] = s|
00004010  2d 3e 73 69 67 6d 6f 69  64 5f 6f 75 74 20 3f 20  |->sigmoid_out ? |
00004020  73 69 67 31 36 28 77 68  31 29 20 3a 20 77 68 31  |sig16(wh1) : wh1|
00004030  3b 0a 20 20 7d 0a 20 20  72 65 74 75 72 6e 20 54  |;.  }.  return T|
00004040  52 55 45 3b 0a 7d 0a 0a  42 4f 4f 4c 20 62 61 63  |RUE;.}..BOOL bac|
00004050  6b 70 72 6f 70 61 67 61  74 69 6f 6e 28 6e 65 74  |kpropagation(net|
00004060  77 6f 72 6b 5f 72 65 63  20 2a 6e 65 74 2c 20 76  |work_rec *net, v|
00004070  65 63 74 6f 72 20 64 65  73 69 72 65 64 5f 6f 75  |ector desired_ou|
00004080  74 2c 20 77 65 69 67 68  74 73 5f 72 65 63 20 2a  |t, weights_rec *|
00004090  77 74 73 2c 0a 09 09 20  20 20 20 20 77 65 69 67  |wts,...     weig|
000040a0  68 74 73 5f 72 65 63 20  2a 6d 6f 6d 65 6e 74 75  |hts_rec *momentu|
000040b0  6d 2c 20 66 66 5f 73 65  74 75 70 5f 72 65 63 20  |m, ff_setup_rec |
000040c0  2a 73 65 74 75 70 09 09  20 20 20 20 20 29 0a 7b  |*setup..     ).{|
000040d0  0a 20 20 69 6e 74 20 69  2c 20 6a 2c 20 6b 3b 0a  |.  int i, j, k;.|
000040e0  20 20 42 4f 4f 4c 20 72  65 74 63 6f 64 65 3d 46  |  BOOL retcode=F|
000040f0  41 4c 53 45 3b 0a 20 20  75 6e 69 74 20 73 75 6d  |ALSE;.  unit sum|
00004100  3d 30 2c 20 74 65 72 6d  3d 30 2c 20 77 74 5f 63  |=0, term=0, wt_c|
00004110  68 61 6e 67 65 3d 30 3b  0a 20 20 76 65 63 74 6f  |hange=0;.  vecto|
00004120  72 20 69 5f 64 65 6c 74  61 3d 4e 55 4c 4c 2c 20  |r i_delta=NULL, |
00004130  6f 5f 64 65 6c 74 61 3d  4e 55 4c 4c 3b 0a 20 20  |o_delta=NULL;.  |
00004140  75 6e 69 74 20 6c 72 6f  6d 61 20 3d 20 6d 75 6c  |unit lroma = mul|
00004150  5f 66 72 61 63 31 36 28  73 65 74 75 70 2d 3e 6c  |_frac16(setup->l|
00004160  65 61 72 6e 69 6e 67 5f  72 61 74 65 2c 20 6f 6e  |earning_rate, on|
00004170  65 2d 73 65 74 75 70 2d  3e 61 6c 70 68 61 29 3b  |e-setup->alpha);|
00004180  0a 20 20 69 66 20 28 69  5f 64 65 6c 74 61 3d 61  |.  if (i_delta=a|
00004190  6c 6c 6f 63 61 74 65 5f  76 65 63 74 6f 72 28 73  |llocate_vector(s|
000041a0  65 74 75 70 2d 3e 6e 6f  5f 6f 66 5f 68 31 5f 6e  |etup->no_of_h1_n|
000041b0  6f 64 65 73 29 2c 20 69  5f 64 65 6c 74 61 3d 3d  |odes), i_delta==|
000041c0  30 29 20 67 6f 74 6f 20  62 61 63 6b 70 72 6f 70  |0) goto backprop|
000041d0  61 67 61 74 69 6f 6e 5f  32 3b 0a 20 20 69 66 20  |agation_2;.  if |
000041e0  28 6f 5f 64 65 6c 74 61  3d 61 6c 6c 6f 63 61 74  |(o_delta=allocat|
000041f0  65 5f 76 65 63 74 6f 72  28 73 65 74 75 70 2d 3e  |e_vector(setup->|
00004200  6e 6f 5f 6f 66 5f 6f 75  74 70 75 74 73 29 2c 20  |no_of_outputs), |
00004210  20 6f 5f 64 65 6c 74 61  3d 3d 30 29 20 67 6f 74  | o_delta==0) got|
00004220  6f 20 62 61 63 6b 70 72  6f 70 61 67 61 74 69 6f  |o backpropagatio|
00004230  6e 5f 31 3b 0a 20 20 66  6f 72 20 28 6b 3d 31 3b  |n_1;.  for (k=1;|
00004240  20 6b 3c 3d 73 65 74 75  70 2d 3e 6e 6f 5f 6f 66  | k<=setup->no_of|
00004250  5f 6f 75 74 70 75 74 73  3b 20 6b 2b 2b 29 20 6f  |_outputs; k++) o|
00004260  5f 64 65 6c 74 61 5b 6b  5d 20 3d 20 64 65 73 69  |_delta[k] = desi|
00004270  72 65 64 5f 6f 75 74 5b  6b 5d 20 2d 20 6e 65 74  |red_out[k] - net|
00004280  2d 3e 79 5f 6f 75 74 5b  6b 5d 3b 0a 20 20 2f 2a  |->y_out[k];.  /*|
00004290  61 64 6a 75 73 74 20 69  6e 70 75 74 20 77 65 69  |adjust input wei|
000042a0  67 68 74 73 2a 2f 0a 20  20 66 6f 72 20 28 6a 3d  |ghts*/.  for (j=|
000042b0  31 3b 20 6a 3c 3d 73 65  74 75 70 2d 3e 6e 6f 5f  |1; j<=setup->no_|
000042c0  6f 66 5f 68 31 5f 6e 6f  64 65 73 3b 20 6a 2b 2b  |of_h1_nodes; j++|
000042d0  29 20 7b 0a 20 20 20 20  66 6f 72 20 28 73 75 6d  |) {.    for (sum|
000042e0  3d 30 2c 20 6b 3d 31 3b  20 6b 3c 3d 73 65 74 75  |=0, k=1; k<=setu|
000042f0  70 2d 3e 6e 6f 5f 6f 66  5f 6f 75 74 70 75 74 73  |p->no_of_outputs|
00004300  3b 20 6b 2b 2b 29 20 7b  0a 20 20 20 20 20 20 74  |; k++) {.      t|
00004310  65 72 6d 20 3d 20 6d 75  6c 5f 66 72 61 63 31 36  |erm = mul_frac16|
00004320  63 28 6f 5f 64 65 6c 74  61 5b 6b 5d 2c 20 77 74  |c(o_delta[k], wt|
00004330  73 2d 3e 77 6f 5b 6a 5d  5b 6b 5d 29 3b 0a 20 20  |s->wo[j][k]);.  |
00004340  20 20 20 20 69 66 20 28  73 65 74 75 70 2d 3e 73  |    if (setup->s|
00004350  69 67 6d 6f 69 64 5f 6f  75 74 29 20 74 65 72 6d  |igmoid_out) term|
00004360  20 3d 20 6d 75 6c 5f 66  72 61 63 31 36 28 20 6d  | = mul_frac16( m|
00004370  75 6c 5f 66 72 61 63 31  36 28 6e 65 74 2d 3e 79  |ul_frac16(net->y|
00004380  5f 6f 75 74 5b 6b 5d 2c  20 6f 6e 65 2d 6e 65 74  |_out[k], one-net|
00004390  2d 3e 79 5f 6f 75 74 5b  6b 5d 29 2c 20 74 65 72  |->y_out[k]), ter|
000043a0  6d 20 29 3b 0a 20 20 20  20 20 20 73 75 6d 20 2b  |m );.      sum +|
000043b0  3d 20 74 65 72 6d 3b 0a  20 20 20 20 7d 0a 20 20  |= term;.    }.  |
000043c0  20 20 69 5f 64 65 6c 74  61 5b 6a 5d 20 3d 20 73  |  i_delta[j] = s|
000043d0  75 6d 3b 0a 20 20 7d 0a  20 20 66 6f 72 20 28 69  |um;.  }.  for (i|
000043e0  3d 31 3b 20 69 3c 3d 73  65 74 75 70 2d 3e 6e 6f  |=1; i<=setup->no|
000043f0  5f 6f 66 5f 69 6e 70 75  74 73 2b 31 3b 20 69 2b  |_of_inputs+1; i+|
00004400  2b 29 0a 20 20 20 20 66  6f 72 20 28 6a 3d 31 3b  |+).    for (j=1;|
00004410  20 6a 3c 3d 73 65 74 75  70 2d 3e 6e 6f 5f 6f 66  | j<=setup->no_of|
00004420  5f 68 31 5f 6e 6f 64 65  73 3b 20 6a 2b 2b 29 20  |_h1_nodes; j++) |
00004430  7b 0a 20 20 20 20 20 20  77 74 5f 63 68 61 6e 67  |{.      wt_chang|
00004440  65 20 3d 20 6d 75 6c 5f  66 72 61 63 31 36 28 20  |e = mul_frac16( |
00004450  6d 75 6c 5f 66 72 61 63  31 36 28 20 6d 75 6c 5f  |mul_frac16( mul_|
00004460  66 72 61 63 31 36 28 6e  65 74 2d 3e 68 31 5b 6a  |frac16(net->h1[j|
00004470  5d 2c 20 6f 6e 65 2d 6e  65 74 2d 3e 68 31 5b 6a  |], one-net->h1[j|
00004480  5d 29 2c 20 6e 65 74 2d  3e 78 5f 69 6e 70 5b 69  |]), net->x_inp[i|
00004490  5d 29 2c 20 69 5f 64 65  6c 74 61 5b 6a 5d 20 29  |]), i_delta[j] )|
000044a0  3b 0a 20 20 20 20 20 20  69 66 20 28 21 73 65 74  |;.      if (!set|
000044b0  75 70 2d 3e 73 69 67 6d  6f 69 64 5f 6f 75 74 29  |up->sigmoid_out)|
000044c0  20 77 74 5f 63 68 61 6e  67 65 20 2f 3d 20 31 30  | wt_change /= 10|
000044d0  3b 0a 20 20 20 20 20 20  77 74 73 2d 3e 77 69 5b  |;.      wts->wi[|
000044e0  69 5d 5b 6a 5d 20 2b 3d  20 6d 75 6c 5f 66 72 61  |i][j] += mul_fra|
000044f0  63 31 36 28 6c 72 6f 6d  61 2c 20 77 74 5f 63 68  |c16(lroma, wt_ch|
00004500  61 6e 67 65 29 20 2b 20  6d 75 6c 5f 66 72 61 63  |ange) + mul_frac|
00004510  31 36 28 73 65 74 75 70  2d 3e 61 6c 70 68 61 2c  |16(setup->alpha,|
00004520  20 6d 6f 6d 65 6e 74 75  6d 2d 3e 77 69 5b 69 5d  | momentum->wi[i]|
00004530  5b 6a 5d 29 3b 0a 20 20  20 20 20 20 6d 6f 6d 65  |[j]);.      mome|
00004540  6e 74 75 6d 2d 3e 77 69  5b 69 5d 5b 6a 5d 20 3d  |ntum->wi[i][j] =|
00004550  20 77 74 5f 63 68 61 6e  67 65 3b 0a 20 20 20 20  | wt_change;.    |
00004560  7d 0a 20 20 2f 2a 61 64  6a 75 73 74 20 6f 75 74  |}.  /*adjust out|
00004570  70 75 74 20 77 65 69 67  68 74 73 2a 2f 0a 20 20  |put weights*/.  |
00004580  66 6f 72 20 28 6a 3d 31  3b 20 6a 3c 3d 73 65 74  |for (j=1; j<=set|
00004590  75 70 2d 3e 6e 6f 5f 6f  66 5f 68 31 5f 6e 6f 64  |up->no_of_h1_nod|
000045a0  65 73 3b 20 6a 2b 2b 29  0a 20 20 20 20 66 6f 72  |es; j++).    for|
000045b0  20 28 6b 3d 31 3b 20 6b  3c 3d 73 65 74 75 70 2d  | (k=1; k<=setup-|
000045c0  3e 6e 6f 5f 6f 66 5f 6f  75 74 70 75 74 73 3b 20  |>no_of_outputs; |
000045d0  6b 2b 2b 29 20 7b 0a 20  20 20 20 20 20 77 74 5f  |k++) {.      wt_|
000045e0  63 68 61 6e 67 65 20 3d  20 6d 75 6c 5f 66 72 61  |change = mul_fra|
000045f0  63 31 36 28 6e 65 74 2d  3e 68 31 5b 6a 5d 2c 20  |c16(net->h1[j], |
00004600  6f 5f 64 65 6c 74 61 5b  6b 5d 29 3b 0a 20 20 20  |o_delta[k]);.   |
00004610  20 20 20 69 66 20 28 73  65 74 75 70 2d 3e 73 69  |   if (setup->si|
00004620  67 6d 6f 69 64 5f 6f 75  74 29 20 77 74 5f 63 68  |gmoid_out) wt_ch|
00004630  61 6e 67 65 20 3d 20 6d  75 6c 5f 66 72 61 63 31  |ange = mul_frac1|
00004640  36 28 20 6d 75 6c 5f 66  72 61 63 31 36 28 6e 65  |6( mul_frac16(ne|
00004650  74 2d 3e 79 5f 6f 75 74  5b 6b 5d 2c 20 6f 6e 65  |t->y_out[k], one|
00004660  2d 6e 65 74 2d 3e 79 5f  6f 75 74 5b 6b 5d 29 2c  |-net->y_out[k]),|
00004670  20 77 74 5f 63 68 61 6e  67 65 20 29 3b 0a 20 20  | wt_change );.  |
00004680  20 20 20 20 65 6c 73 65  20 77 74 5f 63 68 61 6e  |    else wt_chan|
00004690  67 65 20 2f 3d 20 31 30  3b 0a 20 20 20 20 20 20  |ge /= 10;.      |
000046a0  77 74 73 2d 3e 77 6f 5b  6a 5d 5b 6b 5d 20 2b 3d  |wts->wo[j][k] +=|
000046b0  20 6d 75 6c 5f 66 72 61  63 31 36 28 6c 72 6f 6d  | mul_frac16(lrom|
000046c0  61 2c 20 77 74 5f 63 68  61 6e 67 65 29 20 2b 20  |a, wt_change) + |
000046d0  6d 75 6c 5f 66 72 61 63  31 36 28 73 65 74 75 70  |mul_frac16(setup|
000046e0  2d 3e 61 6c 70 68 61 2c  20 6d 6f 6d 65 6e 74 75  |->alpha, momentu|
000046f0  6d 2d 3e 77 6f 5b 6a 5d  5b 6b 5d 29 3b 0a 20 20  |m->wo[j][k]);.  |
00004700  20 20 20 20 6d 6f 6d 65  6e 74 75 6d 2d 3e 77 6f  |    momentum->wo|
00004710  5b 6a 5d 5b 6b 5d 20 3d  20 77 74 5f 63 68 61 6e  |[j][k] = wt_chan|
00004720  67 65 3b 0a 20 20 20 20  7d 0a 20 20 72 65 74 63  |ge;.    }.  retc|
00004730  6f 64 65 3d 54 52 55 45  3b 0a 20 20 66 72 65 65  |ode=TRUE;.  free|
00004740  5f 76 65 63 74 6f 72 28  6f 5f 64 65 6c 74 61 29  |_vector(o_delta)|
00004750  3b 0a 20 20 62 61 63 6b  70 72 6f 70 61 67 61 74  |;.  backpropagat|
00004760  69 6f 6e 5f 31 3a 0a 20  20 66 72 65 65 5f 76 65  |ion_1:.  free_ve|
00004770  63 74 6f 72 28 69 5f 64  65 6c 74 61 29 3b 0a 20  |ctor(i_delta);. |
00004780  20 62 61 63 6b 70 72 6f  70 61 67 61 74 69 6f 6e  | backpropagation|
00004790  5f 32 3a 0a 20 20 72 65  74 75 72 6e 20 72 65 74  |_2:.  return ret|
000047a0  63 6f 64 65 3b 0a 7d 0a  0a 42 4f 4f 4c 20 62 61  |code;.}..BOOL ba|
000047b0  63 6b 70 72 6f 70 61 67  61 74 69 6f 6e 5f 74 72  |ckpropagation_tr|
000047c0  61 69 6e 69 6e 67 28 6e  65 74 77 6f 72 6b 5f 72  |aining(network_r|
000047d0  65 63 20 2a 6e 65 74 2c  20 77 65 69 67 68 74 73  |ec *net, weights|
000047e0  5f 72 65 63 20 2a 77 74  73 2c 20 69 6e 74 20 6e  |_rec *wts, int n|
000047f0  6f 5f 6f 66 5f 74 72 61  69 6e 69 6e 67 5f 69 74  |o_of_training_it|
00004800  65 6d 73 2c 0a 09 09 09  20 20 20 20 20 20 67 65  |ems,....      ge|
00004810  74 5f 64 61 74 61 5f 70  72 6f 63 20 67 65 74 5f  |t_data_proc get_|
00004820  6e 65 74 77 6f 72 6b 5f  69 6e 70 75 74 5f 6f 75  |network_input_ou|
00004830  74 70 75 74 2c 20 42 4f  4f 4c 20 76 65 72 62 6f  |tput, BOOL verbo|
00004840  73 65 2c 20 66 66 5f 73  65 74 75 70 5f 72 65 63  |se, ff_setup_rec|
00004850  20 2a 73 65 74 75 70 29  0a 7b 0a 20 20 69 6e 74  | *setup).{.  int|
00004860  20 69 3b 0a 20 20 75 6e  69 74 20 65 72 72 3b 0a  | i;.  unit err;.|
00004870  20 20 77 65 69 67 68 74  73 5f 72 65 63 20 6d 6f  |  weights_rec mo|
00004880  6d 65 6e 74 75 6d 20 3d  20 7b 30 2c 20 4e 55 4c  |mentum = {0, NUL|
00004890  4c 2c 20 4e 55 4c 4c 2c  20 30 2c 20 30 2c 20 30  |L, NULL, 0, 0, 0|
000048a0  7d 3b 0a 20 20 76 65 63  74 6f 72 20 64 5f 6f 75  |};.  vector d_ou|
000048b0  74 20 3d 20 4e 55 4c 4c  3b 0a 20 20 64 69 73 70  |t = NULL;.  disp|
000048c0  6c 61 79 5f 72 65 63 20  64 69 73 70 6c 61 79 20  |lay_rec display |
000048d0  3d 20 7b 30 2c 30 2c 30  2c 30 2c 30 2c 30 2c 30  |= {0,0,0,0,0,0,0|
000048e0  2c 30 7d 3b 0a 20 20 69  66 20 28 21 65 6e 73 75  |,0};.  if (!ensu|
000048f0  72 65 5f 6e 65 74 77 6f  72 6b 5f 65 78 69 73 74  |re_network_exist|
00004900  73 28 6e 65 74 2c 20 73  65 74 75 70 29 29 20 67  |s(net, setup)) g|
00004910  6f 74 6f 20 62 70 74 33  3b 0a 20 20 69 66 20 28  |oto bpt3;.  if (|
00004920  69 6e 69 74 69 61 6c 69  73 65 5f 77 65 69 67 68  |initialise_weigh|
00004930  74 73 28 26 6d 6f 6d 65  6e 74 75 6d 2c 20 46 41  |ts(&momentum, FA|
00004940  4c 53 45 2c 20 73 65 74  75 70 29 3d 3d 30 29 20  |LSE, setup)==0) |
00004950  67 6f 74 6f 20 62 70 74  32 3b 0a 20 20 69 66 20  |goto bpt2;.  if |
00004960  28 64 5f 6f 75 74 3d 61  6c 6c 6f 63 61 74 65 5f  |(d_out=allocate_|
00004970  76 65 63 74 6f 72 28 73  65 74 75 70 2d 3e 6e 6f  |vector(setup->no|
00004980  5f 6f 66 5f 6f 75 74 70  75 74 73 29 2c 20 64 5f  |_of_outputs), d_|
00004990  6f 75 74 3d 3d 30 29 20  67 6f 74 6f 20 62 70 74  |out==0) goto bpt|
000049a0  31 3b 0a 20 20 64 69 73  70 6c 61 79 2e 69 74 65  |1;.  display.ite|
000049b0  72 20 3d 20 73 65 74 75  70 2d 3e 73 74 61 72 74  |r = setup->start|
000049c0  5f 69 74 65 72 3b 0a 20  20 64 69 73 70 6c 61 79  |_iter;.  display|
000049d0  2e 6e 62 72 5f 74 72 5f  69 74 65 6d 73 20 3d 20  |.nbr_tr_items = |
000049e0  6e 6f 5f 6f 66 5f 74 72  61 69 6e 69 6e 67 5f 69  |no_of_training_i|
000049f0  74 65 6d 73 3b 0a 20 20  69 66 20 28 76 65 72 62  |tems;.  if (verb|
00004a00  6f 73 65 29 20 73 65 74  75 70 5f 73 63 72 65 65  |ose) setup_scree|
00004a10  6e 28 26 64 69 73 70 6c  61 79 2c 20 73 65 74 75  |n(&display, setu|
00004a20  70 29 3b 0a 20 20 77 68  69 6c 65 20 28 20 64 69  |p);.  while ( di|
00004a30  73 70 6c 61 79 2e 63 6f  75 6e 74 5f 6d 61 78 3c  |splay.count_max<|
00004a40  31 20 26 26 20 21 6b 62  68 69 74 28 29 20 29 20  |1 && !kbhit() ) |
00004a50  7b 0a 20 20 20 20 64 69  73 70 6c 61 79 2e 72 69  |{.    display.ri|
00004a60  67 68 74 5f 63 6f 75 6e  74 20 3d 20 30 3b 0a 20  |ght_count = 0;. |
00004a70  20 20 20 64 69 73 70 6c  61 79 2e 77 72 6f 6e 67  |   display.wrong|
00004a80  5f 63 6f 75 6e 74 20 3d  20 30 3b 0a 20 20 20 20  |_count = 0;.    |
00004a90  64 69 73 70 6c 61 79 2e  69 74 65 72 2b 2b 3b 0a  |display.iter++;.|
00004aa0  20 20 20 20 66 6f 72 20  28 69 3d 31 3b 20 69 3c  |    for (i=1; i<|
00004ab0  3d 6e 6f 5f 6f 66 5f 74  72 61 69 6e 69 6e 67 5f  |=no_of_training_|
00004ac0  69 74 65 6d 73 3b 20 69  2b 2b 29 20 7b 0a 20 20  |items; i++) {.  |
00004ad0  20 20 20 20 67 65 74 5f  6e 65 74 77 6f 72 6b 5f  |    get_network_|
00004ae0  69 6e 70 75 74 5f 6f 75  74 70 75 74 28 6e 65 74  |input_output(net|
00004af0  2d 3e 78 5f 69 6e 70 2c  20 64 5f 6f 75 74 2c 20  |->x_inp, d_out, |
00004b00  73 65 74 75 70 29 3b 0a  20 20 20 20 20 20 66 65  |setup);.      fe|
00004b10  65 64 66 6f 72 77 61 72  64 28 6e 65 74 2c 20 77  |edforward(net, w|
00004b20  74 73 2c 20 73 65 74 75  70 29 3b 0a 20 20 20 20  |ts, setup);.    |
00004b30  20 20 65 72 72 20 3d 20  66 66 5f 65 72 72 6f 72  |  err = ff_error|
00004b40  28 64 5f 6f 75 74 2c 20  6e 65 74 2d 3e 79 5f 6f  |(d_out, net->y_o|
00004b50  75 74 2c 20 73 65 74 75  70 29 3b 0a 20 20 20 20  |ut, setup);.    |
00004b60  20 20 69 66 20 28 65 72  72 20 3e 20 73 65 74 75  |  if (err > setu|
00004b70  70 2d 3e 65 72 72 6f 72  5f 74 68 72 65 73 68 6f  |p->error_thresho|
00004b80  6c 64 29 20 7b 0a 20 20  20 20 20 20 20 20 64 69  |ld) {.        di|
00004b90  73 70 6c 61 79 2e 77 72  6f 6e 67 5f 63 6f 75 6e  |splay.wrong_coun|
00004ba0  74 2b 2b 3b 0a 20 20 20  20 20 20 20 20 62 61 63  |t++;.        bac|
00004bb0  6b 70 72 6f 70 61 67 61  74 69 6f 6e 28 6e 65 74  |kpropagation(net|
00004bc0  2c 20 64 5f 6f 75 74 2c  20 77 74 73 2c 20 26 6d  |, d_out, wts, &m|
00004bd0  6f 6d 65 6e 74 75 6d 2c  20 73 65 74 75 70 29 3b  |omentum, setup);|
00004be0  0a 20 20 20 20 20 20 7d  0a 20 20 20 20 20 20 65  |.      }.      e|
00004bf0  6c 73 65 20 64 69 73 70  6c 61 79 2e 72 69 67 68  |lse display.righ|
00004c00  74 5f 63 6f 75 6e 74 2b  2b 3b 0a 20 20 20 20 20  |t_count++;.     |
00004c10  20 69 66 20 28 76 65 72  62 6f 73 65 20 26 26 20  | if (verbose && |
00004c20  28 69 26 33 31 29 3d 3d  30 29 20 64 69 73 70 6c  |(i&31)==0) displ|
00004c30  61 79 5f 72 65 73 75 6c  74 73 28 26 64 69 73 70  |ay_results(&disp|
00004c40  6c 61 79 2c 20 64 5f 6f  75 74 2c 20 6e 65 74 2d  |lay, d_out, net-|
00004c50  3e 79 5f 6f 75 74 2c 20  73 65 74 75 70 29 3b 0a  |>y_out, setup);.|
00004c60  20 20 20 20 7d 0a 20 20  20 20 69 66 20 28 64 69  |    }.    if (di|
00004c70  73 70 6c 61 79 2e 72 69  67 68 74 5f 63 6f 75 6e  |splay.right_coun|
00004c80  74 20 3e 20 64 69 73 70  6c 61 79 2e 68 69 67 68  |t > display.high|
00004c90  5f 77 61 74 65 72 29 20  64 69 73 70 6c 61 79 2e  |_water) display.|
00004ca0  68 69 67 68 5f 77 61 74  65 72 20 3d 20 64 69 73  |high_water = dis|
00004cb0  70 6c 61 79 2e 72 69 67  68 74 5f 63 6f 75 6e 74  |play.right_count|
00004cc0  3b 0a 20 20 20 20 69 66  20 28 64 69 73 70 6c 61  |;.    if (displa|
00004cd0  79 2e 72 69 67 68 74 5f  63 6f 75 6e 74 20 3e 3d  |y.right_count >=|
00004ce0  6e 6f 5f 6f 66 5f 74 72  61 69 6e 69 6e 67 5f 69  |no_of_training_i|
00004cf0  74 65 6d 73 29 20 64 69  73 70 6c 61 79 2e 63 6f  |tems) display.co|
00004d00  75 6e 74 5f 6d 61 78 2b  2b 3b 0a 20 20 20 20 65  |unt_max++;.    e|
00004d10  6c 73 65 20 64 69 73 70  6c 61 79 2e 63 6f 75 6e  |lse display.coun|
00004d20  74 5f 6d 61 78 3d 30 3b  0a 20 20 20 20 64 69 73  |t_max=0;.    dis|
00004d30  70 6c 61 79 2e 6c 61 73  74 5f 72 69 67 68 74 20  |play.last_right |
00004d40  3d 20 64 69 73 70 6c 61  79 2e 72 69 67 68 74 5f  |= display.right_|
00004d50  63 6f 75 6e 74 3b 0a 20  20 20 20 64 69 73 70 6c  |count;.    displ|
00004d60  61 79 2e 6c 61 73 74 5f  77 72 6f 6e 67 20 3d 20  |ay.last_wrong = |
00004d70  64 69 73 70 6c 61 79 2e  77 72 6f 6e 67 5f 63 6f  |display.wrong_co|
00004d80  75 6e 74 3b 0a 20 20 7d  0a 20 20 73 65 74 75 70  |unt;.  }.  setup|
00004d90  2d 3e 73 74 61 72 74 5f  69 74 65 72 20 3d 20 64  |->start_iter = d|
00004da0  69 73 70 6c 61 79 2e 69  74 65 72 3b 0a 20 20 69  |isplay.iter;.  i|
00004db0  66 20 28 64 69 73 70 6c  61 79 2e 63 6f 75 6e 74  |f (display.count|
00004dc0  5f 6d 61 78 3d 3d 31 29  20 62 62 63 5f 76 64 75  |_max==1) bbc_vdu|
00004dd0  28 37 29 3b 0a 20 20 65  6c 73 65 20 67 5f 75 73  |(7);.  else g_us|
00004de0  65 72 5f 74 65 72 6d 69  6e 61 74 65 64 5f 6c 65  |er_terminated_le|
00004df0  61 72 6e 69 6e 67 20 3d  20 54 52 55 45 3b 0a 20  |arning = TRUE;. |
00004e00  20 69 66 20 28 76 65 72  62 6f 73 65 29 20 7b 0a  | if (verbose) {.|
00004e10  20 20 20 20 62 62 63 5f  63 6c 73 28 29 3b 0a 20  |    bbc_cls();. |
00004e20  20 20 20 62 62 63 5f 74  61 62 28 32 31 2c 34 3c  |   bbc_tab(21,4<|
00004e30  3c 28 32 2d 6c 79 29 29  3b 20 20 70 72 69 6e 74  |<(2-ly));  print|
00004e40  66 28 22 54 6f 74 61 6c  20 6e 75 6d 62 65 72 20  |f("Total number |
00004e50  6f 66 20 69 74 65 72 61  74 69 6f 6e 73 20 75 73  |of iterations us|
00004e60  65 64 3a 20 25 69 22 2c  20 64 69 73 70 6c 61 79  |ed: %i", display|
00004e70  2e 69 74 65 72 29 3b 0a  20 20 20 20 62 62 63 5f  |.iter);.    bbc_|
00004e80  74 61 62 28 32 31 2c 36  3c 3c 28 32 2d 6c 79 29  |tab(21,6<<(2-ly)|
00004e90  29 3b 20 20 70 72 69 6e  74 66 28 22 20 20 48 69  |);  printf("  Hi|
00004ea0  67 68 20 77 61 74 65 72  20 6d 61 72 6b 3a 20 25  |gh water mark: %|
00004eb0  33 69 20 6f 75 74 20 6f  66 20 25 33 69 2e 22 2c  |3i out of %3i.",|
00004ec0  20 64 69 73 70 6c 61 79  2e 68 69 67 68 5f 77 61  | display.high_wa|
00004ed0  74 65 72 2c 20 6e 6f 5f  6f 66 5f 74 72 61 69 6e  |ter, no_of_train|
00004ee0  69 6e 67 5f 69 74 65 6d  73 29 3b 0a 20 20 20 20  |ing_items);.    |
00004ef0  62 62 63 5f 74 61 62 28  32 32 2c 31 37 3c 3c 28  |bbc_tab(22,17<<(|
00004f00  32 2d 6c 79 29 29 3b 20  70 72 69 6e 74 66 28 22  |2-ly)); printf("|
00004f10  48 69 74 20 3c 53 70 61  63 65 3e 20 74 6f 20 72  |Hit <Space> to r|
00004f20  65 74 75 72 6e 20 74 6f  20 44 65 73 6b 74 6f 70  |eturn to Desktop|
00004f30  2e 22 29 3b 0a 20 20 20  20 72 65 6c 65 61 73 65  |.");.    release|
00004f40  28 2d 39 39 29 3b 0a 20  20 20 20 70 72 65 73 73  |(-99);.    press|
00004f50  28 2d 39 39 29 3b 0a 20  20 20 20 72 65 6c 65 61  |(-99);.    relea|
00004f60  73 65 28 2d 39 39 29 3b  0a 20 20 20 20 62 62 63  |se(-99);.    bbc|
00004f70  5f 63 6c 73 28 29 3b 0a  20 20 7d 0a 20 20 66 72  |_cls();.  }.  fr|
00004f80  65 65 5f 76 65 63 74 6f  72 28 64 5f 6f 75 74 29  |ee_vector(d_out)|
00004f90  3b 0a 20 20 66 72 65 65  5f 6e 65 74 77 6f 72 6b  |;.  free_network|
00004fa0  5f 77 65 69 67 68 74 73  28 26 6d 6f 6d 65 6e 74  |_weights(&moment|
00004fb0  75 6d 29 3b 0a 20 20 72  65 74 75 72 6e 20 54 52  |um);.  return TR|
00004fc0  55 45 3b 0a 20 20 62 70  74 31 3a 0a 20 20 66 72  |UE;.  bpt1:.  fr|
00004fd0  65 65 5f 6e 65 74 77 6f  72 6b 5f 77 65 69 67 68  |ee_network_weigh|
00004fe0  74 73 28 26 6d 6f 6d 65  6e 74 75 6d 29 3b 0a 20  |ts(&momentum);. |
00004ff0  20 62 70 74 32 3a 0a 20  20 66 72 65 65 5f 6e 65  | bpt2:.  free_ne|
00005000  74 77 6f 72 6b 28 6e 65  74 29 3b 0a 20 20 62 70  |twork(net);.  bp|
00005010  74 33 3a 0a 20 20 72 65  74 75 72 6e 20 46 41 4c  |t3:.  return FAL|
00005020  53 45 3b 0a 7d 0a 0a 2f  2a 2a 2a 2a 2a 2a 2a 2a  |SE;.}../********|
00005030  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00005040  2a 2a 2a 2a 20 62 72 6f  6c 6c 79 20 63 6f 6e 74  |**** brolly cont|
00005050  72 6f 6c 6c 65 72 20 73  70 65 63 69 66 69 63 20  |roller specific |
00005060  6e 65 74 20 66 75 6e 63  74 69 6f 6e 73 20 2a 2a  |net functions **|
00005070  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00005090  2a 2f 0a 0a 23 64 65 66  69 6e 65 20 58 5f 50 4f  |*/..#define X_PO|
000050a0  53 5f 49 4e 44 45 58 20  31 0a 23 64 65 66 69 6e  |S_INDEX 1.#defin|
000050b0  65 20 58 5f 44 4f 54 5f  49 4e 44 45 58 20 32 0a  |e X_DOT_INDEX 2.|
000050c0  23 64 65 66 69 6e 65 20  54 48 45 54 41 5f 49 4e  |#define THETA_IN|
000050d0  44 45 58 20 33 0a 23 64  65 66 69 6e 65 20 54 48  |DEX 3.#define TH|
000050e0  45 54 41 5f 44 4f 54 5f  49 4e 44 45 58 20 34 0a  |ETA_DOT_INDEX 4.|
000050f0  23 64 65 66 69 6e 65 20  46 4f 52 43 45 5f 49 4e  |#define FORCE_IN|
00005100  44 45 58 20 35 0a 23 64  65 66 69 6e 65 20 4d 41  |DEX 5.#define MA|
00005110  58 5f 46 4f 52 43 45 20  28 31 30 2a 6f 6e 65 29  |X_FORCE (10*one)|
00005120  0a 0a 74 79 70 65 64 65  66 20 73 74 72 75 63 74  |..typedef struct|
00005130  20 7b 0a 20 20 75 6e 69  74 20 78 5f 70 6f 73 2c  | {.  unit x_pos,|
00005140  0a 20 20 20 20 20 20 20  78 5f 64 6f 74 2c 0a 20  |.       x_dot,. |
00005150  20 20 20 20 20 20 74 68  65 74 61 2c 0a 20 20 20  |      theta,.   |
00005160  20 20 20 20 74 68 65 74  61 5f 64 6f 74 3b 0a 7d  |    theta_dot;.}|
00005170  20 73 74 61 74 65 5f 72  65 63 3b 0a 0a 74 79 70  | state_rec;..typ|
00005180  65 64 65 66 20 73 74 72  75 63 74 20 7b 0a 20 20  |edef struct {.  |
00005190  75 6e 69 74 20 72 61 6e  64 5f 66 6f 72 63 65 2c  |unit rand_force,|
000051a0  0a 20 20 20 20 20 20 20  73 79 73 74 65 6d 5f 66  |.       system_f|
000051b0  6f 72 63 65 5f 69 6e 63  72 2c 0a 20 20 20 20 20  |orce_incr,.     |
000051c0  20 20 75 73 65 72 5f 66  6f 72 63 65 5f 69 6e 63  |  user_force_inc|
000051d0  72 2c 0a 20 20 20 20 20  20 20 7a 65 72 6f 5f 74  |r,.       zero_t|
000051e0  68 65 74 61 3b 0a 7d 20  74 62 72 6d 5f 73 65 74  |heta;.} tbrm_set|
000051f0  75 70 5f 72 65 63 3b 0a  0a 75 6e 69 74 20 78 5f  |up_rec;..unit x_|
00005200  70 6f 73 5f 6d 69 6e 20  3d 20 28 69 6e 74 29 28  |pos_min = (int)(|
00005210  2d 32 2e 34 2a 6f 6e 65  29 3b 0a 75 6e 69 74 20  |-2.4*one);.unit |
00005220  78 5f 70 6f 73 5f 6d 61  78 20 3d 20 28 69 6e 74  |x_pos_max = (int|
00005230  29 28 32 2e 34 2a 6f 6e  65 29 3b 0a 75 6e 69 74  |)(2.4*one);.unit|
00005240  20 78 5f 64 6f 74 5f 6d  69 6e 20 3d 20 28 69 6e  | x_dot_min = (in|
00005250  74 29 28 2d 30 2e 36 33  2a 6f 6e 65 29 3b 0a 75  |t)(-0.63*one);.u|
00005260  6e 69 74 20 78 5f 64 6f  74 5f 6d 61 78 20 3d 20  |nit x_dot_max = |
00005270  28 69 6e 74 29 28 30 2e  36 33 2a 6f 6e 65 29 3b  |(int)(0.63*one);|
00005280  0a 75 6e 69 74 20 74 68  65 74 61 5f 6d 69 6e 20  |.unit theta_min |
00005290  3d 20 28 69 6e 74 29 28  2d 31 2e 32 32 2a 6f 6e  |= (int)(-1.22*on|
000052a0  65 29 3b 0a 75 6e 69 74  20 74 68 65 74 61 5f 6d  |e);.unit theta_m|
000052b0  61 78 20 3d 20 28 69 6e  74 29 28 31 2e 32 32 2a  |ax = (int)(1.22*|
000052c0  6f 6e 65 29 3b 0a 75 6e  69 74 20 74 68 65 74 61  |one);.unit theta|
000052d0  5f 6c 6f 77 5f 6c 69 6d  20 3d 20 28 69 6e 74 29  |_low_lim = (int)|
000052e0  28 2d 30 2e 32 30 39 34  2a 6f 6e 65 29 3b 0a 75  |(-0.2094*one);.u|
000052f0  6e 69 74 20 74 68 65 74  61 5f 75 70 5f 6c 69 6d  |nit theta_up_lim|
00005300  20 20 3d 20 28 69 6e 74  29 28 30 2e 32 30 39 34  |  = (int)(0.2094|
00005310  2a 6f 6e 65 29 3b 0a 75  6e 69 74 20 74 68 65 74  |*one);.unit thet|
00005320  61 5f 64 6f 74 5f 6d 69  6e 20 3d 20 28 69 6e 74  |a_dot_min = (int|
00005330  29 28 2d 31 2e 33 35 2a  6f 6e 65 29 3b 0a 75 6e  |)(-1.35*one);.un|
00005340  69 74 20 74 68 65 74 61  5f 64 6f 74 5f 6d 61 78  |it theta_dot_max|
00005350  20 3d 20 28 69 6e 74 29  28 31 2e 33 35 2a 6f 6e  | = (int)(1.35*on|
00005360  65 29 3b 0a 75 6e 69 74  20 66 6f 72 63 65 5f 6d  |e);.unit force_m|
00005370  61 67 20 3d 20 28 69 6e  74 29 28 31 30 2e 30 2a  |ag = (int)(10.0*|
00005380  6f 6e 65 29 3b 0a 75 6e  69 74 20 78 5f 70 6f 73  |one);.unit x_pos|
00005390  5f 66 61 63 74 6f 72 3b  0a 75 6e 69 74 20 78 5f  |_factor;.unit x_|
000053a0  64 6f 74 5f 66 61 63 74  6f 72 3b 0a 75 6e 69 74  |dot_factor;.unit|
000053b0  20 74 68 65 74 61 5f 66  61 63 74 6f 72 3b 0a 75  | theta_factor;.u|
000053c0  6e 69 74 20 74 68 65 74  61 5f 64 6f 74 5f 66 61  |nit theta_dot_fa|
000053d0  63 74 6f 72 3b 0a 75 6e  69 74 20 66 6f 72 63 65  |ctor;.unit force|
000053e0  5f 66 61 63 74 6f 72 3b  0a 0a 74 62 72 6d 5f 73  |_factor;..tbrm_s|
000053f0  65 74 75 70 5f 72 65 63  20 67 5f 62 72 6d 5f 73  |etup_rec g_brm_s|
00005400  65 74 75 70 3b 0a 73 74  61 74 65 5f 72 65 63 20  |etup;.state_rec |
00005410  67 5f 62 72 6d 5f 73 74  61 74 65 3b 0a 69 6e 74  |g_brm_state;.int|
00005420  20 6e 6f 5f 6f 66 5f 74  72 61 69 6e 69 6e 67 5f  | no_of_training_|
00005430  69 74 65 6d 73 3b 0a 66  66 5f 73 65 74 75 70 5f  |items;.ff_setup_|
00005440  72 65 63 20 67 5f 66 66  5f 73 65 74 75 70 3b 0a  |rec g_ff_setup;.|
00005450  6e 65 74 77 6f 72 6b 5f  72 65 63 20 67 5f 6e 65  |network_rec g_ne|
00005460  74 77 6f 72 6b 20 3d 20  7b 46 41 4c 53 45 2c 20  |twork = {FALSE, |
00005470  4e 55 4c 4c 2c 20 4e 55  4c 4c 2c 20 4e 55 4c 4c  |NULL, NULL, NULL|
00005480  2c 20 30 2c 20 30 2c 20  30 7d 3b 0a 77 65 69 67  |, 0, 0, 0};.weig|
00005490  68 74 73 5f 72 65 63 20  67 5f 77 65 69 67 68 74  |hts_rec g_weight|
000054a0  73 20 3d 20 7b 46 41 4c  53 45 2c 20 4e 55 4c 4c  |s = {FALSE, NULL|
000054b0  2c 20 4e 55 4c 4c 2c 20  30 2c 20 30 2c 20 30 7d  |, NULL, 0, 0, 0}|
000054c0  3b 0a 0a 74 79 70 65 64  65 66 20 75 6e 69 74 20  |;..typedef unit |
000054d0  28 2a 63 6f 6e 74 72 6f  6c 6c 65 72 29 20 28 73  |(*controller) (s|
000054e0  74 61 74 65 5f 72 65 63  20 2a 73 74 61 74 65 29  |tate_rec *state)|
000054f0  3b 0a 63 6f 6e 74 72 6f  6c 6c 65 72 20 67 65 74  |;.controller get|
00005500  5f 66 6f 72 63 65 3b 0a  0a 76 6f 69 64 20 69 6e  |_force;..void in|
00005510  69 74 69 61 6c 69 73 65  5f 62 72 6d 5f 73 65 74  |itialise_brm_set|
00005520  75 70 28 74 62 72 6d 5f  73 65 74 75 70 5f 72 65  |up(tbrm_setup_re|
00005530  63 20 2a 73 29 0a 7b 0a  20 20 73 2d 3e 72 61 6e  |c *s).{.  s->ran|
00005540  64 5f 66 6f 72 63 65 20  3d 20 28 69 6e 74 29 28  |d_force = (int)(|
00005550  35 2e 30 2a 6f 6e 65 29  3b 0a 20 20 73 2d 3e 73  |5.0*one);.  s->s|
00005560  79 73 74 65 6d 5f 66 6f  72 63 65 5f 69 6e 63 72  |ystem_force_incr|
00005570  20 3d 20 28 69 6e 74 29  28 33 2e 30 2a 6f 6e 65  | = (int)(3.0*one|
00005580  29 3b 0a 20 20 73 2d 3e  75 73 65 72 5f 66 6f 72  |);.  s->user_for|
00005590  63 65 5f 69 6e 63 72 20  3d 20 28 69 6e 74 29 28  |ce_incr = (int)(|
000055a0  35 2e 30 2a 6f 6e 65 29  3b 0a 20 20 73 2d 3e 7a  |5.0*one);.  s->z|
000055b0  65 72 6f 5f 74 68 65 74  61 20 3d 20 28 69 6e 74  |ero_theta = (int|
000055c0  29 28 30 2e 30 30 35 2a  6f 6e 65 29 3b 0a 7d 0a  |)(0.005*one);.}.|
000055d0  0a 76 6f 69 64 20 73 65  74 5f 62 72 6f 6c 6c 79  |.void set_brolly|
000055e0  5f 61 74 5f 73 74 61 72  74 5f 70 6f 73 69 74 69  |_at_start_positi|
000055f0  6f 6e 28 73 74 61 74 65  5f 72 65 63 20 2a 73 74  |on(state_rec *st|
00005600  61 74 65 29 0a 7b 0a 20  20 73 74 61 74 65 2d 3e  |ate).{.  state->|
00005610  78 5f 70 6f 73 20 3d 20  30 3b 0a 20 20 73 74 61  |x_pos = 0;.  sta|
00005620  74 65 2d 3e 78 5f 64 6f  74 20 3d 20 30 3b 0a 20  |te->x_dot = 0;. |
00005630  20 73 74 61 74 65 2d 3e  74 68 65 74 61 20 3d 20  | state->theta = |
00005640  30 3b 0a 20 20 73 74 61  74 65 2d 3e 74 68 65 74  |0;.  state->thet|
00005650  61 5f 64 6f 74 20 3d 20  30 3b 0a 7d 0a 0a 2f 2a  |a_dot = 0;.}../*|
00005660  6e 62 20 6f 6c 64 5f 73  74 61 74 65 3d 6e 65 77  |nb old_state=new|
00005670  5f 73 74 61 74 65 20 70  65 72 6d 69 74 74 65 64  |_state permitted|
00005680  2a 2f 0a 76 6f 69 64 20  65 76 6f 6c 76 65 28 75  |*/.void evolve(u|
00005690  6e 69 74 20 66 2c 20 73  74 61 74 65 5f 72 65 63  |nit f, state_rec|
000056a0  20 2a 6f 6c 64 5f 73 74  61 74 65 2c 20 73 74 61  | *old_state, sta|
000056b0  74 65 5f 72 65 63 20 2a  6e 65 77 5f 73 74 61 74  |te_rec *new_stat|
000056c0  65 29 0a 7b 0a 20 20 69  6e 74 20 74 68 6d 20 3d  |e).{.  int thm =|
000056d0  20 6d 75 6c 5f 66 72 61  63 31 36 63 28 6f 6c 64  | mul_frac16c(old|
000056e0  5f 73 74 61 74 65 2d 3e  74 68 65 74 61 2c 20 34  |_state->theta, 4|
000056f0  31 37 32 32 29 3b 20 2f  2a 63 6f 6e 76 65 72 74  |1722); /*convert|
00005700  73 20 66 72 6f 6d 20 74  68 65 74 61 20 69 6e 20  |s from theta in |
00005710  72 61 64 73 2a 6f 6e 65  20 74 6f 20 74 68 6d 20  |rads*one to thm |
00005720  69 6e 20 72 61 64 73 2a  6f 6e 65 2a 32 2f 50 49  |in rads*one*2/PI|
00005730  2c 20 72 65 71 75 69 72  65 64 20 62 79 20 73 69  |, required by si|
00005740  6e 31 36 20 26 20 63 6f  73 31 36 2a 2f 0a 20 20  |n16 & cos16*/.  |
00005750  69 6e 74 20 74 68 64 64  2c 20 78 64 64 2c 20 73  |int thdd, xdd, s|
00005760  69 6e 74 2c 20 63 6f 73  74 2c 20 74 68 64 32 73  |int, cost, thd2s|
00005770  74 3b 0a 20 20 73 69 6e  74 20 20 20 3d 20 73 69  |t;.  sint   = si|
00005780  6e 31 36 28 74 68 6d 29  3b 0a 20 20 63 6f 73 74  |n16(thm);.  cost|
00005790  20 20 20 3d 20 63 6f 73  31 36 28 74 68 6d 29 3b  |   = cos16(thm);|
000057a0  0a 20 20 74 68 64 32 73  74 20 3d 20 6d 75 6c 5f  |.  thd2st = mul_|
000057b0  66 72 61 63 31 36 63 28  6d 75 6c 5f 66 72 61 63  |frac16c(mul_frac|
000057c0  31 36 28 6f 6c 64 5f 73  74 61 74 65 2d 3e 74 68  |16(old_state->th|
000057d0  65 74 61 5f 64 6f 74 2c  20 6f 6c 64 5f 73 74 61  |eta_dot, old_sta|
000057e0  74 65 2d 3e 74 68 65 74  61 5f 64 6f 74 29 2c 20  |te->theta_dot), |
000057f0  73 69 6e 74 29 3b 0a 20  20 74 68 64 64 20 20 20  |sint);.  thdd   |
00005800  3d 20 64 69 76 5f 66 72  61 63 31 36 28 20 6d 75  |= div_frac16( mu|
00005810  6c 5f 66 72 61 63 31 36  63 28 70 32 2c 20 73 69  |l_frac16c(p2, si|
00005820  6e 74 29 20 2d 20 6d 75  6c 5f 66 72 61 63 31 36  |nt) - mul_frac16|
00005830  63 28 66 2b 6d 75 6c 5f  66 72 61 63 31 36 28 70  |c(f+mul_frac16(p|
00005840  31 2c 74 68 64 32 73 74  29 2c 20 63 6f 73 74 29  |1,thd2st), cost)|
00005850  20 2c 20 70 33 20 2d 20  6d 75 6c 5f 66 72 61 63  | , p3 - mul_frac|
00005860  31 36 63 28 70 31 2c 20  6d 75 6c 5f 66 72 61 63  |16c(p1, mul_frac|
00005870  31 36 63 28 63 6f 73 74  2c 20 63 6f 73 74 29 29  |16c(cost, cost))|
00005880  20 29 3b 0a 20 20 78 64  64 20 20 20 20 3d 20 64  | );.  xdd    = d|
00005890  69 76 5f 66 72 61 63 31  36 28 20 66 20 2b 20 6d  |iv_frac16( f + m|
000058a0  75 6c 5f 66 72 61 63 31  36 28 74 68 64 32 73 74  |ul_frac16(thd2st|
000058b0  2d 6d 75 6c 5f 66 72 61  63 31 36 63 28 74 68 64  |-mul_frac16c(thd|
000058c0  64 2c 63 6f 73 74 29 2c  20 70 31 29 20 2c 20 6d  |d,cost), p1) , m|
000058d0  20 29 3b 0a 20 20 6e 65  77 5f 73 74 61 74 65 2d  | );.  new_state-|
000058e0  3e 78 5f 70 6f 73 09 3d  20 6f 6c 64 5f 73 74 61  |>x_pos.= old_sta|
000058f0  74 65 2d 3e 78 5f 70 6f  73 20 2b 20 6f 6c 64 5f  |te->x_pos + old_|
00005900  73 74 61 74 65 2d 3e 78  5f 64 6f 74 20 2f 20 66  |state->x_dot / f|
00005910  72 61 6d 65 5f 66 72 65  71 3b 0a 20 20 6e 65 77  |rame_freq;.  new|
00005920  5f 73 74 61 74 65 2d 3e  74 68 65 74 61 09 3d 20  |_state->theta.= |
00005930  6f 6c 64 5f 73 74 61 74  65 2d 3e 74 68 65 74 61  |old_state->theta|
00005940  20 2b 20 6f 6c 64 5f 73  74 61 74 65 2d 3e 74 68  | + old_state->th|
00005950  65 74 61 5f 64 6f 74 20  2f 20 66 72 61 6d 65 5f  |eta_dot / frame_|
00005960  66 72 65 71 3b 0a 20 20  6e 65 77 5f 73 74 61 74  |freq;.  new_stat|
00005970  65 2d 3e 78 5f 64 6f 74  09 3d 20 6f 6c 64 5f 73  |e->x_dot.= old_s|
00005980  74 61 74 65 2d 3e 78 5f  64 6f 74 20 2b 20 78 64  |tate->x_dot + xd|
00005990  64 20 2f 20 66 72 61 6d  65 5f 66 72 65 71 3b 0a  |d / frame_freq;.|
000059a0  20 20 6e 65 77 5f 73 74  61 74 65 2d 3e 74 68 65  |  new_state->the|
000059b0  74 61 5f 64 6f 74 09 3d  20 6f 6c 64 5f 73 74 61  |ta_dot.= old_sta|
000059c0  74 65 2d 3e 74 68 65 74  61 5f 64 6f 74 20 2b 20  |te->theta_dot + |
000059d0  74 68 64 64 20 2f 20 66  72 61 6d 65 5f 66 72 65  |thdd / frame_fre|
000059e0  71 3b 0a 20 20 72 65 74  75 72 6e 3b 0a 7d 0a 0a  |q;.  return;.}..|
000059f0  2f 2a 74 68 69 73 20 66  6e 20 69 73 20 75 73 65  |/*this fn is use|
00005a00  64 20 64 75 72 69 6e 67  20 6e 65 74 20 74 72 61  |d during net tra|
00005a10  69 6e 69 6e 67 2c 20 73  69 6e 63 65 20 61 70 70  |ining, since app|
00005a20  6c 69 63 61 74 69 6f 6e  20 6f 66 20 65 76 6f 6c  |lication of evol|
00005a30  76 65 20 61 6c 6f 6e 65  20 69 73 6e 27 74 20 73  |ve alone isn't s|
00005a40  75 66 66 69 63 69 65 6e  74 20 66 6f 72 20 6e 65  |ufficient for ne|
00005a50  74 20 74 6f 0a 20 20 6c  65 61 72 6e 20 65 66 66  |t to.  learn eff|
00005a60  65 63 74 20 6f 66 20 66  20 6f 6e 20 74 68 65 74  |ect of f on thet|
00005a70  61 20 2d 20 6e 61 74 75  72 65 20 6f 66 20 45 75  |a - nature of Eu|
00005a80  6c 65 72 20 69 73 20 73  75 63 68 20 74 68 61 74  |ler is such that|
00005a90  20 6e 65 65 64 20 32 20  61 70 70 6c 69 63 61 74  | need 2 applicat|
00005aa0  69 6f 6e 73 20 66 6f 72  20 65 66 66 65 63 74 20  |ions for effect |
00005ab0  74 6f 20 66 69 6c 74 65  72 20 64 6f 77 6e 0a 20  |to filter down. |
00005ac0  20 74 6f 20 70 6f 73 69  74 69 6f 6e 20 76 61 72  | to position var|
00005ad0  69 61 62 6c 65 73 2a 2f  0a 76 6f 69 64 20 66 6f  |iables*/.void fo|
00005ae0  72 63 65 5f 65 66 66 65  63 74 28 75 6e 69 74 20  |rce_effect(unit |
00005af0  66 2c 20 73 74 61 74 65  5f 72 65 63 20 2a 69 6e  |f, state_rec *in|
00005b00  2c 20 73 74 61 74 65 5f  72 65 63 20 2a 6f 75 74  |, state_rec *out|
00005b10  29 0a 7b 0a 20 20 65 76  6f 6c 76 65 28 66 2c 20  |).{.  evolve(f, |
00005b20  69 6e 2c 20 6f 75 74 29  3b 0a 20 20 65 76 6f 6c  |in, out);.  evol|
00005b30  76 65 28 30 2c 20 6f 75  74 2c 20 6f 75 74 29 3b  |ve(0, out, out);|
00005b40  0a 7d 0a 0a 42 4f 4f 4c  20 63 72 65 61 74 65 5f  |.}..BOOL create_|
00005b50  6d 61 78 5f 6d 69 6e 5f  64 61 74 61 28 76 6f 69  |max_min_data(voi|
00005b60  64 29 0a 7b 0a 20 20 73  74 61 74 65 5f 72 65 63  |d).{.  state_rec|
00005b70  20 73 74 61 74 65 2c 20  6e 65 77 5f 73 74 61 74  | state, new_stat|
00005b80  65 2c 20 6d 69 6e 5f 73  74 61 74 65 2c 20 6d 61  |e, min_state, ma|
00005b90  78 5f 73 74 61 74 65 3b  0a 20 20 75 6e 69 74 20  |x_state;.  unit |
00005ba0  66 6f 72 63 65 3b 0a 20  20 69 6e 74 20 69 3b 0a  |force;.  int i;.|
00005bb0  20 20 6d 69 6e 5f 73 74  61 74 65 2e 78 5f 70 6f  |  min_state.x_po|
00005bc0  73 09 3d 09 78 5f 70 6f  73 5f 6d 69 6e 3b 0a 20  |s.=.x_pos_min;. |
00005bd0  20 6d 61 78 5f 73 74 61  74 65 2e 78 5f 70 6f 73  | max_state.x_pos|
00005be0  09 3d 09 78 5f 70 6f 73  5f 6d 61 78 3b 0a 20 20  |.=.x_pos_max;.  |
00005bf0  6d 69 6e 5f 73 74 61 74  65 2e 74 68 65 74 61 09  |min_state.theta.|
00005c00  3d 09 74 68 65 74 61 5f  6c 6f 77 5f 6c 69 6d 3b  |=.theta_low_lim;|
00005c10  0a 20 20 6d 61 78 5f 73  74 61 74 65 2e 74 68 65  |.  max_state.the|
00005c20  74 61 09 3d 09 74 68 65  74 61 5f 75 70 5f 6c 69  |ta.=.theta_up_li|
00005c30  6d 3b 0a 20 20 6d 69 6e  5f 73 74 61 74 65 2e 78  |m;.  min_state.x|
00005c40  5f 64 6f 74 09 3d 09 30  3b 0a 20 20 6d 61 78 5f  |_dot.=.0;.  max_|
00005c50  73 74 61 74 65 2e 78 5f  64 6f 74 09 3d 09 30 3b  |state.x_dot.=.0;|
00005c60  0a 20 20 6d 69 6e 5f 73  74 61 74 65 2e 74 68 65  |.  min_state.the|
00005c70  74 61 5f 64 6f 74 09 3d  09 30 3b 0a 20 20 6d 61  |ta_dot.=.0;.  ma|
00005c80  78 5f 73 74 61 74 65 2e  74 68 65 74 61 5f 64 6f  |x_state.theta_do|
00005c90  74 09 3d 09 30 3b 0a 20  20 2f 2a 72 75 6e 20 74  |t.=.0;.  /*run t|
00005ca0  68 65 20 62 72 6f 6c 6c  79 20 64 79 6e 61 6d 69  |he brolly dynami|
00005cb0  63 73 20 74 6f 20 63 6f  6c 6c 65 63 74 20 6f 62  |cs to collect ob|
00005cc0  73 65 72 76 61 74 69 6f  6e 73 20 6f 6e 20 6d 61  |servations on ma|
00005cd0  78 2f 6d 69 6e 20 64 61  74 61 2a 2f 0a 20 20 73  |x/min data*/.  s|
00005ce0  65 74 5f 62 72 6f 6c 6c  79 5f 61 74 5f 73 74 61  |et_brolly_at_sta|
00005cf0  72 74 5f 70 6f 73 69 74  69 6f 6e 28 26 73 74 61  |rt_position(&sta|
00005d00  74 65 29 3b 0a 20 20 66  6f 72 20 28 69 3d 31 3b  |te);.  for (i=1;|
00005d10  20 69 3c 3d 6e 6f 5f 6f  66 5f 74 72 61 69 6e 69  | i<=no_of_traini|
00005d20  6e 67 5f 69 74 65 6d 73  3b 20 69 2b 2b 29 20 7b  |ng_items; i++) {|
00005d30  0a 20 20 20 20 66 6f 72  63 65 20 3d 20 6d 75 6c  |.    force = mul|
00005d40  5f 66 72 61 63 31 36 63  28 66 6f 72 63 65 5f 6d  |_frac16c(force_m|
00005d50  61 67 2c 20 72 61 6e 64  31 36 28 29 29 3b 0a 20  |ag, rand16());. |
00005d60  20 20 20 65 76 6f 6c 76  65 28 66 6f 72 63 65 2c  |   evolve(force,|
00005d70  20 26 73 74 61 74 65 2c  20 26 6e 65 77 5f 73 74  | &state, &new_st|
00005d80  61 74 65 29 3b 0a 20 20  20 20 69 66 20 28 6e 65  |ate);.    if (ne|
00005d90  77 5f 73 74 61 74 65 2e  78 5f 64 6f 74 20 3c 20  |w_state.x_dot < |
00005da0  6d 69 6e 5f 73 74 61 74  65 2e 78 5f 64 6f 74 29  |min_state.x_dot)|
00005db0  20 6d 69 6e 5f 73 74 61  74 65 2e 78 5f 64 6f 74  | min_state.x_dot|
00005dc0  20 3d 20 6e 65 77 5f 73  74 61 74 65 2e 78 5f 64  | = new_state.x_d|
00005dd0  6f 74 3b 0a 20 20 20 20  69 66 20 28 6e 65 77 5f  |ot;.    if (new_|
00005de0  73 74 61 74 65 2e 78 5f  64 6f 74 20 3e 20 6d 61  |state.x_dot > ma|
00005df0  78 5f 73 74 61 74 65 2e  78 5f 64 6f 74 29 20 6d  |x_state.x_dot) m|
00005e00  61 78 5f 73 74 61 74 65  2e 78 5f 64 6f 74 20 3d  |ax_state.x_dot =|
00005e10  20 6e 65 77 5f 73 74 61  74 65 2e 78 5f 64 6f 74  | new_state.x_dot|
00005e20  3b 0a 20 20 20 20 69 66  20 28 6e 65 77 5f 73 74  |;.    if (new_st|
00005e30  61 74 65 2e 74 68 65 74  61 5f 64 6f 74 20 3c 20  |ate.theta_dot < |
00005e40  6d 69 6e 5f 73 74 61 74  65 2e 74 68 65 74 61 5f  |min_state.theta_|
00005e50  64 6f 74 29 20 6d 69 6e  5f 73 74 61 74 65 2e 74  |dot) min_state.t|
00005e60  68 65 74 61 5f 64 6f 74  20 3d 20 6e 65 77 5f 73  |heta_dot = new_s|
00005e70  74 61 74 65 2e 74 68 65  74 61 5f 64 6f 74 3b 0a  |tate.theta_dot;.|
00005e80  20 20 20 20 69 66 20 28  6e 65 77 5f 73 74 61 74  |    if (new_stat|
00005e90  65 2e 74 68 65 74 61 5f  64 6f 74 20 3e 20 6d 61  |e.theta_dot > ma|
00005ea0  78 5f 73 74 61 74 65 2e  74 68 65 74 61 5f 64 6f  |x_state.theta_do|
00005eb0  74 29 20 6d 61 78 5f 73  74 61 74 65 2e 74 68 65  |t) max_state.the|
00005ec0  74 61 5f 64 6f 74 20 3d  20 6e 65 77 5f 73 74 61  |ta_dot = new_sta|
00005ed0  74 65 2e 74 68 65 74 61  5f 64 6f 74 3b 0a 20 20  |te.theta_dot;.  |
00005ee0  20 20 69 66 20 28 20 6e  65 77 5f 73 74 61 74 65  |  if ( new_state|
00005ef0  2e 78 5f 70 6f 73 3e 78  5f 70 6f 73 5f 6d 69 6e  |.x_pos>x_pos_min|
00005f00  20 26 26 20 6e 65 77 5f  73 74 61 74 65 2e 78 5f  | && new_state.x_|
00005f10  70 6f 73 3c 78 5f 70 6f  73 5f 6d 61 78 20 26 26  |pos<x_pos_max &&|
00005f20  0a 09 20 6e 65 77 5f 73  74 61 74 65 2e 74 68 65  |.. new_state.the|
00005f30  74 61 3e 74 68 65 74 61  5f 6c 6f 77 5f 6c 69 6d  |ta>theta_low_lim|
00005f40  20 26 26 20 6e 65 77 5f  73 74 61 74 65 2e 74 68  | && new_state.th|
00005f50  65 74 61 3c 74 68 65 74  61 5f 75 70 5f 6c 69 6d  |eta<theta_up_lim|
00005f60  20 29 20 73 74 61 74 65  20 3d 20 6e 65 77 5f 73  | ) state = new_s|
00005f70  74 61 74 65 3b 0a 20 20  20 20 65 6c 73 65 20 73  |tate;.    else s|
00005f80  65 74 5f 62 72 6f 6c 6c  79 5f 61 74 5f 73 74 61  |et_brolly_at_sta|
00005f90  72 74 5f 70 6f 73 69 74  69 6f 6e 28 26 73 74 61  |rt_position(&sta|
00005fa0  74 65 29 3b 0a 20 20 7d  0a 20 20 69 66 20 28 6d  |te);.  }.  if (m|
00005fb0  61 78 5f 73 74 61 74 65  2e 78 5f 64 6f 74 2b 6d  |ax_state.x_dot+m|
00005fc0  69 6e 5f 73 74 61 74 65  2e 78 5f 64 6f 74 20 3c  |in_state.x_dot <|
00005fd0  20 30 29 20 6d 61 78 5f  73 74 61 74 65 2e 78 5f  | 0) max_state.x_|
00005fe0  64 6f 74 20 3d 20 2d 6d  69 6e 5f 73 74 61 74 65  |dot = -min_state|
00005ff0  2e 78 5f 64 6f 74 3b 0a  20 20 6d 69 6e 5f 73 74  |.x_dot;.  min_st|
00006000  61 74 65 2e 78 5f 64 6f  74 20 3d 20 2d 6d 61 78  |ate.x_dot = -max|
00006010  5f 73 74 61 74 65 2e 78  5f 64 6f 74 3b 0a 20 20  |_state.x_dot;.  |
00006020  69 66 20 28 6d 61 78 5f  73 74 61 74 65 2e 74 68  |if (max_state.th|
00006030  65 74 61 5f 64 6f 74 2b  6d 69 6e 5f 73 74 61 74  |eta_dot+min_stat|
00006040  65 2e 74 68 65 74 61 5f  64 6f 74 20 3c 20 30 29  |e.theta_dot < 0)|
00006050  20 6d 61 78 5f 73 74 61  74 65 2e 74 68 65 74 61  | max_state.theta|
00006060  5f 64 6f 74 20 3d 20 2d  6d 69 6e 5f 73 74 61 74  |_dot = -min_stat|
00006070  65 2e 74 68 65 74 61 5f  64 6f 74 3b 0a 20 20 6d  |e.theta_dot;.  m|
00006080  69 6e 5f 73 74 61 74 65  2e 74 68 65 74 61 5f 64  |in_state.theta_d|
00006090  6f 74 20 3d 20 2d 6d 61  78 5f 73 74 61 74 65 2e  |ot = -max_state.|
000060a0  74 68 65 74 61 5f 64 6f  74 3b 0a 20 20 2f 2a 63  |theta_dot;.  /*c|
000060b0  6f 6d 70 75 74 65 20 74  68 65 20 66 61 63 74 6f  |ompute the facto|
000060c0  72 73 20 69 6e 76 6f 6c  76 65 64 20 69 6e 20 63  |rs involved in c|
000060d0  6f 6e 76 65 72 74 69 6e  67 20 62 65 74 77 65 65  |onverting betwee|
000060e0  6e 20 61 20 73 74 61 74  65 5f 72 65 63 20 26 20  |n a state_rec & |
000060f0  6e 6f 72 6d 61 6c 69 73  65 64 20 6e 65 74 77 6f  |normalised netwo|
00006100  72 6b 20 69 6e 70 75 74  2a 2f 0a 20 20 69 66 20  |rk input*/.  if |
00006110  28 6d 61 78 5f 73 74 61  74 65 2e 78 5f 64 6f 74  |(max_state.x_dot|
00006120  2d 6d 69 6e 5f 73 74 61  74 65 2e 78 5f 64 6f 74  |-min_state.x_dot|
00006130  3c 33 20 7c 7c 20 6d 61  78 5f 73 74 61 74 65 2e  |<3 || max_state.|
00006140  74 68 65 74 61 5f 64 6f  74 2d 6d 69 6e 5f 73 74  |theta_dot-min_st|
00006150  61 74 65 2e 74 68 65 74  61 5f 64 6f 74 3c 33 29  |ate.theta_dot<3)|
00006160  20 7b 0a 20 20 20 20 77  65 72 72 28 77 65 72 72  | {.    werr(werr|
00006170  74 65 72 6d 2c 20 22 43  72 65 61 74 65 20 6d 61  |term, "Create ma|
00006180  78 20 6d 69 6e 20 64 61  74 61 3a 20 74 6f 6f 20  |x min data: too |
00006190  6c 6f 77 20 61 20 72 61  6e 67 65 20 6f 6e 20 78  |low a range on x|
000061a0  20 6f 72 20 74 68 65 74  61 20 64 6f 74 20 64 61  | or theta dot da|
000061b0  74 61 22 29 3b 0a 20 20  20 20 72 65 74 75 72 6e  |ta");.    return|
000061c0  20 46 41 4c 53 45 3b 0a  20 20 7d 0a 20 20 78 5f  | FALSE;.  }.  x_|
000061d0  64 6f 74 5f 6d 69 6e 09  3d 20 6d 69 6e 5f 73 74  |dot_min.= min_st|
000061e0  61 74 65 2e 78 5f 64 6f  74 3b 0a 20 20 78 5f 64  |ate.x_dot;.  x_d|
000061f0  6f 74 5f 6d 61 78 09 3d  20 6d 61 78 5f 73 74 61  |ot_max.= max_sta|
00006200  74 65 2e 78 5f 64 6f 74  3b 0a 20 20 74 68 65 74  |te.x_dot;.  thet|
00006210  61 5f 64 6f 74 5f 6d 69  6e 09 3d 20 6d 69 6e 5f  |a_dot_min.= min_|
00006220  73 74 61 74 65 2e 74 68  65 74 61 5f 64 6f 74 3b  |state.theta_dot;|
00006230  0a 20 20 74 68 65 74 61  5f 64 6f 74 5f 6d 61 78  |.  theta_dot_max|
00006240  09 3d 20 6d 61 78 5f 73  74 61 74 65 2e 74 68 65  |.= max_state.the|
00006250  74 61 5f 64 6f 74 3b 0a  20 20 78 5f 70 6f 73 5f  |ta_dot;.  x_pos_|
00006260  66 61 63 74 6f 72 20 3d  20 64 69 76 5f 66 72 61  |factor = div_fra|
00006270  63 31 36 28 6f 6e 65 2c  20 78 5f 70 6f 73 5f 6d  |c16(one, x_pos_m|
00006280  61 78 2d 78 5f 70 6f 73  5f 6d 69 6e 29 3b 0a 20  |ax-x_pos_min);. |
00006290  20 78 5f 64 6f 74 5f 66  61 63 74 6f 72 20 3d 20  | x_dot_factor = |
000062a0  64 69 76 5f 66 72 61 63  31 36 28 6f 6e 65 2c 20  |div_frac16(one, |
000062b0  78 5f 64 6f 74 5f 6d 61  78 2d 78 5f 64 6f 74 5f  |x_dot_max-x_dot_|
000062c0  6d 69 6e 29 3b 0a 20 20  74 68 65 74 61 5f 66 61  |min);.  theta_fa|
000062d0  63 74 6f 72 20 3d 20 64  69 76 5f 66 72 61 63 31  |ctor = div_frac1|
000062e0  36 28 6f 6e 65 2c 20 74  68 65 74 61 5f 75 70 5f  |6(one, theta_up_|
000062f0  6c 69 6d 2d 74 68 65 74  61 5f 6c 6f 77 5f 6c 69  |lim-theta_low_li|
00006300  6d 29 3b 0a 20 20 74 68  65 74 61 5f 64 6f 74 5f  |m);.  theta_dot_|
00006310  66 61 63 74 6f 72 20 3d  20 64 69 76 5f 66 72 61  |factor = div_fra|
00006320  63 31 36 28 6f 6e 65 2c  20 74 68 65 74 61 5f 64  |c16(one, theta_d|
00006330  6f 74 5f 6d 61 78 2d 74  68 65 74 61 5f 64 6f 74  |ot_max-theta_dot|
00006340  5f 6d 69 6e 29 3b 0a 20  20 66 6f 72 63 65 5f 66  |_min);.  force_f|
00006350  61 63 74 6f 72 20 3d 20  64 69 76 5f 66 72 61 63  |actor = div_frac|
00006360  31 36 28 6f 6e 65 2c 20  32 2a 66 6f 72 63 65 5f  |16(one, 2*force_|
00006370  6d 61 67 29 3b 0a 20 20  72 65 74 75 72 6e 20 54  |mag);.  return T|
00006380  52 55 45 3b 0a 7d 0a 0a  2f 2a 74 68 65 20 75 73  |RUE;.}../*the us|
00006390  65 5f 6f 6c 64 20 62 6f  64 67 65 20 65 6e 73 75  |e_old bodge ensu|
000063a0  72 65 73 20 74 68 65 20  6e 65 74 20 67 65 74 73  |res the net gets|
000063b0  20 27 73 79 6d 6d 65 74  72 69 63 27 20 74 72 61  | 'symmetric' tra|
000063c0  69 6e 69 6e 67 20 2d 20  73 65 65 20 61 72 74 69  |ining - see arti|
000063d0  63 6c 65 20 66 6f 72 20  77 68 79 20 74 68 69 73  |cle for why this|
000063e0  20 69 73 20 69 6d 70 6f  72 74 61 6e 74 2a 2f 0a  | is important*/.|
000063f0  76 6f 69 64 20 67 65 74  5f 72 61 6e 64 6f 6d 5f  |void get_random_|
00006400  62 72 6f 6c 6c 79 5f 73  74 61 74 65 28 73 74 61  |brolly_state(sta|
00006410  74 65 5f 72 65 63 20 2a  73 74 61 74 65 29 0a 7b  |te_rec *state).{|
00006420  0a 20 20 73 74 61 74 69  63 20 42 4f 4f 4c 20 75  |.  static BOOL u|
00006430  73 65 5f 6f 6c 64 3d 46  41 4c 53 45 3b 0a 20 20  |se_old=FALSE;.  |
00006440  73 74 61 74 69 63 20 73  74 61 74 65 5f 72 65 63  |static state_rec|
00006450  20 73 3b 0a 20 20 69 66  20 28 75 73 65 5f 6f 6c  | s;.  if (use_ol|
00006460  64 29 20 7b 0a 20 20 20  20 73 2e 78 5f 70 6f 73  |d) {.    s.x_pos|
00006470  20 3d 20 2d 73 2e 78 5f  70 6f 73 3b 0a 20 20 20  | = -s.x_pos;.   |
00006480  20 73 2e 78 5f 64 6f 74  20 3d 20 2d 73 2e 78 5f  | s.x_dot = -s.x_|
00006490  64 6f 74 3b 0a 20 20 20  20 73 2e 74 68 65 74 61  |dot;.    s.theta|
000064a0  20 3d 20 2d 73 2e 74 68  65 74 61 3b 0a 20 20 20  | = -s.theta;.   |
000064b0  20 73 2e 74 68 65 74 61  5f 64 6f 74 20 3d 20 2d  | s.theta_dot = -|
000064c0  73 2e 74 68 65 74 61 5f  64 6f 74 3b 0a 20 20 7d  |s.theta_dot;.  }|
000064d0  0a 20 20 65 6c 73 65 20  7b 0a 20 20 20 20 73 2e  |.  else {.    s.|
000064e0  78 5f 70 6f 73 20 3d 20  6d 75 6c 5f 66 72 61 63  |x_pos = mul_frac|
000064f0  31 36 63 28 78 5f 70 6f  73 5f 6d 61 78 2d 78 5f  |16c(x_pos_max-x_|
00006500  70 6f 73 5f 6d 69 6e 2c  20 72 61 6e 64 75 31 36  |pos_min, randu16|
00006510  28 29 29 20 2b 20 78 5f  70 6f 73 5f 6d 69 6e 3b  |()) + x_pos_min;|
00006520  0a 20 20 20 20 73 2e 78  5f 64 6f 74 20 3d 20 6d  |.    s.x_dot = m|
00006530  75 6c 5f 66 72 61 63 31  36 63 28 78 5f 64 6f 74  |ul_frac16c(x_dot|
00006540  5f 6d 61 78 2d 78 5f 64  6f 74 5f 6d 69 6e 2c 20  |_max-x_dot_min, |
00006550  72 61 6e 64 75 31 36 28  29 29 20 2b 20 78 5f 64  |randu16()) + x_d|
00006560  6f 74 5f 6d 69 6e 3b 0a  20 20 20 20 73 2e 74 68  |ot_min;.    s.th|
00006570  65 74 61 20 3d 20 6d 75  6c 5f 66 72 61 63 31 36  |eta = mul_frac16|
00006580  63 28 74 68 65 74 61 5f  75 70 5f 6c 69 6d 2d 74  |c(theta_up_lim-t|
00006590  68 65 74 61 5f 6c 6f 77  5f 6c 69 6d 2c 20 72 61  |heta_low_lim, ra|
000065a0  6e 64 75 31 36 28 29 29  20 2b 20 74 68 65 74 61  |ndu16()) + theta|
000065b0  5f 6c 6f 77 5f 6c 69 6d  3b 0a 20 20 20 20 73 2e  |_low_lim;.    s.|
000065c0  74 68 65 74 61 5f 64 6f  74 20 3d 20 6d 75 6c 5f  |theta_dot = mul_|
000065d0  66 72 61 63 31 36 63 28  74 68 65 74 61 5f 64 6f  |frac16c(theta_do|
000065e0  74 5f 6d 61 78 2d 74 68  65 74 61 5f 64 6f 74 5f  |t_max-theta_dot_|
000065f0  6d 69 6e 2c 20 72 61 6e  64 75 31 36 28 29 29 20  |min, randu16()) |
00006600  2b 20 74 68 65 74 61 5f  64 6f 74 5f 6d 69 6e 3b  |+ theta_dot_min;|
00006610  0a 20 20 7d 0a 20 20 2a  73 74 61 74 65 20 3d 20  |.  }.  *state = |
00006620  73 3b 0a 20 20 75 73 65  5f 6f 6c 64 20 3d 20 21  |s;.  use_old = !|
00006630  75 73 65 5f 6f 6c 64 3b  0a 7d 0a 0a 76 6f 69 64  |use_old;.}..void|
00006640  20 67 65 74 5f 6e 65 74  77 6f 72 6b 5f 69 6e 70  | get_network_inp|
00006650  75 74 28 73 74 61 74 65  5f 72 65 63 20 2a 73 2c  |ut(state_rec *s,|
00006660  20 76 65 63 74 6f 72 20  78 5f 69 6e 2c 20 75 6e  | vector x_in, un|
00006670  69 74 20 66 6f 72 63 65  2c 20 66 66 5f 73 65 74  |it force, ff_set|
00006680  75 70 5f 72 65 63 20 2a  73 65 74 75 70 29 0a 7b  |up_rec *setup).{|
00006690  0a 20 20 69 6e 74 20 69  3b 0a 20 20 75 6e 69 74  |.  int i;.  unit|
000066a0  20 6e 6f 72 6d 5f 69 6e  5f 6d 61 78 3b 0a 20 20  | norm_in_max;.  |
000066b0  78 5f 69 6e 5b 58 5f 50  4f 53 5f 49 4e 44 45 58  |x_in[X_POS_INDEX|
000066c0  5d 09 3d 20 6d 75 6c 5f  66 72 61 63 31 36 28 73  |].= mul_frac16(s|
000066d0  65 74 75 70 2d 3e 6e 6f  72 6d 5f 69 6e 5f 72 61  |etup->norm_in_ra|
000066e0  6e 67 65 2c 20 6d 75 6c  5f 66 72 61 63 31 36 28  |nge, mul_frac16(|
000066f0  73 2d 3e 78 5f 70 6f 73  2d 78 5f 70 6f 73 5f 6d  |s->x_pos-x_pos_m|
00006700  69 6e 2c 20 78 5f 70 6f  73 5f 66 61 63 74 6f 72  |in, x_pos_factor|
00006710  29 29 20 2b 20 73 65 74  75 70 2d 3e 6e 6f 72 6d  |)) + setup->norm|
00006720  5f 69 6e 5f 6d 69 6e 3b  0a 20 20 78 5f 69 6e 5b  |_in_min;.  x_in[|
00006730  58 5f 44 4f 54 5f 49 4e  44 45 58 5d 09 3d 20 6d  |X_DOT_INDEX].= m|
00006740  75 6c 5f 66 72 61 63 31  36 28 73 65 74 75 70 2d  |ul_frac16(setup-|
00006750  3e 6e 6f 72 6d 5f 69 6e  5f 72 61 6e 67 65 2c 20  |>norm_in_range, |
00006760  6d 75 6c 5f 66 72 61 63  31 36 28 73 2d 3e 78 5f  |mul_frac16(s->x_|
00006770  64 6f 74 2d 78 5f 64 6f  74 5f 6d 69 6e 2c 20 78  |dot-x_dot_min, x|
00006780  5f 64 6f 74 5f 66 61 63  74 6f 72 29 29 20 2b 20  |_dot_factor)) + |
00006790  73 65 74 75 70 2d 3e 6e  6f 72 6d 5f 69 6e 5f 6d  |setup->norm_in_m|
000067a0  69 6e 3b 0a 20 20 78 5f  69 6e 5b 54 48 45 54 41  |in;.  x_in[THETA|
000067b0  5f 49 4e 44 45 58 5d 09  3d 20 6d 75 6c 5f 66 72  |_INDEX].= mul_fr|
000067c0  61 63 31 36 28 73 65 74  75 70 2d 3e 6e 6f 72 6d  |ac16(setup->norm|
000067d0  5f 69 6e 5f 72 61 6e 67  65 2c 20 6d 75 6c 5f 66  |_in_range, mul_f|
000067e0  72 61 63 31 36 28 73 2d  3e 74 68 65 74 61 2d 74  |rac16(s->theta-t|
000067f0  68 65 74 61 5f 6c 6f 77  5f 6c 69 6d 2c 20 74 68  |heta_low_lim, th|
00006800  65 74 61 5f 66 61 63 74  6f 72 29 29 20 2b 20 73  |eta_factor)) + s|
00006810  65 74 75 70 2d 3e 6e 6f  72 6d 5f 69 6e 5f 6d 69  |etup->norm_in_mi|
00006820  6e 3b 0a 20 20 78 5f 69  6e 5b 54 48 45 54 41 5f  |n;.  x_in[THETA_|
00006830  44 4f 54 5f 49 4e 44 45  58 5d 09 3d 20 6d 75 6c  |DOT_INDEX].= mul|
00006840  5f 66 72 61 63 31 36 28  73 65 74 75 70 2d 3e 6e  |_frac16(setup->n|
00006850  6f 72 6d 5f 69 6e 5f 72  61 6e 67 65 2c 20 6d 75  |orm_in_range, mu|
00006860  6c 5f 66 72 61 63 31 36  28 73 2d 3e 74 68 65 74  |l_frac16(s->thet|
00006870  61 5f 64 6f 74 2d 74 68  65 74 61 5f 64 6f 74 5f  |a_dot-theta_dot_|
00006880  6d 69 6e 2c 20 74 68 65  74 61 5f 64 6f 74 5f 66  |min, theta_dot_f|
00006890  61 63 74 6f 72 29 29 20  2b 20 73 65 74 75 70 2d  |actor)) + setup-|
000068a0  3e 6e 6f 72 6d 5f 69 6e  5f 6d 69 6e 3b 0a 20 20  |>norm_in_min;.  |
000068b0  78 5f 69 6e 5b 46 4f 52  43 45 5f 49 4e 44 45 58  |x_in[FORCE_INDEX|
000068c0  5d 09 3d 20 6d 75 6c 5f  66 72 61 63 31 36 28 73  |].= mul_frac16(s|
000068d0  65 74 75 70 2d 3e 6e 6f  72 6d 5f 69 6e 5f 72 61  |etup->norm_in_ra|
000068e0  6e 67 65 2c 20 6d 75 6c  5f 66 72 61 63 31 36 28  |nge, mul_frac16(|
000068f0  66 6f 72 63 65 2a 30 2b  66 6f 72 63 65 5f 6d 61  |force*0+force_ma|
00006900  67 2c 20 66 6f 72 63 65  5f 66 61 63 74 6f 72 29  |g, force_factor)|
00006910  29 20 2b 20 73 65 74 75  70 2d 3e 6e 6f 72 6d 5f  |) + setup->norm_|
00006920  69 6e 5f 6d 69 6e 3b 0a  20 20 6e 6f 72 6d 5f 69  |in_min;.  norm_i|
00006930  6e 5f 6d 61 78 20 3d 20  73 65 74 75 70 2d 3e 6e  |n_max = setup->n|
00006940  6f 72 6d 5f 69 6e 5f 6d  69 6e 20 2b 20 73 65 74  |orm_in_min + set|
00006950  75 70 2d 3e 6e 6f 72 6d  5f 69 6e 5f 72 61 6e 67  |up->norm_in_rang|
00006960  65 3b 0a 20 20 66 6f 72  20 28 69 3d 31 3b 20 69  |e;.  for (i=1; i|
00006970  3c 3d 35 3b 20 69 2b 2b  29 20 7b 0a 20 20 20 20  |<=5; i++) {.    |
00006980  69 66 20 28 78 5f 69 6e  5b 69 5d 20 3e 20 6e 6f  |if (x_in[i] > no|
00006990  72 6d 5f 69 6e 5f 6d 61  78 29 20 78 5f 69 6e 5b  |rm_in_max) x_in[|
000069a0  69 5d 20 3d 20 6e 6f 72  6d 5f 69 6e 5f 6d 61 78  |i] = norm_in_max|
000069b0  3b 0a 20 20 20 20 69 66  20 28 78 5f 69 6e 5b 69  |;.    if (x_in[i|
000069c0  5d 20 3c 20 73 65 74 75  70 2d 3e 6e 6f 72 6d 5f  |] < setup->norm_|
000069d0  69 6e 5f 6d 69 6e 29 20  78 5f 69 6e 5b 69 5d 20  |in_min) x_in[i] |
000069e0  3d 20 73 65 74 75 70 2d  3e 6e 6f 72 6d 5f 69 6e  |= setup->norm_in|
000069f0  5f 6d 69 6e 3b 0a 20 20  7d 0a 7d 0a 0a 76 6f 69  |_min;.  }.}..voi|
00006a00  64 20 62 72 6f 6c 6c 79  5f 64 79 6e 61 6d 69 63  |d brolly_dynamic|
00006a10  73 5f 69 6e 70 75 74 28  76 65 63 74 6f 72 20 78  |s_input(vector x|
00006a20  5f 69 6e 2c 20 76 65 63  74 6f 72 20 64 65 73 69  |_in, vector desi|
00006a30  72 65 64 5f 6f 75 74 2c  20 66 66 5f 73 65 74 75  |red_out, ff_setu|
00006a40  70 5f 72 65 63 20 2a 73  65 74 75 70 29 0a 7b 0a  |p_rec *setup).{.|
00006a50  20 20 73 74 61 74 65 5f  72 65 63 20 73 74 61 74  |  state_rec stat|
00006a60  65 2c 20 6e 65 77 5f 73  74 61 74 65 3b 0a 20 20  |e, new_state;.  |
00006a70  75 6e 69 74 20 66 6f 72  63 65 20 3d 20 6d 75 6c  |unit force = mul|
00006a80  5f 66 72 61 63 31 36 63  28 66 6f 72 63 65 5f 6d  |_frac16c(force_m|
00006a90  61 67 2c 20 72 61 6e 64  31 36 28 29 29 3b 0a 20  |ag, rand16());. |
00006aa0  20 67 65 74 5f 72 61 6e  64 6f 6d 5f 62 72 6f 6c  | get_random_brol|
00006ab0  6c 79 5f 73 74 61 74 65  28 26 73 74 61 74 65 29  |ly_state(&state)|
00006ac0  3b 0a 20 20 66 6f 72 63  65 5f 65 66 66 65 63 74  |;.  force_effect|
00006ad0  28 66 6f 72 63 65 2c 20  26 73 74 61 74 65 2c 20  |(force, &state, |
00006ae0  26 6e 65 77 5f 73 74 61  74 65 29 3b 0a 20 20 67  |&new_state);.  g|
00006af0  65 74 5f 6e 65 74 77 6f  72 6b 5f 69 6e 70 75 74  |et_network_input|
00006b00  28 26 73 74 61 74 65 2c  20 78 5f 69 6e 2c 20 66  |(&state, x_in, f|
00006b10  6f 72 63 65 2c 20 73 65  74 75 70 29 3b 0a 20 20  |orce, setup);.  |
00006b20  64 65 73 69 72 65 64 5f  6f 75 74 5b 31 5d 20 3d  |desired_out[1] =|
00006b30  20 6d 75 6c 5f 66 72 61  63 31 36 28 6e 65 77 5f  | mul_frac16(new_|
00006b40  73 74 61 74 65 2e 74 68  65 74 61 2d 74 68 65 74  |state.theta-thet|
00006b50  61 5f 6c 6f 77 5f 6c 69  6d 2c 20 74 68 65 74 61  |a_low_lim, theta|
00006b60  5f 66 61 63 74 6f 72 29  3b 0a 7d 0a 0a 2f 2a 2a  |_factor);.}../**|
00006b70  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00006b80  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 20  |*************** |
00006b90  76 61 72 69 6f 75 73 20  70 6f 73 73 69 62 6c 65  |various possible|
00006ba0  20 63 6f 6e 74 72 6f 6c  6c 65 72 73 21 20 2a 2a  | controllers! **|
00006bb0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00006bd0  2a 2a 2a 2a 2a 2a 2f 0a  0a 2f 2a 61 6e 20 65 6c  |******/../*an el|
00006be0  65 6d 65 6e 74 61 72 79  20 73 74 72 61 74 65 67  |ementary strateg|
00006bf0  79 20 64 6f 6f 6d 65 64  20 74 6f 20 66 61 69 6c  |y doomed to fail|
00006c00  75 72 65 21 2a 2f 0a 75  6e 69 74 20 63 6f 6e 74  |ure!*/.unit cont|
00006c10  72 6f 6c 28 73 74 61 74  65 5f 72 65 63 20 2a 73  |rol(state_rec *s|
00006c20  29 0a 7b 0a 20 20 69 66  20 28 73 2d 3e 74 68 65  |).{.  if (s->the|
00006c30  74 61 3e 67 5f 62 72 6d  5f 73 65 74 75 70 2e 7a  |ta>g_brm_setup.z|
00006c40  65 72 6f 5f 74 68 65 74  61 29 20 20 72 65 74 75  |ero_theta)  retu|
00006c50  72 6e 20 67 5f 62 72 6d  5f 73 65 74 75 70 2e 73  |rn g_brm_setup.s|
00006c60  79 73 74 65 6d 5f 66 6f  72 63 65 5f 69 6e 63 72  |ystem_force_incr|
00006c70  3b 0a 20 20 69 66 20 28  73 2d 3e 74 68 65 74 61  |;.  if (s->theta|
00006c80  3c 2d 67 5f 62 72 6d 5f  73 65 74 75 70 2e 7a 65  |<-g_brm_setup.ze|
00006c90  72 6f 5f 74 68 65 74 61  29 20 72 65 74 75 72 6e  |ro_theta) return|
00006ca0  20 2d 67 5f 62 72 6d 5f  73 65 74 75 70 2e 73 79  | -g_brm_setup.sy|
00006cb0  73 74 65 6d 5f 66 6f 72  63 65 5f 69 6e 63 72 3b  |stem_force_incr;|
00006cc0  0a 20 20 72 65 74 75 72  6e 20 30 3b 0a 7d 0a 0a  |.  return 0;.}..|
00006cd0  2f 2a 74 68 65 20 6e 75  6c 6c 20 27 64 6f 20 6e  |/*the null 'do n|
00006ce0  6f 74 68 69 6e 67 27 20  63 6f 6e 74 72 6f 6c 6c  |othing' controll|
00006cf0  65 72 20 66 6f 72 20 75  73 65 20 77 68 65 6e 20  |er for use when |
00006d00  79 6f 75 20 77 61 6e 74  20 61 20 6d 61 6e 75 61  |you want a manua|
00006d10  6c 20 67 61 6d 65 2a 2f  0a 75 6e 69 74 20 6e 75  |l game*/.unit nu|
00006d20  6c 6c 5f 63 6f 6e 74 72  6f 6c 28 73 74 61 74 65  |ll_control(state|
00006d30  5f 72 65 63 20 2a 73 29  0a 7b 0a 20 20 72 65 74  |_rec *s).{.  ret|
00006d40  75 72 6e 20 30 3b 0a 7d  0a 0a 2f 2a 2a 2a 2a 2a  |urn 0;.}../*****|
00006d50  2a 2a 2a 20 20 20 20 20  20 20 20 20 20 20 20 20  |***             |
00006d60  20 20 20 20 20 20 20 20  20 20 20 20 6f 75 72 20  |            our |
00006d70  6e 65 75 72 61 6c 20 6e  65 74 77 6f 72 6b 20 63  |neural network c|
00006d80  6f 6e 74 72 6f 6c 6c 65  72 20 21 21 21 20 20 20  |ontroller !!!   |
00006d90  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00006da0  20 20 20 20 20 20 20 20  20 20 20 2a 2a 2a 2a 2a  |           *****|
00006db0  2a 2a 2a 2f 0a 0a 75 6e  69 74 20 6e 65 75 72 61  |***/..unit neura|
00006dc0  6c 5f 63 6f 6e 74 72 6f  6c 28 73 74 61 74 65 5f  |l_control(state_|
00006dd0  72 65 63 20 2a 73 29 0a  7b 0a 20 20 75 6e 69 74  |rec *s).{.  unit|
00006de0  20 6f 75 74 5f 61 6e 67  6c 65 3b 0a 20 20 67 65  | out_angle;.  ge|
00006df0  74 5f 6e 65 74 77 6f 72  6b 5f 69 6e 70 75 74 28  |t_network_input(|
00006e00  73 2c 20 67 5f 6e 65 74  77 6f 72 6b 2e 78 5f 69  |s, g_network.x_i|
00006e10  6e 70 2c 20 30 2c 20 26  67 5f 66 66 5f 73 65 74  |np, 0, &g_ff_set|
00006e20  75 70 29 3b 0a 20 20 66  65 65 64 66 6f 72 77 61  |up);.  feedforwa|
00006e30  72 64 28 26 67 5f 6e 65  74 77 6f 72 6b 2c 20 26  |rd(&g_network, &|
00006e40  67 5f 77 65 69 67 68 74  73 2c 20 26 67 5f 66 66  |g_weights, &g_ff|
00006e50  5f 73 65 74 75 70 29 3b  0a 20 20 6f 75 74 5f 61  |_setup);.  out_a|
00006e60  6e 67 6c 65 20 3d 20 6d  75 6c 5f 66 72 61 63 31  |ngle = mul_frac1|
00006e70  36 28 67 5f 6e 65 74 77  6f 72 6b 2e 79 5f 6f 75  |6(g_network.y_ou|
00006e80  74 5b 31 5d 2c 20 74 68  65 74 61 5f 75 70 5f 6c  |t[1], theta_up_l|
00006e90  69 6d 2d 74 68 65 74 61  5f 6c 6f 77 5f 6c 69 6d  |im-theta_low_lim|
00006ea0  29 20 2b 20 74 68 65 74  61 5f 6c 6f 77 5f 6c 69  |) + theta_low_li|
00006eb0  6d 3b 0a 20 20 69 66 20  28 6f 75 74 5f 61 6e 67  |m;.  if (out_ang|
00006ec0  6c 65 3e 67 5f 62 72 6d  5f 73 65 74 75 70 2e 7a  |le>g_brm_setup.z|
00006ed0  65 72 6f 5f 74 68 65 74  61 29 20 20 72 65 74 75  |ero_theta)  retu|
00006ee0  72 6e 20 20 67 5f 62 72  6d 5f 73 65 74 75 70 2e  |rn  g_brm_setup.|
00006ef0  73 79 73 74 65 6d 5f 66  6f 72 63 65 5f 69 6e 63  |system_force_inc|
00006f00  72 3b 0a 20 20 69 66 20  28 6f 75 74 5f 61 6e 67  |r;.  if (out_ang|
00006f10  6c 65 3c 2d 67 5f 62 72  6d 5f 73 65 74 75 70 2e  |le<-g_brm_setup.|
00006f20  7a 65 72 6f 5f 74 68 65  74 61 29 20 72 65 74 75  |zero_theta) retu|
00006f30  72 6e 20 2d 67 5f 62 72  6d 5f 73 65 74 75 70 2e  |rn -g_brm_setup.|
00006f40  73 79 73 74 65 6d 5f 66  6f 72 63 65 5f 69 6e 63  |system_force_inc|
00006f50  72 3b 0a 20 20 72 65 74  75 72 6e 20 30 3b 0a 7d  |r;.  return 0;.}|
00006f60  0a 0a 2f 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |../*************|
00006f70  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00006f80  2a 2a 2a 2a 2a 2a 2a 20  69 6e 69 74 69 61 6c 69  |******* initiali|
00006f90  73 65 20 6e 65 74 77 6f  72 6b 20 64 61 74 61 20  |se network data |
00006fa0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00006fc0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2f 0a 0a 42 4f  |***********/..BO|
00006fd0  4f 4c 20 6e 65 74 77 6f  72 6b 5f 69 6e 69 74 69  |OL network_initi|
00006fe0  61 6c 69 73 65 5f 70 61  72 61 6d 65 74 65 72 73  |alise_parameters|
00006ff0  28 76 6f 69 64 29 0a 7b  0a 20 20 67 65 74 5f 66  |(void).{.  get_f|
00007000  6f 72 63 65 20 3d 20 6e  65 75 72 61 6c 5f 63 6f  |orce = neural_co|
00007010  6e 74 72 6f 6c 3b 0a 20  20 73 70 65 65 64 20 3d  |ntrol;.  speed =|
00007020  20 32 3b 0a 20 20 69 6e  69 74 69 61 6c 69 73 65  | 2;.  initialise|
00007030  5f 62 72 6d 5f 73 65 74  75 70 28 26 67 5f 62 72  |_brm_setup(&g_br|
00007040  6d 5f 73 65 74 75 70 29  3b 0a 20 20 6e 6f 5f 6f  |m_setup);.  no_o|
00007050  66 5f 74 72 61 69 6e 69  6e 67 5f 69 74 65 6d 73  |f_training_items|
00007060  09 09 3d 09 31 30 30 3b  0a 20 20 67 5f 66 66 5f  |..=.100;.  g_ff_|
00007070  73 65 74 75 70 2e 65 72  72 6f 72 5f 74 68 72 65  |setup.error_thre|
00007080  73 68 6f 6c 64 09 3d 09  28 69 6e 74 29 28 30 2e  |shold.=.(int)(0.|
00007090  30 30 36 35 2a 6f 6e 65  29 3b 0a 20 20 67 5f 66  |0065*one);.  g_f|
000070a0  66 5f 73 65 74 75 70 2e  73 74 61 72 74 5f 69 74  |f_setup.start_it|
000070b0  65 72 09 09 3d 09 30 3b  0a 20 20 67 5f 66 66 5f  |er..=.0;.  g_ff_|
000070c0  73 65 74 75 70 2e 6e 6f  5f 6f 66 5f 69 6e 70 75  |setup.no_of_inpu|
000070d0  74 73 09 3d 09 35 3b 0a  20 20 67 5f 66 66 5f 73  |ts.=.5;.  g_ff_s|
000070e0  65 74 75 70 2e 6e 6f 5f  6f 66 5f 68 31 5f 6e 6f  |etup.no_of_h1_no|
000070f0  64 65 73 09 3d 09 32 30  3b 0a 20 20 67 5f 66 66  |des.=.20;.  g_ff|
00007100  5f 73 65 74 75 70 2e 6e  6f 5f 6f 66 5f 6f 75 74  |_setup.no_of_out|
00007110  70 75 74 73 09 3d 09 31  3b 0a 20 20 67 5f 66 66  |puts.=.1;.  g_ff|
00007120  5f 73 65 74 75 70 2e 73  69 67 6d 6f 69 64 5f 6f  |_setup.sigmoid_o|
00007130  75 74 09 3d 09 54 52 55  45 3b 0a 20 20 67 5f 66  |ut.=.TRUE;.  g_f|
00007140  66 5f 73 65 74 75 70 2e  61 6c 70 68 61 09 09 3d  |f_setup.alpha..=|
00007150  09 28 69 6e 74 29 28 30  2e 39 2a 6f 6e 65 29 3b  |.(int)(0.9*one);|
00007160  0a 20 20 67 5f 66 66 5f  73 65 74 75 70 2e 6c 65  |.  g_ff_setup.le|
00007170  61 72 6e 69 6e 67 5f 72  61 74 65 09 3d 09 28 69  |arning_rate.=.(i|
00007180  6e 74 29 28 31 2e 30 2a  6f 6e 65 29 3b 0a 20 20  |nt)(1.0*one);.  |
00007190  67 5f 66 66 5f 73 65 74  75 70 2e 6e 6f 72 6d 5f  |g_ff_setup.norm_|
000071a0  69 6e 5f 6d 69 6e 09 3d  09 28 69 6e 74 29 28 2d  |in_min.=.(int)(-|
000071b0  35 2e 30 2a 6f 6e 65 29  3b 0a 20 20 67 5f 66 66  |5.0*one);.  g_ff|
000071c0  5f 73 65 74 75 70 2e 6e  6f 72 6d 5f 69 6e 5f 72  |_setup.norm_in_r|
000071d0  61 6e 67 65 09 3d 09 2d  32 2a 67 5f 66 66 5f 73  |ange.=.-2*g_ff_s|
000071e0  65 74 75 70 2e 6e 6f 72  6d 5f 69 6e 5f 6d 69 6e  |etup.norm_in_min|
000071f0  3b 0a 20 20 67 5f 75 73  65 72 5f 74 65 72 6d 69  |;.  g_user_termi|
00007200  6e 61 74 65 64 5f 6c 65  61 72 6e 69 6e 67 09 3d  |nated_learning.=|
00007210  09 46 41 4c 53 45 3b 0a  20 20 72 65 74 75 72 6e  |.FALSE;.  return|
00007220  20 54 52 55 45 3b 0a 7d  0a 0a 2f 2a 2a 2a 2a 2a  | TRUE;.}../*****|
00007230  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00007290  2a 2a 2a 2f 0a 2f 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |***/./**********|
000072a0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
000072b0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 20 4d 41 49  |************ MAI|
000072c0  4e 20 47 41 4d 45 20 43  4f 44 45 20 2a 2a 2a 2a  |N GAME CODE ****|
000072d0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000072f0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2f 0a  |**************/.|
00007300  0a 42 4f 4f 4c 20 69 6e  69 74 28 76 6f 69 64 29  |.BOOL init(void)|
00007310  0a 7b 0a 20 20 73 70 72  69 74 65 5f 70 74 72 20  |.{.  sprite_ptr |
00007320  62 73 70 5b 34 37 5d 3b  0a 20 20 63 68 61 72 20  |bsp[47];.  char |
00007330  66 69 6c 65 70 61 74 68  5b 6d 61 78 70 61 74 68  |filepath[maxpath|
00007340  5d 20 3d 20 22 3c 42 72  6f 6c 6c 79 24 44 69 72  |] = "<Brolly$Dir|
00007350  3e 2e 47 72 61 70 68 69  63 73 2e 53 70 72 69 74  |>.Graphics.Sprit|
00007360  65 73 22 3b 0a 20 20 63  68 61 72 20 73 6e 61 6d  |es";.  char snam|
00007370  65 5b 33 5d 3b 0a 20 20  69 6e 74 20 69 3b 0a 20  |e[3];.  int i;. |
00007380  20 73 70 72 69 74 65 5f  69 64 20 73 69 64 3b 0a  | sprite_id sid;.|
00007390  20 20 69 6e 74 20 74 68  31 2c 20 74 68 32 2c 74  |  int th1, th2,t|
000073a0  68 69 2c 74 68 69 32 2c  74 68 63 3b 0a 20 20 69  |hi,thi2,thc;.  i|
000073b0  6e 74 20 61 6e 67 3b 0a  20 20 69 6e 74 20 78 5b  |nt ang;.  int x[|
000073c0  5d 20 3d 20 7b 20 20 31  39 32 2c 20 31 38 36 2c  |] = {  192, 186,|
000073d0  20 31 37 39 2c 20 31 37  30 2c 20 31 36 30 2c 20  | 179, 170, 160, |
000073e0  31 34 39 2c 20 31 33 39  2c 20 31 32 39 2c 20 31  |149, 139, 129, 1|
000073f0  31 39 2c 20 31 30 38 2c  20 20 39 39 2c 20 20 39  |19, 108,  99,  9|
00007400  30 2c 20 20 38 31 2c 20  20 37 33 2c 20 20 36 35  |0,  81,  73,  65|
00007410  2c 0a 20 20 09 20 20 20  20 20 20 20 20 35 37 2c  |,.  .        57,|
00007420  20 20 35 31 2c 20 20 34  36 2c 20 20 34 31 2c 20  |  51,  46,  41, |
00007430  20 33 38 2c 20 20 33 34  2c 20 20 33 32 2c 20 20  | 38,  34,  32,  |
00007440  33 30 2c 20 20 33 30 2c  20 20 32 38 2c 20 20 32  |30,  30,  28,  2|
00007450  37 2c 20 20 32 35 2c 20  20 32 31 2c 20 20 31 37  |7,  25,  21,  17|
00007460  2c 20 20 31 33 2c 20 20  20 37 2c 0a 09 20 20 20  |,  13,   7,..   |
00007470  20 20 20 20 20 20 33 2c  20 20 20 32 2c 20 20 20  |      3,   2,   |
00007480  33 2c 20 20 20 33 2c 20  20 20 32 2c 20 20 20 32  |3,   3,   2,   2|
00007490  2c 20 20 20 32 2c 20 20  20 32 2c 20 20 20 32 2c  |,   2,   2,   2,|
000074a0  20 20 20 32 2c 20 20 20  32 2c 20 20 20 32 2c 20  |   2,   2,   2, |
000074b0  20 20 32 2c 20 20 20 32  2c 20 20 20 31 2c 20 20  |  2,   2,   1,  |
000074c0  20 31 20 20 7d 3b 0a 0a  20 20 76 67 61 20 3d 20  | 1  };..  vga = |
000074d0  72 65 61 64 5f 6d 6f 6e  69 74 6f 72 5f 74 79 70  |read_monitor_typ|
000074e0  65 28 29 3d 3d 6d 75 6c  74 69 20 3f 20 54 52 55  |e()==multi ? TRU|
000074f0  45 20 3a 20 46 41 4c 53  45 3b 0a 20 20 2f 2a 6e  |E : FALSE;.  /*n|
00007500  62 20 61 73 73 65 6d 62  6c 65 72 20 67 72 61 70  |b assembler grap|
00007510  68 69 63 73 20 63 6f 64  65 20 61 73 73 75 6d 65  |hics code assume|
00007520  73 20 6d 6f 64 65 20 69  73 20 36 34 30 20 70 69  |s mode is 640 pi|
00007530  78 65 6c 73 20 77 69 64  65 2a 2f 0a 20 20 69 66  |xels wide*/.  if|
00007540  20 28 76 67 61 29 20 7b  0a 20 20 20 20 6d 6f 64  | (vga) {.    mod|
00007550  65 20 20 3d 20 32 37 3b  0a 20 20 20 20 73 74 72  |e  = 27;.    str|
00007560  63 61 74 28 66 69 6c 65  70 61 74 68 2c 20 22 32  |cat(filepath, "2|
00007570  32 22 29 3b 0a 20 20 20  20 6f 73 79 20 20 20 3d  |2");.    osy   =|
00007580  20 39 36 30 3b 0a 20 20  20 20 67 77 79 20 20 20  | 960;.    gwy   |
00007590  3d 20 2d 33 39 34 3b 0a  20 20 20 20 67 79 20 20  |= -394;.    gy  |
000075a0  20 20 3d 20 35 31 3b 0a  20 20 20 20 6c 78 20 20  |  = 51;.    lx  |
000075b0  20 20 3d 20 31 3b 0a 20  20 20 20 6c 79 20 20 20  |  = 1;.    ly   |
000075c0  20 3d 20 31 3b 0a 20 20  20 20 73 61 72 65 61 20  | = 1;.    sarea |
000075d0  3d 20 34 31 38 30 38 34  2b 36 2a 35 35 36 2b 28  |= 418084+6*556+(|
000075e0  34 34 2b 31 36 30 2a 28  62 68 3e 3e 6c 79 29 29  |44+160*(bh>>ly))|
000075f0  2b 34 3b 0a 20 20 7d 0a  20 20 65 6c 73 65 20 7b  |+4;.  }.  else {|
00007600  0a 20 20 20 20 6d 6f 64  65 20 20 3d 20 31 32 3b  |.    mode  = 12;|
00007610  0a 20 20 20 20 73 74 72  63 61 74 28 66 69 6c 65  |.    strcat(file|
00007620  70 61 74 68 2c 20 22 32  34 22 29 3b 0a 20 20 20  |path, "24");.   |
00007630  20 6f 73 79 20 20 20 3d  20 31 30 32 34 3b 0a 20  | osy   = 1024;. |
00007640  20 20 20 67 77 79 20 20  20 3d 20 2d 34 35 36 3b  |   gwy   = -456;|
00007650  0a 20 20 20 20 67 79 20  20 20 20 3d 20 32 36 3b  |.    gy    = 26;|
00007660  0a 20 20 20 20 6c 78 20  20 20 20 3d 20 31 3b 0a  |.    lx    = 1;.|
00007670  20 20 20 20 6c 79 20 20  20 20 3d 20 32 3b 0a 20  |    ly    = 2;. |
00007680  20 20 20 73 61 72 65 61  20 3d 20 32 31 35 33 39  |   sarea = 21539|
00007690  32 2b 36 2a 33 30 30 2b  28 34 34 2b 31 36 30 2a  |2+6*300+(44+160*|
000076a0  28 62 68 3e 3e 6c 79 29  29 2b 34 3b 0a 20 20 7d  |(bh>>ly))+4;.  }|
000076b0  0a 20 20 6f 72 69 67 69  6e 78 20 20 3d 20 36 34  |.  originx  = 64|
000076c0  30 3b 0a 20 20 6f 72 69  67 69 6e 79 20 20 3d 20  |0;.  originy  = |
000076d0  35 36 34 3b 0a 20 20 61  72 65 61 20 3d 20 6d 61  |564;.  area = ma|
000076e0  6c 6c 6f 63 28 73 61 72  65 61 29 3b 0a 20 20 69  |lloc(sarea);.  i|
000076f0  66 20 28 61 72 65 61 3d  3d 30 29 20 7b 0a 20 20  |f (area==0) {.  |
00007700  20 20 77 65 72 72 28 30  2c 20 22 49 6e 73 75 66  |  werr(0, "Insuf|
00007710  66 69 63 69 65 6e 74 20  6d 65 6d 6f 72 79 22 29  |ficient memory")|
00007720  3b 0a 20 20 20 20 72 65  74 75 72 6e 20 46 41 4c  |;.    return FAL|
00007730  53 45 3b 0a 20 20 7d 0a  20 20 73 70 72 69 74 65  |SE;.  }.  sprite|
00007740  5f 61 72 65 61 5f 69 6e  69 74 69 61 6c 69 73 65  |_area_initialise|
00007750  28 61 72 65 61 2c 20 73  61 72 65 61 29 3b 0a 20  |(area, sarea);. |
00007760  20 77 69 6d 70 74 5f 6e  6f 65 72 72 28 73 70 72  | wimpt_noerr(spr|
00007770  69 74 65 5f 61 72 65 61  5f 6c 6f 61 64 28 61 72  |ite_area_load(ar|
00007780  65 61 2c 20 66 69 6c 65  70 61 74 68 29 29 3b 0a  |ea, filepath));.|
00007790  20 20 73 69 64 2e 74 61  67 20 20 3d 20 73 70 72  |  sid.tag  = spr|
000077a0  69 74 65 5f 69 64 5f 6e  61 6d 65 3b 0a 20 20 73  |ite_id_name;.  s|
000077b0  69 64 2e 73 2e 6e 61 6d  65 20 3d 20 73 6e 61 6d  |id.s.name = snam|
000077c0  65 3b 0a 20 20 66 6f 72  20 28 69 3d 31 3b 20 69  |e;.  for (i=1; i|
000077d0  3c 3d 34 37 3b 20 69 2b  2b 29 20 7b 0a 20 20 20  |<=47; i++) {.   |
000077e0  20 73 70 72 69 6e 74 66  28 73 6e 61 6d 65 2c 20  | sprintf(sname, |
000077f0  22 25 30 32 69 22 2c 20  69 29 3b 0a 20 20 20 20  |"%02i", i);.    |
00007800  77 69 6d 70 74 5f 6e 6f  65 72 72 28 73 70 72 69  |wimpt_noerr(spri|
00007810  74 65 5f 73 65 6c 65 63  74 5f 72 70 28 61 72 65  |te_select_rp(are|
00007820  61 2c 20 26 73 69 64 2c  20 62 73 70 2b 69 2d 31  |a, &sid, bsp+i-1|
00007830  29 29 3b 0a 20 20 7d 0a  20 20 66 6f 72 20 28 69  |));.  }.  for (i|
00007840  3d 30 3b 20 69 3c 3d 39  3b 20 69 2b 2b 29 20 7b  |=0; i<=9; i++) {|
00007850  0a 20 20 20 20 73 70 72  69 6e 74 66 28 73 6e 61  |.    sprintf(sna|
00007860  6d 65 2c 20 22 25 30 31  69 22 2c 20 69 29 3b 0a  |me, "%01i", i);.|
00007870  20 20 20 20 77 69 6d 70  74 5f 6e 6f 65 72 72 28  |    wimpt_noerr(|
00007880  73 70 72 69 74 65 5f 73  65 6c 65 63 74 5f 72 70  |sprite_select_rp|
00007890  28 61 72 65 61 2c 20 26  73 69 64 2c 20 6e 75 6d  |(area, &sid, num|
000078a0  73 2b 69 29 29 3b 0a 20  20 7d 0a 20 20 68 61 6e  |s+i));.  }.  han|
000078b0  64 70 2e 74 61 67 20 20  3d 20 73 70 72 69 74 65  |dp.tag  = sprite|
000078c0  5f 69 64 5f 6e 61 6d 65  3b 0a 20 20 68 61 6e 64  |_id_name;.  hand|
000078d0  70 2e 73 2e 6e 61 6d 65  20 3d 20 22 68 61 6e 64  |p.s.name = "hand|
000078e0  22 3b 0a 20 20 77 69 6d  70 74 5f 6e 6f 65 72 72  |";.  wimpt_noerr|
000078f0  28 73 70 72 69 74 65 5f  73 65 6c 65 63 74 5f 72  |(sprite_select_r|
00007900  70 28 61 72 65 61 2c 20  26 68 61 6e 64 70 2c 20  |p(area, &handp, |
00007910  26 68 61 6e 64 70 2e 73  2e 61 64 64 72 29 29 3b  |&handp.s.addr));|
00007920  0a 20 20 68 61 6e 64 70  2e 74 61 67 20 20 3d 20  |.  handp.tag  = |
00007930  73 70 72 69 74 65 5f 69  64 5f 61 64 64 72 3b 0a  |sprite_id_addr;.|
00007940  20 20 77 61 6c 6c 2e 74  61 67 20 20 3d 20 73 70  |  wall.tag  = sp|
00007950  72 69 74 65 5f 69 64 5f  6e 61 6d 65 3b 0a 20 20  |rite_id_name;.  |
00007960  77 61 6c 6c 2e 73 2e 6e  61 6d 65 20 3d 20 22 77  |wall.s.name = "w|
00007970  61 6c 6c 22 3b 0a 20 20  77 69 6d 70 74 5f 6e 6f  |all";.  wimpt_no|
00007980  65 72 72 28 73 70 72 69  74 65 5f 73 65 6c 65 63  |err(sprite_selec|
00007990  74 5f 72 70 28 61 72 65  61 2c 20 26 77 61 6c 6c  |t_rp(area, &wall|
000079a0  2c 20 26 77 61 6c 6c 2e  73 2e 61 64 64 72 29 29  |, &wall.s.addr))|
000079b0  3b 0a 20 20 77 61 6c 6c  2e 74 61 67 20 20 3d 20  |;.  wall.tag  = |
000079c0  73 70 72 69 74 65 5f 69  64 5f 61 64 64 72 3b 0a  |sprite_id_addr;.|
000079d0  20 20 67 65 74 72 65 61  64 79 2e 74 61 67 20 20  |  getready.tag  |
000079e0  3d 20 73 70 72 69 74 65  5f 69 64 5f 6e 61 6d 65  |= sprite_id_name|
000079f0  3b 0a 20 20 67 65 74 72  65 61 64 79 2e 73 2e 6e  |;.  getready.s.n|
00007a00  61 6d 65 20 3d 20 22 67  65 74 72 65 61 64 79 22  |ame = "getready"|
00007a10  3b 0a 20 20 77 69 6d 70  74 5f 6e 6f 65 72 72 28  |;.  wimpt_noerr(|
00007a20  73 70 72 69 74 65 5f 73  65 6c 65 63 74 5f 72 70  |sprite_select_rp|
00007a30  28 61 72 65 61 2c 20 26  67 65 74 72 65 61 64 79  |(area, &getready|
00007a40  2c 20 26 67 65 74 72 65  61 64 79 2e 73 2e 61 64  |, &getready.s.ad|
00007a50  64 72 29 29 3b 0a 20 20  67 65 74 72 65 61 64 79  |dr));.  getready|
00007a60  2e 74 61 67 20 20 3d 20  73 70 72 69 74 65 5f 69  |.tag  = sprite_i|
00007a70  64 5f 61 64 64 72 3b 0a  0a 20 20 74 68 31 3d 2d  |d_addr;..  th1=-|
00007a80  39 39 39 2a 6f 6e 65 2c  20 74 68 32 3d 2d 36 39  |999*one, th2=-69|
00007a90  2a 6f 6e 65 2c 20 74 68  69 3d 32 33 2a 6f 6e 65  |*one, thi=23*one|
00007aa0  2f 34 2c 20 74 68 69 32  3d 2d 6f 6e 65 2f 34 2c  |/4, thi2=-one/4,|
00007ab0  20 74 68 63 3d 30 3b 0a  20 20 66 6f 72 20 28 69  | thc=0;.  for (i|
00007ac0  3d 30 3b 20 69 3c 3d 31  30 32 34 3b 20 69 2b 2b  |=0; i<=1024; i++|
00007ad0  29 20 7b 0a 20 20 20 20  61 6e 67 20 3d 20 31 38  |) {.    ang = 18|
00007ae0  30 2a 69 2a 28 6f 6e 65  2f 31 30 32 34 29 20 2d  |0*i*(one/1024) -|
00007af0  20 39 30 2a 6f 6e 65 3b  0a 20 20 20 20 69 66 20  | 90*one;.    if |
00007b00  28 61 6e 67 3e 74 68 32  20 26 26 20 61 6e 67 3c  |(ang>th2 && ang<|
00007b10  36 39 2a 6f 6e 65 29 20  7b 0a 20 20 20 20 20 20  |69*one) {.      |
00007b20  74 68 63 2b 2b 2c 20 74  68 31 3d 74 68 32 2c 20  |thc++, th1=th2, |
00007b30  74 68 32 2b 3d 74 68 69  2c 20 74 68 69 2b 3d 74  |th2+=thi, thi+=t|
00007b40  68 69 32 3b 0a 20 20 20  20 20 20 69 66 20 28 74  |hi2;.      if (t|
00007b50  68 69 3d 3d 30 29 20 7b  0a 20 20 20 20 20 20 20  |hi==0) {.       |
00007b60  20 74 68 69 32 3d 2d 74  68 69 32 3b 0a 20 20 20  | thi2=-thi2;.   |
00007b70  20 20 20 20 20 74 68 69  2b 3d 74 68 69 32 3b 0a  |     thi+=thi2;.|
00007b80  20 20 20 20 20 20 7d 0a  20 20 20 20 7d 0a 20 20  |      }.    }.  |
00007b90  20 20 69 66 20 28 74 68  69 32 2d 61 6e 67 3c 61  |  if (thi2-ang<a|
00007ba0  6e 67 2d 74 68 31 29 20  7b 0a 20 20 20 20 20 20  |ng-th1) {.      |
00007bb0  73 70 72 5b 69 5d 20 20  3d 20 62 73 70 5b 74 68  |spr[i]  = bsp[th|
00007bc0  63 5d 3b 0a 20 20 20 20  20 20 73 70 72 78 5b 69  |c];.      sprx[i|
00007bd0  5d 20 3d 20 2d 32 2a 78  5b 74 68 63 5d 3b 0a 20  |] = -2*x[thc];. |
00007be0  20 20 20 7d 0a 20 20 20  20 65 6c 73 65 20 7b 0a  |   }.    else {.|
00007bf0  20 20 20 20 20 20 73 70  72 5b 69 5d 20 20 3d 20  |      spr[i]  = |
00007c00  62 73 70 5b 74 68 63 2d  31 5d 3b 0a 20 20 20 20  |bsp[thc-1];.    |
00007c10  20 20 73 70 72 78 5b 69  5d 20 3d 20 2d 32 2a 78  |  sprx[i] = -2*x|
00007c20  5b 74 68 63 2d 31 5d 3b  0a 20 20 20 20 7d 0a 20  |[thc-1];.    }. |
00007c30  20 7d 0a 20 20 6d 20 20  3d 20 31 31 2a 6f 6e 65  | }.  m  = 11*one|
00007c40  2f 31 30 3b 0a 20 20 6c  20 20 3d 20 6f 6e 65 3b  |/10;.  l  = one;|
00007c50  0a 20 20 6d 62 20 3d 20  6f 6e 65 2f 31 30 3b 0a  |.  mb = one/10;.|
00007c60  20 20 67 20 20 3d 20 39  38 2a 6f 6e 65 2f 31 30  |  g  = 98*one/10|
00007c70  3b 0a 20 20 70 31 20 3d  20 6d 75 6c 5f 66 72 61  |;.  p1 = mul_fra|
00007c80  63 31 36 28 6d 62 2c 20  6c 29 2f 32 3b 0a 20 20  |c16(mb, l)/2;.  |
00007c90  70 32 20 3d 20 6d 75 6c  5f 66 72 61 63 31 36 28  |p2 = mul_frac16(|
00007ca0  6d 2c 20 67 29 3b 0a 20  20 70 33 20 3d 20 32 2a  |m, g);.  p3 = 2*|
00007cb0  6d 75 6c 5f 66 72 61 63  31 36 28 6d 2c 20 6c 29  |mul_frac16(m, l)|
00007cc0  2f 33 3b 0a 0a 20 20 67  6f 72 69 67 69 6e 78 20  |/3;..  goriginx |
00007cd0  3d 20 6f 72 69 67 69 6e  78 3b 0a 20 20 67 6f 72  |= originx;.  gor|
00007ce0  69 67 69 6e 79 20 3d 20  28 6f 73 79 2d 31 2d 6f  |iginy = (osy-1-o|
00007cf0  72 69 67 69 6e 79 29 26  7e 28 28 31 3c 3c 6c 79  |riginy)&~((1<<ly|
00007d00  29 2d 31 29 3b 0a 0a 20  20 6e 65 74 77 6f 72 6b  |)-1);..  network|
00007d10  5f 69 6e 69 74 69 61 6c  69 73 65 5f 70 61 72 61  |_initialise_para|
00007d20  6d 65 74 65 72 73 28 29  3b 0a 20 20 69 66 20 28  |meters();.  if (|
00007d30  21 63 72 65 61 74 65 5f  6d 61 78 5f 6d 69 6e 5f  |!create_max_min_|
00007d40  64 61 74 61 28 29 29 20  72 65 74 75 72 6e 20 46  |data()) return F|
00007d50  41 4c 53 45 3b 0a 20 20  6e 65 74 70 61 72 61 6d  |ALSE;.  netparam|
00007d60  73 5f 74 6f 5f 67 75 69  28 29 3b 0a 0a 20 20 50  |s_to_gui();..  P|
00007d70  43 48 66 6f 72 5b 31 32  5d 20 3d 20 31 33 3b 0a  |CHfor[12] = 13;.|
00007d80  20 20 50 43 48 66 6f 72  5b 31 33 5d 20 3d 20 31  |  PCHfor[13] = 1|
00007d90  34 3b 0a 20 20 50 43 48  66 6f 72 5b 31 34 5d 20  |4;.  PCHfor[14] |
00007da0  3d 20 31 35 3b 0a 20 20  50 43 48 66 6f 72 5b 31  |= 15;.  PCHfor[1|
00007db0  35 5d 20 3d 20 31 36 3b  0a 20 20 50 43 48 66 6f  |5] = 16;.  PCHfo|
00007dc0  72 5b 31 36 5d 20 3d 20  31 32 3b 0a 20 20 50 43  |r[16] = 12;.  PC|
00007dd0  48 66 6f 72 5b 31 37 5d  20 3d 20 31 38 3b 0a 20  |Hfor[17] = 18;. |
00007de0  20 50 43 48 66 6f 72 5b  31 38 5d 20 3d 20 31 39  | PCHfor[18] = 19|
00007df0  3b 0a 20 20 50 43 48 66  6f 72 5b 31 39 5d 20 3d  |;.  PCHfor[19] =|
00007e00  20 32 30 3b 0a 20 20 50  43 48 66 6f 72 5b 32 30  | 20;.  PCHfor[20|
00007e10  5d 20 3d 20 31 37 3b 0a  20 20 50 43 48 61 66 74  |] = 17;.  PCHaft|
00007e20  5b 31 32 5d 20 3d 20 31  36 3b 0a 20 20 50 43 48  |[12] = 16;.  PCH|
00007e30  61 66 74 5b 31 33 5d 20  3d 20 31 32 3b 0a 20 20  |aft[13] = 12;.  |
00007e40  50 43 48 61 66 74 5b 31  34 5d 20 3d 20 31 33 3b  |PCHaft[14] = 13;|
00007e50  0a 20 20 50 43 48 61 66  74 5b 31 35 5d 20 3d 20  |.  PCHaft[15] = |
00007e60  31 34 3b 0a 20 20 50 43  48 61 66 74 5b 31 36 5d  |14;.  PCHaft[16]|
00007e70  20 3d 20 31 35 3b 0a 20  20 50 43 48 61 66 74 5b  | = 15;.  PCHaft[|
00007e80  31 37 5d 20 3d 20 32 30  3b 0a 20 20 50 43 48 61  |17] = 20;.  PCHa|
00007e90  66 74 5b 31 38 5d 20 3d  20 31 37 3b 0a 20 20 50  |ft[18] = 17;.  P|
00007ea0  43 48 61 66 74 5b 31 39  5d 20 3d 20 31 38 3b 0a  |CHaft[19] = 18;.|
00007eb0  20 20 50 43 48 61 66 74  5b 32 30 5d 20 3d 20 31  |  PCHaft[20] = 1|
00007ec0  39 3b 0a 0a 20 20 72 65  74 75 72 6e 20 54 52 55  |9;..  return TRU|
00007ed0  45 3b 0a 7d 0a 0a 76 6f  69 64 20 6c 6f 73 65 28  |E;.}..void lose(|
00007ee0  76 6f 69 64 29 0a 7b 0a  20 20 62 61 6e 6b 20 3d  |void).{.  bank =|
00007ef0  20 33 2d 62 61 6e 6b 3b  0a 20 20 6f 73 5f 73 77  | 3-bank;.  os_sw|
00007f00  69 32 28 4f 53 5f 42 79  74 65 2c 20 31 31 32 2c  |i2(OS_Byte, 112,|
00007f10  20 62 61 6e 6b 29 3b 0a  20 20 2f 2a 70 72 69 6e  | bank);.  /*prin|
00007f20  74 66 28 22 5c 6e 54 6f  74 61 6c 20 74 69 6d 65  |tf("\nTotal time|
00007f30  3a 20 25 69 5c 6e 22 2c  20 63 6c 6f 63 6b 28 29  |: %i\n", clock()|
00007f40  2d 74 69 32 29 3b 2a 2f  0a 20 20 62 62 63 5f 76  |-ti2);*/.  bbc_v|
00007f50  64 75 28 37 29 3b 0a 20  20 72 65 6c 65 61 73 65  |du(7);.  release|
00007f60  28 2d 32 36 29 3b 0a 20  20 72 65 6c 65 61 73 65  |(-26);.  release|
00007f70  28 2d 31 32 32 29 3b 0a  20 20 72 65 6c 65 61 73  |(-122);.  releas|
00007f80  65 28 2d 39 39 29 3b 0a  20 20 62 62 63 5f 63 75  |e(-99);.  bbc_cu|
00007f90  72 73 6f 72 28 30 29 3b  0a 20 20 6f 73 5f 73 77  |rsor(0);.  os_sw|
00007fa0  69 32 28 4f 53 5f 42 79  74 65 2c 20 31 35 2c 20  |i2(OS_Byte, 15, |
00007fb0  31 29 3b 0a 20 20 62 62  63 5f 74 61 62 28 67 65  |1);.  bbc_tab(ge|
00007fc0  74 5f 66 6f 72 63 65 3d  3d 6e 75 6c 6c 5f 63 6f  |t_force==null_co|
00007fd0  6e 74 72 6f 6c 3f 32 30  3a 31 36 2c 33 29 3b 0a  |ntrol?20:16,3);.|
00007fe0  09 09 09 70 72 69 6e 74  66 28 22 20 20 20 20 20  |...printf("     |
00007ff0  20 20 59 6f 75 25 73 20  73 75 72 76 69 76 65 64  |  You%s survived|
00008000  20 66 6f 72 20 25 69 20  73 74 65 70 73 2e 22 2c  | for %i steps.",|
00008010  20 67 65 74 5f 66 6f 72  63 65 3d 3d 6e 75 6c 6c  | get_force==null|
00008020  5f 63 6f 6e 74 72 6f 6c  3f 22 22 3a 22 72 20 6e  |_control?"":"r n|
00008030  65 74 77 6f 72 6b 22 2c  20 67 65 6e 29 3b 0a 20  |etwork", gen);. |
00008040  20 62 62 63 5f 74 61 62  28 32 35 2c 31 31 29 3b  | bbc_tab(25,11);|
00008050  09 70 72 69 6e 74 66 28  22 48 69 74 20 3c 53 70  |.printf("Hit <Sp|
00008060  61 63 65 3e 20 74 6f 20  72 65 74 75 72 6e 20 74  |ace> to return t|
00008070  6f 20 44 65 73 6b 74 6f  70 2e 22 29 3b 0a 20 20  |o Desktop.");.  |
00008080  69 66 20 28 67 65 6e 3e  68 73 63 6f 72 65 29 20  |if (gen>hscore) |
00008090  7b 0a 20 20 20 20 68 73  63 6f 72 65 20 3d 20 67  |{.    hscore = g|
000080a0  65 6e 3b 0a 20 20 20 20  62 62 63 5f 74 61 62 28  |en;.    bbc_tab(|
000080b0  32 36 2c 37 29 3b 09 70  72 69 6e 74 66 28 22 59  |26,7);.printf("Y|
000080c0  6f 75 20 68 61 76 65 20  73 65 74 20 61 20 6e 65  |ou have set a ne|
000080d0  77 20 68 69 67 68 20 73  63 6f 72 65 21 22 29 3b  |w high score!");|
000080e0  0a 20 20 7d 0a 20 20 65  6c 73 65 20 7b 0a 20 20  |.  }.  else {.  |
000080f0  20 20 62 62 63 5f 74 61  62 28 32 36 2c 37 29 3b  |  bbc_tab(26,7);|
00008100  09 70 72 69 6e 74 66 28  22 20 20 20 20 20 20 48  |.printf("      H|
00008110  69 67 68 20 73 63 6f 72  65 3a 20 25 69 22 2c 20  |igh score: %i", |
00008120  68 73 63 6f 72 65 29 3b  0a 20 20 7d 0a 20 20 67  |hscore);.  }.  g|
00008130  61 6d 65 63 2b 2b 3b 0a  20 20 74 6f 74 67 65 6e  |amec++;.  totgen|
00008140  2b 3d 67 65 6e 3b 0a 20  20 62 62 63 5f 74 61 62  |+=gen;.  bbc_tab|
00008150  28 32 36 2c 35 29 3b 09  70 72 69 6e 74 66 28 22  |(26,5);.printf("|
00008160  20 20 20 20 20 20 41 76  65 72 61 67 65 20 73 63  |      Average sc|
00008170  6f 72 65 3a 20 25 69 22  2c 20 28 74 6f 74 67 65  |ore: %i", (totge|
00008180  6e 2b 67 61 6d 65 63 2f  32 29 2f 67 61 6d 65 63  |n+gamec/2)/gamec|
00008190  29 3b 0a 20 20 70 72 65  73 73 28 2d 39 39 29 3b  |);.  press(-99);|
000081a0  0a 20 20 72 65 6c 65 61  73 65 28 2d 39 39 29 3b  |.  release(-99);|
000081b0  0a 20 20 71 75 69 74 3d  54 52 55 45 3b 0a 20 20  |.  quit=TRUE;.  |
000081c0  73 72 61 6e 64 28 30 78  35 35 35 35 35 35 35 35  |srand(0x55555555|
000081d0  2b 63 6c 6f 63 6b 28 29  29 3b 0a 7d 0a 0a 76 6f  |+clock());.}..vo|
000081e0  69 64 20 70 6c 6f 74 5f  62 61 63 6b 67 72 6f 75  |id plot_backgrou|
000081f0  6e 64 28 76 6f 69 64 29  0a 7b 0a 20 20 62 62 63  |nd(void).{.  bbc|
00008200  5f 63 6c 73 28 29 3b 0a  20 20 77 69 6d 70 74 5f  |_cls();.  wimpt_|
00008210  63 6f 6d 70 6c 61 69 6e  28 73 70 72 69 74 65 5f  |complain(sprite_|
00008220  70 75 74 5f 67 69 76 65  6e 28 61 72 65 61 2c 20  |put_given(area, |
00008230  26 77 61 6c 6c 2c 20 30  2c 20 2d 36 34 30 2c 20  |&wall, 0, -640, |
00008240  67 77 79 29 29 3b 0a 7d  0a 0a 76 6f 69 64 20 69  |gwy));.}..void i|
00008250  6e 69 74 5f 67 65 6e 61  6e 64 62 61 72 28 76 6f  |nit_genandbar(vo|
00008260  69 64 29 0a 7b 0a 20 20  69 6e 74 20 69 2c 20 6a  |id).{.  int i, j|
00008270  3b 0a 20 20 63 68 61 72  20 73 6e 61 6d 65 5b 33  |;.  char sname[3|
00008280  5d 3b 0a 20 20 73 70 72  69 74 65 5f 69 64 20 73  |];.  sprite_id s|
00008290  69 64 3b 0a 20 20 6a 3d  67 65 6e 3d 6c 6f 77 67  |id;.  j=gen=lowg|
000082a0  65 6e 3b 0a 20 20 74 6e  64 3d 30 3b 0a 20 20 66  |en;.  tnd=0;.  f|
000082b0  6f 72 20 28 69 3d 30 3b  20 69 3c 36 3b 20 69 2b  |or (i=0; i<6; i+|
000082c0  2b 29 20 7b 0a 20 20 20  20 64 5b 69 5d 20 3d 20  |+) {.    d[i] = |
000082d0  6a 25 31 30 3b 0a 20 20  20 20 69 66 20 28 64 5b  |j%10;.    if (d[|
000082e0  69 5d 21 3d 30 29 20 74  6e 64 3d 69 2b 31 3b 0a  |i]!=0) tnd=i+1;.|
000082f0  20 20 20 20 6a 3d 6a 2f  31 30 3b 0a 20 20 7d 0a  |    j=j/10;.  }.|
00008300  20 20 6f 74 6e 64 3d 76  6f 74 6e 64 3d 74 6e 64  |  otnd=votnd=tnd|
00008310  3b 0a 20 20 69 66 20 28  74 6e 64 21 3d 30 29 20  |;.  if (tnd!=0) |
00008320  7b 0a 20 20 20 20 66 6f  72 20 28 69 3d 30 3b 20  |{.    for (i=0; |
00008330  69 3c 74 6e 64 3b 20 69  2b 2b 29 20 7b 0a 20 20  |i<tnd; i++) {.  |
00008340  20 20 20 20 67 78 5b 69  5d 20 3d 20 33 32 2a 74  |    gx[i] = 32*t|
00008350  6e 64 20 2d 20 36 34 2a  28 69 2b 31 29 3b 0a 20  |nd - 64*(i+1);. |
00008360  20 20 20 20 20 73 70 72  69 6e 74 66 28 73 6e 61  |     sprintf(sna|
00008370  6d 65 2c 20 22 64 25 30  31 69 22 2c 20 69 29 3b  |me, "d%01i", i);|
00008380  0a 20 20 20 20 20 20 77  69 6d 70 74 5f 63 6f 6d  |.      wimpt_com|
00008390  70 6c 61 69 6e 28 73 70  72 69 74 65 5f 67 65 74  |plain(sprite_get|
000083a0  5f 67 69 76 65 6e 28 61  72 65 61 2c 20 73 6e 61  |_given(area, sna|
000083b0  6d 65 2c 20 46 41 4c 53  45 2c 20 67 78 5b 69 5d  |me, FALSE, gx[i]|
000083c0  2c 20 67 6e 79 2c 20 67  78 5b 69 5d 2b 36 33 2c  |, gny, gx[i]+63,|
000083d0  20 67 6e 79 2b 36 33 29  29 3b 0a 20 20 20 20 7d  | gny+63));.    }|
000083e0  0a 20 20 20 20 73 69 64  2e 74 61 67 20 20 3d 20  |.    sid.tag  = |
000083f0  73 70 72 69 74 65 5f 69  64 5f 6e 61 6d 65 3b 0a  |sprite_id_name;.|
00008400  20 20 20 20 73 69 64 2e  73 2e 6e 61 6d 65 20 3d  |    sid.s.name =|
00008410  20 73 6e 61 6d 65 3b 0a  20 20 20 20 66 6f 72 20  | sname;.    for |
00008420  28 69 3d 30 3b 20 69 3c  74 6e 64 3b 20 69 2b 2b  |(i=0; i<tnd; i++|
00008430  29 20 7b 0a 20 20 20 20  20 20 73 70 72 69 6e 74  |) {.      sprint|
00008440  66 28 73 6e 61 6d 65 2c  20 22 64 25 30 31 69 22  |f(sname, "d%01i"|
00008450  2c 20 69 29 3b 0a 20 20  20 20 20 20 77 69 6d 70  |, i);.      wimp|
00008460  74 5f 63 6f 6d 70 6c 61  69 6e 28 73 70 72 69 74  |t_complain(sprit|
00008470  65 5f 73 65 6c 65 63 74  5f 72 70 28 61 72 65 61  |e_select_rp(area|
00008480  2c 20 26 73 69 64 2c 20  6e 75 6d 62 61 63 6b 73  |, &sid, numbacks|
00008490  2b 69 29 29 3b 0a 20 20  20 20 7d 0a 20 20 7d 0a  |+i));.    }.  }.|
000084a0  20 20 77 69 6d 70 74 5f  63 6f 6d 70 6c 61 69 6e  |  wimpt_complain|
000084b0  28 73 70 72 69 74 65 5f  67 65 74 5f 67 69 76 65  |(sprite_get_give|
000084c0  6e 5f 72 70 28 61 72 65  61 2c 20 22 62 61 72 22  |n_rp(area, "bar"|
000084d0  2c 20 46 41 4c 53 45 2c  20 2d 33 32 30 2c 20 62  |, FALSE, -320, b|
000084e0  79 2c 20 2d 33 32 30 2b  36 33 39 2c 20 62 79 2b  |y, -320+639, by+|
000084f0  62 68 2d 31 20 20 2c 26  62 61 72 29 29 3b 0a 7d  |bh-1  ,&bar));.}|
00008500  0a 0a 76 6f 69 64 20 67  65 6e 6e 75 6d 62 65 72  |..void gennumber|
00008510  28 76 6f 69 64 29 0a 7b  0a 20 20 69 6e 74 20 6e  |(void).{.  int n|
00008520  63 64 64 3b 09 09 09 2f  2a 6e 75 6d 62 65 72 20  |cdd;.../*number |
00008530  6f 66 20 63 68 61 6e 67  65 64 20 64 69 67 69 74  |of changed digit|
00008540  73 20 74 6f 20 62 65 20  64 69 73 70 6c 61 79 65  |s to be displaye|
00008550  64 20 28 6e 62 20 62 61  6e 6b 20 73 77 61 70 70  |d (nb bank swapp|
00008560  69 6e 67 20 69 6d 70 6c  69 65 73 20 6f 76 65 72  |ing implies over|
00008570  70 72 69 6e 74 69 6e 67  20 6f 6e 20 73 63 72 65  |printing on scre|
00008580  65 6e 20 32 20 66 72 61  6d 65 73 20 62 61 63 6b  |en 2 frames back|
00008590  29 2a 2f 0a 20 20 69 6e  74 20 6e 63 64 65 3b 09  |)*/.  int ncde;.|
000085a0  09 09 2f 2a 6e 75 6d 62  65 72 20 6f 66 20 63 68  |../*number of ch|
000085b0  61 6e 67 65 64 20 64 69  67 69 74 73 20 74 6f 20  |anged digits to |
000085c0  62 65 20 65 72 61 73 65  64 2a 2f 0a 20 20 69 6e  |be erased*/.  in|
000085d0  74 20 69 3b 0a 20 20 63  68 61 72 20 73 6e 61 6d  |t i;.  char snam|
000085e0  65 5b 33 5d 3b 0a 20 20  73 70 72 69 74 65 5f 69  |e[3];.  sprite_i|
000085f0  64 20 73 69 64 3b 0a 20  20 76 6f 74 6e 64 3d 6f  |d sid;.  votnd=o|
00008600  74 6e 64 3b 0a 20 20 6f  6e 63 64 3d 6e 63 64 3b  |tnd;.  oncd=ncd;|
00008610  0a 20 20 6f 74 6e 64 3d  74 6e 64 3b 0a 20 20 66  |.  otnd=tnd;.  f|
00008620  6f 72 20 28 69 3d 30 3b  20 69 3c 36 3b 20 69 2b  |or (i=0; i<6; i+|
00008630  2b 29 20 69 66 20 28 64  5b 69 5d 21 3d 39 29 20  |+) if (d[i]!=9) |
00008640  62 72 65 61 6b 3b 0a 20  20 6e 63 64 20 3d 20 69  |break;.  ncd = i|
00008650  2b 31 3b 0a 20 20 69 66  20 28 6e 63 64 3e 74 6e  |+1;.  if (ncd>tn|
00008660  64 29 20 74 6e 64 3d 6e  63 64 3b 0a 20 20 69 66  |d) tnd=ncd;.  if|
00008670  20 28 6e 63 64 3d 3d 37  29 20 6e 63 64 3d 74 6e  | (ncd==7) ncd=tn|
00008680  64 3d 31 3b 0a 20 20 6e  63 64 64 20 3d 20 6e 63  |d=1;.  ncdd = nc|
00008690  64 3e 6f 6e 63 64 20 3f  20 6e 63 64 20 3a 20 6f  |d>oncd ? ncd : o|
000086a0  6e 63 64 3b 0a 20 20 6e  63 64 65 20 3d 20 74 6e  |ncd;.  ncde = tn|
000086b0  64 21 3d 76 6f 74 6e 64  20 3f 20 76 6f 74 6e 64  |d!=votnd ? votnd|
000086c0  20 3a 20 6e 63 64 64 3b  0a 20 20 2f 2a 65 72 61  | : ncdd;.  /*era|
000086d0  73 65 20 6f 6c 64 20 6e  75 6d 62 65 72 73 20 28  |se old numbers (|
000086e0  6e 63 64 65 20 61 74 20  63 6f 6f 72 64 73 20 69  |ncde at coords i|
000086f0  6e 20 6f 78 5b 5d 29 2c  20 65 78 63 65 70 74 20  |n ox[]), except |
00008700  6f 6e 20 31 73 74 20 32  20 66 72 61 6d 65 73 20  |on 1st 2 frames |
00008710  77 68 65 72 65 20 61 72  65 20 6e 6f 6e 65 2a 2f  |where are none*/|
00008720  0a 20 20 69 66 20 28 67  65 6e 2d 6c 6f 77 67 65  |.  if (gen-lowge|
00008730  6e 3e 31 29 20 66 6f 72  20 28 69 3d 30 3b 20 69  |n>1) for (i=0; i|
00008740  3c 6e 63 64 65 3b 20 69  2b 2b 29 20 65 72 61 73  |<ncde; i++) eras|
00008750  65 5f 6e 75 6d 62 65 72  28 61 72 65 61 2c 20 6e  |e_number(area, n|
00008760  75 6d 62 61 63 6b 73 5b  69 5d 2c 20 67 6f 78 5b  |umbacks[i], gox[|
00008770  69 5d 2c 20 67 6e 79 29  3b 0a 20 20 65 6c 73 65  |i], gny);.  else|
00008780  20 6e 63 64 64 3d 74 6e  64 3b 0a 20 20 66 6f 72  | ncdd=tnd;.  for|
00008790  20 28 69 3d 35 3b 20 69  3e 3d 30 3b 20 69 2d 2d  | (i=5; i>=0; i--|
000087a0  29 20 67 6f 78 5b 69 5d  3d 67 78 5b 69 5d 3b 0a  |) gox[i]=gx[i];.|
000087b0  20 20 69 66 20 28 74 6e  64 21 3d 6f 74 6e 64 29  |  if (tnd!=otnd)|
000087c0  20 7b 0a 20 20 20 20 66  6f 72 20 28 69 3d 30 3b  | {.    for (i=0;|
000087d0  20 69 3c 74 6e 64 3b 20  69 2b 2b 29 20 7b 0a 20  | i<tnd; i++) {. |
000087e0  20 20 20 20 20 67 78 5b  69 5d 20 3d 20 33 32 2a  |     gx[i] = 32*|
000087f0  74 6e 64 20 2d 20 36 34  2a 28 69 2b 31 29 3b 0a  |tnd - 64*(i+1);.|
00008800  20 20 20 20 7d 0a 20 20  7d 0a 20 20 65 6c 73 65  |    }.  }.  else|
00008810  20 69 66 20 28 74 6e 64  21 3d 76 6f 74 6e 64 29  | if (tnd!=votnd)|
00008820  20 7b 0a 20 20 20 20 66  6f 72 20 28 69 3d 30 3b  | {.    for (i=0;|
00008830  20 69 3c 74 6e 64 3b 20  69 2b 2b 29 20 7b 0a 20  | i<tnd; i++) {. |
00008840  20 20 20 20 20 73 70 72  69 6e 74 66 28 73 6e 61  |     sprintf(sna|
00008850  6d 65 2c 20 22 64 25 30  31 69 22 2c 20 69 29 3b  |me, "d%01i", i);|
00008860  0a 20 20 20 20 20 20 77  69 6d 70 74 5f 63 6f 6d  |.      wimpt_com|
00008870  70 6c 61 69 6e 28 73 70  72 69 74 65 5f 67 65 74  |plain(sprite_get|
00008880  5f 67 69 76 65 6e 28 61  72 65 61 2c 20 73 6e 61  |_given(area, sna|
00008890  6d 65 2c 20 46 41 4c 53  45 2c 20 67 78 5b 69 5d  |me, FALSE, gx[i]|
000088a0  2c 20 67 6e 79 2c 20 67  78 5b 69 5d 2b 36 33 2c  |, gny, gx[i]+63,|
000088b0  20 67 6e 79 2b 36 33 29  29 3b 0a 20 20 20 20 7d  | gny+63));.    }|
000088c0  0a 20 20 20 20 73 69 64  2e 74 61 67 20 20 3d 20  |.    sid.tag  = |
000088d0  73 70 72 69 74 65 5f 69  64 5f 6e 61 6d 65 3b 0a  |sprite_id_name;.|
000088e0  20 20 20 20 73 69 64 2e  73 2e 6e 61 6d 65 20 3d  |    sid.s.name =|
000088f0  20 73 6e 61 6d 65 3b 0a  20 20 20 20 66 6f 72 20  | sname;.    for |
00008900  28 69 3d 30 3b 20 69 3c  74 6e 64 3b 20 69 2b 2b  |(i=0; i<tnd; i++|
00008910  29 20 7b 0a 20 20 20 20  20 20 73 70 72 69 6e 74  |) {.      sprint|
00008920  66 28 73 6e 61 6d 65 2c  20 22 64 25 30 31 69 22  |f(sname, "d%01i"|
00008930  2c 20 69 29 3b 0a 20 20  20 20 20 20 77 69 6d 70  |, i);.      wimp|
00008940  74 5f 63 6f 6d 70 6c 61  69 6e 28 73 70 72 69 74  |t_complain(sprit|
00008950  65 5f 73 65 6c 65 63 74  5f 72 70 28 61 72 65 61  |e_select_rp(area|
00008960  2c 20 26 73 69 64 2c 20  6e 75 6d 62 61 63 6b 73  |, &sid, numbacks|
00008970  2b 69 29 29 3b 0a 20 20  20 20 7d 0a 20 20 20 20  |+i));.    }.    |
00008980  73 69 64 2e 73 2e 6e 61  6d 65 20 3d 20 22 62 61  |sid.s.name = "ba|
00008990  72 22 3b 0a 20 20 20 20  77 69 6d 70 74 5f 63 6f  |r";.    wimpt_co|
000089a0  6d 70 6c 61 69 6e 28 73  70 72 69 74 65 5f 73 65  |mplain(sprite_se|
000089b0  6c 65 63 74 5f 72 70 28  61 72 65 61 2c 20 26 73  |lect_rp(area, &s|
000089c0  69 64 2c 20 26 62 61 72  29 29 3b 0a 20 20 7d 0a  |id, &bar));.  }.|
000089d0  20 20 2f 2a 6e 6f 77 20  69 6e 63 20 65 61 63 68  |  /*now inc each|
000089e0  20 64 69 67 69 74 20 73  74 6f 72 65 64 20 69 6e  | digit stored in|
000089f0  64 69 76 69 64 75 61 6c  6c 79 20 61 6e 64 20 70  |dividually and p|
00008a00  6c 6f 74 20 61 73 20 6d  61 6e 79 20 61 73 20 68  |lot as many as h|
00008a10  61 76 65 20 63 68 61 6e  67 65 64 20 73 69 6e 63  |ave changed sinc|
00008a20  65 20 32 20 66 72 61 6d  65 73 20 62 61 63 6b 2a  |e 2 frames back*|
00008a30  2f 0a 20 20 66 6f 72 20  28 69 3d 30 3b 20 69 3c  |/.  for (i=0; i<|
00008a40  36 3b 20 69 2b 2b 29 20  7b 0a 20 20 20 20 69 66  |6; i++) {.    if|
00008a50  20 28 2b 2b 64 5b 69 5d  3d 3d 31 30 29 20 64 5b  | (++d[i]==10) d[|
00008a60  69 5d 3d 30 3b 0a 20 20  20 20 65 6c 73 65 20 62  |i]=0;.    else b|
00008a70  72 65 61 6b 3b 0a 20 20  7d 0a 20 20 66 6f 72 20  |reak;.  }.  for |
00008a80  28 69 3d 30 3b 20 69 3c  6e 63 64 64 3b 20 69 2b  |(i=0; i<ncdd; i+|
00008a90  2b 29 20 70 6c 6f 74 5f  6e 75 6d 62 65 72 28 61  |+) plot_number(a|
00008aa0  72 65 61 2c 20 6e 75 6d  73 5b 64 5b 69 5d 5d 2c  |rea, nums[d[i]],|
00008ab0  20 67 78 5b 69 5d 2c 20  67 6e 79 29 3b 0a 20 20  | gx[i], gny);.  |
00008ac0  67 65 6e 2b 2b 3b 0a 7d  0a 0a 76 6f 69 64 20 70  |gen++;.}..void p|
00008ad0  6c 6f 74 5f 6f 62 6a 65  63 74 73 28 76 6f 69 64  |lot_objects(void|
00008ae0  29 0a 7b 0a 20 20 65 72  61 73 65 5f 62 72 6f 6c  |).{.  erase_brol|
00008af0  6c 79 28 73 70 72 5b 76  6f 69 5d 2c 20 76 6f 78  |ly(spr[voi], vox|
00008b00  2b 73 70 72 78 5b 76 6f  69 5d 2c 20 2d 36 34 29  |+sprx[voi], -64)|
00008b10  3b 0a 20 20 65 72 61 73  65 5f 68 61 6e 64 28 61  |;.  erase_hand(a|
00008b20  72 65 61 2c 20 68 61 6e  64 70 2e 73 2e 61 64 64  |rea, handp.s.add|
00008b30  72 2c 20 76 6f 78 2d 37  32 2c 20 2d 36 34 2d 36  |r, vox-72, -64-6|
00008b40  34 29 3b 0a 20 20 69 66  20 28 76 6f 66 21 3d 30  |4);.  if (vof!=0|
00008b50  29 20 65 72 61 73 65 5f  62 61 72 28 62 68 2c 20  |) erase_bar(bh, |
00008b60  62 61 72 2c 20 2d 33 32  30 2c 20 62 79 29 3b 0a  |bar, -320, by);.|
00008b70  20 20 70 6c 6f 74 5f 62  72 6f 6c 6c 79 28 61 72  |  plot_brolly(ar|
00008b80  65 61 2c 20 73 70 72 5b  73 70 72 69 5d 2c 20 69  |ea, spr[spri], i|
00008b90  78 2b 73 70 72 78 5b 73  70 72 69 5d 2c 20 30 2d  |x+sprx[spri], 0-|
00008ba0  36 34 29 3b 0a 20 20 70  6c 6f 74 5f 68 61 6e 64  |64);.  plot_hand|
00008bb0  28 61 72 65 61 2c 20 68  61 6e 64 70 2e 73 2e 61  |(area, handp.s.a|
00008bc0  64 64 72 2c 20 69 78 2d  37 32 2c 20 2d 36 34 2d  |ddr, ix-72, -64-|
00008bd0  36 34 29 3b 0a 20 20 69  66 20 28 66 21 3d 30 29  |64);.  if (f!=0)|
00008be0  20 70 6c 6f 74 5f 62 61  72 28 30 2c 20 62 79 2c  | plot_bar(0, by,|
00008bf0  20 66 2f 28 6f 6e 65 2f  33 32 29 2c 20 62 68 2c  | f/(one/32), bh,|
00008c00  20 62 63 69 29 3b 0a 20  20 76 6f 66 3d 6f 66 3b  | bci);.  vof=of;|
00008c10  0a 20 20 6f 66 3d 66 3b  0a 20 20 67 65 6e 6e 75  |.  of=f;.  gennu|
00008c20  6d 62 65 72 28 29 3b 0a  7d 0a 0a 76 6f 69 64 20  |mber();.}..void |
00008c30  73 74 61 72 74 5f 67 61  6d 65 28 76 6f 69 64 29  |start_game(void)|
00008c40  0a 7b 0a 20 20 71 75 69  74 20 3d 20 46 41 4c 53  |.{.  quit = FALS|
00008c50  45 3b 0a 20 20 74 69 20  20 20 3d 20 63 6c 6f 63  |E;.  ti   = cloc|
00008c60  6b 28 29 3b 0a 20 20 66  20 3d 20 6f 66 20 3d 20  |k();.  f = of = |
00008c70  76 6f 66 20 3d 20 30 3b  0a 20 20 73 65 74 5f 62  |vof = 0;.  set_b|
00008c80  72 6f 6c 6c 79 5f 61 74  5f 73 74 61 72 74 5f 70  |rolly_at_start_p|
00008c90  6f 73 69 74 69 6f 6e 28  26 67 5f 62 72 6d 5f 73  |osition(&g_brm_s|
00008ca0  74 61 74 65 29 3b 0a 20  20 76 6f 78 20 3d 20 6f  |tate);.  vox = o|
00008cb0  78 20 3d 20 69 78 20 3d  20 28 67 5f 62 72 6d 5f  |x = ix = (g_brm_|
00008cc0  73 74 61 74 65 2e 78 5f  70 6f 73 2b 31 34 30 29  |state.x_pos+140)|
00008cd0  2f 32 38 30 3b 0a 20 20  76 6f 69 20 3d 20 6f 69  |/280;.  voi = oi|
00008ce0  20 3d 20 73 70 72 69 20  3d 20 35 31 32 20 2b 20  | = spri = 512 + |
00008cf0  28 67 5f 62 72 6d 5f 73  74 61 74 65 2e 74 68 65  |(g_brm_state.the|
00008d00  74 61 2b 31 30 31 29 2f  32 30 31 3b 0a 20 20 70  |ta+101)/201;.  p|
00008d10  6c 6f 74 5f 62 61 63 6b  67 72 6f 75 6e 64 28 29  |lot_background()|
00008d20  3b 0a 20 20 73 77 61 70  5f 62 61 6e 6b 73 28 29  |;.  swap_banks()|
00008d30  3b 0a 20 20 70 6c 6f 74  5f 62 61 63 6b 67 72 6f  |;.  plot_backgro|
00008d40  75 6e 64 28 29 3b 0a 20  20 69 6e 69 74 5f 67 65  |und();.  init_ge|
00008d50  6e 61 6e 64 62 61 72 28  29 3b 0a 20 20 77 69 6d  |nandbar();.  wim|
00008d60  70 74 5f 63 6f 6d 70 6c  61 69 6e 28 73 70 72 69  |pt_complain(spri|
00008d70  74 65 5f 70 75 74 5f 67  69 76 65 6e 28 61 72 65  |te_put_given(are|
00008d80  61 2c 20 26 67 65 74 72  65 61 64 79 2c 20 30 2c  |a, &getready, 0,|
00008d90  20 2d 32 37 30 2c 20 34  30 30 29 29 3b 0a 20 20  | -270, 400));.  |
00008da0  70 6c 6f 74 5f 6f 62 6a  65 63 74 73 28 29 3b 0a  |plot_objects();.|
00008db0  20 20 73 77 61 70 5f 62  61 6e 6b 73 28 29 3b 0a  |  swap_banks();.|
00008dc0  20 20 66 6f 72 20 28 74  69 3d 63 6c 6f 63 6b 28  |  for (ti=clock(|
00008dd0  29 3b 20 63 6c 6f 63 6b  28 29 2d 74 69 3c 3d 32  |); clock()-ti<=2|
00008de0  30 30 3b 29 3b 0a 20 20  62 61 6e 6b 20 3d 20 33  |00;);.  bank = 3|
00008df0  2d 62 61 6e 6b 3b 0a 20  20 70 6c 6f 74 5f 62 61  |-bank;.  plot_ba|
00008e00  72 28 2d 32 37 32 2c 20  34 30 30 2c 20 35 34 34  |r(-272, 400, 544|
00008e10  2c 20 36 34 2c 20 30 29  3b 0a 20 20 62 61 6e 6b  |, 64, 0);.  bank|
00008e20  20 3d 20 33 2d 62 61 6e  6b 3b 0a 20 20 62 62 63  | = 3-bank;.  bbc|
00008e30  5f 76 64 75 28 37 29 3b  0a 20 20 66 20 3d 20 72  |_vdu(7);.  f = r|
00008e40  61 6e 64 28 29 3e 52 41  4e 44 5f 4d 41 58 2f 32  |and()>RAND_MAX/2|
00008e50  20 3f 20 67 5f 62 72 6d  5f 73 65 74 75 70 2e 72  | ? g_brm_setup.r|
00008e60  61 6e 64 5f 66 6f 72 63  65 20 3a 20 2d 67 5f 62  |and_force : -g_b|
00008e70  72 6d 5f 73 65 74 75 70  2e 72 61 6e 64 5f 66 6f  |rm_setup.rand_fo|
00008e80  72 63 65 3b 0a 20 20 65  76 6f 6c 76 65 28 66 2c  |rce;.  evolve(f,|
00008e90  20 26 67 5f 62 72 6d 5f  73 74 61 74 65 2c 20 26  | &g_brm_state, &|
00008ea0  67 5f 62 72 6d 5f 73 74  61 74 65 29 3b 0a 20 20  |g_brm_state);.  |
00008eb0  74 69 32 3d 63 6c 6f 63  6b 28 29 3b 0a 7d 0a 0a  |ti2=clock();.}..|
00008ec0  76 6f 69 64 20 70 6c 61  79 5f 67 61 6d 65 28 76  |void play_game(v|
00008ed0  6f 69 64 29 0a 7b 0a 20  20 73 74 61 72 74 5f 67  |oid).{.  start_g|
00008ee0  61 6d 65 28 29 3b 0a 20  20 66 6f 72 20 28 3b 21  |ame();.  for (;!|
00008ef0  71 75 69 74 3b 29 20 7b  0a 20 20 20 20 76 6f 78  |quit;) {.    vox|
00008f00  20 3d 20 6f 78 3b 0a 20  20 20 20 76 6f 69 20 3d  | = ox;.    voi =|
00008f10  20 6f 69 3b 0a 20 20 20  20 6f 78 20 20 3d 20 69  | oi;.    ox  = i|
00008f20  78 3b 0a 20 20 20 20 6f  69 20 20 3d 20 73 70 72  |x;.    oi  = spr|
00008f30  69 3b 0a 20 20 20 20 69  78 20 3d 20 28 67 5f 62  |i;.    ix = (g_b|
00008f40  72 6d 5f 73 74 61 74 65  2e 78 5f 70 6f 73 2b 31  |rm_state.x_pos+1|
00008f50  34 30 29 2f 32 38 30 3b  20 2f 2a 20 28 37 2f 38  |40)/280; /* (7/8|
00008f60  20 2a 20 36 34 30 29 2a  28 78 2f 6f 6e 65 29 2f  | * 640)*(x/one)/|
00008f70  32 2e 34 20 2a 2f 0a 20  20 20 20 73 70 72 69 20  |2.4 */.    spri |
00008f80  3d 20 35 31 32 20 2b 20  28 67 5f 62 72 6d 5f 73  |= 512 + (g_brm_s|
00008f90  74 61 74 65 2e 74 68 65  74 61 2b 31 30 31 29 2f  |tate.theta+101)/|
00008fa0  32 30 31 3b 20 2f 2a 20  31 30 32 34 2a 28 74 68  |201; /* 1024*(th|
00008fb0  2f 6f 6e 65 29 2f 50 49  20 2b 20 35 31 32 20 2a  |/one)/PI + 512 *|
00008fc0  2f 0a 20 20 20 20 69 66  20 28 73 70 72 69 3c 30  |/.    if (spri<0|
00008fd0  29 20 20 20 20 73 70 72  69 3d 30 3b 0a 20 20 20  |)    spri=0;.   |
00008fe0  20 69 66 20 28 73 70 72  69 3e 31 30 32 34 29 20  | if (spri>1024) |
00008ff0  73 70 72 69 3d 31 30 32  34 3b 0a 20 20 20 20 70  |spri=1024;.    p|
00009000  6c 6f 74 5f 6f 62 6a 65  63 74 73 28 29 3b 0a 20  |lot_objects();. |
00009010  20 20 20 70 61 75 73 65  28 29 3b 0a 20 20 20 20  |   pause();.    |
00009020  73 77 61 70 5f 62 61 6e  6b 73 28 29 3b 0a 20 20  |swap_banks();.  |
00009030  20 20 69 66 20 28 61 62  73 28 67 5f 62 72 6d 5f  |  if (abs(g_brm_|
00009040  73 74 61 74 65 2e 78 5f  70 6f 73 29 3e 78 5f 70  |state.x_pos)>x_p|
00009050  6f 73 5f 6d 61 78 20 7c  7c 20 61 62 73 28 67 5f  |os_max || abs(g_|
00009060  62 72 6d 5f 73 74 61 74  65 2e 74 68 65 74 61 29  |brm_state.theta)|
00009070  3e 74 68 65 74 61 5f 6d  61 78 20 7c 7c 20 62 62  |>theta_max || bb|
00009080  63 5f 69 6e 6b 65 79 28  2d 39 39 29 29 20 7b 0a  |c_inkey(-99)) {.|
00009090  20 20 20 20 20 20 6c 6f  73 65 28 29 3b 0a 20 20  |      lose();.  |
000090a0  20 20 20 20 62 72 65 61  6b 3b 0a 20 20 20 20 7d  |    break;.    }|
000090b0  0a 20 20 20 20 66 20 3d  20 67 65 74 5f 66 6f 72  |.    f = get_for|
000090c0  63 65 28 26 67 5f 62 72  6d 5f 73 74 61 74 65 29  |ce(&g_brm_state)|
000090d0  3b 0a 20 20 20 20 69 66  20 28 62 62 63 5f 69 6e  |;.    if (bbc_in|
000090e0  6b 65 79 28 2d 32 36 29  29 20 20 66 2d 3d 67 5f  |key(-26))  f-=g_|
000090f0  62 72 6d 5f 73 65 74 75  70 2e 75 73 65 72 5f 66  |brm_setup.user_f|
00009100  6f 72 63 65 5f 69 6e 63  72 3b 0a 20 20 20 20 69  |orce_incr;.    i|
00009110  66 20 28 62 62 63 5f 69  6e 6b 65 79 28 2d 31 32  |f (bbc_inkey(-12|
00009120  32 29 29 20 66 2b 3d 67  5f 62 72 6d 5f 73 65 74  |2)) f+=g_brm_set|
00009130  75 70 2e 75 73 65 72 5f  66 6f 72 63 65 5f 69 6e  |up.user_force_in|
00009140  63 72 3b 0a 20 20 20 20  69 66 20 28 66 3e 4d 41  |cr;.    if (f>MA|
00009150  58 5f 46 4f 52 43 45 29  20 20 66 3d 4d 41 58 5f  |X_FORCE)  f=MAX_|
00009160  46 4f 52 43 45 3b 0a 20  20 20 20 69 66 20 28 66  |FORCE;.    if (f|
00009170  3c 2d 4d 41 58 5f 46 4f  52 43 45 29 20 66 3d 2d  |<-MAX_FORCE) f=-|
00009180  4d 41 58 5f 46 4f 52 43  45 3b 0a 20 20 20 20 65  |MAX_FORCE;.    e|
00009190  76 6f 6c 76 65 28 66 2c  20 26 67 5f 62 72 6d 5f  |volve(f, &g_brm_|
000091a0  73 74 61 74 65 2c 20 26  67 5f 62 72 6d 5f 73 74  |state, &g_brm_st|
000091b0  61 74 65 29 3b 0a 20 20  7d 0a 7d 0a 0a 2f 2a 2a  |ate);.  }.}../**|
000091c0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00009220  2a 2a 2a 2a 2a 2a 2f 0a  2f 2a 2a 2a 2a 2a 2a 2a  |******/./*******|
00009230  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
00009240  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 20  |*************** |
00009250  57 49 4d 50 20 46 55 4e  43 54 49 4f 4e 53 20 20  |WIMP FUNCTIONS  |
00009260  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
00009290  2a 2f 0a 0a 2f 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |*/../***********|
000092a0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
000092b0  20 66 69 6c 65 20 66 75  6e 63 74 69 6f 6e 73 20  | file functions |
000092c0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
*
000092e0  2a 2f 0a 0a 73 74 61 74  69 63 20 69 6e 74 20 70  |*/..static int p|
000092f0  62 70 5f 6c 61 73 74 63  68 75 6e 6b 73 69 7a 65  |bp_lastchunksize|
00009300  3b 0a 0a 42 4f 4f 4c 20  70 61 72 61 6d 65 74 65  |;..BOOL paramete|
00009310  72 73 5f 62 75 66 66 65  72 5f 70 72 6f 63 65 73  |rs_buffer_proces|
00009320  73 6f 72 28 63 68 61 72  20 2a 2a 62 75 66 66 65  |sor(char **buffe|
00009330  72 2c 20 69 6e 74 20 2a  73 69 7a 65 29 0a 7b 0a  |r, int *size).{.|
00009340  20 20 69 6e 74 20 65 78  74 65 6e 73 69 6f 6e 20  |  int extension |
00009350  3d 20 34 30 39 36 3b 0a  20 20 69 6e 74 20 6f 66  |= 4096;.  int of|
00009360  66 73 65 74 20 3d 20 2a  62 75 66 66 65 72 20 2d  |fset = *buffer -|
00009370  20 70 66 69 6c 65 3b 0a  20 20 63 68 61 72 20 2a  | pfile;.  char *|
00009380  6e 65 77 62 6c 6f 63 6b  20 3d 20 72 65 61 6c 6c  |newblock = reall|
00009390  6f 63 28 70 66 69 6c 65  2c 20 6f 66 66 73 65 74  |oc(pfile, offset|
000093a0  2b 2a 73 69 7a 65 2b 31  2b 65 78 74 65 6e 73 69  |+*size+1+extensi|
000093b0  6f 6e 29 3b 0a 20 20 69  66 20 28 6e 65 77 62 6c  |on);.  if (newbl|
000093c0  6f 63 6b 3d 3d 30 29 20  7b 0a 20 20 20 20 77 65  |ock==0) {.    we|
000093d0  72 72 28 30 2c 20 6d 73  67 73 5f 6c 6f 6f 6b 75  |rr(0, msgs_looku|
000093e0  70 28 22 4d 65 6d 52 4c  31 22 29 29 3b 0a 20 20  |p("MemRL1"));.  |
000093f0  20 20 72 65 74 75 72 6e  20 46 41 4c 53 45 3b 0a  |  return FALSE;.|
00009400  20 20 7d 0a 20 20 70 66  69 6c 65 20 3d 20 6e 65  |  }.  pfile = ne|
00009410  77 62 6c 6f 63 6b 3b 0a  20 20 70 66 69 6c 65 5f  |wblock;.  pfile_|
00009420  6c 65 6e 67 74 68 20 2b  3d 20 65 78 74 65 6e 73  |length += extens|
00009430  69 6f 6e 3b 0a 20 20 2a  62 75 66 66 65 72 20 3d  |ion;.  *buffer =|
00009440  20 70 66 69 6c 65 2b 6f  66 66 73 65 74 2b 2a 73  | pfile+offset+*s|
00009450  69 7a 65 3b 0a 20 20 70  62 70 5f 6c 61 73 74 63  |ize;.  pbp_lastc|
00009460  68 75 6e 6b 73 69 7a 65  20 3d 20 2a 73 69 7a 65  |hunksize = *size|
00009470  20 3d 20 65 78 74 65 6e  73 69 6f 6e 3b 0a 20 20  | = extension;.  |
00009480  72 65 74 75 72 6e 20 54  52 55 45 3b 0a 7d 0a 0a  |return TRUE;.}..|
00009490  42 4f 4f 4c 20 70 61 72  61 6d 65 74 65 72 73 5f  |BOOL parameters_|
000094a0  6c 6f 61 64 5f 72 61 6d  28 76 6f 69 64 29 0a 7b  |load_ram(void).{|
000094b0  0a 20 20 69 6e 74 20 65  73 74 73 69 7a 65 3b 0a  |.  int estsize;.|
000094c0  20 20 69 6e 74 20 66 69  6c 65 74 79 70 65 3d 78  |  int filetype=x|
000094d0  66 65 72 72 65 63 76 5f  63 68 65 63 6b 69 6d 70  |ferrecv_checkimp|
000094e0  6f 72 74 28 26 65 73 74  73 69 7a 65 29 3b 0a 20  |ort(&estsize);. |
000094f0  20 69 66 20 28 70 66 69  6c 65 29 20 7b 0a 20 20  | if (pfile) {.  |
00009500  20 20 66 72 65 65 28 70  66 69 6c 65 29 3b 0a 20  |  free(pfile);. |
00009510  20 20 20 70 66 69 6c 65  3d 30 3b 0a 20 20 7d 0a  |   pfile=0;.  }.|
00009520  20 20 69 66 20 28 66 69  6c 65 74 79 70 65 21 3d  |  if (filetype!=|
00009530  2d 31 29 20 7b 0a 20 20  20 20 69 6e 74 20 66 69  |-1) {.    int fi|
00009540  6e 61 6c 5f 73 69 7a 65  3b 0a 20 20 20 20 69 66  |nal_size;.    if|
00009550  20 28 66 69 6c 65 74 79  70 65 21 3d 30 78 66 66  | (filetype!=0xff|
00009560  66 29 20 7b 0a 20 20 20  20 20 20 77 65 72 72 28  |f) {.      werr(|
00009570  30 2c 20 22 49 6c 6c 65  67 61 6c 20 61 74 74 65  |0, "Illegal atte|
00009580  6d 70 74 20 74 6f 20 6c  6f 61 64 20 61 20 6e 6f  |mpt to load a no|
00009590  6e 2d 74 65 78 74 20 66  69 6c 65 22 29 3b 0a 20  |n-text file");. |
000095a0  20 20 20 20 20 72 65 74  75 72 6e 20 46 41 4c 53  |     return FALS|
000095b0  45 3b 0a 20 20 20 20 7d  0a 20 20 20 20 70 66 69  |E;.    }.    pfi|
000095c0  6c 65 20 3d 20 6d 61 6c  6c 6f 63 28 65 73 74 73  |le = malloc(ests|
000095d0  69 7a 65 2b 31 29 3b 0a  20 20 20 20 69 66 20 28  |ize+1);.    if (|
000095e0  70 66 69 6c 65 3d 3d 30  29 20 7b 0a 20 20 20 20  |pfile==0) {.    |
000095f0  20 20 77 65 72 72 28 30  2c 20 22 49 6e 73 75 66  |  werr(0, "Insuf|
00009600  66 69 63 69 65 6e 74 20  6d 65 6d 6f 72 79 20 66  |ficient memory f|
00009610  6f 72 20 64 61 74 61 20  74 72 61 6e 73 66 65 72  |or data transfer|
00009620  22 29 3b 0a 20 20 20 20  20 20 72 65 74 75 72 6e  |");.      return|
00009630  20 46 41 4c 53 45 3b 0a  20 20 20 20 7d 0a 20 20  | FALSE;.    }.  |
00009640  20 20 70 66 69 6c 65 5f  6c 65 6e 67 74 68 20 3d  |  pfile_length =|
00009650  20 70 62 70 5f 6c 61 73  74 63 68 75 6e 6b 73 69  | pbp_lastchunksi|
00009660  7a 65 20 3d 20 65 73 74  73 69 7a 65 3b 0a 20 20  |ze = estsize;.  |
00009670  20 20 69 66 20 28 66 69  6e 61 6c 5f 73 69 7a 65  |  if (final_size|
00009680  3d 78 66 65 72 72 65 63  76 5f 64 6f 69 6d 70 6f  |=xferrecv_doimpo|
00009690  72 74 28 70 66 69 6c 65  2c 20 65 73 74 73 69 7a  |rt(pfile, estsiz|
000096a0  65 2c 20 70 61 72 61 6d  65 74 65 72 73 5f 62 75  |e, parameters_bu|
000096b0  66 66 65 72 5f 70 72 6f  63 65 73 73 6f 72 29 2c  |ffer_processor),|
000096c0  0a 20 20 20 20 20 20 20  20 66 69 6e 61 6c 5f 73  |.        final_s|
000096d0  69 7a 65 3e 3d 30 29 20  7b 0a 20 20 20 20 20 20  |ize>=0) {.      |
000096e0  70 66 69 6c 65 5f 6c 65  6e 67 74 68 20 2b 3d 20  |pfile_length += |
000096f0  66 69 6e 61 6c 5f 73 69  7a 65 20 2d 20 70 62 70  |final_size - pbp|
00009700  5f 6c 61 73 74 63 68 75  6e 6b 73 69 7a 65 3b 0a  |_lastchunksize;.|
00009710  20 20 20 20 20 20 70 66  69 6c 65 5b 70 66 69 6c  |      pfile[pfil|
00009720  65 5f 6c 65 6e 67 74 68  5d 3d 27 5c 30 27 3b 0a  |e_length]='\0';.|
00009730  20 20 20 20 20 20 69 66  20 28 73 74 72 73 74 72  |      if (strstr|
00009740  28 70 66 69 6c 65 2c 20  22 4e 65 75 72 61 6c 20  |(pfile, "Neural |
00009750  4e 65 74 20 57 65 69 67  68 74 73 20 46 69 6c 65  |Net Weights File|
00009760  22 29 29 20 72 65 74 75  72 6e 20 54 52 55 45 3b  |")) return TRUE;|
00009770  0a 20 20 20 20 20 20 77  65 72 72 28 30 2c 20 22  |.      werr(0, "|
00009780  49 6c 6c 65 67 61 6c 20  61 74 74 65 6d 70 74 20  |Illegal attempt |
00009790  74 6f 20 6c 6f 61 64 20  61 20 66 69 6c 65 20 77  |to load a file w|
000097a0  68 69 63 68 20 64 6f 65  73 20 6e 6f 74 20 63 6f  |hich does not co|
000097b0  6e 74 61 69 6e 20 77 65  69 67 68 74 73 20 64 61  |ntain weights da|
000097c0  74 61 22 29 3b 0a 20 20  20 20 20 20 72 65 74 75  |ta");.      retu|
000097d0  72 6e 20 46 41 4c 53 45  3b 0a 20 20 20 20 7d 0a  |rn FALSE;.    }.|
000097e0  20 20 20 20 77 65 72 72  28 30 2c 20 22 57 65 69  |    werr(0, "Wei|
000097f0  67 68 74 73 20 6c 6f 61  64 20 66 61 69 6c 65 64  |ghts load failed|
00009800  22 29 3b 0a 20 20 20 20  72 65 74 75 72 6e 20 46  |");.    return F|
00009810  41 4c 53 45 3b 0a 20 20  7d 0a 20 20 72 65 74 75  |ALSE;.  }.  retu|
00009820  72 6e 20 70 61 72 61 6d  65 74 65 72 73 5f 6c 6f  |rn parameters_lo|
00009830  61 64 5f 66 69 6c 65 28  29 3b 0a 7d 0a 0a 42 4f  |ad_file();.}..BO|
00009840  4f 4c 20 70 61 72 61 6d  65 74 65 72 73 5f 6c 6f  |OL parameters_lo|
00009850  61 64 5f 66 69 6c 65 28  76 6f 69 64 29 0a 7b 0a  |ad_file(void).{.|
00009860  20 20 6f 73 5f 72 65 67  73 65 74 20 72 3b 0a 20  |  os_regset r;. |
00009870  20 6f 73 5f 65 72 72 6f  72 20 2a 65 3b 0a 20 20  | os_error *e;.  |
00009880  63 68 61 72 20 2a 66 69  6c 65 6e 61 6d 65 3b 0a  |char *filename;.|
00009890  20 20 69 6e 74 20 66 69  6c 65 74 79 70 65 3d 78  |  int filetype=x|
000098a0  66 65 72 72 65 63 76 5f  63 68 65 63 6b 69 6e 73  |ferrecv_checkins|
000098b0  65 72 74 28 26 66 69 6c  65 6e 61 6d 65 29 3b 0a  |ert(&filename);.|
000098c0  20 20 69 66 20 28 70 66  69 6c 65 29 20 7b 0a 20  |  if (pfile) {. |
000098d0  20 20 20 66 72 65 65 28  70 66 69 6c 65 29 3b 0a  |   free(pfile);.|
000098e0  20 20 20 20 70 66 69 6c  65 3d 30 3b 0a 20 20 7d  |    pfile=0;.  }|
000098f0  0a 20 20 69 66 20 28 66  69 6c 65 74 79 70 65 21  |.  if (filetype!|
00009900  3d 30 78 66 66 66 29 20  7b 0a 20 20 20 20 77 65  |=0xfff) {.    we|
00009910  72 72 28 30 2c 20 22 49  6c 6c 65 67 61 6c 20 61  |rr(0, "Illegal a|
00009920  74 74 65 6d 70 74 20 74  6f 20 6c 6f 61 64 20 61  |ttempt to load a|
00009930  20 6e 6f 6e 2d 74 65 78  74 20 66 69 6c 65 22 29  | non-text file")|
00009940  3b 0a 20 20 20 20 72 65  74 75 72 6e 20 46 41 4c  |;.    return FAL|
00009950  53 45 3b 0a 20 20 7d 0a  20 20 72 2e 72 5b 30 5d  |SE;.  }.  r.r[0]|
00009960  3d 35 3b 20 20 20 20 20  20 20 20 20 20 20 20 20  |=5;             |
00009970  20 2f 2a 63 68 65 63 6b  20 66 69 6c 65 20 73 69  | /*check file si|
00009980  7a 65 2a 2f 0a 20 20 72  2e 72 5b 31 5d 3d 28 69  |ze*/.  r.r[1]=(i|
00009990  6e 74 29 66 69 6c 65 6e  61 6d 65 3b 0a 20 20 77  |nt)filename;.  w|
000099a0  69 6d 70 74 5f 63 6f 6d  70 6c 61 69 6e 28 65 3d  |impt_complain(e=|
000099b0  6f 73 5f 73 77 69 78 28  4f 53 5f 46 69 6c 65 20  |os_swix(OS_File |
000099c0  7c 20 58 4f 53 5f 42 69  74 2c 20 26 72 29 29 3b  || XOS_Bit, &r));|
000099d0  0a 20 20 69 66 20 28 65  29 20 72 65 74 75 72 6e  |.  if (e) return|
000099e0  20 46 41 4c 53 45 3b 0a  20 20 70 66 69 6c 65 5f  | FALSE;.  pfile_|
000099f0  6c 65 6e 67 74 68 20 3d  20 72 2e 72 5b 34 5d 3b  |length = r.r[4];|
00009a00  0a 20 20 70 66 69 6c 65  20 3d 20 6d 61 6c 6c 6f  |.  pfile = mallo|
00009a10  63 28 70 66 69 6c 65 5f  6c 65 6e 67 74 68 2b 31  |c(pfile_length+1|
00009a20  29 3b 0a 20 20 69 66 20  28 70 66 69 6c 65 3d 3d  |);.  if (pfile==|
00009a30  30 29 20 7b 0a 20 20 20  20 77 65 72 72 28 30 2c  |0) {.    werr(0,|
00009a40  20 22 49 6e 73 75 66 66  69 63 69 65 6e 74 20 6d  | "Insufficient m|
00009a50  65 6d 6f 72 79 20 74 6f  20 6c 6f 61 64 20 66 69  |emory to load fi|
00009a60  6c 65 22 29 3b 0a 20 20  20 20 72 65 74 75 72 6e  |le");.    return|
00009a70  20 46 41 4c 53 45 3b 0a  20 20 7d 0a 20 20 72 2e  | FALSE;.  }.  r.|
00009a80  72 5b 30 5d 3d 32 35 35  3b 20 20 20 20 20 20 20  |r[0]=255;       |
00009a90  20 20 20 20 20 2f 2a 6c  6f 61 64 20 66 69 6c 65  |     /*load file|
00009aa0  2a 2f 0a 20 20 72 2e 72  5b 32 5d 3d 28 69 6e 74  |*/.  r.r[2]=(int|
00009ab0  29 70 66 69 6c 65 3b 0a  20 20 72 2e 72 5b 33 5d  |)pfile;.  r.r[3]|
00009ac0  3d 30 3b 0a 20 20 77 69  6d 70 74 5f 63 6f 6d 70  |=0;.  wimpt_comp|
00009ad0  6c 61 69 6e 28 65 3d 6f  73 5f 73 77 69 78 28 4f  |lain(e=os_swix(O|
00009ae0  53 5f 46 69 6c 65 20 7c  20 58 4f 53 5f 42 69 74  |S_File | XOS_Bit|
00009af0  2c 20 26 72 29 29 3b 0a  20 20 69 66 20 28 65 29  |, &r));.  if (e)|
00009b00  20 72 65 74 75 72 6e 20  46 41 4c 53 45 3b 0a 20  | return FALSE;. |
00009b10  20 70 66 69 6c 65 5b 70  66 69 6c 65 5f 6c 65 6e  | pfile[pfile_len|
00009b20  67 74 68 5d 3d 27 5c 30  27 3b 0a 20 20 69 66 20  |gth]='\0';.  if |
00009b30  28 73 74 72 73 74 72 28  70 66 69 6c 65 2c 20 22  |(strstr(pfile, "|
00009b40  4e 65 75 72 61 6c 20 4e  65 74 20 57 65 69 67 68  |Neural Net Weigh|
00009b50  74 73 20 46 69 6c 65 22  29 29 20 7b 0a 20 20 20  |ts File")) {.   |
00009b60  20 69 66 20 28 78 66 65  72 72 65 63 76 5f 66 69  | if (xferrecv_fi|
00009b70  6c 65 5f 69 73 5f 73 61  66 65 28 29 29 20 7b 0a  |le_is_safe()) {.|
00009b80  20 20 20 20 20 20 73 74  72 6e 63 70 79 28 66 69  |      strncpy(fi|
00009b90  6c 65 70 61 74 68 5f 70  61 72 61 6d 65 74 65 72  |lepath_parameter|
00009ba0  73 2c 20 66 69 6c 65 6e  61 6d 65 2c 20 6d 61 78  |s, filename, max|
00009bb0  70 61 74 68 29 3b 0a 20  20 20 20 20 20 77 74 73  |path);.      wts|
00009bc0  73 61 66 65 20 3d 20 54  52 55 45 3b 0a 20 20 20  |safe = TRUE;.   |
00009bd0  20 7d 0a 20 20 20 20 78  66 65 72 72 65 63 76 5f  | }.    xferrecv_|
00009be0  69 6e 73 65 72 74 66 69  6c 65 6f 6b 28 29 3b 0a  |insertfileok();.|
00009bf0  20 20 20 20 72 65 74 75  72 6e 20 54 52 55 45 3b  |    return TRUE;|
00009c00  0a 20 20 7d 0a 20 20 77  65 72 72 28 30 2c 20 22  |.  }.  werr(0, "|
00009c10  49 6c 6c 65 67 61 6c 20  61 74 74 65 6d 70 74 20  |Illegal attempt |
00009c20  74 6f 20 6c 6f 61 64 20  61 20 66 69 6c 65 20 77  |to load a file w|
00009c30  68 69 63 68 20 64 6f 65  73 20 6e 6f 74 20 63 6f  |hich does not co|
00009c40  6e 74 61 69 6e 20 77 65  69 67 68 74 73 20 64 61  |ntain weights da|
00009c50  74 61 22 29 3b 0a 20 20  72 65 74 75 72 6e 20 46  |ta");.  return F|
00009c60  41 4c 53 45 3b 0a 7d 0a  0a 42 4f 4f 4c 20 70 6c  |ALSE;.}..BOOL pl|
00009c70  64 5f 72 65 61 64 64 28  63 68 61 72 20 2a 73 2c  |d_readd(char *s,|
00009c80  20 63 68 61 72 20 2a 6b  2c 20 66 70 20 2a 66 29  | char *k, fp *f)|
00009c90  0a 7b 0a 20 20 63 68 61  72 20 2a 70 74 72 3b 0a  |.{.  char *ptr;.|
00009ca0  20 20 64 6f 75 62 6c 65  20 64 3b 0a 20 20 69 66  |  double d;.  if|
00009cb0  20 28 70 74 72 3d 73 74  72 73 74 72 28 73 2c 20  | (ptr=strstr(s, |
00009cc0  6b 29 2c 20 70 74 72 29  20 7b 0a 20 20 20 20 69  |k), ptr) {.    i|
00009cd0  66 20 28 73 73 63 61 6e  66 28 70 74 72 2b 73 74  |f (sscanf(ptr+st|
00009ce0  72 6c 65 6e 28 6b 29 2c  20 22 25 6c 67 22 2c 20  |rlen(k), "%lg", |
00009cf0  26 64 29 21 3d 45 4f 46  29 20 7b 0a 20 20 20 20  |&d)!=EOF) {.    |
00009d00  20 20 2a 66 20 3d 20 64  74 6f 66 70 28 64 29 3b  |  *f = dtofp(d);|
00009d10  0a 20 20 20 20 20 20 72  65 74 75 72 6e 20 54 52  |.      return TR|
00009d20  55 45 3b 0a 20 20 20 20  7d 0a 20 20 7d 0a 20 20  |UE;.    }.  }.  |
00009d30  72 65 74 75 72 6e 20 46  41 4c 53 45 3b 0a 7d 0a  |return FALSE;.}.|
00009d40  0a 42 4f 4f 4c 20 70 6c  64 5f 72 65 61 64 69 28  |.BOOL pld_readi(|
00009d50  63 68 61 72 20 2a 73 2c  20 63 68 61 72 20 2a 6b  |char *s, char *k|
00009d60  2c 20 69 6e 74 20 2a 69  29 0a 7b 0a 20 20 63 68  |, int *i).{.  ch|
00009d70  61 72 20 2a 70 74 72 3b  0a 20 20 69 66 20 28 70  |ar *ptr;.  if (p|
00009d80  74 72 3d 73 74 72 73 74  72 28 73 2c 20 6b 29 2c  |tr=strstr(s, k),|
00009d90  20 70 74 72 29 20 7b 0a  20 20 20 20 69 66 20 28  | ptr) {.    if (|
00009da0  73 73 63 61 6e 66 28 70  74 72 2b 73 74 72 6c 65  |sscanf(ptr+strle|
00009db0  6e 28 6b 29 2c 20 22 25  69 22 2c 20 69 29 21 3d  |n(k), "%i", i)!=|
00009dc0  45 4f 46 29 20 72 65 74  75 72 6e 20 54 52 55 45  |EOF) return TRUE|
00009dd0  3b 0a 20 20 7d 0a 20 20  72 65 74 75 72 6e 20 46  |;.  }.  return F|
00009de0  41 4c 53 45 3b 0a 7d 0a  0a 42 4f 4f 4c 20 70 6c  |ALSE;.}..BOOL pl|
00009df0  64 5f 72 65 61 64 62 28  63 68 61 72 20 2a 73 2c  |d_readb(char *s,|
00009e00  20 63 68 61 72 20 2a 6b  2c 20 63 68 61 72 20 2a  | char *k, char *|
00009e10  61 2c 20 42 4f 4f 4c 20  2a 62 29 0a 7b 0a 20 20  |a, BOOL *b).{.  |
00009e20  63 68 61 72 20 2a 70 74  72 3b 0a 20 20 63 68 61  |char *ptr;.  cha|
00009e30  72 20 62 75 66 5b 32 35  36 5d 3b 0a 20 20 69 66  |r buf[256];.  if|
00009e40  20 28 70 74 72 3d 73 74  72 73 74 72 28 73 2c 20  | (ptr=strstr(s, |
00009e50  6b 29 2c 20 70 74 72 29  20 7b 0a 20 20 20 20 69  |k), ptr) {.    i|
00009e60  66 20 28 73 73 63 61 6e  66 28 70 74 72 2b 73 74  |f (sscanf(ptr+st|
00009e70  72 6c 65 6e 28 6b 29 2c  20 22 25 32 35 36 73 22  |rlen(k), "%256s"|
00009e80  2c 20 62 75 66 29 21 3d  45 4f 46 29 20 7b 0a 20  |, buf)!=EOF) {. |
00009e90  20 20 20 20 20 2a 62 20  3d 20 73 74 72 6e 63 6d  |     *b = strncm|
00009ea0  70 28 61 2c 20 62 75 66  2c 20 32 35 36 29 3d 3d  |p(a, buf, 256)==|
00009eb0  30 3b 0a 20 20 20 20 20  20 72 65 74 75 72 6e 20  |0;.      return |
00009ec0  54 52 55 45 3b 0a 20 20  20 20 7d 0a 20 20 7d 0a  |TRUE;.    }.  }.|
00009ed0  20 20 72 65 74 75 72 6e  20 46 41 4c 53 45 3b 0a  |  return FALSE;.|
00009ee0  7d 0a 0a 42 4f 4f 4c 20  70 61 72 61 6d 65 74 65  |}..BOOL paramete|
00009ef0  72 73 5f 6c 6f 61 64 5f  64 65 63 6f 64 65 28 76  |rs_load_decode(v|
00009f00  6f 69 64 29 0a 7b 0a 20  20 63 68 61 72 20 2a 70  |oid).{.  char *p|
00009f10  74 72 3b 20 20 20 20 20  20 20 20 20 2f 2a 72 65  |tr;         /*re|
00009f20  61 64 20 76 61 6c 75 65  73 20 66 72 6f 6d 20 74  |ad values from t|
00009f30  65 78 74 20 62 75 66 66  65 72 20 74 6f 20 76 61  |ext buffer to va|
00009f40  72 69 61 62 6c 65 73 2a  2f 0a 20 20 42 4f 4f 4c  |riables*/.  BOOL|
00009f50  20 62 3b 0a 20 20 42 4f  4f 4c 20 72 65 74 63 6f  | b;.  BOOL retco|
00009f60  64 65 20 3d 20 46 41 4c  53 45 3b 0a 20 20 69 6e  |de = FALSE;.  in|
00009f70  74 20 69 2c 20 6a 2c 20  63 3b 0a 20 20 64 6f 75  |t i, j, c;.  dou|
00009f80  62 6c 65 20 64 3b 0a 20  20 70 6c 64 5f 72 65 61  |ble d;.  pld_rea|
00009f90  64 69 28 70 66 69 6c 65  2c 20 22 23 20 68 69 64  |di(pfile, "# hid|
00009fa0  64 65 6e 20 6c 61 79 65  72 20 6e 6f 64 65 73 3a  |den layer nodes:|
00009fb0  22 2c 20 26 67 5f 66 66  5f 73 65 74 75 70 2e 6e  |", &g_ff_setup.n|
00009fc0  6f 5f 6f 66 5f 68 31 5f  6e 6f 64 65 73 29 3b 0a  |o_of_h1_nodes);.|
00009fd0  20 20 70 6c 64 5f 72 65  61 64 64 28 70 66 69 6c  |  pld_readd(pfil|
00009fe0  65 2c 20 22 61 6c 70 68  61 3a 22 2c 20 26 67 5f  |e, "alpha:", &g_|
00009ff0  66 66 5f 73 65 74 75 70  2e 61 6c 70 68 61 29 3b  |ff_setup.alpha);|
0000a000  0a 20 20 70 6c 64 5f 72  65 61 64 64 28 70 66 69  |.  pld_readd(pfi|
0000a010  6c 65 2c 20 22 6c 65 61  72 6e 69 6e 67 20 72 61  |le, "learning ra|
0000a020  74 65 3a 22 2c 20 26 67  5f 66 66 5f 73 65 74 75  |te:", &g_ff_setu|
0000a030  70 2e 6c 65 61 72 6e 69  6e 67 5f 72 61 74 65 29  |p.learning_rate)|
0000a040  3b 0a 20 20 70 6c 64 5f  72 65 61 64 69 28 70 66  |;.  pld_readi(pf|
0000a050  69 6c 65 2c 20 22 73 74  61 72 74 20 69 74 65 72  |ile, "start iter|
0000a060  61 74 69 6f 6e 3a 22 2c  20 26 67 5f 66 66 5f 73  |ation:", &g_ff_s|
0000a070  65 74 75 70 2e 73 74 61  72 74 5f 69 74 65 72 29  |etup.start_iter)|
0000a080  3b 0a 20 20 70 6c 64 5f  72 65 61 64 69 28 70 66  |;.  pld_readi(pf|
0000a090  69 6c 65 2c 20 22 23 20  74 72 61 69 6e 69 6e 67  |ile, "# training|
0000a0a0  20 69 74 65 6d 73 3a 22  2c 20 26 6e 6f 5f 6f 66  | items:", &no_of|
0000a0b0  5f 74 72 61 69 6e 69 6e  67 5f 69 74 65 6d 73 29  |_training_items)|
0000a0c0  3b 0a 20 20 70 6c 64 5f  72 65 61 64 64 28 70 66  |;.  pld_readd(pf|
0000a0d0  69 6c 65 2c 20 22 65 72  72 6f 72 20 74 68 72 65  |ile, "error thre|
0000a0e0  73 68 6f 6c 64 3a 22 2c  20 26 67 5f 66 66 5f 73  |shold:", &g_ff_s|
0000a0f0  65 74 75 70 2e 65 72 72  6f 72 5f 74 68 72 65 73  |etup.error_thres|
0000a100  68 6f 6c 64 29 3b 0a 20  20 70 6c 64 5f 72 65 61  |hold);.  pld_rea|
0000a110  64 64 28 70 66 69 6c 65  2c 20 22 72 61 6e 64 6f  |dd(pfile, "rando|
0000a120  6d 20 66 6f 72 63 65 3a  22 2c 20 26 67 5f 62 72  |m force:", &g_br|
0000a130  6d 5f 73 65 74 75 70 2e  72 61 6e 64 5f 66 6f 72  |m_setup.rand_for|
0000a140  63 65 29 3b 0a 20 20 70  6c 64 5f 72 65 61 64 64  |ce);.  pld_readd|
0000a150  28 70 66 69 6c 65 2c 20  22 73 79 73 74 65 6d 20  |(pfile, "system |
0000a160  66 6f 72 63 65 3a 22 2c  20 26 67 5f 62 72 6d 5f  |force:", &g_brm_|
0000a170  73 65 74 75 70 2e 73 79  73 74 65 6d 5f 66 6f 72  |setup.system_for|
0000a180  63 65 5f 69 6e 63 72 29  3b 0a 20 20 70 6c 64 5f  |ce_incr);.  pld_|
0000a190  72 65 61 64 64 28 70 66  69 6c 65 2c 20 22 75 73  |readd(pfile, "us|
0000a1a0  65 72 20 66 6f 72 63 65  3a 22 2c 20 26 67 5f 62  |er force:", &g_b|
0000a1b0  72 6d 5f 73 65 74 75 70  2e 75 73 65 72 5f 66 6f  |rm_setup.user_fo|
0000a1c0  72 63 65 5f 69 6e 63 72  29 3b 0a 20 20 70 6c 64  |rce_incr);.  pld|
0000a1d0  5f 72 65 61 64 64 28 70  66 69 6c 65 2c 20 22 7a  |_readd(pfile, "z|
0000a1e0  65 72 6f 20 74 68 65 74  61 20 74 6f 6c 6c 65 72  |ero theta toller|
0000a1f0  61 6e 63 65 3a 22 2c 20  26 67 5f 62 72 6d 5f 73  |ance:", &g_brm_s|
0000a200  65 74 75 70 2e 7a 65 72  6f 5f 74 68 65 74 61 29  |etup.zero_theta)|
0000a210  3b 0a 20 20 69 66 20 28  70 6c 64 5f 72 65 61 64  |;.  if (pld_read|
0000a220  62 28 70 66 69 6c 65 2c  20 22 73 70 65 65 64 3a  |b(pfile, "speed:|
0000a230  22 2c 20 22 66 61 73 74  22 2c 20 26 62 29 29 20  |", "fast", &b)) |
0000a240  73 70 65 65 64 20 3d 20  62 20 3f 20 32 20 3a 20  |speed = b ? 2 : |
0000a250  34 3b 0a 20 20 69 66 20  28 70 6c 64 5f 72 65 61  |4;.  if (pld_rea|
0000a260  64 62 28 70 66 69 6c 65  2c 20 22 6e 65 75 72 61  |db(pfile, "neura|
0000a270  6c 20 63 6f 6e 74 72 6f  6c 6c 65 72 3a 22 2c 20  |l controller:", |
0000a280  22 6f 6e 22 2c 20 26 62  29 29 20 67 65 74 5f 66  |"on", &b)) get_f|
0000a290  6f 72 63 65 20 3d 20 62  20 3f 20 6e 65 75 72 61  |orce = b ? neura|
0000a2a0  6c 5f 63 6f 6e 74 72 6f  6c 20 3a 20 6e 75 6c 6c  |l_control : null|
0000a2b0  5f 63 6f 6e 74 72 6f 6c  3b 0a 20 20 6e 65 74 70  |_control;.  netp|
0000a2c0  61 72 61 6d 73 5f 74 6f  5f 67 75 69 28 29 3b 09  |arams_to_gui();.|
0000a2d0  09 09 2f 2a 63 6f 70 79  20 64 61 74 61 20 69 6e  |../*copy data in|
0000a2e0  74 6f 20 77 69 6e 64 6f  77 2a 2f 0a 20 20 69 66  |to window*/.  if|
0000a2f0  20 28 21 67 75 69 5f 74  6f 5f 6e 65 74 70 61 72  | (!gui_to_netpar|
0000a300  61 6d 73 31 28 29 29 20  67 6f 74 6f 20 70 6c 64  |ams1()) goto pld|
0000a310  31 3b 20 20 2f 2a 71 75  69 63 6b 20 62 6f 64 67  |1;  /*quick bodg|
0000a320  65 20 74 6f 20 72 61 6e  67 65 20 63 68 65 63 6b  |e to range check|
0000a330  20 74 68 65 20 69 74 65  6d 73 20 26 20 20 2e 2e  | the items &  ..|
0000a340  2e 20 2a 2f 0a 20 20 69  66 20 28 21 67 75 69 5f  |. */.  if (!gui_|
0000a350  74 6f 5f 6e 65 74 70 61  72 61 6d 73 32 28 29 29  |to_netparams2())|
0000a360  20 67 6f 74 6f 20 70 6c  64 31 3b 20 20 2f 2a 20  | goto pld1;  /* |
0000a370  2e 2e 2e 20 61 6c 73 6f  20 63 72 65 61 74 65 20  |... also create |
0000a380  77 65 69 67 68 74 73 20  26 20 6e 65 74 20 64 61  |weights & net da|
0000a390  74 61 20 73 74 6f 72 61  67 65 20 2a 2f 0a 20 20  |ta storage */.  |
0000a3a0  69 66 20 28 70 74 72 3d  73 74 72 73 74 72 28 70  |if (ptr=strstr(p|
0000a3b0  66 69 6c 65 2c 20 22 69  6e 70 75 74 20 77 65 69  |file, "input wei|
0000a3c0  67 68 74 73 3a 22 29 2c  20 70 74 72 29 0a 20 20  |ghts:"), ptr).  |
0000a3d0  20 20 69 66 20 28 70 74  72 3d 73 74 72 63 68 72  |  if (ptr=strchr|
0000a3e0  28 70 74 72 2c 20 27 5c  6e 27 29 2c 20 70 74 72  |(ptr, '\n'), ptr|
0000a3f0  29 0a 20 20 20 20 20 20  66 6f 72 20 28 69 3d 31  |).      for (i=1|
0000a400  3b 20 69 3c 3d 67 5f 77  65 69 67 68 74 73 2e 73  |; i<=g_weights.s|
0000a410  69 3b 20 69 2b 2b 29 0a  20 20 20 20 20 20 20 20  |i; i++).        |
0000a420  66 6f 72 20 28 6a 3d 31  3b 20 6a 3c 3d 67 5f 77  |for (j=1; j<=g_w|
0000a430  65 69 67 68 74 73 2e 73  68 3b 20 6a 2b 2b 29 0a  |eights.sh; j++).|
0000a440  20 20 20 20 20 20 20 20  20 20 69 66 20 28 73 73  |          if (ss|
0000a450  63 61 6e 66 28 70 74 72  2c 20 22 20 25 6c 67 25  |canf(ptr, " %lg%|
0000a460  6e 22 2c 20 26 64 2c 20  26 63 29 21 3d 45 4f 46  |n", &d, &c)!=EOF|
0000a470  29 20 7b 0a 20 20 20 20  20 20 20 20 20 20 20 20  |) {.            |
0000a480  67 5f 77 65 69 67 68 74  73 2e 77 69 5b 69 5d 5b  |g_weights.wi[i][|
0000a490  6a 5d 20 3d 20 64 74 6f  66 70 28 64 29 3b 0a 20  |j] = dtofp(d);. |
0000a4a0  20 20 20 20 20 20 20 20  20 20 20 70 74 72 2b 3d  |           ptr+=|
0000a4b0  63 3b 0a 20 20 20 20 20  20 20 20 20 20 7d 0a 20  |c;.          }. |
0000a4c0  20 69 66 20 28 70 74 72  3d 73 74 72 73 74 72 28  | if (ptr=strstr(|
0000a4d0  70 66 69 6c 65 2c 20 22  6f 75 74 70 75 74 20 77  |pfile, "output w|
0000a4e0  65 69 67 68 74 73 3a 22  29 2c 20 70 74 72 29 0a  |eights:"), ptr).|
0000a4f0  20 20 20 20 69 66 20 28  70 74 72 3d 73 74 72 63  |    if (ptr=strc|
0000a500  68 72 28 70 74 72 2c 20  27 5c 6e 27 29 2c 20 70  |hr(ptr, '\n'), p|
0000a510  74 72 29 0a 20 20 20 20  20 20 66 6f 72 20 28 69  |tr).      for (i|
0000a520  3d 31 3b 20 69 3c 3d 67  5f 77 65 69 67 68 74 73  |=1; i<=g_weights|
0000a530  2e 73 68 3b 20 69 2b 2b  29 0a 20 20 20 20 20 20  |.sh; i++).      |
0000a540  20 20 66 6f 72 20 28 6a  3d 31 3b 20 6a 3c 3d 67  |  for (j=1; j<=g|
0000a550  5f 77 65 69 67 68 74 73  2e 73 6f 3b 20 6a 2b 2b  |_weights.so; j++|
0000a560  29 0a 20 20 20 20 20 20  20 20 20 20 69 66 20 28  |).          if (|
0000a570  73 73 63 61 6e 66 28 70  74 72 2c 20 22 20 25 6c  |sscanf(ptr, " %l|
0000a580  67 25 6e 22 2c 20 26 64  2c 20 26 63 29 21 3d 45  |g%n", &d, &c)!=E|
0000a590  4f 46 29 20 7b 0a 20 20  20 20 20 20 20 20 20 20  |OF) {.          |
0000a5a0  20 20 67 5f 77 65 69 67  68 74 73 2e 77 6f 5b 69  |  g_weights.wo[i|
0000a5b0  5d 5b 6a 5d 20 3d 20 64  74 6f 66 70 28 64 29 3b  |][j] = dtofp(d);|
0000a5c0  0a 20 20 20 20 20 20 20  20 20 20 20 20 70 74 72  |.            ptr|
0000a5d0  2b 3d 63 3b 0a 20 20 20  20 20 20 20 20 20 20 7d  |+=c;.          }|
0000a5e0  0a 20 20 72 65 74 63 6f  64 65 20 3d 20 54 52 55  |.  retcode = TRU|
0000a5f0  45 3b 0a 20 20 70 6c 64  31 3a 0a 20 20 66 72 65  |E;.  pld1:.  fre|
0000a600  65 28 70 66 69 6c 65 29  3b 0a 20 20 70 66 69 6c  |e(pfile);.  pfil|
0000a610  65 20 3d 20 30 3b 0a 20  20 72 65 74 75 72 6e 20  |e = 0;.  return |
0000a620  72 65 74 63 6f 64 65 3b  0a 7d 0a 0a 63 68 61 72  |retcode;.}..char|
0000a630  20 2a 62 70 66 5f 6f 75  74 28 63 68 61 72 20 2a  | *bpf_out(char *|
0000a640  70 74 72 2c 20 42 4f 4f  4c 20 77 72 69 74 65 2c  |ptr, BOOL write,|
0000a650  20 63 68 61 72 20 2a 66  6f 72 6d 61 74 2c 20 2e  | char *format, .|
0000a660  2e 2e 29 0a 7b 0a 20 20  63 68 61 72 20 62 75 66  |..).{.  char buf|
0000a670  5b 32 35 36 5d 3b 0a 20  20 69 6e 74 20 6c 65 6e  |[256];.  int len|
0000a680  3b 0a 20 20 76 61 5f 6c  69 73 74 20 61 72 67 5f  |;.  va_list arg_|
0000a690  70 6f 69 6e 74 65 72 3b  0a 20 20 76 61 5f 73 74  |pointer;.  va_st|
0000a6a0  61 72 74 28 61 72 67 5f  70 6f 69 6e 74 65 72 2c  |art(arg_pointer,|
0000a6b0  20 66 6f 72 6d 61 74 29  3b 0a 20 20 6c 65 6e 20  | format);.  len |
0000a6c0  3d 20 76 73 70 72 69 6e  74 66 28 62 75 66 2c 20  |= vsprintf(buf, |
0000a6d0  66 6f 72 6d 61 74 2c 20  61 72 67 5f 70 6f 69 6e  |format, arg_poin|
0000a6e0  74 65 72 29 3b 0a 20 20  69 66 20 28 6c 65 6e 3e  |ter);.  if (len>|
0000a6f0  3d 32 35 36 29 20 77 65  72 72 28 30 2c 20 22 49  |=256) werr(0, "I|
0000a700  6e 74 65 72 6e 61 6c 20  65 72 72 6f 72 3a 20 62  |nternal error: b|
0000a710  70 66 5f 6f 75 74 2c 20  62 75 66 20 6f 76 65 72  |pf_out, buf over|
0000a720  66 6c 6f 77 22 29 3b 0a  20 20 69 66 20 28 77 72  |flow");.  if (wr|
0000a730  69 74 65 29 20 6d 65 6d  63 70 79 28 70 74 72 2c  |ite) memcpy(ptr,|
0000a740  20 62 75 66 2c 20 6c 65  6e 29 3b 0a 20 20 70 74  | buf, len);.  pt|
0000a750  72 20 2b 3d 20 6c 65 6e  3b 0a 20 20 76 61 5f 65  |r += len;.  va_e|
0000a760  6e 64 28 61 72 67 5f 70  6f 69 6e 74 65 72 29 3b  |nd(arg_pointer);|
0000a770  0a 20 20 72 65 74 75 72  6e 20 70 74 72 3b 0a 7d  |.  return ptr;.}|
0000a780  0a 0a 69 6e 74 20 62 70  66 5f 69 6e 74 65 72 6e  |..int bpf_intern|
0000a790  28 42 4f 4f 4c 20 77 72  69 74 65 29 0a 7b 0a 20  |(BOOL write).{. |
0000a7a0  20 69 6e 74 20 69 2c 20  6a 3b 0a 20 20 63 68 61  | int i, j;.  cha|
0000a7b0  72 20 2a 70 74 72 3d 70  66 69 6c 65 3b 0a 20 20  |r *ptr=pfile;.  |
0000a7c0  70 74 72 20 3d 20 62 70  66 5f 6f 75 74 28 70 74  |ptr = bpf_out(pt|
0000a7d0  72 2c 20 77 72 69 74 65  2c 20 22 4e 65 75 72 61  |r, write, "Neura|
0000a7e0  6c 20 4e 65 74 20 57 65  69 67 68 74 73 20 46 69  |l Net Weights Fi|
0000a7f0  6c 65 3a 5c 6e 5c 6e 22  29 3b 0a 20 20 70 74 72  |le:\n\n");.  ptr|
0000a800  20 3d 20 62 70 66 5f 6f  75 74 28 70 74 72 2c 20  | = bpf_out(ptr, |
0000a810  77 72 69 74 65 2c 20 22  23 20 69 6e 70 75 74 20  |write, "# input |
0000a820  6e 6f 64 65 73 3a 20 25  69 5c 6e 22 2c 20 67 5f  |nodes: %i\n", g_|
0000a830  66 66 5f 73 65 74 75 70  2e 6e 6f 5f 6f 66 5f 69  |ff_setup.no_of_i|
0000a840  6e 70 75 74 73 29 3b 0a  20 20 70 74 72 20 3d 20  |nputs);.  ptr = |
0000a850  62 70 66 5f 6f 75 74 28  70 74 72 2c 20 77 72 69  |bpf_out(ptr, wri|
0000a860  74 65 2c 20 22 23 20 68  69 64 64 65 6e 20 6c 61  |te, "# hidden la|
0000a870  79 65 72 20 6e 6f 64 65  73 3a 20 25 69 5c 6e 22  |yer nodes: %i\n"|
0000a880  2c 20 67 5f 66 66 5f 73  65 74 75 70 2e 6e 6f 5f  |, g_ff_setup.no_|
0000a890  6f 66 5f 68 31 5f 6e 6f  64 65 73 29 3b 0a 20 20  |of_h1_nodes);.  |
0000a8a0  70 74 72 20 3d 20 62 70  66 5f 6f 75 74 28 70 74  |ptr = bpf_out(pt|
0000a8b0  72 2c 20 77 72 69 74 65  2c 20 22 23 20 6f 75 74  |r, write, "# out|
0000a8c0  70 75 74 20 6e 6f 64 65  73 3a 20 25 69 5c 6e 5c  |put nodes: %i\n\|
0000a8d0  6e 22 2c 20 67 5f 66 66  5f 73 65 74 75 70 2e 6e  |n", g_ff_setup.n|
0000a8e0  6f 5f 6f 66 5f 6f 75 74  70 75 74 73 29 3b 0a 20  |o_of_outputs);. |
0000a8f0  20 70 74 72 20 3d 20 62  70 66 5f 6f 75 74 28 70  | ptr = bpf_out(p|
0000a900  74 72 2c 20 77 72 69 74  65 2c 20 22 61 6c 70 68  |tr, write, "alph|
0000a910  61 3a 20 25 67 5c 6e 22  2c 20 66 70 74 6f 64 28  |a: %g\n", fptod(|
0000a920  67 5f 66 66 5f 73 65 74  75 70 2e 61 6c 70 68 61  |g_ff_setup.alpha|
0000a930  29 29 3b 0a 20 20 70 74  72 20 3d 20 62 70 66 5f  |));.  ptr = bpf_|
0000a940  6f 75 74 28 70 74 72 2c  20 77 72 69 74 65 2c 20  |out(ptr, write, |
0000a950  22 6c 65 61 72 6e 69 6e  67 20 72 61 74 65 3a 20  |"learning rate: |
0000a960  25 67 5c 6e 5c 6e 22 2c  20 66 70 74 6f 64 28 67  |%g\n\n", fptod(g|
0000a970  5f 66 66 5f 73 65 74 75  70 2e 6c 65 61 72 6e 69  |_ff_setup.learni|
0000a980  6e 67 5f 72 61 74 65 29  29 3b 0a 20 20 70 74 72  |ng_rate));.  ptr|
0000a990  20 3d 20 62 70 66 5f 6f  75 74 28 70 74 72 2c 20  | = bpf_out(ptr, |
0000a9a0  77 72 69 74 65 2c 20 22  73 74 61 72 74 20 69 74  |write, "start it|
0000a9b0  65 72 61 74 69 6f 6e 3a  20 25 69 5c 6e 22 2c 20  |eration: %i\n", |
0000a9c0  67 5f 66 66 5f 73 65 74  75 70 2e 73 74 61 72 74  |g_ff_setup.start|
0000a9d0  5f 69 74 65 72 29 3b 0a  20 20 70 74 72 20 3d 20  |_iter);.  ptr = |
0000a9e0  62 70 66 5f 6f 75 74 28  70 74 72 2c 20 77 72 69  |bpf_out(ptr, wri|
0000a9f0  74 65 2c 20 22 23 20 74  72 61 69 6e 69 6e 67 20  |te, "# training |
0000aa00  69 74 65 6d 73 3a 20 25  69 5c 6e 22 2c 20 6e 6f  |items: %i\n", no|
0000aa10  5f 6f 66 5f 74 72 61 69  6e 69 6e 67 5f 69 74 65  |_of_training_ite|
0000aa20  6d 73 29 3b 0a 20 20 70  74 72 20 3d 20 62 70 66  |ms);.  ptr = bpf|
0000aa30  5f 6f 75 74 28 70 74 72  2c 20 77 72 69 74 65 2c  |_out(ptr, write,|
0000aa40  20 22 65 72 72 6f 72 20  74 68 72 65 73 68 6f 6c  | "error threshol|
0000aa50  64 3a 20 25 67 5c 6e 5c  6e 22 2c 20 66 70 74 6f  |d: %g\n\n", fpto|
0000aa60  64 28 67 5f 66 66 5f 73  65 74 75 70 2e 65 72 72  |d(g_ff_setup.err|
0000aa70  6f 72 5f 74 68 72 65 73  68 6f 6c 64 29 29 3b 0a  |or_threshold));.|
0000aa80  20 20 70 74 72 20 3d 20  62 70 66 5f 6f 75 74 28  |  ptr = bpf_out(|
0000aa90  70 74 72 2c 20 77 72 69  74 65 2c 20 22 72 61 6e  |ptr, write, "ran|
0000aaa0  64 6f 6d 20 66 6f 72 63  65 3a 20 25 67 5c 6e 22  |dom force: %g\n"|
0000aab0  2c 20 66 70 74 6f 64 28  67 5f 62 72 6d 5f 73 65  |, fptod(g_brm_se|
0000aac0  74 75 70 2e 72 61 6e 64  5f 66 6f 72 63 65 29 29  |tup.rand_force))|
0000aad0  3b 0a 20 20 70 74 72 20  3d 20 62 70 66 5f 6f 75  |;.  ptr = bpf_ou|
0000aae0  74 28 70 74 72 2c 20 77  72 69 74 65 2c 20 22 73  |t(ptr, write, "s|
0000aaf0  79 73 74 65 6d 20 66 6f  72 63 65 3a 20 25 67 5c  |ystem force: %g\|
0000ab00  6e 22 2c 20 66 70 74 6f  64 28 67 5f 62 72 6d 5f  |n", fptod(g_brm_|
0000ab10  73 65 74 75 70 2e 73 79  73 74 65 6d 5f 66 6f 72  |setup.system_for|
0000ab20  63 65 5f 69 6e 63 72 29  29 3b 0a 20 20 70 74 72  |ce_incr));.  ptr|
0000ab30  20 3d 20 62 70 66 5f 6f  75 74 28 70 74 72 2c 20  | = bpf_out(ptr, |
0000ab40  77 72 69 74 65 2c 20 22  75 73 65 72 20 66 6f 72  |write, "user for|
0000ab50  63 65 3a 20 25 67 5c 6e  5c 6e 22 2c 20 66 70 74  |ce: %g\n\n", fpt|
0000ab60  6f 64 28 67 5f 62 72 6d  5f 73 65 74 75 70 2e 75  |od(g_brm_setup.u|
0000ab70  73 65 72 5f 66 6f 72 63  65 5f 69 6e 63 72 29 29  |ser_force_incr))|
0000ab80  3b 0a 20 20 70 74 72 20  3d 20 62 70 66 5f 6f 75  |;.  ptr = bpf_ou|
0000ab90  74 28 70 74 72 2c 20 77  72 69 74 65 2c 20 22 7a  |t(ptr, write, "z|
0000aba0  65 72 6f 20 74 68 65 74  61 20 74 6f 6c 6c 65 72  |ero theta toller|
0000abb0  61 6e 63 65 3a 20 25 67  5c 6e 22 2c 20 66 70 74  |ance: %g\n", fpt|
0000abc0  6f 64 28 67 5f 62 72 6d  5f 73 65 74 75 70 2e 7a  |od(g_brm_setup.z|
0000abd0  65 72 6f 5f 74 68 65 74  61 29 29 3b 0a 20 20 70  |ero_theta));.  p|
0000abe0  74 72 20 3d 20 62 70 66  5f 6f 75 74 28 70 74 72  |tr = bpf_out(ptr|
0000abf0  2c 20 77 72 69 74 65 2c  20 22 73 70 65 65 64 3a  |, write, "speed:|
0000ac00  20 25 73 5c 6e 22 2c 20  73 70 65 65 64 3c 3d 32  | %s\n", speed<=2|
0000ac10  20 3f 20 22 66 61 73 74  22 20 3a 20 22 73 6c 6f  | ? "fast" : "slo|
0000ac20  77 22 29 3b 0a 20 20 70  74 72 20 3d 20 62 70 66  |w");.  ptr = bpf|
0000ac30  5f 6f 75 74 28 70 74 72  2c 20 77 72 69 74 65 2c  |_out(ptr, write,|
0000ac40  20 22 6e 65 75 72 61 6c  20 63 6f 6e 74 72 6f 6c  | "neural control|
0000ac50  6c 65 72 3a 20 25 73 5c  6e 5c 6e 22 2c 20 67 65  |ler: %s\n\n", ge|
0000ac60  74 5f 66 6f 72 63 65 3d  3d 6e 75 6c 6c 5f 63 6f  |t_force==null_co|
0000ac70  6e 74 72 6f 6c 20 3f 20  22 6f 66 66 22 20 3a 20  |ntrol ? "off" : |
0000ac80  22 6f 6e 22 29 3b 0a 20  20 70 74 72 20 3d 20 62  |"on");.  ptr = b|
0000ac90  70 66 5f 6f 75 74 28 70  74 72 2c 20 77 72 69 74  |pf_out(ptr, writ|
0000aca0  65 2c 20 22 69 6e 70 75  74 20 77 65 69 67 68 74  |e, "input weight|
0000acb0  73 3a 5c 6e 22 29 3b 0a  20 20 66 6f 72 20 28 69  |s:\n");.  for (i|
0000acc0  3d 31 3b 20 69 3c 3d 67  5f 77 65 69 67 68 74 73  |=1; i<=g_weights|
0000acd0  2e 73 69 3b 20 69 2b 2b  29 20 7b 0a 20 20 20 20  |.si; i++) {.    |
0000ace0  66 6f 72 20 28 6a 3d 31  3b 20 6a 3c 3d 67 5f 77  |for (j=1; j<=g_w|
0000acf0  65 69 67 68 74 73 2e 73  68 3b 20 6a 2b 2b 29 20  |eights.sh; j++) |
0000ad00  70 74 72 20 3d 20 62 70  66 5f 6f 75 74 28 70 74  |ptr = bpf_out(pt|
0000ad10  72 2c 20 77 72 69 74 65  2c 20 22 25 37 67 20 22  |r, write, "%7g "|
0000ad20  2c 20 66 70 74 6f 64 28  67 5f 77 65 69 67 68 74  |, fptod(g_weight|
0000ad30  73 2e 77 69 5b 69 5d 5b  6a 5d 29 29 3b 0a 20 20  |s.wi[i][j]));.  |
0000ad40  20 20 69 66 20 28 77 72  69 74 65 29 20 70 74 72  |  if (write) ptr|
0000ad50  5b 2d 31 5d 3d 27 5c 6e  27 3b 0a 20 20 7d 0a 20  |[-1]='\n';.  }. |
0000ad60  20 70 74 72 20 3d 20 62  70 66 5f 6f 75 74 28 70  | ptr = bpf_out(p|
0000ad70  74 72 2c 20 77 72 69 74  65 2c 20 22 5c 6e 6f 75  |tr, write, "\nou|
0000ad80  74 70 75 74 20 77 65 69  67 68 74 73 3a 5c 6e 22  |tput weights:\n"|
0000ad90  29 3b 0a 20 20 66 6f 72  20 28 69 3d 31 3b 20 69  |);.  for (i=1; i|
0000ada0  3c 3d 67 5f 77 65 69 67  68 74 73 2e 73 68 3b 20  |<=g_weights.sh; |
0000adb0  69 2b 2b 29 20 7b 0a 20  20 20 20 66 6f 72 20 28  |i++) {.    for (|
0000adc0  6a 3d 31 3b 20 6a 3c 3d  67 5f 77 65 69 67 68 74  |j=1; j<=g_weight|
0000add0  73 2e 73 6f 3b 20 6a 2b  2b 29 20 70 74 72 20 3d  |s.so; j++) ptr =|
0000ade0  20 62 70 66 5f 6f 75 74  28 70 74 72 2c 20 77 72  | bpf_out(ptr, wr|
0000adf0  69 74 65 2c 20 22 25 37  67 20 22 2c 20 66 70 74  |ite, "%7g ", fpt|
0000ae00  6f 64 28 67 5f 77 65 69  67 68 74 73 2e 77 6f 5b  |od(g_weights.wo[|
0000ae10  69 5d 5b 6a 5d 29 29 3b  0a 20 20 20 20 69 66 20  |i][j]));.    if |
0000ae20  28 77 72 69 74 65 29 20  70 74 72 5b 2d 31 5d 3d  |(write) ptr[-1]=|
0000ae30  27 5c 6e 27 3b 0a 20 20  7d 0a 20 20 70 74 72 20  |'\n';.  }.  ptr |
0000ae40  3d 20 62 70 66 5f 6f 75  74 28 70 74 72 2c 20 77  |= bpf_out(ptr, w|
0000ae50  72 69 74 65 2c 20 22 5c  6e 65 6e 64 3a 5c 6e 22  |rite, "\nend:\n"|
0000ae60  29 3b 0a 20 20 72 65 74  75 72 6e 20 70 74 72 2d  |);.  return ptr-|
0000ae70  70 66 69 6c 65 3b 0a 7d  0a 0a 42 4f 4f 4c 20 62  |pfile;.}..BOOL b|
0000ae80  75 69 6c 64 5f 70 61 72  61 6d 65 74 65 72 73 5f  |uild_parameters_|
0000ae90  66 69 6c 65 28 76 6f 69  64 29 0a 7b 0a 20 20 69  |file(void).{.  i|
0000aea0  66 20 28 70 66 69 6c 65  29 20 7b 0a 20 20 20 20  |f (pfile) {.    |
0000aeb0  66 72 65 65 28 70 66 69  6c 65 29 3b 0a 20 20 20  |free(pfile);.   |
0000aec0  20 70 66 69 6c 65 3d 30  3b 0a 20 20 7d 0a 20 20  | pfile=0;.  }.  |
0000aed0  69 66 20 28 21 67 75 69  5f 74 6f 5f 6e 65 74 70  |if (!gui_to_netp|
0000aee0  61 72 61 6d 73 31 28 29  29 20 72 65 74 75 72 6e  |arams1()) return|
0000aef0  20 46 41 4c 53 45 3b 0a  20 20 69 66 20 28 21 67  | FALSE;.  if (!g|
0000af00  75 69 5f 74 6f 5f 6e 65  74 70 61 72 61 6d 73 32  |ui_to_netparams2|
0000af10  28 29 29 20 72 65 74 75  72 6e 20 46 41 4c 53 45  |()) return FALSE|
0000af20  3b 0a 20 20 70 66 69 6c  65 5f 6c 65 6e 67 74 68  |;.  pfile_length|
0000af30  20 3d 20 62 70 66 5f 69  6e 74 65 72 6e 28 46 41  | = bpf_intern(FA|
0000af40  4c 53 45 29 3b 0a 20 20  70 66 69 6c 65 20 3d 20  |LSE);.  pfile = |
0000af50  6d 61 6c 6c 6f 63 28 70  66 69 6c 65 5f 6c 65 6e  |malloc(pfile_len|
0000af60  67 74 68 2b 31 29 3b 0a  20 20 69 66 20 28 70 66  |gth+1);.  if (pf|
0000af70  69 6c 65 3d 3d 30 29 20  72 65 74 75 72 6e 20 46  |ile==0) return F|
0000af80  41 4c 53 45 3b 0a 20 20  62 70 66 5f 69 6e 74 65  |ALSE;.  bpf_inte|
0000af90  72 6e 28 54 52 55 45 29  3b 0a 20 20 72 65 74 75  |rn(TRUE);.  retu|
0000afa0  72 6e 20 54 52 55 45 3b  0a 7d 0a 0a 42 4f 4f 4c  |rn TRUE;.}..BOOL|
0000afb0  20 70 61 72 61 6d 65 74  65 72 73 5f 73 61 76 65  | parameters_save|
0000afc0  72 5f 70 72 6f 63 28 63  68 61 72 20 2a 66 69 6c  |r_proc(char *fil|
0000afd0  65 6e 61 6d 65 2c 20 76  6f 69 64 20 2a 68 61 6e  |ename, void *han|
0000afe0  64 6c 65 29 0a 7b 0a 20  20 6f 73 5f 72 65 67 73  |dle).{.  os_regs|
0000aff0  65 74 20 72 3b 0a 20 20  6f 73 5f 65 72 72 6f 72  |et r;.  os_error|
0000b000  20 2a 65 3b 0a 20 20 68  61 6e 64 6c 65 3d 68 61  | *e;.  handle=ha|
0000b010  6e 64 6c 65 3b 0a 20 20  72 2e 72 5b 30 5d 3d 31  |ndle;.  r.r[0]=1|
0000b020  30 3b 0a 20 20 72 2e 72  5b 31 5d 3d 28 69 6e 74  |0;.  r.r[1]=(int|
0000b030  29 66 69 6c 65 6e 61 6d  65 3b 0a 20 20 72 2e 72  |)filename;.  r.r|
0000b040  5b 32 5d 3d 30 78 66 66  66 3b 0a 20 20 72 2e 72  |[2]=0xfff;.  r.r|
0000b050  5b 34 5d 3d 28 69 6e 74  29 70 66 69 6c 65 3b 0a  |[4]=(int)pfile;.|
0000b060  20 20 72 2e 72 5b 35 5d  3d 72 2e 72 5b 34 5d 2b  |  r.r[5]=r.r[4]+|
0000b070  70 66 69 6c 65 5f 6c 65  6e 67 74 68 3b 0a 20 20  |pfile_length;.  |
0000b080  77 69 6d 70 74 5f 63 6f  6d 70 6c 61 69 6e 28 28  |wimpt_complain((|
0000b090  65 3d 6f 73 5f 73 77 69  78 28 4f 53 5f 46 69 6c  |e=os_swix(OS_Fil|
0000b0a0  65 20 7c 20 58 4f 53 5f  42 69 74 2c 20 26 72 29  |e | XOS_Bit, &r)|
0000b0b0  2c 20 65 29 29 3b 0a 20  20 66 72 65 65 28 70 66  |, e));.  free(pf|
0000b0c0  69 6c 65 29 3b 0a 20 20  70 66 69 6c 65 20 3d 20  |ile);.  pfile = |
0000b0d0  30 3b 0a 20 20 69 66 20  28 65 29 20 72 65 74 75  |0;.  if (e) retu|
0000b0e0  72 6e 20 46 41 4c 53 45  3b 0a 20 20 69 66 20 28  |rn FALSE;.  if (|
0000b0f0  78 66 65 72 73 65 6e 64  5f 66 69 6c 65 5f 69 73  |xfersend_file_is|
0000b100  5f 73 61 66 65 28 29 29  20 7b 0a 20 20 20 20 73  |_safe()) {.    s|
0000b110  74 72 6e 63 70 79 28 66  69 6c 65 70 61 74 68 5f  |trncpy(filepath_|
0000b120  70 61 72 61 6d 65 74 65  72 73 2c 20 66 69 6c 65  |parameters, file|
0000b130  6e 61 6d 65 2c 20 6d 61  78 70 61 74 68 29 3b 0a  |name, maxpath);.|
0000b140  20 20 20 20 77 74 73 73  61 66 65 3d 54 52 55 45  |    wtssafe=TRUE|
0000b150  3b 0a 20 20 7d 0a 20 20  72 65 74 75 72 6e 20 54  |;.  }.  return T|
0000b160  52 55 45 3b 0a 7d 0a 0a  42 4f 4f 4c 20 70 61 72  |RUE;.}..BOOL par|
0000b170  61 6d 65 74 65 72 73 5f  73 65 6e 64 65 72 5f 70  |ameters_sender_p|
0000b180  72 6f 63 28 76 6f 69 64  20 2a 68 61 6e 64 6c 65  |roc(void *handle|
0000b190  2c 20 69 6e 74 20 2a 6d  61 78 62 75 66 29 0a 7b  |, int *maxbuf).{|
0000b1a0  0a 20 20 63 68 61 72 20  2a 64 61 74 61 3d 70 66  |.  char *data=pf|
0000b1b0  69 6c 65 3b 0a 20 20 69  6e 74 20 64 61 74 61 5f  |ile;.  int data_|
0000b1c0  72 65 6d 61 69 6e 69 6e  67 3d 70 66 69 6c 65 5f  |remaining=pfile_|
0000b1d0  6c 65 6e 67 74 68 3b 0a  20 20 69 6e 74 20 6c 65  |length;.  int le|
0000b1e0  6e 67 74 68 3d 2a 6d 61  78 62 75 66 3b 0a 20 20  |ngth=*maxbuf;.  |
0000b1f0  42 4f 4f 4c 20 64 6f 6e  65 3d 46 41 4c 53 45 3b  |BOOL done=FALSE;|
0000b200  0a 20 20 68 61 6e 64 6c  65 3d 68 61 6e 64 6c 65  |.  handle=handle|
0000b210  3b 0a 20 20 77 68 69 6c  65 20 28 21 64 6f 6e 65  |;.  while (!done|
0000b220  29 20 7b 0a 20 20 20 20  69 66 20 28 6c 65 6e 67  |) {.    if (leng|
0000b230  74 68 3e 64 61 74 61 5f  72 65 6d 61 69 6e 69 6e  |th>data_remainin|
0000b240  67 29 20 7b 6c 65 6e 67  74 68 3d 64 61 74 61 5f  |g) {length=data_|
0000b250  72 65 6d 61 69 6e 69 6e  67 3b 20 64 6f 6e 65 3d  |remaining; done=|
0000b260  54 52 55 45 3b 7d 0a 20  20 20 20 69 66 20 28 21  |TRUE;}.    if (!|
0000b270  78 66 65 72 73 65 6e 64  5f 73 65 6e 64 62 75 66  |xfersend_sendbuf|
0000b280  28 64 61 74 61 2c 20 6c  65 6e 67 74 68 29 29 20  |(data, length)) |
0000b290  72 65 74 75 72 6e 20 46  41 4c 53 45 3b 0a 20 20  |return FALSE;.  |
0000b2a0  20 20 64 61 74 61 2b 3d  6c 65 6e 67 74 68 3b 0a  |  data+=length;.|
0000b2b0  20 20 20 20 64 61 74 61  5f 72 65 6d 61 69 6e 69  |    data_remaini|
0000b2c0  6e 67 2d 3d 6c 65 6e 67  74 68 3b 0a 20 20 20 20  |ng-=length;.    |
0000b2d0  6c 65 6e 67 74 68 3d 2a  6d 61 78 62 75 66 3b 0a  |length=*maxbuf;.|
0000b2e0  20 20 7d 0a 20 20 66 72  65 65 28 70 66 69 6c 65  |  }.  free(pfile|
0000b2f0  29 3b 0a 20 20 70 66 69  6c 65 20 3d 20 30 3b 0a  |);.  pfile = 0;.|
0000b300  20 20 72 65 74 75 72 6e  20 54 52 55 45 3b 0a 7d  |  return TRUE;.}|
0000b310  0a 0a 2f 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |../*************|
0000b320  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 20 6d  |************** m|
0000b330  69 73 63 20 66 75 6e 63  74 69 6f 6e 73 20 2a 2a  |isc functions **|
0000b340  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000b350  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2f  |***************/|
0000b360  0a 0a 76 6f 69 64 20 6e  65 74 70 61 72 61 6d 73  |..void netparams|
0000b370  5f 74 6f 5f 67 75 69 28  76 6f 69 64 29 0a 7b 0a  |_to_gui(void).{.|
0000b380  20 20 6d 64 62 78 5f 73  65 74 6e 75 6d 65 72 69  |  mdbx_setnumeri|
0000b390  63 28 70 61 72 61 5f 77  69 6e 5f 68 61 6e 64 6c  |c(para_win_handl|
0000b3a0  65 2c 20 70 69 74 5f 6e  6f 68 6c 6e 2c 20 67 5f  |e, pit_nohln, g_|
0000b3b0  66 66 5f 73 65 74 75 70  2e 6e 6f 5f 6f 66 5f 68  |ff_setup.no_of_h|
0000b3c0  31 5f 6e 6f 64 65 73 29  3b 0a 20 20 6d 64 62 78  |1_nodes);.  mdbx|
0000b3d0  5f 73 65 74 64 6f 75 62  6c 65 20 28 70 61 72 61  |_setdouble (para|
0000b3e0  5f 77 69 6e 5f 68 61 6e  64 6c 65 2c 20 70 69 74  |_win_handle, pit|
0000b3f0  5f 61 2c 20 66 70 74 6f  64 28 67 5f 66 66 5f 73  |_a, fptod(g_ff_s|
0000b400  65 74 75 70 2e 61 6c 70  68 61 29 29 3b 0a 20 20  |etup.alpha));.  |
0000b410  6d 64 62 78 5f 73 65 74  64 6f 75 62 6c 65 20 28  |mdbx_setdouble (|
0000b420  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 2c  |para_win_handle,|
0000b430  20 70 69 74 5f 6c 72 2c  20 66 70 74 6f 64 28 67  | pit_lr, fptod(g|
0000b440  5f 66 66 5f 73 65 74 75  70 2e 6c 65 61 72 6e 69  |_ff_setup.learni|
0000b450  6e 67 5f 72 61 74 65 29  29 3b 0a 20 20 6d 64 62  |ng_rate));.  mdb|
0000b460  78 5f 73 65 74 64 6f 75  62 6c 65 20 28 70 61 72  |x_setdouble (par|
0000b470  61 5f 77 69 6e 5f 68 61  6e 64 6c 65 2c 20 70 69  |a_win_handle, pi|
0000b480  74 5f 65 74 2c 20 66 70  74 6f 64 28 67 5f 66 66  |t_et, fptod(g_ff|
0000b490  5f 73 65 74 75 70 2e 65  72 72 6f 72 5f 74 68 72  |_setup.error_thr|
0000b4a0  65 73 68 6f 6c 64 29 29  3b 0a 20 20 6d 64 62 78  |eshold));.  mdbx|
0000b4b0  5f 73 65 74 6e 75 6d 65  72 69 63 28 70 61 72 61  |_setnumeric(para|
0000b4c0  5f 77 69 6e 5f 68 61 6e  64 6c 65 2c 20 70 69 74  |_win_handle, pit|
0000b4d0  5f 6e 6f 74 69 2c 20 6e  6f 5f 6f 66 5f 74 72 61  |_noti, no_of_tra|
0000b4e0  69 6e 69 6e 67 5f 69 74  65 6d 73 29 3b 0a 20 20  |ining_items);.  |
0000b4f0  6d 64 62 78 5f 73 65 74  64 6f 75 62 6c 65 20 28  |mdbx_setdouble (|
0000b500  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 2c  |para_win_handle,|
0000b510  20 70 69 74 5f 72 66 2c  20 66 70 74 6f 64 28 67  | pit_rf, fptod(g|
0000b520  5f 62 72 6d 5f 73 65 74  75 70 2e 72 61 6e 64 5f  |_brm_setup.rand_|
0000b530  66 6f 72 63 65 29 29 3b  0a 20 20 6d 64 62 78 5f  |force));.  mdbx_|
0000b540  73 65 74 64 6f 75 62 6c  65 20 28 70 61 72 61 5f  |setdouble (para_|
0000b550  77 69 6e 5f 68 61 6e 64  6c 65 2c 20 70 69 74 5f  |win_handle, pit_|
0000b560  73 66 2c 20 66 70 74 6f  64 28 67 5f 62 72 6d 5f  |sf, fptod(g_brm_|
0000b570  73 65 74 75 70 2e 73 79  73 74 65 6d 5f 66 6f 72  |setup.system_for|
0000b580  63 65 5f 69 6e 63 72 29  29 3b 0a 20 20 6d 64 62  |ce_incr));.  mdb|
0000b590  78 5f 73 65 74 64 6f 75  62 6c 65 20 28 70 61 72  |x_setdouble (par|
0000b5a0  61 5f 77 69 6e 5f 68 61  6e 64 6c 65 2c 20 70 69  |a_win_handle, pi|
0000b5b0  74 5f 75 66 2c 20 66 70  74 6f 64 28 67 5f 62 72  |t_uf, fptod(g_br|
0000b5c0  6d 5f 73 65 74 75 70 2e  75 73 65 72 5f 66 6f 72  |m_setup.user_for|
0000b5d0  63 65 5f 69 6e 63 72 29  29 3b 0a 20 20 6d 64 62  |ce_incr));.  mdb|
0000b5e0  78 5f 73 65 74 64 6f 75  62 6c 65 20 28 70 61 72  |x_setdouble (par|
0000b5f0  61 5f 77 69 6e 5f 68 61  6e 64 6c 65 2c 20 70 69  |a_win_handle, pi|
0000b600  74 5f 7a 74 74 2c 20 66  70 74 6f 64 28 67 5f 62  |t_ztt, fptod(g_b|
0000b610  72 6d 5f 73 65 74 75 70  2e 7a 65 72 6f 5f 74 68  |rm_setup.zero_th|
0000b620  65 74 61 29 29 3b 0a 20  20 77 69 6d 70 74 5f 63  |eta));.  wimpt_c|
0000b630  6f 6d 70 6c 61 69 6e 28  77 69 6d 70 5f 73 65 74  |omplain(wimp_set|
0000b640  5f 69 63 6f 6e 5f 73 74  61 74 65 28 70 61 72 61  |_icon_state(para|
0000b650  5f 77 69 6e 5f 68 61 6e  64 6c 65 2c 20 70 69 74  |_win_handle, pit|
0000b660  5f 63 63 2c 20 67 65 74  5f 66 6f 72 63 65 3d 3d  |_cc, get_force==|
0000b670  6e 75 6c 6c 5f 63 6f 6e  74 72 6f 6c 3f 30 3a 77  |null_control?0:w|
0000b680  69 6d 70 5f 49 53 45 4c  45 43 54 45 44 2c 20 77  |imp_ISELECTED, w|
0000b690  69 6d 70 5f 49 53 45 4c  45 43 54 45 44 29 29 3b  |imp_ISELECTED));|
0000b6a0  0a 20 20 77 69 6d 70 74  5f 63 6f 6d 70 6c 61 69  |.  wimpt_complai|
0000b6b0  6e 28 77 69 6d 70 5f 73  65 74 5f 69 63 6f 6e 5f  |n(wimp_set_icon_|
0000b6c0  73 74 61 74 65 28 70 61  72 61 5f 77 69 6e 5f 68  |state(para_win_h|
0000b6d0  61 6e 64 6c 65 2c 20 70  69 74 5f 73 2c 20 73 70  |andle, pit_s, sp|
0000b6e0  65 65 64 3c 3d 32 3f 30  3a 77 69 6d 70 5f 49 53  |eed<=2?0:wimp_IS|
0000b6f0  45 4c 45 43 54 45 44 2c  20 77 69 6d 70 5f 49 53  |ELECTED, wimp_IS|
0000b700  45 4c 45 43 54 45 44 29  29 3b 0a 20 20 77 69 6d  |ELECTED));.  wim|
0000b710  70 74 5f 63 6f 6d 70 6c  61 69 6e 28 77 69 6d 70  |pt_complain(wimp|
0000b720  5f 73 65 74 5f 69 63 6f  6e 5f 73 74 61 74 65 28  |_set_icon_state(|
0000b730  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 2c  |para_win_handle,|
0000b740  20 70 69 74 5f 66 2c 20  73 70 65 65 64 3e 32 3f  | pit_f, speed>2?|
0000b750  30 3a 77 69 6d 70 5f 49  53 45 4c 45 43 54 45 44  |0:wimp_ISELECTED|
0000b760  2c 20 77 69 6d 70 5f 49  53 45 4c 45 43 54 45 44  |, wimp_ISELECTED|
0000b770  29 29 3b 0a 7d 0a 0a 42  4f 4f 4c 20 67 75 69 5f  |));.}..BOOL gui_|
0000b780  74 6f 5f 6e 65 74 70 61  72 61 6d 73 31 28 76 6f  |to_netparams1(vo|
0000b790  69 64 29 0a 7b 0a 20 20  64 6f 75 62 6c 65 20 64  |id).{.  double d|
0000b7a0  3b 0a 20 20 69 6e 74 20  69 3b 0a 20 20 42 4f 4f  |;.  int i;.  BOO|
0000b7b0  4c 20 62 6c 61 6e 6b 3b  0a 0a 20 20 62 6c 61 6e  |L blank;..  blan|
0000b7c0  6b 3d 21 6d 64 62 78 5f  67 65 74 6e 75 6d 65 72  |k=!mdbx_getnumer|
0000b7d0  69 63 28 70 61 72 61 5f  77 69 6e 5f 68 61 6e 64  |ic(para_win_hand|
0000b7e0  6c 65 2c 20 70 69 74 5f  6e 6f 68 6c 6e 2c 20 26  |le, pit_nohln, &|
0000b7f0  69 29 3b 0a 20 20 69 66  20 28 62 6c 61 6e 6b 20  |i);.  if (blank |
0000b800  7c 7c 20 69 3c 31 20 7c  7c 20 69 3e 4d 41 58 4e  ||| i<1 || i>MAXN|
0000b810  4f 4f 46 4e 4f 44 45 53  29 20 7b 0a 20 20 20 20  |OOFNODES) {.    |
0000b820  69 66 20 28 69 3c 31 29  20 69 3d 31 3b 0a 20 20  |if (i<1) i=1;.  |
0000b830  20 20 69 66 20 28 69 3e  4d 41 58 4e 4f 4f 46 4e  |  if (i>MAXNOOFN|
0000b840  4f 44 45 53 29 20 69 3d  4d 41 58 4e 4f 4f 46 4e  |ODES) i=MAXNOOFN|
0000b850  4f 44 45 53 3b 0a 20 20  20 20 6d 64 62 78 5f 73  |ODES;.    mdbx_s|
0000b860  65 74 6e 75 6d 65 72 69  63 28 70 61 72 61 5f 77  |etnumeric(para_w|
0000b870  69 6e 5f 68 61 6e 64 6c  65 2c 20 70 69 74 5f 6e  |in_handle, pit_n|
0000b880  6f 68 6c 6e 2c 20 69 29  3b 0a 20 20 7d 0a 20 20  |ohln, i);.  }.  |
0000b890  67 5f 66 66 5f 73 65 74  75 70 2e 6e 6f 5f 6f 66  |g_ff_setup.no_of|
0000b8a0  5f 68 31 5f 6e 6f 64 65  73 3d 69 3b 0a 0a 20 20  |_h1_nodes=i;..  |
0000b8b0  62 6c 61 6e 6b 3d 21 6d  64 62 78 5f 67 65 74 6e  |blank=!mdbx_getn|
0000b8c0  75 6d 65 72 69 63 28 70  61 72 61 5f 77 69 6e 5f  |umeric(para_win_|
0000b8d0  68 61 6e 64 6c 65 2c 20  70 69 74 5f 6e 6f 74 69  |handle, pit_noti|
0000b8e0  2c 20 26 69 29 3b 0a 20  20 69 66 20 28 62 6c 61  |, &i);.  if (bla|
0000b8f0  6e 6b 20 7c 7c 20 69 3c  31 20 7c 7c 20 69 3e 31  |nk || i<1 || i>1|
0000b900  30 30 30 29 20 7b 0a 20  20 20 20 69 66 20 28 69  |000) {.    if (i|
0000b910  3c 31 29 20 69 3d 31 3b  0a 20 20 20 20 69 66 20  |<1) i=1;.    if |
0000b920  28 69 3e 31 30 30 30 29  20 69 3d 31 30 30 30 3b  |(i>1000) i=1000;|
0000b930  0a 20 20 20 20 6d 64 62  78 5f 73 65 74 6e 75 6d  |.    mdbx_setnum|
0000b940  65 72 69 63 28 70 61 72  61 5f 77 69 6e 5f 68 61  |eric(para_win_ha|
0000b950  6e 64 6c 65 2c 20 70 69  74 5f 6e 6f 74 69 2c 20  |ndle, pit_noti, |
0000b960  69 29 3b 0a 20 20 7d 0a  20 20 6e 6f 5f 6f 66 5f  |i);.  }.  no_of_|
0000b970  74 72 61 69 6e 69 6e 67  5f 69 74 65 6d 73 3d 69  |training_items=i|
0000b980  3b 0a 0a 20 20 62 6c 61  6e 6b 3d 21 6d 64 62 78  |;..  blank=!mdbx|
0000b990  5f 67 65 74 64 6f 75 62  6c 65 28 70 61 72 61 5f  |_getdouble(para_|
0000b9a0  77 69 6e 5f 68 61 6e 64  6c 65 2c 20 70 69 74 5f  |win_handle, pit_|
0000b9b0  61 2c 20 26 64 29 3b 0a  20 20 69 66 20 28 62 6c  |a, &d);.  if (bl|
0000b9c0  61 6e 6b 20 7c 7c 20 64  3c 30 2e 30 20 7c 7c 20  |ank || d<0.0 || |
0000b9d0  64 3e 32 2e 30 29 20 7b  0a 20 20 20 20 69 66 20  |d>2.0) {.    if |
0000b9e0  28 64 3c 30 2e 30 29 20  64 3d 30 2e 30 3b 0a 20  |(d<0.0) d=0.0;. |
0000b9f0  20 20 20 69 66 20 28 64  3e 32 2e 30 29 20 64 3d  |   if (d>2.0) d=|
0000ba00  32 2e 30 3b 0a 20 20 20  20 6d 64 62 78 5f 73 65  |2.0;.    mdbx_se|
0000ba10  74 64 6f 75 62 6c 65 28  70 61 72 61 5f 77 69 6e  |tdouble(para_win|
0000ba20  5f 68 61 6e 64 6c 65 2c  20 70 69 74 5f 61 2c 20  |_handle, pit_a, |
0000ba30  64 29 3b 0a 20 20 7d 0a  20 20 67 5f 66 66 5f 73  |d);.  }.  g_ff_s|
0000ba40  65 74 75 70 2e 61 6c 70  68 61 20 3d 20 64 74 6f  |etup.alpha = dto|
0000ba50  66 70 28 64 29 3b 0a 0a  20 20 62 6c 61 6e 6b 3d  |fp(d);..  blank=|
0000ba60  21 6d 64 62 78 5f 67 65  74 64 6f 75 62 6c 65 28  |!mdbx_getdouble(|
0000ba70  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 2c  |para_win_handle,|
0000ba80  20 70 69 74 5f 6c 72 2c  20 26 64 29 3b 0a 20 20  | pit_lr, &d);.  |
0000ba90  69 66 20 28 62 6c 61 6e  6b 20 7c 7c 20 64 3c 30  |if (blank || d<0|
0000baa0  2e 30 20 7c 7c 20 64 3e  32 2e 30 29 20 7b 0a 20  |.0 || d>2.0) {. |
0000bab0  20 20 20 69 66 20 28 64  3c 30 2e 30 29 20 64 3d  |   if (d<0.0) d=|
0000bac0  30 2e 30 3b 0a 20 20 20  20 69 66 20 28 64 3e 32  |0.0;.    if (d>2|
0000bad0  2e 30 29 20 64 3d 32 2e  30 3b 0a 20 20 20 20 6d  |.0) d=2.0;.    m|
0000bae0  64 62 78 5f 73 65 74 64  6f 75 62 6c 65 28 70 61  |dbx_setdouble(pa|
0000baf0  72 61 5f 77 69 6e 5f 68  61 6e 64 6c 65 2c 20 70  |ra_win_handle, p|
0000bb00  69 74 5f 6c 72 2c 20 64  29 3b 0a 20 20 7d 0a 20  |it_lr, d);.  }. |
0000bb10  20 67 5f 66 66 5f 73 65  74 75 70 2e 6c 65 61 72  | g_ff_setup.lear|
0000bb20  6e 69 6e 67 5f 72 61 74  65 20 3d 20 64 74 6f 66  |ning_rate = dtof|
0000bb30  70 28 64 29 3b 0a 0a 20  20 62 6c 61 6e 6b 3d 21  |p(d);..  blank=!|
0000bb40  6d 64 62 78 5f 67 65 74  64 6f 75 62 6c 65 28 70  |mdbx_getdouble(p|
0000bb50  61 72 61 5f 77 69 6e 5f  68 61 6e 64 6c 65 2c 20  |ara_win_handle, |
0000bb60  70 69 74 5f 65 74 2c 20  26 64 29 3b 0a 20 20 69  |pit_et, &d);.  i|
0000bb70  66 20 28 62 6c 61 6e 6b  20 7c 7c 20 64 3c 30 2e  |f (blank || d<0.|
0000bb80  30 20 7c 7c 20 64 3e 31  2e 30 29 20 7b 0a 20 20  |0 || d>1.0) {.  |
0000bb90  20 20 69 66 20 28 64 3c  30 2e 30 29 20 64 3d 30  |  if (d<0.0) d=0|
0000bba0  2e 30 3b 0a 20 20 20 20  69 66 20 28 64 3e 31 2e  |.0;.    if (d>1.|
0000bbb0  30 29 20 64 3d 31 2e 30  3b 0a 20 20 20 20 6d 64  |0) d=1.0;.    md|
0000bbc0  62 78 5f 73 65 74 64 6f  75 62 6c 65 28 70 61 72  |bx_setdouble(par|
0000bbd0  61 5f 77 69 6e 5f 68 61  6e 64 6c 65 2c 20 70 69  |a_win_handle, pi|
0000bbe0  74 5f 65 74 2c 20 64 29  3b 0a 20 20 7d 0a 20 20  |t_et, d);.  }.  |
0000bbf0  67 5f 66 66 5f 73 65 74  75 70 2e 65 72 72 6f 72  |g_ff_setup.error|
0000bc00  5f 74 68 72 65 73 68 6f  6c 64 20 3d 20 64 74 6f  |_threshold = dto|
0000bc10  66 70 28 64 29 3b 0a 0a  20 20 69 66 20 28 21 67  |fp(d);..  if (!g|
0000bc20  5f 77 65 69 67 68 74 73  2e 61 6c 6c 6f 63 61 74  |_weights.allocat|
0000bc30  65 64 20 7c 7c 20 67 5f  77 65 69 67 68 74 73 2e  |ed || g_weights.|
0000bc40  73 68 21 3d 67 5f 66 66  5f 73 65 74 75 70 2e 6e  |sh!=g_ff_setup.n|
0000bc50  6f 5f 6f 66 5f 68 31 5f  6e 6f 64 65 73 29 20 7b  |o_of_h1_nodes) {|
0000bc60  0a 20 20 20 20 69 66 20  28 21 65 6e 73 75 72 65  |.    if (!ensure|
0000bc70  5f 6e 65 74 77 6f 72 6b  5f 65 78 69 73 74 73 28  |_network_exists(|
0000bc80  26 67 5f 6e 65 74 77 6f  72 6b 2c 20 26 67 5f 66  |&g_network, &g_f|
0000bc90  66 5f 73 65 74 75 70 29  29 20 72 65 74 75 72 6e  |f_setup)) return|
0000bca0  20 46 41 4c 53 45 3b 0a  20 20 20 20 69 66 20 28  | FALSE;.    if (|
0000bcb0  21 69 6e 69 74 69 61 6c  69 73 65 5f 77 65 69 67  |!initialise_weig|
0000bcc0  68 74 73 28 26 67 5f 77  65 69 67 68 74 73 2c 20  |hts(&g_weights, |
0000bcd0  54 52 55 45 2c 20 26 67  5f 66 66 5f 73 65 74 75  |TRUE, &g_ff_setu|
0000bce0  70 29 29 20 72 65 74 75  72 6e 20 46 41 4c 53 45  |p)) return FALSE|
0000bcf0  3b 0a 20 20 20 20 77 74  73 73 61 66 65 3d 54 52  |;.    wtssafe=TR|
0000bd00  55 45 3b 0a 20 20 7d 0a  20 20 72 65 74 75 72 6e  |UE;.  }.  return|
0000bd10  20 54 52 55 45 3b 0a 7d  0a 0a 42 4f 4f 4c 20 67  | TRUE;.}..BOOL g|
0000bd20  75 69 5f 74 6f 5f 6e 65  74 70 61 72 61 6d 73 32  |ui_to_netparams2|
0000bd30  28 76 6f 69 64 29 0a 7b  0a 20 20 64 6f 75 62 6c  |(void).{.  doubl|
0000bd40  65 20 64 3b 0a 20 20 42  4f 4f 4c 20 62 6c 61 6e  |e d;.  BOOL blan|
0000bd50  6b 3b 0a 20 20 77 69 6d  70 5f 69 63 6f 6e 20 69  |k;.  wimp_icon i|
0000bd60  63 6f 6e 3b 0a 0a 20 20  62 6c 61 6e 6b 3d 21 6d  |con;..  blank=!m|
0000bd70  64 62 78 5f 67 65 74 64  6f 75 62 6c 65 28 70 61  |dbx_getdouble(pa|
0000bd80  72 61 5f 77 69 6e 5f 68  61 6e 64 6c 65 2c 20 70  |ra_win_handle, p|
0000bd90  69 74 5f 72 66 2c 20 26  64 29 3b 0a 20 20 69 66  |it_rf, &d);.  if|
0000bda0  20 28 62 6c 61 6e 6b 20  7c 7c 20 64 3c 30 2e 30  | (blank || d<0.0|
0000bdb0  20 7c 7c 20 64 3e 66 70  74 6f 64 28 4d 41 58 5f  | || d>fptod(MAX_|
0000bdc0  46 4f 52 43 45 29 29 20  7b 0a 20 20 20 20 69 66  |FORCE)) {.    if|
0000bdd0  20 28 64 3c 30 2e 30 29  20 64 3d 30 2e 30 3b 0a  | (d<0.0) d=0.0;.|
0000bde0  20 20 20 20 69 66 20 28  64 3e 66 70 74 6f 64 28  |    if (d>fptod(|
0000bdf0  4d 41 58 5f 46 4f 52 43  45 29 29 20 64 3d 66 70  |MAX_FORCE)) d=fp|
0000be00  74 6f 64 28 4d 41 58 5f  46 4f 52 43 45 29 3b 0a  |tod(MAX_FORCE);.|
0000be10  20 20 20 20 6d 64 62 78  5f 73 65 74 64 6f 75 62  |    mdbx_setdoub|
0000be20  6c 65 28 70 61 72 61 5f  77 69 6e 5f 68 61 6e 64  |le(para_win_hand|
0000be30  6c 65 2c 20 70 69 74 5f  72 66 2c 20 64 29 3b 0a  |le, pit_rf, d);.|
0000be40  20 20 7d 0a 20 20 67 5f  62 72 6d 5f 73 65 74 75  |  }.  g_brm_setu|
0000be50  70 2e 72 61 6e 64 5f 66  6f 72 63 65 20 3d 20 64  |p.rand_force = d|
0000be60  74 6f 66 70 28 64 29 3b  0a 0a 20 20 62 6c 61 6e  |tofp(d);..  blan|
0000be70  6b 3d 21 6d 64 62 78 5f  67 65 74 64 6f 75 62 6c  |k=!mdbx_getdoubl|
0000be80  65 28 70 61 72 61 5f 77  69 6e 5f 68 61 6e 64 6c  |e(para_win_handl|
0000be90  65 2c 20 70 69 74 5f 73  66 2c 20 26 64 29 3b 0a  |e, pit_sf, &d);.|
0000bea0  20 20 69 66 20 28 62 6c  61 6e 6b 20 7c 7c 20 64  |  if (blank || d|
0000beb0  3c 30 2e 30 20 7c 7c 20  64 3e 66 70 74 6f 64 28  |<0.0 || d>fptod(|
0000bec0  4d 41 58 5f 46 4f 52 43  45 29 29 20 7b 0a 20 20  |MAX_FORCE)) {.  |
0000bed0  20 20 69 66 20 28 64 3c  30 2e 30 29 20 64 3d 30  |  if (d<0.0) d=0|
0000bee0  2e 30 3b 0a 20 20 20 20  69 66 20 28 64 3e 66 70  |.0;.    if (d>fp|
0000bef0  74 6f 64 28 4d 41 58 5f  46 4f 52 43 45 29 29 20  |tod(MAX_FORCE)) |
0000bf00  64 3d 66 70 74 6f 64 28  4d 41 58 5f 46 4f 52 43  |d=fptod(MAX_FORC|
0000bf10  45 29 3b 0a 20 20 20 20  6d 64 62 78 5f 73 65 74  |E);.    mdbx_set|
0000bf20  64 6f 75 62 6c 65 28 70  61 72 61 5f 77 69 6e 5f  |double(para_win_|
0000bf30  68 61 6e 64 6c 65 2c 20  70 69 74 5f 73 66 2c 20  |handle, pit_sf, |
0000bf40  64 29 3b 0a 20 20 7d 0a  20 20 67 5f 62 72 6d 5f  |d);.  }.  g_brm_|
0000bf50  73 65 74 75 70 2e 73 79  73 74 65 6d 5f 66 6f 72  |setup.system_for|
0000bf60  63 65 5f 69 6e 63 72 20  3d 20 64 74 6f 66 70 28  |ce_incr = dtofp(|
0000bf70  64 29 3b 0a 0a 20 20 62  6c 61 6e 6b 3d 21 6d 64  |d);..  blank=!md|
0000bf80  62 78 5f 67 65 74 64 6f  75 62 6c 65 28 70 61 72  |bx_getdouble(par|
0000bf90  61 5f 77 69 6e 5f 68 61  6e 64 6c 65 2c 20 70 69  |a_win_handle, pi|
0000bfa0  74 5f 75 66 2c 20 26 64  29 3b 0a 20 20 69 66 20  |t_uf, &d);.  if |
0000bfb0  28 62 6c 61 6e 6b 20 7c  7c 20 64 3c 30 2e 30 20  |(blank || d<0.0 |
0000bfc0  7c 7c 20 64 3e 66 70 74  6f 64 28 4d 41 58 5f 46  ||| d>fptod(MAX_F|
0000bfd0  4f 52 43 45 29 29 20 7b  0a 20 20 20 20 69 66 20  |ORCE)) {.    if |
0000bfe0  28 64 3c 30 2e 30 29 20  64 3d 30 2e 30 3b 0a 20  |(d<0.0) d=0.0;. |
0000bff0  20 20 20 69 66 20 28 64  3e 66 70 74 6f 64 28 4d  |   if (d>fptod(M|
0000c000  41 58 5f 46 4f 52 43 45  29 29 20 64 3d 66 70 74  |AX_FORCE)) d=fpt|
0000c010  6f 64 28 4d 41 58 5f 46  4f 52 43 45 29 3b 0a 20  |od(MAX_FORCE);. |
0000c020  20 20 20 6d 64 62 78 5f  73 65 74 64 6f 75 62 6c  |   mdbx_setdoubl|
0000c030  65 28 70 61 72 61 5f 77  69 6e 5f 68 61 6e 64 6c  |e(para_win_handl|
0000c040  65 2c 20 70 69 74 5f 75  66 2c 20 64 29 3b 0a 20  |e, pit_uf, d);. |
0000c050  20 7d 0a 20 20 67 5f 62  72 6d 5f 73 65 74 75 70  | }.  g_brm_setup|
0000c060  2e 75 73 65 72 5f 66 6f  72 63 65 5f 69 6e 63 72  |.user_force_incr|
0000c070  20 3d 20 64 74 6f 66 70  28 64 29 3b 0a 0a 20 20  | = dtofp(d);..  |
0000c080  62 6c 61 6e 6b 3d 21 6d  64 62 78 5f 67 65 74 64  |blank=!mdbx_getd|
0000c090  6f 75 62 6c 65 28 70 61  72 61 5f 77 69 6e 5f 68  |ouble(para_win_h|
0000c0a0  61 6e 64 6c 65 2c 20 70  69 74 5f 7a 74 74 2c 20  |andle, pit_ztt, |
0000c0b0  26 64 29 3b 0a 20 20 69  66 20 28 62 6c 61 6e 6b  |&d);.  if (blank|
0000c0c0  20 7c 7c 20 64 3c 30 2e  30 20 7c 7c 20 64 3e 31  | || d<0.0 || d>1|
0000c0d0  2e 30 29 20 7b 0a 20 20  20 20 69 66 20 28 64 3c  |.0) {.    if (d<|
0000c0e0  30 2e 30 29 20 64 3d 30  2e 30 3b 0a 20 20 20 20  |0.0) d=0.0;.    |
0000c0f0  69 66 20 28 64 3e 31 2e  30 29 20 64 3d 31 2e 30  |if (d>1.0) d=1.0|
0000c100  3b 0a 20 20 20 20 6d 64  62 78 5f 73 65 74 64 6f  |;.    mdbx_setdo|
0000c110  75 62 6c 65 28 70 61 72  61 5f 77 69 6e 5f 68 61  |uble(para_win_ha|
0000c120  6e 64 6c 65 2c 20 70 69  74 5f 7a 74 74 2c 20 64  |ndle, pit_ztt, d|
0000c130  29 3b 0a 20 20 7d 0a 20  20 67 5f 62 72 6d 5f 73  |);.  }.  g_brm_s|
0000c140  65 74 75 70 2e 7a 65 72  6f 5f 74 68 65 74 61 20  |etup.zero_theta |
0000c150  3d 20 64 74 6f 66 70 28  64 29 3b 0a 0a 20 20 77  |= dtofp(d);..  w|
0000c160  69 6d 70 74 5f 63 6f 6d  70 6c 61 69 6e 28 77 69  |impt_complain(wi|
0000c170  6d 70 5f 67 65 74 5f 69  63 6f 6e 5f 69 6e 66 6f  |mp_get_icon_info|
0000c180  28 70 61 72 61 5f 77 69  6e 5f 68 61 6e 64 6c 65  |(para_win_handle|
0000c190  2c 20 70 69 74 5f 63 63  2c 20 26 69 63 6f 6e 29  |, pit_cc, &icon)|
0000c1a0  29 3b 0a 20 20 67 65 74  5f 66 6f 72 63 65 20 3d  |);.  get_force =|
0000c1b0  20 69 63 6f 6e 2e 66 6c  61 67 73 26 77 69 6d 70  | icon.flags&wimp|
0000c1c0  5f 49 53 45 4c 45 43 54  45 44 20 3f 20 6e 65 75  |_ISELECTED ? neu|
0000c1d0  72 61 6c 5f 63 6f 6e 74  72 6f 6c 20 3a 20 6e 75  |ral_control : nu|
0000c1e0  6c 6c 5f 63 6f 6e 74 72  6f 6c 3b 0a 0a 20 20 77  |ll_control;..  w|
0000c1f0  69 6d 70 74 5f 63 6f 6d  70 6c 61 69 6e 28 77 69  |impt_complain(wi|
0000c200  6d 70 5f 67 65 74 5f 69  63 6f 6e 5f 69 6e 66 6f  |mp_get_icon_info|
0000c210  28 70 61 72 61 5f 77 69  6e 5f 68 61 6e 64 6c 65  |(para_win_handle|
0000c220  2c 20 70 69 74 5f 66 2c  20 26 69 63 6f 6e 29 29  |, pit_f, &icon))|
0000c230  3b 0a 20 20 73 70 65 65  64 20 3d 20 69 63 6f 6e  |;.  speed = icon|
0000c240  2e 66 6c 61 67 73 26 77  69 6d 70 5f 49 53 45 4c  |.flags&wimp_ISEL|
0000c250  45 43 54 45 44 20 3f 20  32 20 3a 20 34 3b 0a 0a  |ECTED ? 2 : 4;..|
0000c260  20 20 72 65 74 75 72 6e  20 54 52 55 45 3b 0a 7d  |  return TRUE;.}|
0000c270  0a 0a 42 4f 4f 4c 20 72  65 61 64 5f 6d 6f 64 65  |..BOOL read_mode|
0000c280  28 69 6e 74 20 2a 2a 70  29 0a 7b 0a 20 20 69 6e  |(int **p).{.  in|
0000c290  74 20 78 2c 20 79 3b 0a  20 20 69 6e 74 20 73 69  |t x, y;.  int si|
0000c2a0  7a 65 3b 0a 20 20 69 6e  74 20 2a 6d 73 2c 20 2a  |ze;.  int *ms, *|
0000c2b0  6d 73 65 2c 20 2a 64 3b  0a 20 20 6f 73 5f 62 79  |mse, *d;.  os_by|
0000c2c0  74 65 28 31 33 35 2c 20  26 78 2c 20 26 79 29 3b  |te(135, &x, &y);|
0000c2d0  0a 20 20 69 66 20 28 79  3c 32 35 36 29 20 73 69  |.  if (y<256) si|
0000c2e0  7a 65 3d 34 3b 09 09 2f  2a 77 65 27 76 65 20 62  |ze=4;../*we've b|
0000c2f0  65 65 6e 20 67 69 76 65  6e 20 61 20 6d 6f 64 65  |een given a mode|
0000c300  20 6e 75 6d 62 65 72 2a  2f 0a 20 20 65 6c 73 65  | number*/.  else|
0000c310  20 7b 09 09 09 2f 2a 77  65 27 72 65 20 6f 6e 20  | {.../*we're on |
0000c320  61 20 52 49 53 43 20 50  43 20 61 6e 64 20 68 61  |a RISC PC and ha|
0000c330  76 65 20 62 65 65 6e 20  67 69 76 65 6e 20 61 20  |ve been given a |
0000c340  70 6f 69 6e 74 65 72 20  74 6f 20 61 20 6d 6f 64  |pointer to a mod|
0000c350  65 20 73 65 6c 65 63 74  6f 72 2a 2f 0a 20 20 20  |e selector*/.   |
0000c360  20 6d 73 20 3d 20 28 69  6e 74 20 2a 29 79 3b 0a  | ms = (int *)y;.|
0000c370  20 20 20 20 64 20 20 3d  20 6d 73 2b 35 3b 0a 20  |    d  = ms+5;. |
0000c380  20 20 20 66 6f 72 20 28  3b 2a 64 21 3d 2d 31 3b  |   for (;*d!=-1;|
0000c390  64 2b 3d 32 29 3b 0a 20  20 20 20 6d 73 65 20 3d  |d+=2);.    mse =|
0000c3a0  20 64 2b 31 3b 0a 20 20  20 20 73 69 7a 65 20 3d  | d+1;.    size =|
0000c3b0  20 34 20 2b 20 28 6d 73  65 2d 6d 73 29 2a 73 69  | 4 + (mse-ms)*si|
0000c3c0  7a 65 6f 66 28 69 6e 74  29 3b 0a 20 20 7d 0a 20  |zeof(int);.  }. |
0000c3d0  20 69 66 20 28 2a 70 29  20 7b 0a 20 20 20 20 66  | if (*p) {.    f|
0000c3e0  72 65 65 28 2a 70 29 3b  0a 20 20 20 20 2a 70 20  |ree(*p);.    *p |
0000c3f0  3d 20 30 3b 0a 20 20 7d  0a 20 20 2a 70 20 3d 20  |= 0;.  }.  *p = |
0000c400  6d 61 6c 6c 6f 63 28 73  69 7a 65 29 3b 0a 20 20  |malloc(size);.  |
0000c410  69 66 20 28 2a 70 3d 3d  30 29 20 72 65 74 75 72  |if (*p==0) retur|
0000c420  6e 20 46 41 4c 53 45 3b  0a 20 20 69 66 20 28 73  |n FALSE;.  if (s|
0000c430  69 7a 65 3d 3d 34 29 20  2a 2a 70 20 3d 20 79 3b  |ize==4) **p = y;|
0000c440  09 09 2f 2a 73 74 6f 72  65 20 6d 6f 64 65 20 6e  |../*store mode n|
0000c450  75 6d 62 65 72 20 69 6e  20 62 6c 6f 63 6b 2a 2f  |umber in block*/|
0000c460  0a 20 20 65 6c 73 65 20  7b 0a 20 20 20 20 2a 2a  |.  else {.    **|
0000c470  70 20 3d 20 28 69 6e 74  29 28 31 2b 2a 70 29 3b  |p = (int)(1+*p);|
0000c480  09 09 2f 2a 6d 61 6b 65  20 66 69 72 73 74 20 77  |../*make first w|
0000c490  6f 72 64 20 69 6e 20 62  6c 6f 63 6b 20 61 20 70  |ord in block a p|
0000c4a0  6f 69 6e 74 65 72 20 74  6f 20 6e 65 78 74 20 77  |ointer to next w|
0000c4b0  6f 72 64 2c 20 61 6e 64  20 63 6f 70 79 20 74 6f  |ord, and copy to|
0000c4c0  20 74 68 65 72 65 20 74  68 65 20 6d 6f 64 65 20  | there the mode |
0000c4d0  73 65 6c 65 63 74 6f 72  2a 2f 0a 20 20 20 20 6d  |selector*/.    m|
0000c4e0  65 6d 63 70 79 28 31 2b  2a 70 2c 20 6d 73 2c 20  |emcpy(1+*p, ms, |
0000c4f0  73 69 7a 65 2d 34 29 3b  0a 20 20 7d 0a 20 20 72  |size-4);.  }.  r|
0000c500  65 74 75 72 6e 20 54 52  55 45 3b 0a 7d 0a 0a 42  |eturn TRUE;.}..B|
0000c510  4f 4f 4c 20 73 65 74 5f  6d 6f 64 65 28 69 6e 74  |OOL set_mode(int|
0000c520  20 2a 70 29 0a 7b 0a 20  20 69 66 20 28 2a 70 3c  | *p).{.  if (*p<|
0000c530  32 35 36 29 20 62 62 63  5f 6d 6f 64 65 28 2a 70  |256) bbc_mode(*p|
0000c540  29 3b 0a 20 20 65 6c 73  65 20 7b 0a 20 20 20 20  |);.  else {.    |
0000c550  69 66 20 28 6f 73 5f 73  77 69 32 28 6f 73 5f 58  |if (os_swi2(os_X|
0000c560  20 7c 20 30 78 36 35 2c  20 30 2c 20 2a 70 29 29  | | 0x65, 0, *p))|
0000c570  20 72 65 74 75 72 6e 20  46 41 4c 53 45 3b 09 2f  | return FALSE;./|
0000c580  2a 6e 62 20 74 68 69 73  20 6c 69 6e 65 20 77 6f  |*nb this line wo|
0000c590  75 6c 64 20 61 6c 73 6f  20 77 6f 72 6b 20 6f 6e  |uld also work on|
0000c5a0  20 61 20 52 49 53 43 20  50 43 20 69 66 20 2a 70  | a RISC PC if *p|
0000c5b0  3c 32 35 36 2a 2f 0a 20  20 7d 0a 20 20 72 65 74  |<256*/.  }.  ret|
0000c5c0  75 72 6e 20 54 52 55 45  3b 0a 7d 0a 0a 42 4f 4f  |urn TRUE;.}..BOO|
0000c5d0  4c 20 72 65 61 64 5f 77  69 6d 70 70 61 6c 65 74  |L read_wimppalet|
0000c5e0  74 65 28 63 68 61 72 20  2a 70 29 0a 7b 0a 20 20  |te(char *p).{.  |
0000c5f0  69 6e 74 20 69 3b 0a 20  20 69 66 20 28 6f 73 5f  |int i;.  if (os_|
0000c600  73 77 69 32 28 6f 73 5f  58 20 7c 20 57 69 6d 70  |swi2(os_X | Wimp|
0000c610  5f 52 65 61 64 50 61 6c  65 74 74 65 2c 20 30 2c  |_ReadPalette, 0,|
0000c620  20 28 69 6e 74 29 70 29  29 20 72 65 74 75 72 6e  | (int)p)) return|
0000c630  20 46 41 4c 53 45 3b 0a  20 20 66 6f 72 20 28 69  | FALSE;.  for (i|
0000c640  3d 30 3b 20 69 3c 32 30  2a 34 3b 20 69 2b 3d 34  |=0; i<20*4; i+=4|
0000c650  29 20 70 5b 69 5d 3d 30  3b 0a 20 20 72 65 74 75  |) p[i]=0;.  retu|
0000c660  72 6e 20 54 52 55 45 3b  0a 7d 0a 0a 76 6f 69 64  |rn TRUE;.}..void|
0000c670  20 70 72 65 70 61 72 65  5f 73 63 72 65 65 6e 5f  | prepare_screen_|
0000c680  69 6e 69 74 28 76 6f 69  64 29 0a 7b 0a 20 20 72  |init(void).{.  r|
0000c690  65 61 64 5f 6d 6f 64 65  28 26 6f 6c 64 6d 6f 64  |ead_mode(&oldmod|
0000c6a0  65 29 3b 0a 20 20 72 65  61 64 5f 77 69 6d 70 70  |e);.  read_wimpp|
0000c6b0  61 6c 65 74 74 65 28 6f  6c 64 70 61 6c 65 74 74  |alette(oldpalett|
0000c6c0  65 29 3b 0a 20 20 77 69  6d 70 5f 67 65 74 5f 70  |e);.  wimp_get_p|
0000c6d0  6f 69 6e 74 5f 69 6e 66  6f 28 26 6f 6c 64 6d 6f  |oint_info(&oldmo|
0000c6e0  75 73 65 29 3b 0a 20 20  62 62 63 5f 6d 6f 64 65  |use);.  bbc_mode|
0000c6f0  28 6d 6f 64 65 2b 31 32  38 29 3b 0a 20 20 73 63  |(mode+128);.  sc|
0000c700  72 73 74 5b 31 5d 20 3d  20 67 65 74 5f 73 63 72  |rst[1] = get_scr|
0000c710  65 65 6e 5f 62 61 73 65  28 29 3b 0a 20 20 62 62  |een_base();.  bb|
0000c720  63 5f 6d 6f 64 65 28 6d  6f 64 65 29 3b 0a 20 20  |c_mode(mode);.  |
0000c730  73 63 72 73 74 5b 30 5d  20 3d 20 67 65 74 5f 73  |scrst[0] = get_s|
0000c740  63 72 65 65 6e 5f 62 61  73 65 28 29 3b 0a 20 20  |creen_base();.  |
0000c750  62 62 63 5f 63 75 72 73  6f 72 28 30 29 3b 0a 20  |bbc_cursor(0);. |
0000c760  20 77 69 6d 70 74 5f 63  6f 6d 70 6c 61 69 6e 28  | wimpt_complain(|
0000c770  6f 73 5f 73 77 69 32 28  6f 73 5f 58 20 7c 20 57  |os_swi2(os_X | W|
0000c780  69 6d 70 5f 53 65 74 50  61 6c 65 74 74 65 2c 20  |imp_SetPalette, |
0000c790  30 2c 20 28 69 6e 74 29  70 61 6c 65 74 74 65 29  |0, (int)palette)|
0000c7a0  29 3b 0a 20 20 62 62 63  5f 6f 72 69 67 69 6e 28  |);.  bbc_origin(|
0000c7b0  67 6f 72 69 67 69 6e 78  2c 20 67 6f 72 69 67 69  |goriginx, gorigi|
0000c7c0  6e 79 29 3b 0a 7d 0a 0a  76 6f 69 64 20 70 72 65  |ny);.}..void pre|
0000c7d0  70 61 72 65 5f 73 63 72  65 65 6e 5f 74 72 61 69  |pare_screen_trai|
0000c7e0  6e 28 76 6f 69 64 29 0a  7b 0a 20 20 70 72 65 70  |n(void).{.  prep|
0000c7f0  61 72 65 5f 73 63 72 65  65 6e 5f 69 6e 69 74 28  |are_screen_init(|
0000c800  29 3b 0a 7d 0a 0a 76 6f  69 64 20 70 72 65 70 61  |);.}..void prepa|
0000c810  72 65 5f 73 63 72 65 65  6e 5f 70 6c 61 79 28 76  |re_screen_play(v|
0000c820  6f 69 64 29 0a 7b 0a 20  20 70 72 65 70 61 72 65  |oid).{.  prepare|
0000c830  5f 73 63 72 65 65 6e 5f  69 6e 69 74 28 29 3b 0a  |_screen_init();.|
0000c840  20 20 62 61 6e 6b 3d 31  3b 0a 20 20 6f 73 5f 73  |  bank=1;.  os_s|
0000c850  77 69 32 28 4f 53 5f 42  79 74 65 2c 20 31 31 32  |wi2(OS_Byte, 112|
0000c860  2c 20 62 61 6e 6b 29 3b  0a 20 20 6f 73 5f 73 77  |, bank);.  os_sw|
0000c870  69 32 28 4f 53 5f 42 79  74 65 2c 20 31 31 33 2c  |i2(OS_Byte, 113,|
0000c880  20 33 2d 62 61 6e 6b 29  3b 0a 7d 0a 0a 76 6f 69  | 3-bank);.}..voi|
0000c890  64 20 72 65 73 65 74 5f  73 63 72 65 65 6e 28 76  |d reset_screen(v|
0000c8a0  6f 69 64 29 0a 7b 0a 20  20 63 68 61 72 20 62 6c  |oid).{.  char bl|
0000c8b0  6f 63 6b 5b 35 5d 20 3d  20 7b 33 2c 20 30 2c 20  |ock[5] = {3, 0, |
0000c8c0  30 2c 20 30 2c 20 30 7d  3b 0a 20 20 77 69 6d 70  |0, 0, 0};.  wimp|
0000c8d0  5f 72 65 64 72 61 77 73  74 72 20 72 3b 0a 20 20  |_redrawstr r;.  |
0000c8e0  73 65 74 5f 6d 6f 64 65  28 6f 6c 64 6d 6f 64 65  |set_mode(oldmode|
0000c8f0  29 3b 0a 20 20 74 69 64  79 28 29 3b 0a 20 20 77  |);.  tidy();.  w|
0000c900  69 6d 70 74 5f 63 6f 6d  70 6c 61 69 6e 28 6f 73  |impt_complain(os|
0000c910  5f 73 77 69 32 28 6f 73  5f 58 20 7c 20 57 69 6d  |_swi2(os_X | Wim|
0000c920  70 5f 53 65 74 50 61 6c  65 74 74 65 2c 20 30 2c  |p_SetPalette, 0,|
0000c930  20 28 69 6e 74 29 6f 6c  64 70 61 6c 65 74 74 65  | (int)oldpalette|
0000c940  29 29 3b 0a 20 20 6f 73  5f 73 77 69 32 28 6f 73  |));.  os_swi2(os|
0000c950  5f 58 20 7c 20 4f 53 5f  42 79 74 65 2c 20 31 35  |_X | OS_Byte, 15|
0000c960  2c 20 31 29 3b 0a 20 20  70 6f 69 6e 74 65 72 5f  |, 1);.  pointer_|
0000c970  72 65 73 65 74 5f 73 68  61 70 65 28 29 3b 0a 20  |reset_shape();. |
0000c980  20 62 6c 6f 63 6b 5b 31  5d 20 3d 20 6f 6c 64 6d  | block[1] = oldm|
0000c990  6f 75 73 65 2e 78 26 32  35 35 3b 0a 20 20 62 6c  |ouse.x&255;.  bl|
0000c9a0  6f 63 6b 5b 32 5d 20 3d  20 6f 6c 64 6d 6f 75 73  |ock[2] = oldmous|
0000c9b0  65 2e 78 3e 3e 38 26 32  35 35 3b 0a 20 20 62 6c  |e.x>>8&255;.  bl|
0000c9c0  6f 63 6b 5b 33 5d 20 3d  20 6f 6c 64 6d 6f 75 73  |ock[3] = oldmous|
0000c9d0  65 2e 79 26 32 35 35 3b  0a 20 20 62 6c 6f 63 6b  |e.y&255;.  block|
0000c9e0  5b 34 5d 20 3d 20 6f 6c  64 6d 6f 75 73 65 2e 79  |[4] = oldmouse.y|
0000c9f0  3e 3e 38 26 32 35 35 3b  0a 20 20 6f 73 5f 77 6f  |>>8&255;.  os_wo|
0000ca00  72 64 28 32 31 2c 20 62  6c 6f 63 6b 29 3b 0a 20  |rd(21, block);. |
0000ca10  20 72 2e 77 20 3d 20 2d  31 3b 0a 20 20 72 2e 62  | r.w = -1;.  r.b|
0000ca20  6f 78 2e 78 30 20 3d 20  30 3b 0a 20 20 72 2e 62  |ox.x0 = 0;.  r.b|
0000ca30  6f 78 2e 79 30 20 3d 20  30 3b 0a 20 20 72 2e 62  |ox.y0 = 0;.  r.b|
0000ca40  6f 78 2e 78 31 20 3d 20  36 35 35 33 35 3b 0a 20  |ox.x1 = 65535;. |
0000ca50  20 72 2e 62 6f 78 2e 79  31 20 3d 20 36 35 35 33  | r.box.y1 = 6553|
0000ca60  35 3b 0a 20 20 77 69 6d  70 74 5f 63 6f 6d 70 6c  |5;.  wimpt_compl|
0000ca70  61 69 6e 28 77 69 6d 70  5f 66 6f 72 63 65 5f 72  |ain(wimp_force_r|
0000ca80  65 64 72 61 77 28 26 72  29 29 3b 0a 7d 0a 0a 42  |edraw(&r));.}..B|
0000ca90  4f 4f 4c 20 62 72 6f 6c  6c 79 5f 63 72 65 61 74  |OOL brolly_creat|
0000caa0  65 5f 77 69 6e 64 6f 77  28 63 68 61 72 20 2a 6e  |e_window(char *n|
0000cab0  61 6d 65 2c 20 77 69 6d  70 5f 77 20 2a 68 61 6e  |ame, wimp_w *han|
0000cac0  64 6c 65 29 0a 7b 0a 20  20 77 69 6d 70 5f 77 69  |dle).{.  wimp_wi|
0000cad0  6e 64 20 2a 77 69 6e 64  6f 77 3b 0a 20 20 77 69  |nd *window;.  wi|
0000cae0  6e 64 6f 77 20 3d 20 74  65 6d 70 6c 61 74 65 5f  |ndow = template_|
0000caf0  73 79 73 68 61 6e 64 6c  65 28 6e 61 6d 65 29 3b  |syshandle(name);|
0000cb00  0a 20 20 69 66 20 28 77  69 6e 64 6f 77 20 3d 3d  |.  if (window ==|
0000cb10  20 30 29 20 20 72 65 74  75 72 6e 20 46 41 4c 53  | 0)  return FALS|
0000cb20  45 3b 0a 20 20 72 65 74  75 72 6e 20 28 77 69 6d  |E;.  return (wim|
0000cb30  70 74 5f 63 6f 6d 70 6c  61 69 6e 28 77 69 6d 70  |pt_complain(wimp|
0000cb40  5f 63 72 65 61 74 65 5f  77 69 6e 64 28 77 69 6e  |_create_wind(win|
0000cb50  64 6f 77 2c 20 68 61 6e  64 6c 65 29 29 20 3d 3d  |dow, handle)) ==|
0000cb60  20 30 29 3b 0a 7d 0a 0a  76 6f 69 64 20 63 61 72  | 0);.}..void car|
0000cb70  65 74 5f 68 6f 70 28 77  69 6d 70 5f 63 61 72 65  |et_hop(wimp_care|
0000cb80  74 73 74 72 20 2a 63 2c  20 77 69 6d 70 5f 69 20  |tstr *c, wimp_i |
0000cb90  69 29 0a 7b 0a 20 20 63  2d 3e 69 20 3d 20 69 3b  |i).{.  c->i = i;|
0000cba0  0a 20 20 63 2d 3e 68 65  69 67 68 74 20 3d 20 2d  |.  c->height = -|
0000cbb0  31 3b 0a 20 20 63 2d 3e  69 6e 64 65 78 20 3d 20  |1;.  c->index = |
0000cbc0  2d 31 3b 0a 20 20 63 2d  3e 78 3d 36 35 35 33 35  |-1;.  c->x=65535|
0000cbd0  3b 0a 20 20 77 69 6d 70  74 5f 6e 6f 65 72 72 28  |;.  wimpt_noerr(|
0000cbe0  77 69 6d 70 5f 73 65 74  5f 63 61 72 65 74 5f 70  |wimp_set_caret_p|
0000cbf0  6f 73 28 63 29 29 3b 0a  7d 0a 0a 42 4f 4f 4c 20  |os(c));.}..BOOL |
0000cc00  64 6f 5f 74 72 61 69 6e  28 76 6f 69 64 29 0a 7b  |do_train(void).{|
0000cc10  0a 20 20 69 66 20 28 21  65 6e 73 75 72 65 5f 6e  |.  if (!ensure_n|
0000cc20  65 74 77 6f 72 6b 5f 65  78 69 73 74 73 28 26 67  |etwork_exists(&g|
0000cc30  5f 6e 65 74 77 6f 72 6b  2c 20 26 67 5f 66 66 5f  |_network, &g_ff_|
0000cc40  73 65 74 75 70 29 29 20  72 65 74 75 72 6e 20 46  |setup)) return F|
0000cc50  41 4c 53 45 3b 0a 20 20  69 66 20 28 21 67 75 69  |ALSE;.  if (!gui|
0000cc60  5f 74 6f 5f 6e 65 74 70  61 72 61 6d 73 31 28 29  |_to_netparams1()|
0000cc70  29 20 72 65 74 75 72 6e  20 46 41 4c 53 45 3b 0a  |) return FALSE;.|
0000cc80  20 20 70 72 65 70 61 72  65 5f 73 63 72 65 65 6e  |  prepare_screen|
0000cc90  5f 74 72 61 69 6e 28 29  3b 0a 20 20 62 61 63 6b  |_train();.  back|
0000cca0  70 72 6f 70 61 67 61 74  69 6f 6e 5f 74 72 61 69  |propagation_trai|
0000ccb0  6e 69 6e 67 28 26 67 5f  6e 65 74 77 6f 72 6b 2c  |ning(&g_network,|
0000ccc0  20 26 67 5f 77 65 69 67  68 74 73 2c 20 6e 6f 5f  | &g_weights, no_|
0000ccd0  6f 66 5f 74 72 61 69 6e  69 6e 67 5f 69 74 65 6d  |of_training_item|
0000cce0  73 2c 20 62 72 6f 6c 6c  79 5f 64 79 6e 61 6d 69  |s, brolly_dynami|
0000ccf0  63 73 5f 69 6e 70 75 74  2c 20 54 52 55 45 2c 20  |cs_input, TRUE, |
0000cd00  26 67 5f 66 66 5f 73 65  74 75 70 29 3b 0a 20 20  |&g_ff_setup);.  |
0000cd10  77 74 73 73 61 66 65 3d  46 41 4c 53 45 3b 0a 20  |wtssafe=FALSE;. |
0000cd20  20 72 65 73 65 74 5f 73  63 72 65 65 6e 28 29 3b  | reset_screen();|
0000cd30  0a 20 20 72 65 74 75 72  6e 20 54 52 55 45 3b 0a  |.  return TRUE;.|
0000cd40  7d 0a 0a 42 4f 4f 4c 20  64 6f 5f 70 6c 61 79 28  |}..BOOL do_play(|
0000cd50  76 6f 69 64 29 0a 7b 0a  20 20 67 75 69 5f 74 6f  |void).{.  gui_to|
0000cd60  5f 6e 65 74 70 61 72 61  6d 73 32 28 29 3b 0a 20  |_netparams2();. |
0000cd70  20 69 66 20 28 67 65 74  5f 66 6f 72 63 65 21 3d  | if (get_force!=|
0000cd80  6e 75 6c 6c 5f 63 6f 6e  74 72 6f 6c 20 26 26 20  |null_control && |
0000cd90  21 67 5f 77 65 69 67 68  74 73 2e 61 6c 6c 6f 63  |!g_weights.alloc|
0000cda0  61 74 65 64 29 20 7b 0a  20 20 20 20 77 65 72 72  |ated) {.    werr|
0000cdb0  28 30 2c 20 6d 73 67 73  5f 6c 6f 6f 6b 75 70 28  |(0, msgs_lookup(|
0000cdc0  22 4e 6f 4e 65 74 22 29  29 3b 0a 20 20 20 20 72  |"NoNet"));.    r|
0000cdd0  65 74 75 72 6e 20 46 41  4c 53 45 3b 0a 20 20 7d  |eturn FALSE;.  }|
0000cde0  0a 20 20 70 72 65 70 61  72 65 5f 73 63 72 65 65  |.  prepare_scree|
0000cdf0  6e 5f 70 6c 61 79 28 29  3b 0a 20 20 70 6c 61 79  |n_play();.  play|
0000ce00  5f 67 61 6d 65 28 29 3b  0a 20 20 72 65 73 65 74  |_game();.  reset|
0000ce10  5f 73 63 72 65 65 6e 28  29 3b 0a 20 20 72 65 74  |_screen();.  ret|
0000ce20  75 72 6e 20 54 52 55 45  3b 0a 7d 0a 0a 76 6f 69  |urn TRUE;.}..voi|
0000ce30  64 20 62 72 6f 6c 6c 79  5f 65 76 65 6e 74 5f 68  |d brolly_event_h|
0000ce40  61 6e 64 6c 65 72 28 77  69 6d 70 5f 65 76 65 6e  |andler(wimp_even|
0000ce50  74 73 74 72 20 2a 65 2c  20 76 6f 69 64 20 2a 68  |tstr *e, void *h|
0000ce60  61 6e 64 6c 65 29 0a 7b  0a 20 20 77 69 6d 70 5f  |andle).{.  wimp_|
0000ce70  69 20 69 3b 0a 20 20 77  69 6d 70 5f 69 63 6f 6e  |i i;.  wimp_icon|
0000ce80  20 69 63 6f 6e 3b 0a 20  20 68 61 6e 64 6c 65 20  | icon;.  handle |
0000ce90  3d 20 68 61 6e 64 6c 65  3b 0a 0a 20 20 73 77 69  |= handle;..  swi|
0000cea0  74 63 68 20 28 65 2d 3e  65 29 0a 20 20 7b 0a 20  |tch (e->e).  {. |
0000ceb0  20 20 20 63 61 73 65 20  77 69 6d 70 5f 45 42 55  |   case wimp_EBU|
0000cec0  54 3a 0a 20 20 20 20 20  20 69 66 20 28 65 2d 3e  |T:.      if (e->|
0000ced0  64 61 74 61 2e 62 75 74  2e 6d 2e 77 20 21 3d 20  |data.but.m.w != |
0000cee0  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 29  |para_win_handle)|
0000cef0  20 62 72 65 61 6b 3b 0a  20 20 20 20 20 20 69 20  | break;.      i |
0000cf00  3d 20 65 2d 3e 64 61 74  61 2e 62 75 74 2e 6d 2e  |= e->data.but.m.|
0000cf10  69 3b 0a 20 20 20 20 20  20 73 77 69 74 63 68 20  |i;.      switch |
0000cf20  28 69 29 0a 20 20 20 20  20 20 7b 0a 20 20 20 20  |(i).      {.    |
0000cf30  20 20 20 20 63 61 73 65  20 70 69 74 5f 73 3a 0a  |    case pit_s:.|
0000cf40  20 20 20 20 20 20 20 20  63 61 73 65 20 70 69 74  |        case pit|
0000cf50  5f 66 3a 0a 20 20 20 20  20 20 20 20 20 20 77 69  |_f:.          wi|
0000cf60  6d 70 74 5f 63 6f 6d 70  6c 61 69 6e 28 77 69 6d  |mpt_complain(wim|
0000cf70  70 5f 67 65 74 5f 69 63  6f 6e 5f 69 6e 66 6f 28  |p_get_icon_info(|
0000cf80  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 2c  |para_win_handle,|
0000cf90  20 69 2c 20 26 69 63 6f  6e 29 29 3b 0a 20 20 20  | i, &icon));.   |
0000cfa0  20 20 20 20 20 20 20 69  66 20 28 28 69 63 6f 6e  |       if ((icon|
0000cfb0  2e 66 6c 61 67 73 26 77  69 6d 70 5f 49 53 45 4c  |.flags&wimp_ISEL|
0000cfc0  45 43 54 45 44 29 20 3d  3d 20 30 29 0a 20 20 20  |ECTED) == 0).   |
0000cfd0  20 20 20 20 20 20 20 20  20 77 69 6d 70 74 5f 63  |         wimpt_c|
0000cfe0  6f 6d 70 6c 61 69 6e 28  77 69 6d 70 5f 73 65 74  |omplain(wimp_set|
0000cff0  5f 69 63 6f 6e 5f 73 74  61 74 65 28 70 61 72 61  |_icon_state(para|
0000d000  5f 77 69 6e 5f 68 61 6e  64 6c 65 2c 20 69 3d 3d  |_win_handle, i==|
0000d010  70 69 74 5f 73 3f 70 69  74 5f 66 3a 70 69 74 5f  |pit_s?pit_f:pit_|
0000d020  73 2c 20 77 69 6d 70 5f  49 53 45 4c 45 43 54 45  |s, wimp_ISELECTE|
0000d030  44 2c 20 77 69 6d 70 5f  49 53 45 4c 45 43 54 45  |D, wimp_ISELECTE|
0000d040  44 29 29 3b 0a 20 20 20  20 20 20 20 20 20 20 62  |D));.          b|
0000d050  72 65 61 6b 3b 0a 0a 09  63 61 73 65 20 70 69 74  |reak;...case pit|
0000d060  5f 72 77 3a 0a 20 20 20  20 20 20 20 20 20 20 69  |_rw:.          i|
0000d070  66 20 28 21 65 6e 73 75  72 65 5f 6e 65 74 77 6f  |f (!ensure_netwo|
0000d080  72 6b 5f 65 78 69 73 74  73 28 26 67 5f 6e 65 74  |rk_exists(&g_net|
0000d090  77 6f 72 6b 2c 20 26 67  5f 66 66 5f 73 65 74 75  |work, &g_ff_setu|
0000d0a0  70 29 29 20 62 72 65 61  6b 3b 0a 20 20 20 20 20  |p)) break;.     |
0000d0b0  20 20 20 20 20 69 6e 69  74 69 61 6c 69 73 65 5f  |     initialise_|
0000d0c0  77 65 69 67 68 74 73 28  26 67 5f 77 65 69 67 68  |weights(&g_weigh|
0000d0d0  74 73 2c 20 54 52 55 45  2c 20 26 67 5f 66 66 5f  |ts, TRUE, &g_ff_|
0000d0e0  73 65 74 75 70 29 3b 0a  20 20 20 20 20 20 20 20  |setup);.        |
0000d0f0  20 20 77 74 73 73 61 66  65 3d 54 52 55 45 3b 0a  |  wtssafe=TRUE;.|
0000d100  20 20 20 20 20 20 20 20  20 20 62 72 65 61 6b 3b  |          break;|
0000d110  0a 0a 20 20 20 20 20 20  20 20 63 61 73 65 20 70  |..        case p|
0000d120  69 74 5f 74 6e 3a 0a 09  20 20 64 6f 5f 74 72 61  |it_tn:..  do_tra|
0000d130  69 6e 28 29 3b 0a 20 20  20 20 20 20 20 20 20 20  |in();.          |
0000d140  62 72 65 61 6b 3b 0a 0a  09 63 61 73 65 20 70 69  |break;...case pi|
0000d150  74 5f 70 3a 0a 20 20 20  20 20 20 20 20 20 20 64  |t_p:.          d|
0000d160  6f 5f 70 6c 61 79 28 29  3b 0a 20 20 20 20 20 20  |o_play();.      |
0000d170  20 20 20 20 62 72 65 61  6b 3b 0a 20 20 20 20 20  |    break;.     |
0000d180  20 7d 0a 20 20 20 20 20  20 62 72 65 61 6b 3b 0a  | }.      break;.|
0000d190  0a 20 20 20 20 63 61 73  65 20 77 69 6d 70 5f 45  |.    case wimp_E|
0000d1a0  4f 50 45 4e 3a 0a 20 20  20 20 20 20 69 66 20 28  |OPEN:.      if (|
0000d1b0  65 2d 3e 64 61 74 61 2e  6f 2e 77 20 21 3d 20 70  |e->data.o.w != p|
0000d1c0  61 72 61 5f 77 69 6e 5f  68 61 6e 64 6c 65 29 20  |ara_win_handle) |
0000d1d0  62 72 65 61 6b 3b 0a 20  20 20 20 20 20 6f 70 65  |break;.      ope|
0000d1e0  6e 5f 77 69 6e 64 6f 77  28 26 65 2d 3e 64 61 74  |n_window(&e->dat|
0000d1f0  61 2e 6f 29 3b 0a 20 20  20 20 20 20 62 72 65 61  |a.o);.      brea|
0000d200  6b 3b 0a 0a 20 20 20 20  63 61 73 65 20 77 69 6d  |k;..    case wim|
0000d210  70 5f 45 43 4c 4f 53 45  3a 0a 20 20 20 20 20 20  |p_ECLOSE:.      |
0000d220  69 66 20 28 65 2d 3e 64  61 74 61 2e 6f 2e 77 20  |if (e->data.o.w |
0000d230  21 3d 20 70 61 72 61 5f  77 69 6e 5f 68 61 6e 64  |!= para_win_hand|
0000d240  6c 65 29 20 62 72 65 61  6b 3b 0a 20 20 20 20 20  |le) break;.     |
0000d250  20 77 69 6d 70 74 5f 6e  6f 65 72 72 28 77 69 6d  | wimpt_noerr(wim|
0000d260  70 5f 63 6c 6f 73 65 5f  77 69 6e 64 28 65 2d 3e  |p_close_wind(e->|
0000d270  64 61 74 61 2e 6f 2e 77  29 29 3b 0a 20 20 20 20  |data.o.w));.    |
0000d280  20 20 70 61 72 61 5f 77  69 6e 64 6f 77 5f 6f 70  |  para_window_op|
0000d290  65 6e 20 3d 20 46 41 4c  53 45 3b 0a 20 20 20 20  |en = FALSE;.    |
0000d2a0  20 20 62 72 65 61 6b 3b  0a 0a 20 20 20 20 63 61  |  break;..    ca|
0000d2b0  73 65 20 77 69 6d 70 5f  45 4b 45 59 3a 0a 20 20  |se wimp_EKEY:.  |
0000d2c0  20 20 20 20 69 66 20 28  65 2d 3e 64 61 74 61 2e  |    if (e->data.|
0000d2d0  6b 65 79 2e 63 2e 77 3d  3d 70 61 72 61 5f 77 69  |key.c.w==para_wi|
0000d2e0  6e 5f 68 61 6e 64 6c 65  29 20 7b 0a 20 20 20 20  |n_handle) {.    |
0000d2f0  20 20 20 20 69 66 20 28  65 2d 3e 64 61 74 61 2e  |    if (e->data.|
0000d300  6b 65 79 2e 63 68 63 6f  64 65 3d 3d 6b 65 79 5f  |key.chcode==key_|
0000d310  52 45 54 55 52 4e 29 20  7b 0a 20 20 20 20 20 20  |RETURN) {.      |
0000d320  20 20 20 20 69 66 20 28  65 2d 3e 64 61 74 61 2e  |    if (e->data.|
0000d330  6b 65 79 2e 63 2e 69 3d  3d 31 36 29 20 7b 0a 20  |key.c.i==16) {. |
0000d340  20 20 20 20 20 20 20 20  20 20 20 64 6f 5f 74 72  |           do_tr|
0000d350  61 69 6e 28 29 3b 0a 20  20 20 20 20 20 20 20 20  |ain();.         |
0000d360  20 20 20 62 72 65 61 6b  3b 0a 20 20 20 20 20 20  |   break;.      |
0000d370  20 20 20 20 7d 0a 20 20  20 20 20 20 20 20 20 20  |    }.          |
0000d380  69 66 20 28 65 2d 3e 64  61 74 61 2e 6b 65 79 2e  |if (e->data.key.|
0000d390  63 2e 69 3d 3d 32 30 29  20 7b 0a 20 20 20 20 20  |c.i==20) {.     |
0000d3a0  20 20 20 20 20 20 20 64  6f 5f 70 6c 61 79 28 29  |       do_play()|
0000d3b0  3b 0a 20 20 20 20 20 20  20 20 20 20 20 20 62 72  |;.            br|
0000d3c0  65 61 6b 3b 0a 20 20 20  20 20 20 20 20 20 20 7d  |eak;.          }|
0000d3d0  0a 20 20 20 20 20 20 20  20 7d 0a 20 20 20 20 20  |.        }.     |
0000d3e0  20 20 20 73 77 69 74 63  68 20 28 65 2d 3e 64 61  |   switch (e->da|
0000d3f0  74 61 2e 6b 65 79 2e 63  68 63 6f 64 65 29 0a 20  |ta.key.chcode). |
0000d400  20 20 20 20 20 20 20 7b  0a 20 20 20 20 20 20 20  |       {.       |
0000d410  20 20 20 63 68 61 72 20  68 6f 70 74 6f 3b 0a 20  |   char hopto;. |
0000d420  20 20 20 20 20 20 20 20  20 63 61 73 65 20 6b 65  |         case ke|
0000d430  79 5f 52 45 54 55 52 4e  3a 0a 20 20 20 20 20 20  |y_RETURN:.      |
0000d440  20 20 20 20 63 61 73 65  20 6b 65 79 5f 54 41 42  |    case key_TAB|
0000d450  3a 0a 20 20 20 20 20 20  20 20 20 20 63 61 73 65  |:.          case|
0000d460  20 6b 65 79 5f 64 6f 77  6e 61 72 72 6f 77 3a 0a  | key_downarrow:.|
0000d470  20 20 20 20 20 20 20 20  20 20 20 20 69 66 20 28  |            if (|
0000d480  68 6f 70 74 6f 20 3d 20  50 43 48 66 6f 72 5b 65  |hopto = PCHfor[e|
0000d490  2d 3e 64 61 74 61 2e 6b  65 79 2e 63 2e 69 5d 2c  |->data.key.c.i],|
0000d4a0  20 68 6f 70 74 6f 20 21  3d 20 32 35 35 29 20 63  | hopto != 255) c|
0000d4b0  61 72 65 74 5f 68 6f 70  28 26 65 2d 3e 64 61 74  |aret_hop(&e->dat|
0000d4c0  61 2e 6b 65 79 2e 63 2c  20 68 6f 70 74 6f 29 3b  |a.key.c, hopto);|
0000d4d0  0a 20 20 20 20 20 20 20  20 20 20 20 20 62 72 65  |.            bre|
0000d4e0  61 6b 3b 0a 0a 09 20 20  63 61 73 65 20 6b 65 79  |ak;...  case key|
0000d4f0  5f 54 41 42 2b 61 6b 62  64 5f 53 68 3a 0a 20 20  |_TAB+akbd_Sh:.  |
0000d500  20 20 20 20 20 20 20 20  63 61 73 65 20 6b 65 79  |        case key|
0000d510  5f 75 70 61 72 72 6f 77  3a 0a 20 20 20 20 20 20  |_uparrow:.      |
0000d520  20 20 20 20 20 20 69 66  20 28 68 6f 70 74 6f 20  |      if (hopto |
0000d530  3d 20 50 43 48 61 66 74  5b 65 2d 3e 64 61 74 61  |= PCHaft[e->data|
0000d540  2e 6b 65 79 2e 63 2e 69  5d 2c 20 68 6f 70 74 6f  |.key.c.i], hopto|
0000d550  20 21 3d 20 32 35 35 29  20 63 61 72 65 74 5f 68  | != 255) caret_h|
0000d560  6f 70 28 26 65 2d 3e 64  61 74 61 2e 6b 65 79 2e  |op(&e->data.key.|
0000d570  63 2c 20 68 6f 70 74 6f  29 3b 0a 20 20 20 20 20  |c, hopto);.     |
0000d580  20 20 20 20 20 20 20 62  72 65 61 6b 3b 0a 0a 20  |       break;.. |
0000d590  20 20 20 20 20 20 20 20  20 64 65 66 61 75 6c 74  |         default|
0000d5a0  3a 0a 20 20 20 20 20 20  20 20 20 20 20 20 77 69  |:.            wi|
0000d5b0  6d 70 74 5f 6e 6f 65 72  72 28 77 69 6d 70 5f 70  |mpt_noerr(wimp_p|
0000d5c0  72 6f 63 65 73 73 6b 65  79 28 65 2d 3e 64 61 74  |rocesskey(e->dat|
0000d5d0  61 2e 6b 65 79 2e 63 68  63 6f 64 65 29 29 3b 0a  |a.key.chcode));.|
0000d5e0  20 20 20 20 20 20 20 20  20 20 20 20 62 72 65 61  |            brea|
0000d5f0  6b 3b 0a 20 20 20 20 20  20 20 20 7d 0a 20 20 20  |k;.        }.   |
0000d600  20 20 20 7d 0a 20 20 20  20 20 20 65 6c 73 65 20  |   }.      else |
0000d610  77 69 6d 70 74 5f 6e 6f  65 72 72 28 77 69 6d 70  |wimpt_noerr(wimp|
0000d620  5f 70 72 6f 63 65 73 73  6b 65 79 28 65 2d 3e 64  |_processkey(e->d|
0000d630  61 74 61 2e 6b 65 79 2e  63 68 63 6f 64 65 29 29  |ata.key.chcode))|
0000d640  3b 0a 20 20 20 20 20 20  62 72 65 61 6b 3b 0a 0a  |;.      break;..|
0000d650  20 20 20 20 63 61 73 65  20 77 69 6d 70 5f 45 53  |    case wimp_ES|
0000d660  45 4e 44 3a 0a 20 20 20  20 63 61 73 65 20 77 69  |END:.    case wi|
0000d670  6d 70 5f 45 53 45 4e 44  57 41 4e 54 41 43 4b 3a  |mp_ESENDWANTACK:|
0000d680  0a 20 20 20 20 20 20 73  77 69 74 63 68 20 28 65  |.      switch (e|
0000d690  2d 3e 64 61 74 61 2e 6d  73 67 2e 68 64 72 2e 61  |->data.msg.hdr.a|
0000d6a0  63 74 69 6f 6e 29 0a 20  20 20 20 20 20 7b 0a 20  |ction).      {. |
0000d6b0  20 20 20 20 20 20 20 63  61 73 65 20 77 69 6d 70  |       case wimp|
0000d6c0  5f 4d 44 41 54 41 53 41  56 45 3a 0a 20 20 20 20  |_MDATASAVE:.    |
0000d6d0  20 20 20 20 20 20 69 66  20 28 65 2d 3e 64 61 74  |      if (e->dat|
0000d6e0  61 2e 6d 73 67 2e 68 64  72 2e 74 61 73 6b 3d 3d  |a.msg.hdr.task==|
0000d6f0  77 69 6d 70 74 5f 74 61  73 6b 28 29 29 20 62 72  |wimpt_task()) br|
0000d700  65 61 6b 3b 0a 20 20 20  20 20 20 20 20 20 20 69  |eak;.          i|
0000d710  66 20 28 65 2d 3e 64 61  74 61 2e 6d 73 67 2e 64  |f (e->data.msg.d|
0000d720  61 74 61 2e 64 61 74 61  73 61 76 65 2e 77 21 3d  |ata.datasave.w!=|
0000d730  70 61 72 61 5f 77 69 6e  5f 68 61 6e 64 6c 65 29  |para_win_handle)|
0000d740  20 62 72 65 61 6b 3b 0a  20 20 20 20 20 20 20 20  | break;.        |
0000d750  20 20 69 66 20 28 65 2d  3e 64 61 74 61 2e 6d 73  |  if (e->data.ms|
0000d760  67 2e 64 61 74 61 2e 64  61 74 61 73 61 76 65 2e  |g.data.datasave.|
0000d770  74 79 70 65 20 3d 3d 20  30 78 66 66 66 29 20 7b  |type == 0xfff) {|
0000d780  0a 20 20 20 20 20 20 20  20 20 20 20 20 69 66 20  |.            if |
0000d790  28 70 61 72 61 6d 65 74  65 72 73 5f 6c 6f 61 64  |(parameters_load|
0000d7a0  5f 72 61 6d 28 29 29 20  70 61 72 61 6d 65 74 65  |_ram()) paramete|
0000d7b0  72 73 5f 6c 6f 61 64 5f  64 65 63 6f 64 65 28 29  |rs_load_decode()|
0000d7c0  3b 0a 20 20 20 20 20 20  20 20 20 20 7d 0a 20 20  |;.          }.  |
0000d7d0  20 20 20 20 20 20 20 20  62 72 65 61 6b 3b 0a 0a  |        break;..|
0000d7e0  20 20 20 20 20 20 20 20  63 61 73 65 20 77 69 6d  |        case wim|
0000d7f0  70 5f 4d 44 41 54 41 4c  4f 41 44 3a 0a 20 20 20  |p_MDATALOAD:.   |
0000d800  20 20 20 20 20 63 61 73  65 20 77 69 6d 70 5f 4d  |     case wimp_M|
0000d810  44 41 54 41 4f 50 45 4e  3a 0a 20 20 20 20 20 20  |DATAOPEN:.      |
0000d820  20 20 20 20 69 66 20 28  65 2d 3e 64 61 74 61 2e  |    if (e->data.|
0000d830  6d 73 67 2e 68 64 72 2e  74 61 73 6b 3d 3d 77 69  |msg.hdr.task==wi|
0000d840  6d 70 74 5f 74 61 73 6b  28 29 29 20 62 72 65 61  |mpt_task()) brea|
0000d850  6b 3b 0a 20 20 20 20 20  20 20 20 20 20 69 66 20  |k;.          if |
0000d860  28 65 2d 3e 64 61 74 61  2e 6d 73 67 2e 64 61 74  |(e->data.msg.dat|
0000d870  61 2e 64 61 74 61 6c 6f  61 64 2e 77 21 3d 70 61  |a.dataload.w!=pa|
0000d880  72 61 5f 77 69 6e 5f 68  61 6e 64 6c 65 29 20 62  |ra_win_handle) b|
0000d890  72 65 61 6b 3b 0a 20 20  20 20 20 20 20 20 20 20  |reak;.          |
0000d8a0  69 66 20 28 65 2d 3e 64  61 74 61 2e 6d 73 67 2e  |if (e->data.msg.|
0000d8b0  64 61 74 61 2e 64 61 74  61 6c 6f 61 64 2e 74 79  |data.dataload.ty|
0000d8c0  70 65 20 3d 3d 20 30 78  66 66 66 29 20 7b 0a 20  |pe == 0xfff) {. |
0000d8d0  20 20 20 20 20 20 20 20  20 20 20 69 66 20 28 70  |           if (p|
0000d8e0  61 72 61 6d 65 74 65 72  73 5f 6c 6f 61 64 5f 66  |arameters_load_f|
0000d8f0  69 6c 65 28 29 29 20 70  61 72 61 6d 65 74 65 72  |ile()) parameter|
0000d900  73 5f 6c 6f 61 64 5f 64  65 63 6f 64 65 28 29 3b  |s_load_decode();|
0000d910  0a 20 20 20 20 20 20 20  20 20 20 7d 0a 20 20 20  |.          }.   |
0000d920  20 20 20 20 20 20 20 62  72 65 61 6b 3b 0a 0a 20  |       break;.. |
0000d930  20 20 20 20 20 20 20 63  61 73 65 20 77 69 6d 70  |       case wimp|
0000d940  5f 4d 50 52 45 51 55 49  54 3a 0a 20 20 20 20 20  |_MPREQUIT:.     |
0000d950  20 20 20 20 20 69 66 20  28 77 74 73 73 61 66 65  |     if (wtssafe|
0000d960  29 20 62 72 65 61 6b 3b  0a 20 20 20 20 20 20 20  |) break;.       |
0000d970  20 20 20 65 2d 3e 64 61  74 61 2e 6d 73 67 2e 68  |   e->data.msg.h|
0000d980  64 72 2e 79 6f 75 72 5f  72 65 66 3d 65 2d 3e 64  |dr.your_ref=e->d|
0000d990  61 74 61 2e 6d 73 67 2e  68 64 72 2e 6d 79 5f 72  |ata.msg.hdr.my_r|
0000d9a0  65 66 3b 0a 20 20 20 20  20 20 20 20 20 20 77 69  |ef;.          wi|
0000d9b0  6d 70 74 5f 63 6f 6d 70  6c 61 69 6e 28 77 69 6d  |mpt_complain(wim|
0000d9c0  70 5f 73 65 6e 64 6d 65  73 73 61 67 65 28 77 69  |p_sendmessage(wi|
0000d9d0  6d 70 5f 45 41 43 4b 2c  20 26 65 2d 3e 64 61 74  |mp_EACK, &e->dat|
0000d9e0  61 2e 6d 73 67 2c 20 30  29 29 3b 0a 20 20 20 20  |a.msg, 0));.    |
0000d9f0  20 20 20 20 20 20 7b 0a  20 20 20 20 20 20 20 20  |      {.        |
0000da00  20 20 20 20 6d 64 62 78  71 75 65 72 79 5f 52 45  |    mdbxquery_RE|
0000da10  50 4c 59 20 72 65 70 6c  79 20 3d 0a 20 20 20 20  |PLY reply =.    |
0000da20  20 20 20 20 20 20 20 20  20 20 6d 64 62 78 5f 71  |          mdbx_q|
0000da30  75 65 72 79 28 6d 73 67  73 5f 6c 6f 6f 6b 75 70  |uery(msgs_lookup|
0000da40  28 22 51 75 65 72 79 53  4d 22 29 2c 20 6d 73 67  |("QuerySM"), msg|
0000da50  73 5f 6c 6f 6f 6b 75 70  28 22 51 75 65 72 79 44  |s_lookup("QueryD|
0000da60  22 29 2c 20 6d 73 67 73  5f 6c 6f 6f 6b 75 70 28  |"), msgs_lookup(|
0000da70  22 51 75 65 72 79 43 22  29 2c 20 6d 73 67 73 5f  |"QueryC"), msgs_|
0000da80  6c 6f 6f 6b 75 70 28 22  51 75 65 72 79 53 22 29  |lookup("QueryS")|
0000da90  2c 20 33 29 3b 0a 20 20  20 20 20 20 20 20 20 20  |, 3);.          |
0000daa0  20 20 69 66 20 28 72 65  70 6c 79 3d 3d 6d 64 62  |  if (reply==mdb|
0000dab0  78 71 75 65 72 79 5f 59  45 53 20 7c 7c 20 72 65  |xquery_YES || re|
0000dac0  70 6c 79 3d 3d 6d 64 62  78 71 75 65 72 79 5f 41  |ply==mdbxquery_A|
0000dad0  4c 54 29 20 7b 0a 20 20  20 20 20 20 20 20 20 20  |LT) {.          |
0000dae0  20 20 20 20 2f 2a 4e 42  20 41 20 70 72 65 71 75  |    /*NB A prequ|
0000daf0  69 74 20 77 69 6c 6c 20  62 65 20 72 65 63 65 69  |it will be recei|
0000db00  76 65 64 20 66 72 6f 6d  20 74 68 65 20 74 61 73  |ved from the tas|
0000db10  6b 20 6d 61 6e 61 67 65  72 20 77 68 65 6e 20 65  |k manager when e|
0000db20  69 74 68 65 72 20 61 20  73 68 75 74 64 6f 77 6e  |ither a shutdown|
0000db30  20 69 73 20 63 6f 6d 6d  65 6e 63 65 64 2c 20 6f  | is commenced, o|
0000db40  72 0a 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |r.              |
0000db50  20 20 77 68 65 6e 20 74  68 65 20 75 73 65 72 20  |  when the user |
0000db60  74 72 69 65 73 20 74 6f  20 71 75 69 74 20 74 68  |tries to quit th|
0000db70  65 20 61 70 70 6c 69 63  61 74 69 6f 6e 20 76 69  |e application vi|
0000db80  61 20 74 68 65 20 74 61  73 6b 20 6d 61 6e 61 67  |a the task manag|
0000db90  65 72 2e 0a 20 20 20 20  20 20 20 20 20 20 20 20  |er..            |
0000dba0  20 20 20 20 55 6e 64 65  72 20 52 49 53 43 20 4f  |    Under RISC O|
0000dbb0  53 20 32 2c 20 71 75 69  74 74 69 6e 67 20 61 70  |S 2, quitting ap|
0000dbc0  70 6c 69 63 61 74 69 6f  6e 20 76 69 61 20 74 61  |plication via ta|
0000dbd0  73 6b 20 6d 61 6e 61 67  65 72 20 77 69 6c 6c 20  |sk manager will |
0000dbe0  62 65 68 61 76 65 20 69  6e 63 6f 72 72 65 63 74  |behave incorrect|
0000dbf0  6c 79 20 77 68 65 6e 20  61 0a 20 20 20 20 20 20  |ly when a.      |
0000dc00  20 20 20 20 20 20 20 20  20 20 6d 6f 64 69 66 69  |          modifi|
0000dc10  65 64 20 66 69 6c 65 20  65 78 69 73 74 73 20 28  |ed file exists (|
0000dc20  69 65 20 75 73 65 72 20  72 65 73 70 6f 6e 64 69  |ie user respondi|
0000dc30  6e 67 20 77 69 74 68 20  27 64 69 73 63 61 72 64  |ng with 'discard|
0000dc40  27 20 74 6f 20 74 68 65  20 63 6f 6e 66 69 72 6d  |' to the confirm|
0000dc50  61 74 69 6f 6e 20 70 72  6f 6d 70 74 0a 20 20 20  |ation prompt.   |
0000dc60  20 20 20 20 20 20 20 20  20 20 20 20 20 66 69 72  |             fir|
0000dc70  73 74 20 67 65 6e 65 72  61 74 65 64 2c 20 77 69  |st generated, wi|
0000dc80  6c 6c 20 72 65 73 75 6c  74 20 69 6e 20 64 65 73  |ll result in des|
0000dc90  6b 74 6f 70 20 73 68 75  74 64 6f 77 6e 20 69 6e  |ktop shutdown in|
0000dca0  73 74 65 61 64 20 6f 66  20 6a 75 73 74 20 74 68  |stead of just th|
0000dcb0  65 20 61 70 70 6c 69 63  61 74 69 6f 6e 20 71 75  |e application qu|
0000dcc0  69 74 74 69 6e 67 29 2e  0a 20 20 20 20 20 20 20  |itting)..       |
0000dcd0  20 20 20 20 20 20 20 20  20 54 68 69 73 20 69 73  |         This is|
0000dce0  20 6e 65 63 65 73 73 61  72 79 20 73 6f 20 74 68  | necessary so th|
0000dcf0  61 74 20 62 65 68 61 76  69 6f 75 72 20 77 69 6c  |at behaviour wil|
0000dd00  6c 20 62 65 20 63 6f 72  72 65 63 74 20 77 68 65  |l be correct whe|
0000dd10  6e 20 61 20 67 65 6e 75  69 6e 65 20 73 68 75 74  |n a genuine shut|
0000dd20  64 6f 77 6e 20 72 65 73  75 6c 74 73 20 69 6e 20  |down results in |
0000dd30  74 68 69 73 0a 20 20 20  20 20 20 20 20 20 20 20  |this.           |
0000dd40  20 20 20 20 20 73 61 6d  65 20 70 72 6f 6d 70 74  |     same prompt|
0000dd50  2c 20 26 20 61 73 20 75  6e 64 65 72 20 6f 6c 64  |, & as under old|
0000dd60  20 6f 73 2c 20 61 70 70  6c 69 63 61 74 69 6f 6e  | os, application|
0000dd70  20 64 6f 65 73 6e 27 74  20 6b 6e 6f 77 20 77 68  | doesn't know wh|
0000dd80  65 74 68 65 72 20 70 72  65 71 75 69 74 20 69 73  |ether prequit is|
0000dd90  20 64 75 65 20 74 6f 20  61 70 70 6c 69 63 61 74  | due to applicat|
0000dda0  69 6f 6e 0a 20 20 20 20  20 20 20 20 20 20 20 20  |ion.            |
0000ddb0  20 20 20 20 71 75 69 74  20 66 72 6f 6d 20 74 61  |    quit from ta|
0000ddc0  73 6b 20 6d 61 6e 61 67  65 72 2c 20 6f 72 20 67  |sk manager, or g|
0000ddd0  6c 6f 62 61 6c 20 73 68  75 74 64 6f 77 6e 2e 0a  |lobal shutdown..|
0000dde0  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
0000ddf0  54 68 69 73 20 70 72 6f  62 6c 65 6d 20 64 6f 65  |This problem doe|
0000de00  73 6e 27 74 20 61 72 69  73 65 20 75 6e 64 65 72  |sn't arise under|
0000de10  20 52 49 53 43 20 4f 53  20 33 2e 31 30 2c 20 61  | RISC OS 3.10, a|
0000de20  73 20 77 69 6d 70 20 66  6c 61 67 73 20 6e 61 74  |s wimp flags nat|
0000de30  75 72 65 20 6f 66 20 70  72 65 71 75 69 74 20 76  |ure of prequit v|
0000de40  69 61 20 6c 6f 77 20 62  69 74 20 6f 66 0a 20 20  |ia low bit of.  |
0000de50  20 20 20 20 20 20 20 20  20 20 20 20 20 20 66 69  |              fi|
0000de60  72 73 74 20 77 6f 72 64  20 66 6f 6c 6c 6f 77 69  |rst word followi|
0000de70  6e 67 20 6d 65 73 73 61  67 65 20 68 65 61 64 65  |ng message heade|
0000de80  72 2e 0a 20 20 20 20 20  20 20 20 20 20 20 20 20  |r..             |
0000de90  20 20 20 49 45 20 6f 6e  20 61 20 75 73 65 72 20  |   IE on a user |
0000dea0  64 69 73 63 61 72 64 20  72 65 73 70 6f 6e 73 65  |discard response|
0000deb0  2c 20 75 73 65 20 70 73  65 75 64 6f 20 63 6f 64  |, use pseudo cod|
0000dec0  65 3a 0a 20 20 20 20 20  20 20 20 20 20 20 20 20  |e:.             |
0000ded0  20 20 20 69 66 20 73 69  7a 65 21 3d 32 30 20 26  |   if size!=20 &|
0000dee0  20 62 69 74 20 69 73 20  73 65 74 20 74 68 65 6e  | bit is set then|
0000def0  20 6a 75 73 74 20 71 75  69 74 20 74 68 65 20 61  | just quit the a|
0000df00  70 70 2c 20 65 6c 73 65  20 72 65 73 75 6d 65 20  |pp, else resume |
0000df10  74 68 65 20 73 68 75 74  64 6f 77 6e 0a 20 20 20  |the shutdown.   |
0000df20  20 20 20 20 20 20 20 20  20 20 20 20 2a 2f 0a 20  |            */. |
0000df30  20 20 20 20 20 20 20 20  20 20 20 20 20 69 6e 74  |             int|
0000df40  20 64 61 74 61 3d 2a 28  35 2b 28 69 6e 74 20 2a  | data=*(5+(int *|
0000df50  29 26 65 2d 3e 64 61 74  61 2e 6d 73 67 2e 68 64  |)&e->data.msg.hd|
0000df60  72 29 3b 0a 20 20 20 20  20 20 20 20 20 20 20 20  |r);.            |
0000df70  20 20 42 4f 4f 4c 20 73  68 75 74 64 6f 77 6e 20  |  BOOL shutdown |
0000df80  3d 20 28 65 2d 3e 64 61  74 61 2e 6d 73 67 2e 68  |= (e->data.msg.h|
0000df90  64 72 2e 73 69 7a 65 21  3d 32 30 20 26 26 20 64  |dr.size!=20 && d|
0000dfa0  61 74 61 26 31 29 20 3f  20 46 41 4c 53 45 20 3a  |ata&1) ? FALSE :|
0000dfb0  20 54 52 55 45 20 3b 0a  20 20 20 20 20 20 20 20  | TRUE ;.        |
0000dfc0  20 20 20 20 20 20 69 66  20 28 72 65 70 6c 79 3d  |      if (reply=|
0000dfd0  3d 6d 64 62 78 71 75 65  72 79 5f 41 4c 54 29 20  |=mdbxquery_ALT) |
0000dfe0  7b 0a 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |{.              |
0000dff0  20 20 69 66 20 28 62 75  69 6c 64 5f 70 61 72 61  |  if (build_para|
0000e000  6d 65 74 65 72 73 5f 66  69 6c 65 28 29 29 20 73  |meters_file()) s|
0000e010  61 76 65 61 73 28 30 78  66 66 66 2c 20 66 69 6c  |aveas(0xfff, fil|
0000e020  65 70 61 74 68 5f 70 61  72 61 6d 65 74 65 72 73  |epath_parameters|
0000e030  2c 20 70 66 69 6c 65 5f  6c 65 6e 67 74 68 2c 20  |, pfile_length, |
0000e040  70 61 72 61 6d 65 74 65  72 73 5f 73 61 76 65 72  |parameters_saver|
0000e050  5f 70 72 6f 63 2c 20 70  61 72 61 6d 65 74 65 72  |_proc, parameter|
0000e060  73 5f 73 65 6e 64 65 72  5f 70 72 6f 63 2c 20 30  |s_sender_proc, 0|
0000e070  2c 20 30 29 3b 0a 20 20  20 20 20 20 20 20 20 20  |, 0);.          |
0000e080  20 20 20 20 20 20 69 66  20 28 21 77 74 73 73 61  |      if (!wtssa|
0000e090  66 65 29 20 62 72 65 61  6b 3b 0a 20 20 20 20 20  |fe) break;.     |
0000e0a0  20 20 20 20 20 20 20 20  20 7d 0a 20 20 20 20 20  |         }.     |
0000e0b0  20 20 20 20 20 20 20 20  20 69 66 20 28 73 68 75  |         if (shu|
0000e0c0  74 64 6f 77 6e 29 20 7b  0a 20 20 20 20 20 20 20  |tdown) {.       |
0000e0d0  20 20 20 20 20 20 20 20  20 77 69 6d 70 5f 70 72  |         wimp_pr|
0000e0e0  6f 63 65 73 73 6b 65 79  28 30 78 31 66 63 29 3b  |ocesskey(0x1fc);|
0000e0f0  0a 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |.               |
0000e100  20 77 74 73 73 61 66 65  3d 54 52 55 45 3b 0a 20  | wtssafe=TRUE;. |
0000e110  20 20 20 20 20 20 20 20  20 20 20 20 20 7d 0a 20  |             }. |
0000e120  20 20 20 20 20 20 20 20  20 20 20 20 20 65 6c 73  |             els|
0000e130  65 20 65 78 69 74 28 30  29 3b 0a 20 20 20 20 20  |e exit(0);.     |
0000e140  20 20 20 20 20 20 20 7d  0a 20 20 20 20 20 20 20  |       }.       |
0000e150  20 20 20 7d 0a 20 20 20  20 20 20 20 20 20 20 62  |   }.          b|
0000e160  72 65 61 6b 3b 0a 0a 20  20 20 20 20 20 7d 0a 20  |reak;..      }. |
0000e170  20 20 20 20 20 62 72 65  61 6b 3b 0a 0a 20 20 20  |     break;..   |
0000e180  20 64 65 66 61 75 6c 74  3a 20 20 20 2f 2a 20 49  | default:   /* I|
0000e190  67 6e 6f 72 65 20 61 6e  79 20 6f 74 68 65 72 20  |gnore any other |
0000e1a0  65 76 65 6e 74 20 2a 2f  0a 20 20 20 20 20 20 62  |event */.      b|
0000e1b0  72 65 61 6b 3b 0a 20 20  7d 0a 7d 0a 0a 2f 2a 2a  |reak;.  }.}../**|
0000e1c0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000e1d0  2a 2a 2a 2a 2a 2a 2a 2a  2a 20 6d 65 6e 75 20 66  |********* menu f|
0000e1e0  75 6e 63 74 69 6f 6e 73  20 2a 2a 2a 2a 2a 2a 2a  |unctions *******|
0000e1f0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000e200  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2f 0a 0a 73 74 61  |**********/..sta|
0000e210  74 69 63 20 76 6f 69 64  20 6d 61 69 6e 5f 6d 65  |tic void main_me|
0000e220  6e 75 5f 68 61 6e 64 6c  65 72 28 76 6f 69 64 20  |nu_handler(void |
0000e230  2a 68 61 6e 64 6c 65 2c  20 63 68 61 72 20 2a 68  |*handle, char *h|
0000e240  69 74 29 0a 7b 0a 20 20  68 61 6e 64 6c 65 20 3d  |it).{.  handle =|
0000e250  20 68 61 6e 64 6c 65 3b  0a 0a 20 20 73 77 69 74  | handle;..  swit|
0000e260  63 68 20 28 68 69 74 5b  30 5d 29 0a 20 20 7b 0a  |ch (hit[0]).  {.|
0000e270  20 20 20 20 63 61 73 65  20 4d 4d 69 6e 66 6f 3a  |    case MMinfo:|
0000e280  0a 20 20 20 20 20 20 62  72 6f 6c 6c 79 5f 69 6e  |.      brolly_in|
0000e290  66 6f 5f 61 62 6f 75 74  5f 70 72 6f 67 72 61 6d  |fo_about_program|
0000e2a0  28 29 3b 0a 20 20 20 20  20 20 62 72 65 61 6b 3b  |();.      break;|
0000e2b0  0a 0a 20 20 20 20 63 61  73 65 20 4d 4d 73 61 76  |..    case MMsav|
0000e2c0  65 3a 0a 20 20 20 20 20  20 69 66 20 28 62 75 69  |e:.      if (bui|
0000e2d0  6c 64 5f 70 61 72 61 6d  65 74 65 72 73 5f 66 69  |ld_parameters_fi|
0000e2e0  6c 65 28 29 29 20 73 61  76 65 61 73 28 30 78 66  |le()) saveas(0xf|
0000e2f0  66 66 2c 20 66 69 6c 65  70 61 74 68 5f 70 61 72  |ff, filepath_par|
0000e300  61 6d 65 74 65 72 73 2c  20 70 66 69 6c 65 5f 6c  |ameters, pfile_l|
0000e310  65 6e 67 74 68 2c 20 70  61 72 61 6d 65 74 65 72  |ength, parameter|
0000e320  73 5f 73 61 76 65 72 5f  70 72 6f 63 2c 20 70 61  |s_saver_proc, pa|
0000e330  72 61 6d 65 74 65 72 73  5f 73 65 6e 64 65 72 5f  |rameters_sender_|
0000e340  70 72 6f 63 2c 20 30 2c  20 30 29 3b 0a 20 20 20  |proc, 0, 0);.   |
0000e350  20 20 20 62 72 65 61 6b  3b 0a 20 20 7d 0a 7d 0a  |   break;.  }.}.|
0000e360  0a 2f 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |./**************|
0000e370  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 20 69 63  |************* ic|
0000e380  6f 6e 20 62 61 72 20 66  75 6e 63 74 69 6f 6e 73  |on bar functions|
0000e390  20 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  | ***************|
0000e3a0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2f 0a  |**************/.|
0000e3b0  0a 2f 2a 2d 2d 2d 20 45  76 65 6e 74 20 68 61 6e  |./*--- Event han|
0000e3c0  64 6c 65 72 20 63 61 6c  6c 65 64 20 6f 6e 20 61  |dler called on a|
0000e3d0  20 6c 65 66 74 20 63 6c  69 63 6b 20 6f 6e 20 74  | left click on t|
0000e3e0  68 65 20 69 63 6f 6e 2e  20 2d 2d 2d 2a 2f 0a 73  |he icon. ---*/.s|
0000e3f0  74 61 74 69 63 20 76 6f  69 64 20 62 72 6f 6c 6c  |tatic void broll|
0000e400  79 5f 69 63 6f 6e 63 6c  69 63 6b 28 77 69 6d 70  |y_iconclick(wimp|
0000e410  5f 69 20 69 63 6f 6e 29  0a 7b 0a 20 20 69 63 6f  |_i icon).{.  ico|
0000e420  6e 20 3d 20 69 63 6f 6e  3b 20 2f 2a 20 57 65 20  |n = icon; /* We |
0000e430  64 6f 6e 27 74 20 6e 65  65 64 20 74 68 65 20 68  |don't need the h|
0000e440  61 6e 64 6c 65 3a 20 74  68 69 73 20 73 74 6f 70  |andle: this stop|
0000e450  73 20 63 6f 6d 70 69 6c  65 72 20 77 61 72 6e 69  |s compiler warni|
0000e460  6e 67 20 2a 2f 0a 20 20  70 61 72 61 5f 6f 70 65  |ng */.  para_ope|
0000e470  6e 28 29 3b 0a 7d 0a 0a  73 74 61 74 69 63 20 76  |n();.}..static v|
0000e480  6f 69 64 20 70 61 72 61  5f 6f 70 65 6e 28 76 6f  |oid para_open(vo|
0000e490  69 64 29 0a 7b 0a 20 20  77 69 6d 70 5f 77 73 74  |id).{.  wimp_wst|
0000e4a0  61 74 65 20 20 73 74 61  74 65 3b 0a 20 20 69 66  |ate  state;.  if|
0000e4b0  20 28 77 69 6d 70 74 5f  63 6f 6d 70 6c 61 69 6e  | (wimpt_complain|
0000e4c0  28 77 69 6d 70 5f 67 65  74 5f 77 69 6e 64 5f 73  |(wimp_get_wind_s|
0000e4d0  74 61 74 65 28 70 61 72  61 5f 77 69 6e 5f 68 61  |tate(para_win_ha|
0000e4e0  6e 64 6c 65 2c 20 26 73  74 61 74 65 29 29 20 3d  |ndle, &state)) =|
0000e4f0  3d 20 30 29 0a 20 20 7b  0a 20 20 20 20 73 74 61  |= 0).  {.    sta|
0000e500  74 65 2e 6f 2e 62 65 68  69 6e 64 20 3d 20 2d 31  |te.o.behind = -1|
0000e510  3b 0a 20 20 20 20 77 69  6d 70 74 5f 6e 6f 65 72  |;.    wimpt_noer|
0000e520  72 28 77 69 6d 70 5f 6f  70 65 6e 5f 77 69 6e 64  |r(wimp_open_wind|
0000e530  28 26 73 74 61 74 65 2e  6f 29 29 3b 0a 20 20 20  |(&state.o));.   |
0000e540  20 70 61 72 61 5f 77 69  6e 64 6f 77 5f 6f 70 65  | para_window_ope|
0000e550  6e 20 3d 20 54 52 55 45  3b 0a 20 20 7d 0a 7d 0a  |n = TRUE;.  }.}.|
0000e560  0a 73 74 61 74 69 63 20  76 6f 69 64 20 62 72 6f  |.static void bro|
0000e570  6c 6c 79 5f 69 63 6f 6e  6c 6f 61 64 28 77 69 6d  |lly_iconload(wim|
0000e580  70 5f 65 76 65 6e 74 73  74 72 20 2a 65 2c 20 76  |p_eventstr *e, v|
0000e590  6f 69 64 20 2a 68 29 0a  7b 0a 20 20 77 69 6d 70  |oid *h).{.  wimp|
0000e5a0  5f 77 20 77 3b 0a 20 20  77 69 6d 70 5f 69 20 69  |_w w;.  wimp_i i|
0000e5b0  3b 0a 20 20 69 6e 74 20  74 3b 0a 20 20 68 3d 68  |;.  int t;.  h=h|
0000e5c0  3b 0a 20 20 73 77 69 74  63 68 20 28 65 2d 3e 65  |;.  switch (e->e|
0000e5d0  29 0a 20 20 7b 0a 20 20  20 20 63 61 73 65 20 77  |).  {.    case w|
0000e5e0  69 6d 70 5f 45 53 45 4e  44 3a 0a 20 20 20 20 63  |imp_ESEND:.    c|
0000e5f0  61 73 65 20 77 69 6d 70  5f 45 53 45 4e 44 57 41  |ase wimp_ESENDWA|
0000e600  4e 54 41 43 4b 3a 0a 20  20 20 20 20 20 73 77 69  |NTACK:.      swi|
0000e610  74 63 68 20 28 65 2d 3e  64 61 74 61 2e 6d 73 67  |tch (e->data.msg|
0000e620  2e 68 64 72 2e 61 63 74  69 6f 6e 29 0a 20 20 20  |.hdr.action).   |
0000e630  20 20 20 7b 0a 20 20 20  20 20 20 20 20 63 61 73  |   {.        cas|
0000e640  65 20 77 69 6d 70 5f 4d  44 41 54 41 53 41 56 45  |e wimp_MDATASAVE|
0000e650  3a 0a 20 20 20 20 20 20  20 20 20 20 69 66 20 28  |:.          if (|
0000e660  65 2d 3e 64 61 74 61 2e  6d 73 67 2e 68 64 72 2e  |e->data.msg.hdr.|
0000e670  74 61 73 6b 3d 3d 77 69  6d 70 74 5f 74 61 73 6b  |task==wimpt_task|
0000e680  28 29 29 20 62 72 65 61  6b 3b 0a 20 20 20 20 20  |()) break;.     |
0000e690  20 20 20 20 20 77 3d 65  2d 3e 64 61 74 61 2e 6d  |     w=e->data.m|
0000e6a0  73 67 2e 64 61 74 61 2e  64 61 74 61 73 61 76 65  |sg.data.datasave|
0000e6b0  2e 77 3b 0a 20 20 20 20  20 20 20 20 20 20 69 3d  |.w;.          i=|
0000e6c0  65 2d 3e 64 61 74 61 2e  6d 73 67 2e 64 61 74 61  |e->data.msg.data|
0000e6d0  2e 64 61 74 61 73 61 76  65 2e 69 3b 0a 20 20 20  |.datasave.i;.   |
0000e6e0  20 20 20 20 20 20 20 74  3d 65 2d 3e 64 61 74 61  |       t=e->data|
0000e6f0  2e 6d 73 67 2e 64 61 74  61 2e 64 61 74 61 73 61  |.msg.data.datasa|
0000e700  76 65 2e 74 79 70 65 3b  0a 20 20 20 20 20 20 20  |ve.type;.       |
0000e710  20 20 20 69 66 20 28 77  21 3d 2d 32 20 7c 7c 20  |   if (w!=-2 || |
0000e720  69 21 3d 62 72 6f 6c 6c  79 5f 69 63 6f 6e 29 20  |i!=brolly_icon) |
0000e730  62 72 65 61 6b 3b 0a 20  20 20 20 20 20 20 20 20  |break;.         |
0000e740  20 69 66 20 28 74 20 3d  3d 20 30 78 66 66 66 29  | if (t == 0xfff)|
0000e750  20 7b 0a 20 20 20 20 20  20 20 20 20 20 20 20 69  | {.            i|
0000e760  66 20 28 70 61 72 61 6d  65 74 65 72 73 5f 6c 6f  |f (parameters_lo|
0000e770  61 64 5f 72 61 6d 28 29  29 20 7b 0a 20 20 20 20  |ad_ram()) {.    |
0000e780  20 20 20 20 20 20 20 20  20 20 70 61 72 61 6d 65  |          parame|
0000e790  74 65 72 73 5f 6c 6f 61  64 5f 64 65 63 6f 64 65  |ters_load_decode|
0000e7a0  28 29 3b 0a 20 20 20 20  20 20 20 20 20 20 20 20  |();.            |
0000e7b0  20 20 62 72 6f 6c 6c 79  5f 69 63 6f 6e 63 6c 69  |  brolly_iconcli|
0000e7c0  63 6b 28 69 29 3b 0a 20  20 20 20 20 20 20 20 20  |ck(i);.         |
0000e7d0  20 20 20 7d 0a 20 20 20  20 20 20 20 20 20 20 7d  |   }.          }|
0000e7e0  0a 20 20 20 20 20 20 20  20 20 20 62 72 65 61 6b  |.          break|
0000e7f0  3b 0a 0a 20 20 20 20 20  20 20 20 63 61 73 65 20  |;..        case |
0000e800  77 69 6d 70 5f 4d 44 41  54 41 4c 4f 41 44 3a 0a  |wimp_MDATALOAD:.|
0000e810  20 20 20 20 20 20 20 20  63 61 73 65 20 77 69 6d  |        case wim|
0000e820  70 5f 4d 44 41 54 41 4f  50 45 4e 3a 0a 20 20 20  |p_MDATAOPEN:.   |
0000e830  20 20 20 20 20 20 20 69  66 20 28 65 2d 3e 64 61  |       if (e->da|
0000e840  74 61 2e 6d 73 67 2e 68  64 72 2e 74 61 73 6b 3d  |ta.msg.hdr.task=|
0000e850  3d 77 69 6d 70 74 5f 74  61 73 6b 28 29 29 20 62  |=wimpt_task()) b|
0000e860  72 65 61 6b 3b 0a 20 20  20 20 20 20 20 20 20 20  |reak;.          |
0000e870  77 3d 65 2d 3e 64 61 74  61 2e 6d 73 67 2e 64 61  |w=e->data.msg.da|
0000e880  74 61 2e 64 61 74 61 6c  6f 61 64 2e 77 3b 0a 20  |ta.dataload.w;. |
0000e890  20 20 20 20 20 20 20 20  20 69 3d 65 2d 3e 64 61  |         i=e->da|
0000e8a0  74 61 2e 6d 73 67 2e 64  61 74 61 2e 64 61 74 61  |ta.msg.data.data|
0000e8b0  6c 6f 61 64 2e 69 3b 0a  20 20 20 20 20 20 20 20  |load.i;.        |
0000e8c0  20 20 74 3d 65 2d 3e 64  61 74 61 2e 6d 73 67 2e  |  t=e->data.msg.|
0000e8d0  64 61 74 61 2e 64 61 74  61 6c 6f 61 64 2e 74 79  |data.dataload.ty|
0000e8e0  70 65 3b 0a 20 20 20 20  20 20 20 20 20 20 69 66  |pe;.          if|
0000e8f0  20 28 77 21 3d 2d 32 20  7c 7c 20 69 21 3d 62 72  | (w!=-2 || i!=br|
0000e900  6f 6c 6c 79 5f 69 63 6f  6e 29 20 62 72 65 61 6b  |olly_icon) break|
0000e910  3b 0a 20 20 20 20 20 20  20 20 20 20 69 66 20 28  |;.          if (|
0000e920  74 20 3d 3d 20 30 78 66  66 66 29 20 7b 0a 20 20  |t == 0xfff) {.  |
0000e930  20 20 20 20 20 20 20 20  20 20 69 66 20 28 70 61  |          if (pa|
0000e940  72 61 6d 65 74 65 72 73  5f 6c 6f 61 64 5f 66 69  |rameters_load_fi|
0000e950  6c 65 28 29 29 20 7b 0a  20 20 20 20 20 20 20 20  |le()) {.        |
0000e960  20 20 20 20 20 20 70 61  72 61 6d 65 74 65 72 73  |      parameters|
0000e970  5f 6c 6f 61 64 5f 64 65  63 6f 64 65 28 29 3b 0a  |_load_decode();.|
0000e980  20 20 20 20 20 20 20 20  20 20 20 20 20 20 62 72  |              br|
0000e990  6f 6c 6c 79 5f 69 63 6f  6e 63 6c 69 63 6b 28 69  |olly_iconclick(i|
0000e9a0  29 3b 0a 20 20 20 20 20  20 20 20 20 20 20 20 7d  |);.            }|
0000e9b0  0a 20 20 20 20 20 20 20  20 20 20 7d 0a 20 20 20  |.          }.   |
0000e9c0  20 20 20 20 20 20 20 62  72 65 61 6b 3b 0a 20 20  |       break;.  |
0000e9d0  20 20 20 20 7d 0a 20 20  20 20 20 20 62 72 65 61  |    }.      brea|
0000e9e0  6b 3b 0a 20 20 7d 0a 7d  0a 0a 2f 2a 2d 2d 2d 20  |k;.  }.}../*--- |
0000e9f0  45 76 65 6e 74 20 68 61  6e 64 6c 65 72 20 66 6f  |Event handler fo|
0000ea00  72 20 74 68 65 20 6d 65  6e 75 2e 20 2d 2d 2d 2a  |r the menu. ---*|
0000ea10  2f 0a 73 74 61 74 69 63  20 76 6f 69 64 20 62 61  |/.static void ba|
0000ea20  72 5f 6d 65 6e 75 5f 68  61 6e 64 6c 65 72 28 76  |r_menu_handler(v|
0000ea30  6f 69 64 20 2a 68 61 6e  64 6c 65 2c 20 63 68 61  |oid *handle, cha|
0000ea40  72 20 2a 68 69 74 29 0a  7b 0a 20 20 6d 64 62 78  |r *hit).{.  mdbx|
0000ea50  71 75 65 72 79 5f 52 45  50 4c 59 20 72 65 70 6c  |query_REPLY repl|
0000ea60  79 3b 0a 20 20 68 61 6e  64 6c 65 20 3d 20 68 61  |y;.  handle = ha|
0000ea70  6e 64 6c 65 3b 0a 0a 20  20 73 77 69 74 63 68 20  |ndle;..  switch |
0000ea80  28 68 69 74 5b 30 5d 29  0a 20 20 7b 0a 20 20 20  |(hit[0]).  {.   |
0000ea90  20 63 61 73 65 20 62 61  72 5f 6d 65 6e 75 5f 69  | case bar_menu_i|
0000eaa0  6e 66 6f 3a 0a 20 20 20  20 20 20 62 72 6f 6c 6c  |nfo:.      broll|
0000eab0  79 5f 69 6e 66 6f 5f 61  62 6f 75 74 5f 70 72 6f  |y_info_about_pro|
0000eac0  67 72 61 6d 28 29 3b 0a  20 20 20 20 20 20 62 72  |gram();.      br|
0000ead0  65 61 6b 3b 0a 0a 20 20  20 20 63 61 73 65 20 62  |eak;..    case b|
0000eae0  61 72 5f 6d 65 6e 75 5f  71 75 69 74 3a 0a 20 20  |ar_menu_quit:.  |
0000eaf0  20 20 20 20 2f 2a 20 45  78 69 74 20 66 72 6f 6d  |    /* Exit from|
0000eb00  20 74 68 65 20 70 72 6f  67 72 61 6d 20 69 66 20  | the program if |
0000eb10  77 74 73 73 61 66 65 20  6f 72 20 75 73 65 72 20  |wtssafe or user |
0000eb20  63 6f 6e 66 69 72 6d 73  2e 20 54 68 65 20 77 69  |confirms. The wi|
0000eb30  6d 70 20 67 65 74 73 20  72 69 64 20 6f 66 20 74  |mp gets rid of t|
0000eb40  68 65 20 77 69 6e 64 6f  77 20 61 6e 64 20 69 63  |he window and ic|
0000eb50  6f 6e 20 2a 2f 0a 20 20  20 20 20 20 69 66 20 28  |on */.      if (|
0000eb60  77 74 73 73 61 66 65 29  20 65 78 69 74 28 30 29  |wtssafe) exit(0)|
0000eb70  3b 0a 20 20 20 20 20 20  72 65 70 6c 79 20 3d 20  |;.      reply = |
0000eb80  6d 64 62 78 5f 71 75 65  72 79 28 6d 73 67 73 5f  |mdbx_query(msgs_|
0000eb90  6c 6f 6f 6b 75 70 28 22  51 75 65 72 79 53 4d 22  |lookup("QuerySM"|
0000eba0  29 2c 20 6d 73 67 73 5f  6c 6f 6f 6b 75 70 28 22  |), msgs_lookup("|
0000ebb0  51 75 65 72 79 44 22 29  2c 20 6d 73 67 73 5f 6c  |QueryD"), msgs_l|
0000ebc0  6f 6f 6b 75 70 28 22 51  75 65 72 79 43 22 29 2c  |ookup("QueryC"),|
0000ebd0  20 6d 73 67 73 5f 6c 6f  6f 6b 75 70 28 22 51 75  | msgs_lookup("Qu|
0000ebe0  65 72 79 53 22 29 2c 20  33 29 3b 0a 20 20 20 20  |eryS"), 3);.    |
0000ebf0  20 20 69 66 20 28 72 65  70 6c 79 3d 3d 6d 64 62  |  if (reply==mdb|
0000ec00  78 71 75 65 72 79 5f 59  45 53 29 20 65 78 69 74  |xquery_YES) exit|
0000ec10  28 30 29 3b 0a 20 20 20  20 20 20 69 66 20 28 72  |(0);.      if (r|
0000ec20  65 70 6c 79 3d 3d 6d 64  62 78 71 75 65 72 79 5f  |eply==mdbxquery_|
0000ec30  41 4c 54 29 20 69 66 20  28 62 75 69 6c 64 5f 70  |ALT) if (build_p|
0000ec40  61 72 61 6d 65 74 65 72  73 5f 66 69 6c 65 28 29  |arameters_file()|
0000ec50  29 20 73 61 76 65 61 73  28 30 78 66 66 66 2c 20  |) saveas(0xfff, |
0000ec60  66 69 6c 65 70 61 74 68  5f 70 61 72 61 6d 65 74  |filepath_paramet|
0000ec70  65 72 73 2c 20 70 66 69  6c 65 5f 6c 65 6e 67 74  |ers, pfile_lengt|
0000ec80  68 2c 20 70 61 72 61 6d  65 74 65 72 73 5f 73 61  |h, parameters_sa|
0000ec90  76 65 72 5f 70 72 6f 63  2c 20 70 61 72 61 6d 65  |ver_proc, parame|
0000eca0  74 65 72 73 5f 73 65 6e  64 65 72 5f 70 72 6f 63  |ters_sender_proc|
0000ecb0  2c 20 30 2c 20 30 29 3b  0a 20 20 20 20 20 20 69  |, 0, 0);.      i|
0000ecc0  66 20 28 77 74 73 73 61  66 65 29 20 65 78 69 74  |f (wtssafe) exit|
0000ecd0  28 30 29 3b 0a 20 20 20  20 20 20 62 72 65 61 6b  |(0);.      break|
0000ece0  3b 0a 20 20 7d 0a 7d 0a  0a 2f 2a 2d 2d 2d 20 44  |;.  }.}../*--- D|
0000ecf0  69 73 70 6c 61 79 20 74  68 65 20 70 72 6f 67 72  |isplay the progr|
0000ed00  61 6d 20 69 6e 66 6f 20  62 6f 78 20 2d 20 63 61  |am info box - ca|
0000ed10  6c 6c 65 64 20 66 72 6f  6d 20 74 68 65 20 6d 65  |lled from the me|
0000ed20  6e 75 20 70 72 6f 63 65  73 73 6f 72 2e 20 2d 2d  |nu processor. --|
0000ed30  2d 2a 2f 0a 73 74 61 74  69 63 20 76 6f 69 64 20  |-*/.static void |
0000ed40  62 72 6f 6c 6c 79 5f 69  6e 66 6f 5f 61 62 6f 75  |brolly_info_abou|
0000ed50  74 5f 70 72 6f 67 72 61  6d 28 76 6f 69 64 29 0a  |t_program(void).|
0000ed60  7b 0a 20 20 64 62 6f 78  20 20 64 3b 20 20 2f 2a  |{.  dbox  d;  /*|
0000ed70  20 44 69 61 6c 6f 67 75  65 20 62 6f 78 20 68 61  | Dialogue box ha|
0000ed80  6e 64 6c 65 20 2a 2f 0a  20 20 69 66 20 28 64 20  |ndle */.  if (d |
0000ed90  3d 20 64 62 6f 78 5f 6e  65 77 28 22 50 72 6f 67  |= dbox_new("Prog|
0000eda0  49 6e 66 6f 22 29 2c 20  64 20 21 3d 20 4e 55 4c  |Info"), d != NUL|
0000edb0  4c 29 0a 20 20 7b 0a 20  20 20 20 64 62 6f 78 5f  |L).  {.    dbox_|
0000edc0  73 65 74 66 69 65 6c 64  28 64 2c 20 62 72 6f 6c  |setfield(d, brol|
0000edd0  6c 79 5f 69 6e 66 6f 5f  66 69 65 6c 64 2c 20 56  |ly_info_field, V|
0000ede0  45 52 53 49 4f 4e 29 3b  0a 20 20 20 20 64 62 6f  |ERSION);.    dbo|
0000edf0  78 5f 73 68 6f 77 28 64  29 3b 0a 20 20 20 20 64  |x_show(d);.    d|
0000ee00  62 6f 78 5f 66 69 6c 6c  69 6e 28 64 29 3b 0a 20  |box_fillin(d);. |
0000ee10  20 20 20 64 62 6f 78 5f  64 69 73 70 6f 73 65 28  |   dbox_dispose(|
0000ee20  26 64 29 3b 0a 20 20 7d  0a 7d 0a 0a 2f 2a 2a 2a  |&d);.  }.}../***|
0000ee30  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000ee40  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 20 69 6e 69 74  |*********** init|
0000ee50  69 61 6c 69 73 61 74 69  6f 6e 20 2a 2a 2a 2a 2a  |ialisation *****|
0000ee60  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000ee70  2a 2a 2a 2a 2a 2a 2a 2a  2a 2f 0a 0a 2f 2a 2d 2d  |*********/../*--|
0000ee80  2d 20 49 6e 69 74 69 61  6c 69 73 65 20 74 68 65  |- Initialise the|
0000ee90  20 70 72 6f 67 72 61 6d  2c 20 72 65 74 75 72 6e  | program, return|
0000eea0  69 6e 67 20 54 52 55 45  20 69 66 20 69 74 20 77  |ing TRUE if it w|
0000eeb0  61 73 20 61 6c 6c 20 4f  4b 2e 20 2d 2d 2d 2a 2f  |as all OK. ---*/|
0000eec0  0a 73 74 61 74 69 63 20  42 4f 4f 4c 20 62 72 6f  |.static BOOL bro|
0000eed0  6c 6c 79 5f 69 6e 69 74  69 61 6c 69 73 65 28 76  |lly_initialise(v|
0000eee0  6f 69 64 29 0a 7b 0a 20  20 63 68 61 72 20 2a 6d  |oid).{.  char *m|
0000eef0  61 69 6e 5f 6d 65 6e 75  5f 73 74 72 69 6e 67 3b  |ain_menu_string;|
0000ef00  0a 20 20 6f 73 5f 66 69  6c 65 73 74 72 20 66 3b  |.  os_filestr f;|
0000ef10  0a 20 20 63 68 61 72 20  70 5b 31 32 30 5d 2c 20  |.  char p[120], |
0000ef20  2a 70 74 72 3b 0a 20 20  6f 73 5f 65 72 72 6f 72  |*ptr;.  os_error|
0000ef30  20 2a 65 3b 0a 20 20 69  6e 74 20 69 3b 0a 20 20  | *e;.  int i;.  |
0000ef40  77 69 6d 70 5f 70 61 6c  65 74 74 65 77 6f 72 64  |wimp_paletteword|
0000ef50  20 2a 64 3b 0a 0a 20 20  77 69 6d 70 74 5f 69 6e  | *d;..  wimpt_in|
0000ef60  69 74 28 22 42 72 6f 6c  6c 79 22 29 3b 20 20 20  |it("Brolly");   |
0000ef70  2f 2a 20 4d 61 69 6e 20  57 69 6d 70 20 69 6e 69  |/* Main Wimp ini|
0000ef80  74 69 61 6c 69 73 61 74  69 6f 6e 20 2a 2f 0a 20  |tialisation */. |
0000ef90  20 72 65 73 5f 69 6e 69  74 28 22 42 72 6f 6c 6c  | res_init("Broll|
0000efa0  79 22 29 3b 20 20 20 20  20 20 20 20 20 20 20 20  |y");            |
0000efb0  20 20 2f 2a 20 52 65 73  6f 75 72 63 65 73 20 2a  |  /* Resources *|
0000efc0  2f 0a 20 20 74 65 6d 70  6c 61 74 65 5f 69 6e 69  |/.  template_ini|
0000efd0  74 28 29 3b 20 20 20 20  20 20 20 20 20 20 20 20  |t();            |
0000efe0  20 20 20 20 20 2f 2a 20  54 65 6d 70 6c 61 74 65  |     /* Template|
0000eff0  73 20 2a 2f 0a 20 20 76  69 73 64 65 6c 61 79 5f  |s */.  visdelay_|
0000f000  69 6e 69 74 28 29 3b 0a  20 20 64 62 6f 78 5f 69  |init();.  dbox_i|
0000f010  6e 69 74 28 29 3b 20 20  20 20 20 20 20 20 20 20  |nit();          |
0000f020  20 20 20 20 20 20 20 20  20 20 20 2f 2a 20 44 69  |           /* Di|
0000f030  61 6c 6f 67 75 65 20 62  6f 78 65 73 20 2a 2f 0a  |alogue boxes */.|
0000f040  20 20 6d 73 67 73 5f 69  6e 69 74 28 29 3b 0a 0a  |  msgs_init();..|
0000f050  20 20 61 74 65 78 69 74  28 74 69 64 79 29 3b 0a  |  atexit(tidy);.|
0000f060  0a 20 20 66 2e 61 63 74  69 6f 6e 3d 32 35 35 3b  |.  f.action=255;|
0000f070  0a 20 20 66 2e 6e 61 6d  65 3d 22 3c 42 72 6f 6c  |.  f.name="<Brol|
0000f080  6c 79 24 44 69 72 3e 2e  47 72 61 70 68 69 63 73  |ly$Dir>.Graphics|
0000f090  2e 50 61 6c 65 74 74 65  22 3b 0a 20 20 66 2e 6c  |.Palette";.  f.l|
0000f0a0  6f 61 64 61 64 64 72 3d  28 69 6e 74 29 70 3b 0a  |oadaddr=(int)p;.|
0000f0b0  20 20 66 2e 65 78 65 63  61 64 64 72 3d 30 3b 0a  |  f.execaddr=0;.|
0000f0c0  20 20 65 20 3d 20 6f 73  5f 66 69 6c 65 28 26 66  |  e = os_file(&f|
0000f0d0  29 3b 0a 20 20 69 66 20  28 65 20 7c 7c 20 66 2e  |);.  if (e || f.|
0000f0e0  73 74 61 72 74 21 3d 31  32 30 29 20 7b 0a 20 20  |start!=120) {.  |
0000f0f0  20 20 77 65 72 72 28 30  2c 20 22 49 6e 74 65 72  |  werr(0, "Inter|
0000f100  6e 61 6c 3a 20 47 72 61  70 68 69 63 73 2e 50 61  |nal: Graphics.Pa|
0000f110  6c 65 74 74 65 20 66 69  6c 65 20 61 62 73 65 6e  |lette file absen|
0000f120  74 20 6f 72 20 63 6f 72  72 75 70 74 22 29 3b 0a  |t or corrupt");.|
0000f130  20 20 20 20 72 65 74 75  72 6e 20 46 41 4c 53 45  |    return FALSE|
0000f140  3b 0a 20 20 7d 0a 20 20  66 6f 72 20 28 69 3d 30  |;.  }.  for (i=0|
0000f150  2c 20 70 74 72 3d 70 2c  20 64 3d 28 77 69 6d 70  |, ptr=p, d=(wimp|
0000f160  5f 70 61 6c 65 74 74 65  77 6f 72 64 20 2a 29 70  |_paletteword *)p|
0000f170  61 6c 65 74 74 65 3b 20  69 3c 32 30 3b 20 69 2b  |alette; i<20; i+|
0000f180  2b 2c 20 70 74 72 2b 3d  36 29 20 28 64 2b 2b 29  |+, ptr+=6) (d++)|
0000f190  2d 3e 77 6f 72 64 3d 28  70 74 72 5b 33 5d 20 3c  |->word=(ptr[3] <|
0000f1a0  3c 20 38 29 2b 28 70 74  72 5b 34 5d 20 3c 3c 20  |< 8)+(ptr[4] << |
0000f1b0  31 36 29 2b 28 70 74 72  5b 35 5d 20 3c 3c 20 32  |16)+(ptr[5] << 2|
0000f1c0  34 29 3b 0a 0a 20 20 6d  61 69 6e 5f 6d 65 6e 75  |4);..  main_menu|
0000f1d0  5f 73 74 72 69 6e 67 3d  6d 73 67 73 5f 6c 6f 6f  |_string=msgs_loo|
0000f1e0  6b 75 70 28 22 4d 65 6e  75 4d 22 29 3b 0a 20 20  |kup("MenuM");.  |
0000f1f0  6d 61 69 6e 5f 6d 65 6e  75 20 3d 20 6d 65 6e 75  |main_menu = menu|
0000f200  5f 6e 65 77 28 6d 73 67  73 5f 6c 6f 6f 6b 75 70  |_new(msgs_lookup|
0000f210  28 22 4d 65 6e 74 4d 22  29 2c 20 6d 61 69 6e 5f  |("MentM"), main_|
0000f220  6d 65 6e 75 5f 73 74 72  69 6e 67 29 3b 0a 20 20  |menu_string);.  |
0000f230  69 66 20 28 62 61 72 5f  6d 65 6e 75 20 3d 20 6d  |if (bar_menu = m|
0000f240  65 6e 75 5f 6e 65 77 28  6d 73 67 73 5f 6c 6f 6f  |enu_new(msgs_loo|
0000f250  6b 75 70 28 22 4d 65 6e  74 42 22 29 2c 20 6d 73  |kup("MentB"), ms|
0000f260  67 73 5f 6c 6f 6f 6b 75  70 28 22 4d 65 6e 75 42  |gs_lookup("MenuB|
0000f270  22 29 29 2c 20 62 61 72  5f 6d 65 6e 75 20 3d 3d  |")), bar_menu ==|
0000f280  20 4e 55 4c 4c 29 20 72  65 74 75 72 6e 20 46 41  | NULL) return FA|
0000f290  4c 53 45 3b 0a 20 20 62  72 6f 6c 6c 79 5f 69 63  |LSE;.  brolly_ic|
0000f2a0  6f 6e 3d 62 61 72 69 63  6f 6e 28 22 21 62 72 6f  |on=baricon("!bro|
0000f2b0  6c 6c 79 22 2c 20 31 2c  20 62 72 6f 6c 6c 79 5f  |lly", 1, brolly_|
0000f2c0  69 63 6f 6e 63 6c 69 63  6b 29 3b 0a 20 20 77 69  |iconclick);.  wi|
0000f2d0  6e 5f 72 65 67 69 73 74  65 72 5f 65 76 65 6e 74  |n_register_event|
0000f2e0  5f 68 61 6e 64 6c 65 72  28 77 69 6e 5f 49 43 4f  |_handler(win_ICO|
0000f2f0  4e 42 41 52 4c 4f 41 44  2c 20 62 72 6f 6c 6c 79  |NBARLOAD, brolly|
0000f300  5f 69 63 6f 6e 6c 6f 61  64 2c 20 30 29 3b 0a 20  |_iconload, 0);. |
0000f310  20 69 66 20 28 21 65 76  65 6e 74 5f 61 74 74 61  | if (!event_atta|
0000f320  63 68 6d 65 6e 75 28 77  69 6e 5f 49 43 4f 4e 42  |chmenu(win_ICONB|
0000f330  41 52 2c 20 62 61 72 5f  6d 65 6e 75 2c 20 62 61  |AR, bar_menu, ba|
0000f340  72 5f 6d 65 6e 75 5f 68  61 6e 64 6c 65 72 2c 20  |r_menu_handler, |
0000f350  30 29 29 20 72 65 74 75  72 6e 20 46 41 4c 53 45  |0)) return FALSE|
0000f360  3b 0a 20 20 69 66 20 28  21 62 72 6f 6c 6c 79 5f  |;.  if (!brolly_|
0000f370  63 72 65 61 74 65 5f 77  69 6e 64 6f 77 28 22 69  |create_window("i|
0000f380  6e 70 75 74 73 22 2c 20  26 70 61 72 61 5f 77 69  |nputs", &para_wi|
0000f390  6e 5f 68 61 6e 64 6c 65  29 29 20 72 65 74 75 72  |n_handle)) retur|
0000f3a0  6e 20 46 41 4c 53 45 3b  0a 20 20 77 69 6e 5f 72  |n FALSE;.  win_r|
0000f3b0  65 67 69 73 74 65 72 5f  65 76 65 6e 74 5f 68 61  |egister_event_ha|
0000f3c0  6e 64 6c 65 72 28 70 61  72 61 5f 77 69 6e 5f 68  |ndler(para_win_h|
0000f3d0  61 6e 64 6c 65 2c 20 62  72 6f 6c 6c 79 5f 65 76  |andle, brolly_ev|
0000f3e0  65 6e 74 5f 68 61 6e 64  6c 65 72 2c 20 30 29 3b  |ent_handler, 0);|
0000f3f0  0a 20 20 77 69 6e 5f 63  6c 61 69 6d 5f 75 6e 6b  |.  win_claim_unk|
0000f400  6e 6f 77 6e 5f 65 76 65  6e 74 73 28 70 61 72 61  |nown_events(para|
0000f410  5f 77 69 6e 5f 68 61 6e  64 6c 65 29 3b 0a 20 20  |_win_handle);.  |
0000f420  69 66 20 28 21 65 76 65  6e 74 5f 61 74 74 61 63  |if (!event_attac|
0000f430  68 6d 65 6e 75 28 70 61  72 61 5f 77 69 6e 5f 68  |hmenu(para_win_h|
0000f440  61 6e 64 6c 65 2c 20 6d  61 69 6e 5f 6d 65 6e 75  |andle, main_menu|
0000f450  2c 20 6d 61 69 6e 5f 6d  65 6e 75 5f 68 61 6e 64  |, main_menu_hand|
0000f460  6c 65 72 2c 20 30 29 29  20 72 65 74 75 72 6e 20  |ler, 0)) return |
0000f470  46 41 4c 53 45 3b 0a 0a  20 20 77 69 6d 70 5f 73  |FALSE;..  wimp_s|
0000f480  61 76 65 5f 66 70 5f 73  74 61 74 65 5f 6f 6e 5f  |ave_fp_state_on_|
0000f490  70 6f 6c 6c 28 29 3b 0a  20 20 69 66 20 28 21 69  |poll();.  if (!i|
0000f4a0  6e 69 74 28 29 29 20 72  65 74 75 72 6e 20 46 41  |nit()) return FA|
0000f4b0  4c 53 45 3b 0a 20 20 72  65 74 75 72 6e 20 54 52  |LSE;.  return TR|
0000f4c0  55 45 3b 0a 7d 0a 0a 2f  2a 2a 2a 2a 2a 2a 2a 2a  |UE;.}../********|
0000f4d0  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000f4e0  2a 2a 2a 2a 2a 2a 2a 20  6d 61 69 6e 20 70 72 6f  |******* main pro|
0000f4f0  67 72 61 6d 20 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |gram ***********|
0000f500  2a 2a 2a 2a 2a 2a 2a 2a  2a 2a 2a 2a 2a 2a 2a 2a  |****************|
0000f510  2a 2a 2a 2a 2a 2f 0a 0a  2f 2a 2d 2d 2d 20 4d 61  |*****/../*--- Ma|
0000f520  69 6e 20 65 6e 74 72 79  20 70 6f 69 6e 74 2e 20  |in entry point. |
0000f530  2d 2d 2d 2a 2f 0a 69 6e  74 20 6d 61 69 6e 28 76  |---*/.int main(v|
0000f540  6f 69 64 29 0a 7b 0a 20  20 69 66 20 28 62 72 6f  |oid).{.  if (bro|
0000f550  6c 6c 79 5f 69 6e 69 74  69 61 6c 69 73 65 28 29  |lly_initialise()|
0000f560  29 20 7b 0a 20 20 20 20  77 68 69 6c 65 20 28 54  |) {.    while (T|
0000f570  52 55 45 29 20 65 76 65  6e 74 5f 70 72 6f 63 65  |RUE) event_proce|
0000f580  73 73 28 29 3b 0a 20 20  7d 0a 0a 20 20 72 65 74  |ss();.  }..  ret|
0000f590  75 72 6e 20 30 3b 0a 7d  0a                       |urn 0;.}.|
0000f599