// B R A V O

get "BRAVO1.DF";
get "MEASURE.DF";
get "altofilesys.d"

// Incoming Procedures

external [
	init;
	errhlta
	];

// Incoming Statics

external [
	vCfaEndRes;
	] 


// Outgoing Procedures

external [
	array;
	array1;
	abs;
	min;
	max;
	addbt;
	main
	];

// Outgoing Statics

external [
	mult;
	ult;
	ugt;
	umax;
	umin;
	move;
	movec;
	ratio;
	swat;
	divmod;
	freet;
	freee;
	vyorig;
	scanconvert;
	stackroot
	Saved335
	]; 

// Local Statics

static [
	mult;
	ult;
	ugt;
	umax;
	umin;
	move;
	movec;
	ratio;
	swat;
	divmod;
	freet;
	freee;
	vyorig;
	stackroot
	Saved335
	];

// M A I N

let main(blv,paramvec,cfaEndRes) be
[
// U L T 
// unsigned less than
ult = table [ 
 	#122432;	// subz# 1,0,szc
	#000403;	// jmp   3,1
	#102000;	// adc   0,0
	#001401;	// jmp   1,3
	#102400;	// sub   0,0
	#001401;	// jmp   1,3
	]; 



// U G T
// unsigned greater than
ugt = table [ 
	#106432;	// subz# 0,1,szc
	#000403;	// jmp   3,1
	#102000;	// adc   0,0
	#001401;	// jmp   1,3
	#102400;	// sub   0,0
	#001401; 	// jmp   1,3
	]; 
// M O V E
// move(from,to,words)
move = table [ 
	#175400;	// inc   3,3
	#054412;	// sta   3,12,1
	#034412;	// lda   3,12,1
	#162400;	// sub   3,0
	#035003;	// lda   3,3,2
	#167000;	// add   3,1
	#124400;	// neg   1,1
	#124000;	// com   1,1
	#174400;	// neg   3,3
	#061005;	// blt
	#002401;	// jmp   @1,1
	#0     ;	// return address
	#1     ;	// 1
	];
// M O V E C
// movec(from,to,const)
movec = table [ 
	#175400;	// inc   3,3
	#054410;	// sta   3,10,1
	#135000;	// mov   1,3
	#116400;	// sub   0,3
	#175400;	// inc   3,3
	#174400;	// neg   3,3
	#021003;	// lda   0,3,2
	#061006;	// blks
	#002401;	// jmp   @1,1
	#0     ;	// return address
	]; 
// R A T I O
// ratio(a,b,c)
ratio = table[
	#175400;	// inc	3,3
	#054413;	// sta	3,13,1
	#155000;	// mov	2,3
	#111000;	// mov	0,2
	#102400;	// sub	0,0
	#061020;	// mul
	#031403;	// lda	2,3,3
	#061021;	// div
	#000401;	// jmp	1,1
	#121000;	// mov	1,0
	#171000;	// mov	3,2
	#002401;	// jmp	@1,1
	#0;		// 0
	];
// D I V M O D
// divmod(a,b,modadr)
divmod = table[
	#175400;	// inc	3,3
	#054413;	// sta	3,13,1
	#050413;	// sta  2,13,1
	#131000;	// mov  1,2
	#105000;	// mov  0,1
	#102400;	// sub	0,0
	#061021;	// div
	#000401;	// jmp	1,1
	#030405;	// lda  2,5,1
	#043003;	// sta  0,@3,2
	#121000;	// mov	1,0
	#002401;	// jmp	@1,1
	#0;		// 0
	#0;		// save for ac2
	];
// S W A T ! ! !
swat = table [
	#77400;
	#1401;
	];
// U M I N
// umin(a,b) = a<b ? a,b
umin = table [ 
	#106432;	// subz# 0,1,szc
	#000402;	// jmp   2,1
	#121000;	// mov	 1,0
	#001401;	// jmp   1,3
	]; 
// U M A X
// umax(a,b) = a > b ? a,b
umax = table [ 
 	#122432;	// subz# 1,0,szc
	#000402;	// jmp   2,1
	#121000;	// mov	 1,0
	#001401;	// jmp   1,3
	]; 
// M U L T 
// mult(a,b)
mult = table [ 
	#175400;	// inc	3,3
	#054410;	// sta	3,10,1
	#155000		// mov	2,3
	#111000		// mov	0,2
	#102400;	// sub	0,0
	#061020;	// mul
	#121000		// mov	1,0
	#171000		// mov 3,2
	#002401;	// jmp   @1,1
	#0		// return address
	] 

// B R A V O P A R I T Y C K
//
Saved335=@#335 //Save stack minimum
stackroot = (lv blv)-4;
vCfaEndRes = table [ 0; 0; 0; 0; 0; 0; 0; 0 ] 
move(cfaEndRes,vCfaEndRes,lCFA)
init(blv,paramvec,vCfaEndRes);
] // end main

// A R R A Y
// array allocates number words from the allocation stack

and array(siz) = valof
[
let tfreet = freet;
test siz eq -1 ifso 
	[
	if ult(freee,freet) then errhlta(163); // Bounds exceeded
	rv freet = freee-freet;
	freet = freee;
	resultis tfreet;
	]
ifnot	[
	if ult(freee,freet+siz) then errhlta(164);
	freee = freee-siz;
	resultis freee + 1;
	];
] // end array
// A R R A Y 1
// 

and array1(siz,initval;numargs n) = valof
[ let tp = array(siz);
if n eq 2 then
	movec(tp,tp+siz-1,initval);
resultis tp
] 

// A B S
// SPE catalogue no.

and abs(val) = valof
[
if val ls 0 then resultis -val;
resultis val;
] // end abs

// M I N
//
and min(a,b) = (a ls b) ? a,b;


// M A X
//
and max(a,b) = (a gr b) ? a,b;

// A D D B T
//
and addbt(bt,int) be
[ let t = 0;
let trem = int;
unless ult(int,base) then
	t = divmod(int,base,lv trem);
bt ! 0 = bt ! 0+t;
bt ! 1 = bt ! 1+trem;
unless ult(bt ! 1,base) then
	[ bt ! 1 = bt ! 1-base;
	bt ! 0 = bt ! 0+1;
	] 
unless ult(bt ! 1,base) then
	errhlta(165);
]