-+-+-+-+-+-+-+-+ START OF PART 79 -+-+-+-+-+-+-+-+ X`09movc3`09curlen_c,(r1),(r3)`09; Move col cursor characters. X`09mull3`09#12,8(ap),r1`09`09; (8 bytes * index) for row. X`09movab`09cursor_r-10`5Br1`5D,r1`09; Address of needed row coord. X`09movc3`09curlen_r,(r1),(r3)`09; Move row cursor characters. X`09brb`092$`09`09`09; Branch to copy string X1$:`09`09`09`09`09; Row,Col format X`09mull3`09#12,8(ap),r1`09`09; (8 bytes * index) for row. X`09movab`09cursor_r-10`5Br1`5D,r1`09; Address of needed row coord. X`09movc3`09curlen_r,(r1),(r3)`09; Move row cursor characters. X`09mull3`09#12,12(ap),r1`09`09; (8 bytes * index) for col. X`09movab`09cursor_c-10`5Br1`5D,r1`09; Address of needed col coord. X`09movc3`09curlen_c,(r1),(r3)`09; Move col cursor characters. X2$:`09`09`09`09`09; Copy String X`09tstw`09@4(ap)`09`09`09; No string? X`09beql`093$`09`09`09; No move needed. X`09movl`094(ap),r1`09`09; Move address of string arg. X`09movc3`09@4(ap),2(r1),(r3)`09; Move string arg into output buff. X3$: X`09addw3`09cursor_l,@4(ap),r1`09; Total length of new output X`09addw2`09r1,out_len`09`09; Total length of saved output X`09cmpw`09out_len,#900`09`09; Buffer getting full? X`09bgtr`09DUMP_QIO`09`09; Output the buffer... X`09ret`09`09`09`09; return from PUT_BUFFER X`09`09`09`09`09; X`09`09`09`09`09; PUT_QIO entry point XPUT_QIO:: X`09.word`090 X`09`09`09`09`09; XDUMP_QIO: X`09$QIOW_S`09EFN=#6, -`09`09; Unique event flag X`09`09CHAN=channel, -`09`09; Output the buffer X`09`09FUNC=IO$_WRITEVBLK, -`09; Write virtual block X`09`09P1=out_buf, -`09`09; Address of buffer X`09`09P2=out_len`09`09; Buffers current length X`09`09`09`09`09; X`09movw`09#0,out_len`09`09; Clear buffer; X`09ret`09`09`09`09; Return from PUT_QIO X`09`09`09`09`09; X`09.end $ CALL UNPACK [.SOURCE.MACRO]PUTQIO.MAR;1 2019791587 $ create 'f' X`09; X`09; Macro function for : X`09; X`09;`09y := RANDINT(x) where y receives an integer X`09;`09`09`091 <= y <= x X`09; X`09; Seed is a global variable declared in PASCAL main. X`09; X`09.title`09randint`09`09Uniform random number generator X`09.ident`09/randint/ X`09.psect misc1$code,pic,con,rel,lcl,shr,exe,rd,nowrt,2 X`09.entry`09randint,`5EM<> X`09mull2`09#16807,seed X`09bicl2`09#`5EX80000000,seed X`09subl3`09#1,seed,r0 X`09emul`09r0,4(ap),#0,r0 X`09ediv`09#2147483647,r0,r0,r1 X`09addl2`09#1,r0 X`09ret X`09.end X $ CALL UNPACK [.SOURCE.MACRO]RANDINT.MAR;1 1047970647 $ create 'f' X`09; X`09; Macro function for : X`09; X`09;`09For i := 1 to y do sum := sum + randint(x) X`09; where RANDINT returns random integer 1 <= r <= x X`09; X`09; Seed is a global variable declared in PASCAL main X`09; X`09.title`09RAND_REP X`09.ident`09/rand_rep/ X`09.psect misc1$code,pic,con,rel,lcl,shr,exe,rd,nowrt,2 X`09.entry`09rand_rep,`5EM X`09movl`094(ap),r4 X`09cmpl`09r4,#0 X`09bleq`092$ X`09movl`09#0,r0 X1$:`09mull2`09#16807,seed X`09bicl2`09#`5EX80000000,seed X`09subl3`09#1,seed,r2 X`09emul`09r2,8(ap),#0,r2 X`09ediv`09#2147483647,r2,r2,r3 X`09addl`09r2,r0 X`09sobgtr`09r4,1$ X`09addl`094(ap),r0 X`09ret X2$:`09movl`09#0,r0 X`09ret X`09.end X $ CALL UNPACK [.SOURCE.MACRO]RANDREP.MAR;1 225796726 $ create 'f' X`09.title`09sub_quadtime X; X;`09call sequence X; X;`09call sub_quadtime(a, b, c) X; X;`09where a, b, and c are quadword system time buffers X; X;`09c = a - b X; Xa = 4 Xb = 8 Xc = 12 Xsub_quadtime::`09.word`09`5Em X`09`09movq`09@a(ap),r0`09; minuend in registers X`09`09movl`09b(ap),r2`09; address of subtrahend in r2 X`09`09subl`09(r2),r0`09`09; subtract low order half X`09`09sbwc`094(r2),r1`09; subtract high@order half with carry X; X;`09we now have the time increment between a and b. The system X;`09form of a delta time is the negative of this. We get this by X;`09subtracting from 0. X; X`09`09movl`09c(ap),r2`09; address of destination in r2 X`09`09clrl`09(r2)`09`09; set to 0 X`09`09clrl`094(r2) X`09`09subl`09r0,(r2)`09`09; subtract low half X`09`09sbwc`09r1,4(r2)`09; subtract high half X`09`09ret X`09`09.end $ CALL UNPACK [.SOURCE.MACRO]SUBQUAD.MAR;1 341530493 $ create 'f' X`09.Title`09Users X X .entry users, `5EM<> X movzwl g`5Esys$gw_ijobcnt, r0 X ret X X`09.entry`09max_users, `5EM<> X movzwl g`5Esys$gw_ijoblim, r0 X`09ret X .end ; remember to link with SYS$SYSTEM:SYS.STB/SELECTIVE $ CALL UNPACK [.SOURCE.MACRO]USERS.MAR;1 1063354017 $ v=f$verify(v) $ EXIT