// 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