// B R A V O // GBRAVO.SR added cpc to make -1<0<1<...<65534

get "BRAVO.DF" // **

// Incoming Procedures

external [
	init;
	errhlt;
	INITALTOIO
	SetEndCode
	];

// Incoming Statics


// Outgoing Procedures

external [
	array;
	abs;
	];

// Outgoing Statics

external [
	mult
	umax
	umin
	ult;
	ugt;
	move;
	movec;
	ratio;
	swat;
	divmod;
	freet;
	freee;
	vyorig;
	ozone
	ozonel
	scanconvert
	stackroot
	Saved335
	cpc // **
	cpmin
	cpmax
	]; 

// Local Statics

static [
	mult
	umax
	umin
	ult;
	ugt;
	move;
	movec;
	ratio;
	swat;
	divmod;
	freet;
	freee;
	vyorig;
	scanconvert
	stackroot
	Saved335
	cpc // **
	cpmin
	cpmax
	];

// M A I N

let main(v) 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
	]; 

// ** GYPSY ADDED:
// cp compare, unsigned, with -1<0<1<...<-3<-2
cpc = table [
	#101400;	// inc 0,0 ** so -1<0<1... **
	#125400;	// inc 1,1 ** same         **
	#106032;	// adcz# 0 1 szc // rest is Usc
	#000404;	// jmp .+4
	#122424;	// subz 1 0 szr // ** was bug in Usc
	#102520;	// mkone 0 0 (subzl 0,0)
	#001401;	// jmp 1,3
	#102000;	// mknil 0 0 (adc 0,0)
	#001401;	// jmp 1,3
	]; 
// ** END GYPSY ADDITION

// 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 C A N C O N V E R T
// scanconvert(char,pconvert)
scanconvert = table [
	#175400;	// inc 3,3
	#054423;	// sta 3,23,1
	#050423;	// sta 2,23,1
	#131000;	// move 1,2
	#035000;	// lda 3,0,2
	#117000;	// add 0,3
	#021003;	// lda 0,3,2
	#067001;	// convert+1
	#000411;	// jmp 11,1
	#166422;	// subz 3,1,szc
	#000404;	// jmp 4,1
	#011003;	// isz 3,2
	#034412;	// lda 3,12,1
	#167000;	// add 3,1
	#045002;	// sta 1,2,2
	#030406;	// lda 2,6,1
	#002404;	// jmp 4,1
	#011003;	// isz 3,2
	#161000;	// mov 3,0
	#000761;	// jmp -17,1
	#0;		// return adr
	#0;		// save for ac2
	#20;		// 20?!?
	];
// U M I N
// umin(a,b) = a<b ? a,b
umin = table [ 
	#106432;	// subz# 0,1,snc
	#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
	]; 
// ** C P M I N
// cpmin(a,b) = a<b ? a,b but -1 < ... < -2
cpmin = table [ 
	#101400;	// inc 0,0 ** so -1<0<1... **
	#125400;	// inc 1,1 ** same         **
	#106432;	// subz# 0,1,snc
	#000402;	// jmp   2,1
	#121000;	// mov	 1,0
	#100400;	// neg   0,0 // ** decrement
	#100000;	// com   0,0 // ** same
	#001401;	// jmp   1,3
	]; 
// ** C P M A X
// cpmax(a,b) = a > b ? a,b but -1 < ... < -2
cpmax = table [ 
	#101400;	// inc 0,0 ** so -1<0<1... **
	#125400;	// inc 1,1 ** same         **
 	#122432;	// subz# 1,0,szc
	#000402;	// jmp   2,1
	#121000;	// mov	 1,0
	#100400;	// neg   0,0 // ** decrement
	#100000;	// com   0,0 // ** same
	#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
	] 
// S W A T ! ! !
swat = table [
	#77400;
	#1401;
	];

Saved335=@#335 //Save stack minimum
INITALTOIO(maxstream-3);
SetEndCode(INITALTOIO);
stackroot = (lv v)-4;
rv #1102 = #176777;
init();
] // 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 errhlt("ARE"); // Bounds exceeded
	rv freet = freee-freet;
	freet = freee;
	resultis tfreet;
	]
ifnot	[
	if ult(freee,freet+siz) then errhlt("ARE");
	freee = freee-siz;
	resultis freee + 1;
	];
] // end array

// A B S
// SPE catalogue no.

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