// 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); ]