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