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", ¶_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", ¶_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