*comdeck cdkcbtz convert blanks to zeroes in a word. btz ctext cdkcbtz - convert blanks to zeroes in a word. btz space 4,10 if -def,qual$,1 qual cdkcbtz base d btz space 4,10 *** btz - convert blanks to zeroes in a word. * * g. m. townsend. 83/08/22. code based on *comcztb*. * * btz converts all blanks in a word to 00 characters. btz space 4,10 *** btz converts all blanks in a word to 00 characters. * * entry (x1) = word to be converted. * (b1) = 1. * * exit (x6) = converted word. * (x7) = final character mask. * * uses x - 3, 6, 7. * b - none. * a - 3. * * calls none. btz> subr entry/exit sa3 btza bx7 x1-x3 convert blanks to 00, others to misc sa3 a3+b1 bx6 x3*x7 remove upper bit from all characters bx7 -x3*x7 isolate upper bits ix6 x6+x3 any non-zero character produces carry bx6 x6+x7 merge upper bits and carries bx7 -x3*x6 all non-zero characters = 40b bx6 x7 lx7 -5 ix7 x6-x7 bx7 x6+x7 now have mask bx6 x7*x1 clear spaces from original word eq btz> and return btza con 10h con 37373737373737373737b btz space 4,10 base * qual$ if -def,qual$ qual * btz> equ /cdkcbtz/btz> qual$ endif btz endx *comdeck cdkcmfs move fortran string. mfs ctext cdkcmfs - move fortran string. mfs space 4,10 if -def,qual$,1 qual cdkcmfs base d mfs space 4,10 *** mfs - move fortran string. * * g. m. townsend. 83/05/31. * * mfs moves a (possibly unaligned) ftn5 character string * into a word-aligned buffer. mfs space 4,10 *** mfs moves a ftn5 character string into a buffer. this is * particularly useful for subroutines which need their data * word-aligned. if the string is too long for the buffer, it * is truncated; if too short, it is padded with zeroes. * * mfs also works for ftn4 or ftn5 hollerith strings (characters * stored in variables of other types); since such strings * have no associated length they will be copied until the * buffer is filled. * * strings must be in cm (not ecs/lcm) and must not exceed * 777777b characters in length. * * entry (x1) = aplist entry specifying string in cm * (see ftn5 reference manual) or address * of hollerith string. * (b1) = 1. * (b6) = fwa of output buffer. * (b7) = size of output buffer, in words. * * exit (b6) = lwa+1 of buffer. * * uses x - 1, 2, 6, 7. * b - 3, 4, 5, 6, 7. * a - 2, 6. * * calls none. mfs> subr entry/exit sa2 x1 (a2/x2) = current input word mx7 -6 (x7) = one-character mask ax1 24 bx6 -x1+x7 -(beginning char position) ax1 6 sb3 x1 (b3) = number of chars left (0 = unknown). sb4 x6+10 (b4) = number of chars left in x2 ix1 x6+x6 -2 * bcp ix1 x6+x1 -3 * bcp lx1 1 -6 * bcp (0 to -54) sb5 x1 ax2 b5 position x2 to first input character mx6 0 (x6) = output word in progress sb5 54 (b5) = shift count for stuffing output nz b3,mfs2 if input char count provided sb3 -1 no, use huge count eq mfs2 join main loop mfs1 sa2 a2+1 get next input word sb4 10 indicate 10 chars available mfs2 zr b3,mfs4 if input string exhausted zr b4,mfs1 if need to load new input word mfs3 lx2 6 no, position to next character sb3 b3-b1 count character from string bx1 -x7*x2 isolate it sb4 b4-b1 count character from x2 lx1 b5 position it sb5 b5-6 adjust shift count for next time bx6 x6+x1 add into output word pl b5,mfs2 if output word not full sa6 b6 yes, save output word sb7 b7-b1 count it sb6 b6+b1 bump store address sb5 54 reset shift count mx6 0 clear output word gt b7,mfs2 if output buffer not full eq mfs> if full, return mfs4 mx2 0 use zeroes for remaining characters sb4 b0 indicate huge number left eq mfs3 rejoin loop mfs space 4,10 base * qual$ if -def,qual$ qual * mfs> equ /cdkcmfs/mfs> qual$ endif mfs endx *comdeck cdkcmvc move characters. mvc ctext cdkcmvc - cm string move. mvc space 4,10 if -def,qual$,1 qual cdkcmvc base d mvc space 4,10 *** mvc - move character string. * * r. o. anderson, * w. r. sears 75/05/21. * * r. o. anderson. 80/07/03. handle char offsets .gt. 9. * * mvc moves character strings. mvc space 4,10 *** mvc moves strings from one location to another on what * appears to be a character by character basis. mvc does not * change characters in the destination area that lie beyond the * space covered by the string that was moved. * * entry (a1) = source address. * (a2) = destination address. * (b1) = 1. * (b2) = source character offset (0 to 131071). * (b3) = destination character offset (0 to 131071). * (b4) = number of characters to move (0 to 131071). * * exit string moved. * * uses x - 1, 2, 3, 4, 5, 6, 7. * b - 2, 3, 4, 5. * a - 1, 2, 3, 4, 6, 7. mvc.csiz equ 6 bits per character mvc.cpw equ 60/mvc.csiz characters per word mvc4 bx7 x2 set up sa2 a2-b1 for first bx6 x2 iteration sa6 a2 of loop mvc5 bx5 -x3*x1 -123456789 bx2 x4*x7 abc------- sa1 a1+b1 klmnopqrst bx7 x3*x1 k--------- bx7 x5+x7 k123456789 lx7 b2,x7 89k1234567 bx6 -x4*x7 ---1234567 bx6 x6+x2 abc1234567 sb4 b4-mvc.cpw decrement characters left le b4,mvc6 if done sa6 a6+b1 store this word eq mvc5 loop till done mvc6 sa2 mvca+mvc.cpw-1+b4 get proper edit mask sb3 b3-60 set up right circular shift of mask lx2 -b3,x2 ---******- bx1 x4+x2 *********- bx3 x4*x2 ---------- bx7 x4*x7 890------- sa2 a6+b1 abcdefghij sa4 a2+b1 klmnopqrst bx2 -x1*x2 ---------j bx4 -x3*x4 klmnopqrst bx6 x1*x6 abc123456- bx7 x3*x7 --------- bx6 x6+x2 abc123456j bx7 x7+x4 klmnopqrst sa6 a2 update sa7 a4 last words mvc> subr entry/exit le b4,mvc> quit if nothing to do sx6 mvc.csiz x6 = bits per character mvc0 sb2 b2-10 compute source word address mi b2,mvc0a if word address ok sa1 a1+b1 advance 1 word eq mvc0 mvc0a sb2 b2+10 compute corrected source offset mx5 1 for mask generation sb5 b2 save source offset for later mvc0b sb3 b3-10 compute destination word address mi b3,mvc0c if word address ok sa2 a2+b1 advance 1 word eq mvc0b mvc0c sb3 b3+10 compute corrected destination offset sx7 b2 convert ix7 x7*x6 source offset sb2 x7 to bits sx7 b3 convert ix7 x7*x6 destination offset sb3 x7 to bits ax3 x5,b2 build source and ax4 x5,b3 destination masks lx5 b1,x3 compensate bx3 x5*x3 for lx5 b1,x4 extra bx4 x5*x4 bit sx6 a1 get fwa of source area sb2 b2-b3 b2 is offset difference pl b2,mvc1 skip if positive sb2 b2+60 else make it positive mvc1 sx7 a2 get destination fwa ix5 x6-x7 see if fwa source .ge. fwa dest. pl x5,mvc4 if so sx5 b5+b4 get character offset of lwa source sx7 mvc.cpw compute mx6 -1 characters per word ix6 x6+x7 minus one ix5 x5+x6 x5 = offset + rounding value * ix7 x5/x7,b5 word offset of lwa + 1 source ix7 x5/x7 word offset of lwa + 1 source sx6 a1 compute lwa + 1 ix5 x6+x7 of source sx6 a2 see if lwa + 1 source ix6 x6-x5 .le. fwa destination pl x6,mvc4 if so sa1 x5-1 a1 = lwa source sx6 a2 compute ix5 x6+x7 lwa + 1 destination sa2 x5-1 a2 = lwa destination sx7 mvc.cpw compute sx6 b4 remainder of px6 x6,b0 integer divide px7 x7,b0 nx7 x7,b0 fx5 x6/x7 ux6,b5 x6 restore registers lx6 x6,b5 ux7,b5 x7 lx7 x7,b5 ux5,b5 x5 lx5 x5,b5 ix5 x5*x7 number of characters / chars per word ix5 x6-x5 then get ix5 x5-x7 index into mask table sb5 mvca+mvc.cpw-1+x5 b5 = pointer to mask bx6 x3 save sa6 mvcb both bx7 x4 masks sa7 a6+b1 for later lx6 x1,b2 ^!+"*/[]() bx5 x4*x6 ^!+------- bx6 x3*x1 +--------- sa1 a1-b1 0123456789 bx1 -x3*x1 -123456789 bx6 x6+x1 +123456789 lx7 x6,b2 89+1234567 bx6 x4*x7 89+------- sa1 a1+b1 +"*/[]()^! lx1 x1,b2 ^!+"*/[]() bx1 -x4*x1 ---"*/[]() bx6 x6+x1 89+"*/[]() sa3 b5 get the edit mask sb5 b3-60 get mask rotation value lx3 -b5,x3 **-******* bx1 x4+x3 ********** bx3 x4*x3 **-------- sa4 a2+b1 %%%%%%%%%% bx4 -x3*x4 --%%%%%%%% bx5 x3*x5 ^!-------- bx5 x5+x4 ^!%%%%%%%% bx2 -x1*x2 ---------- bx4 x1*x6 89+"*/[]() bx6 x5 ^!%%%%%%%% sa6 a4 update last word in dest. area bx6 x4+x2 89+"*/[]() sa6 a2 update the next to last word cx1 x1 see cx3 x3 how many ix3 x3+x1 characters sx1 mvc.csiz were * ix3 x3/x1,b5 used ix3 x3/x1 used sb5 x3 and decrement sb4 b4-b5 the total le b4,mvc> if done sa1 a1-b1 0123456789 sa3 mvcb recover sa4 a3+b1 masks mvc2 bx5 x3*x1 0--------- bx2 -x4*x7 ---1234567 sa1 a1-b1 abcdefghij bx7 -x3*x1 -bcdefghij bx7 x7+x5 0bcdefghij lx7 b2,x7 ij0bcdefgh bx6 x4*x7 ij0------- bx6 x6+x2 ij01234567 sb4 b4-mvc.cpw decrement characters left le b4,mvc3 if done sa6 a6-b1 store this word eq mvc2 loop till done mvc3 bx6 -x4*x6 ---bcdefgh sa1 a6-b1 klmnopqrst bx1 x4*x1 klm------- bx6 x1+x6 klmbcdefgh sa6 a1 store last word eq mvc> return mvca vfd mvc.csiz/-0,*p/0 mask table .mvcif ifgt mvc.cpw,2 .mvcset set mvc.csiz .mvc1up dup mvc.cpw-2 .mvcset set .mvcset+mvc.csiz vfd .mvcset/-0,*p/0 .mvc1up endd .mvcif endif data -0 mvcb bss 2 to save masks mvc space 4,10 base * qual$ if -def,qual$ qual * mvc> equ /cdkcmvc/mvc> qual$ endif mvc endx *comdeck cdkcscs select character set. scs ctext cdkcscs - select character set. scs space 4,10 if -def,qual$,1 qual cdkcscs base d scs space 4,10 *** scs - select character set. * * g. m. townsend. 81/02/17. * * scs determines the character set of a file by inspecting the * first buffer full of data. scs space 4,10 *** scs looks at a portion of a file to determine whether it is * display code or 7-in-12 ascii. it does this by seeing if * there are zero bits where they should be for an ascii file; * if not, the file is assumed to be in display code. the * algorithm is not foolproof -- it can falsely diagnose a file * as ascii if it contains only the display code characters * a, 5, and 6 (also *:* in 64-character set) in odd-numbered * columns. despite this, the method works well in practice. * * scs looks at all the data in a circular buffer, as indicated * by the fet. the caller should first issue a read, then call * scs. * * entry (x2) = fet address. * (b1) = 1. * * exit (x6) = 1 if display code. * (x6) = 0 if buffer is empty. * (x6) = -1 if nos 812 ascii. * (x6) = -2 if ut 812 ascii. * * uses x - 1, 3, 6. * b - 2, 3, 4, 5. * a - 1, 3. scs> subr entry/exit recall x2 wait for read to finish sa1 x2+b1 sb2 x1 (b2) = first sa1 a1+b1 sb3 x1 (b3) = in sa1 a1+b1 sb4 x1 (b4) = out sa1 a1+b1 sb5 x1 (b5) = limit sx6 b0 eq b3,b4,scs> if empty buffer, return sa3 scsa (x3) = mask sx6 b1 assume display code scs1 sa1 b4 fetch word bx1 -x3*x1 zr x1,scs2 if ok ascii so far, check more sa1 b4 check against ut 812 ascii sa3 scsb bx1 -x3*x1 nz x1,scs> if display code, return scs2 sb4 b4+b1 bump pointer eq b4,b3,scs3 if no more in buffer lt b4,b5,scs1 if not yet to limit sb4 b2 go back to first ne b4,b3,scs1 if more to check scs3 sx6 -b1 indicate ascii sa1 scsa bx1 x1-x3 zr x1,scs> if nos 812 ascii sx6 -2 indicate ut 812 ascii eq scs> return scsa data 41774177417741774177b mask for bits in ascii chars scsb data 43774377437743774377b mask for ut 812 chars scs space 4,10 base * qual$ if -def,qual$ qual * scs> equ /cdkcscs/scs> qual$ endif scs endx *comdeck cdkcsxt convert characters, sixbit to twelvebit. sxt ctext cdkcsxt - sixbit to twelve bit character mapping. sxt space 4,10 if -def,qual$,1 qual cdkcsxt base d sxt space 4,10 *** sxt - sixbit to twelve bit character mapping. * * r. o. anderson. 75/01/27. * * sxt converts a 6-bit character set into a 12-bit character * set. sxt space 4,10 *** sxt performs a character mapping operation using a conversion * table of 1 character per word, right justified, binary zero * filled. the table is assumed to be long enough to allow * mapping of any character encountered in the input string. * * entry (b1) = 1. * (b2) = address of input string. * (b3) = length of input string, in words. * (b4) = address of output string. * (b5) = address of conversion table. * * exit string converted. * * uses x - 1, 2, 6, 7. * b - none. * a - 1, 2, 6. sxt> subr entry/exit sx6 b3 save input sa6 sxta string length sx6 b4 save output sa6 a6+b1 start address sb3 b2+b3 compute lwa + 1 of input area mx7 -6 set up a one byte mask sxt1 sa1 b2 read up the next word to convert mx6 0 clear assembly register .sxt dup 5 lx1 6 get one character bx2 -x7*x1 in x2 sa2 b5+x2 get replacement lx6 12 make room for new character bx6 x6+x2 add in new character .sxt endd sa6 b4 store output word mx6 0 clear assembly register .sxt dup 5 lx1 6 get one character bx2 -x7*x1 in x2 sa2 b5+x2 get replacement lx6 12 make room for new character bx6 x6+x2 add in new character .sxt endd sa6 a6+b1 store output word sb2 b2+b1 increment in pointer sb4 a6+b1 increment out pointer lt b2,b3,sxt1 loop till done sa1 sxta recover input sb3 x1 string length sa1 a1+b1 recover output sb4 x1 start address sb2 b2-b3 restore input starting address eq sxt> return sxta bss 2 to save length and out start addr sxt space 4,10 base * qual$ if -def,qual$ qual * sxt> equ /cdkcsxt/sxt> qual$ endif sxt endx *comdeck cdkctxs convert characters, twelvebit to sixbit. txs ctext cdkctxs - twelve bit to sixbit character mapping. txs space 4,10 if -def,qual$,1 qual cdkctxs base d txs space 4,10 *** txs - twelve bit to sixbit character mapping. * * r. o. anderson. 75/01/27. * * txs converts a 12-bit character set into a 6-bit character * set. txs space 4,10 *** txs performs a character mapping operation using a conversion * table of 1 character per word, right justified, binary zero * filled. the table is assumed to be long enough to allow * mapping of any character encountered in the input string. * * entry (b1) = 1. * (b2) = address of input string. * (b3) = length of input string, in words. * (b4) = address of output string. * (b5) = address of conversion table. * * exit string converted. * * uses x - 1, 2, 6, 7. * b - none. * a - 1, 2, 6. txs> subr entry/exit sx6 b3 save input sa6 txsa string length sx6 b4 save output sa6 a6+b1 start address sb3 b2+b3 compute lwa + 1 of input area mx7 -12 set up a one byte mask txs1 sa1 b2 read up the next word to convert mx6 0 clear assembly register .txs dup 5 lx1 12 get one character bx2 -x7*x1 in x2 sa2 b5+x2 get replacement lx6 6 make room for new character bx6 x6+x2 add in new character .txs endd sb2 b2+b1 increment in pointer ge b2,b3,txs3 store word if input length odd sa1 b2 else get next word and continue .txs dup 5 lx1 12 get one character bx2 -x7*x1 in x2 sa2 b5+x2 get replacement lx6 6 make room for new character bx6 x6+x2 add in new character .txs endd sa6 b4 store output word sb2 b2+b1 increment in pointer sb4 b4+b1 increment out pointer lt b2,b3,txs1 loop till done txs2 sa1 txsa recover input sb3 x1 string length sa1 a1+b1 recover output sb4 x1 start address sb2 b2-b3 restore input starting address eq txs> return txs3 lx6 30 position partial word sa6 b4 save it eq txs2 to complete exit txsa bss 2 to save length and out start addr txs space 4,10 base * qual$ if -def,qual$ qual * txs> equ /cdkctxs/txs> qual$ endif txs endx *comdeck cdkcvfn validate file name. vfn ctext cdkcvfn - validate file name. vfn space 4,10 if -def,qual$,1 qual cdkcvfn base d vfn space 4,10 *** vfn - validate file name. * * g. m. townsend. 78/02/02. * * vfn checks that a string is a legal file name. vfn space 4,10 *** entry (x1) = file name, l format. * (b1) = 1. * * exit (x1) = 0 if legal. * * uses x - 1, 2, 6. * b - 2. * a - none. vfn> subr entry/exit mi x1,vfn> if negative, return immediately bx2 x1 ax2 54 sx2 x2-1r0 pl x2,vfn> if first char numeric, return sb2 7 (b2) = character counter mx2 -6 (x2) = character mask vfn1 lx1 6 bx6 -x2*x1 (x6) = character zr x6,vfn> if zero character, return sx6 x6-1r9-1 pl x6,vfn> if illegal character, return bx1 x2*x1 clear out last char, it is legal sb2 b2-b1 nz b2,vfn1 if more characters to test eq vfn> return vfn space 4,10 base * qual$ if -def,qual$ qual * vfn> equ /cdkcvfn/vfn> qual$ endif vfn endx *deck rel ident cpu.btz entry btz> btz title btz - convert blanks to zeroes in a word. comment convert blanks to zeroes in a word. *call cdkcbtz end ident cpu.mfs entry mfs> mfs title mfs - move fortran string. comment move fortran string. *call cdkcmfs end ident cpu.mvc entry mvc> mvc title mvc - move characters. comment move characters. *call cdkcmvc end ident cpu.scs entry scs> scs title scs - select character set. comment select character set. *call cdkcscs end ident cpu.sxt entry sxt> sxt title sxt - convert characters, sixbit to twelvebit. comment convert characters, sixbit to twelvebit. *call cdkcsxt end ident cpu.txs entry txs> txs title txs - convert characters, twelvebit to sixbit. comment convert characters, twelvebit to sixbit. *call cdkctxs end ident cpu.vfn entry vfn> sst vfn title vfn - validate file name. comment validate file name. *call cdkcvfn end *deck macrel ident macrel entry macrel.,macrel=,macwal= sst b1=1 list f title macrel - system macro interface routines. comment system macro interface routines. macrel space 4,10 *** macrel - system macro interface routines. * * t. r. ramsey. 76/08/08. * * copyright control data corporation. 1976. macrel space 4,10 *** macrel is a collection of relocatable modules that * provide the interface between higher level language modules * and the system macros. * * fortran calling sequences are shown in each module along with * other pertinent information, e.g., entry, exit. title macrel - system macro interface routines. macrel space 4,10 ** macrel modules translate parameters in higher level * language calling sequences into macro calling sequences. * fortran calling sequences mentioned are equivalent to * cobol (enter using), sympl, etc. * * entry fortran *call* and function reference calling * sequences use the actual parameter list, call by * reference calling sequence where - * (a1) = fwa of aplist * ((a1)) # first parameter * ((a1+1)) # second parameter * . . * . . * . . * ((a1+n)) # n-th parameter * ((a1+n+1)) = 0 (zero) (nominally) (un-needed herein) * (x1) # first parameter * * exit for *call*, typically none, but see individual modules. * for function references, * (x6) = function result * (x7) = second word of two word result, e.g., complex * * uses preserves a0 * * calls macrel. if macro undefined or not coded yet * macrel= if argument error * * needs each module contains a call to a macro whose name is * the same as the module (except where noted). these * macros are defined in systext (kronos nos) and cputext * (scope nos/be) and also in jettext. jettext is the * preferred system text. * * note b1 is set to one upon entry to each module * * other macrel is a collection of relocatable modules combined * into one *update* deck entity named macrel. the * modules are arranged in the same order as the macros * in jettext. macrel. space 4,10 ** macrel. - undefined macro processor. * * entry (x1) = macro name in 0l format * * exit does not exit * * uses a6 b1 x6 * * calls none * * needs macros abort, message macrel. subr entry/exit sb1 1 bx6 x1 sa6 maca+3 message maca,,rcl abort eq macrel. maca data c* macrel - undefined macro - fill-in.* macrel= space 4,10 ** macrel= - illegal argument processor. * * entry (x1) = macro name in 0l format * (x2) = illegal argument * * exit does not exit * * uses a6 b1 x0,x1,x2,x6 * * calls ztb= * * needs macros abort, message macrel= subr entry/exit sb1 1 bx0 x2 save second argument lx1 -6 sx2 1r- bx1 x1+x2 rj =xztb= bx1 x0 sa6 macb rj =xztb= sa6 macb+3 message macb,,rcl abort ,nd eq macrel= macb data c* fill-in - illegal argument >fill-it-in<.* macwal= space 4,10 ** macwal= - word align a 10 or less character parameter. * * entry (x1) = ftn/ftn5 argument list item. * * exit (x2) = value from argument list, left justified, with * space fill, unless value was 0b or all spaces, in * which case, 0b returned. * * uses a2,a3,a6 b1,b3,b4,b5,b6,b7 x1,x2,x3,x6,x7 * * calls mfs>, ztb=. macwal= subr entry/exit sb1 1 sb6 macc where mfs can stash the result sb7 b1 length of mfs buffer rj =xmfs> move the option sa2 macc get the result zr x2,macwal= if nothing specified, return binary zero bx1 x2 for ztb rj =xztb= blank out the 00b characters sa2 macd spaces bx2 x2-x6 zr x2,macwal= map spaces to zero for ftn5 bx2 x6 for most of our callers, this is best eq macwal= return macc bss 1 buffer for mfs macd data 10h end ident excst entry excst sst syscom b1 excst title excst - execute control statement for ftn. comment (ftn) execute control statement. excst space 4,10 ***** excst - execute control statement for ftn. * * r. o. anderson. 83/10/31. * * allow ftn program to execute a control statement. excst space 4,10 *** excst allows an ftn program to execute a control * statement at termination. * * call excst(string) * * entry *string* is a hollerith string (ftn4), including * a line terminator, or a character variable (ftn5). * in either case, the maximum length is 80 characters. * * exit does not return. * * calls mfs>, sys=. excst subr = entry (only) sb1 1 always sb6 ccdr where to put the image sb7 8 maximum buffer length rj =xmfs> move the string excst ccdr execute image * system pcc,r,ccdr execute image (does not return) endrun in case we did a 1aj command end ident close entry close sst b1=1 title close - close file. comment close file. close space 4,10 *** close - close file. * * call close (file,option) * * entry (file) = first word of the fet * (option) = a hollerith string or character variable * with any of the following values. * = 0 or blanks, close with rewind * = ^nr^, close without rewind * = ^reel^, close reel with rewind * = ^reelnr^, close reel without rewind * = ^reelun^, close reel with rewind, unload * = ^return^, close with rewind, return * = ^rewind^, close with rewind * = ^unload^, close with rewind, unload * * exit to argument-error processor if option is unrecognized * else none close subr sb1 1 sa1 a1+b1 point to option rj =xmacwal= word align option sa1 a1-b1 reset x1 to be fet address zr,x2 clo1 sa3 =0hnr bx4 x2-x3 zr,x4 clo2 if nr sa3 =0hreel bx4 x2-x3 zr,x4 clo3 if reel sa3 =0hreelnr bx4 x2-x3 zr,x4 clo4 if reelnr sa3 =0hreelun bx4 x2-x3 zr,x4 clo5 if reelun sa3 =0hreturn bx4 x2-x3 zr,x4 clo6 if return sa3 =0hrewind bx4 x2-x3 zr,x4 clo7 if rewind sa3 =0hunload bx4 x2-x3 zr,x4 clo8 if unload sa1 =0lclose rj =xmacrel= diagnose illegal argument eq close clo1 close x1 eq close clo2 close x1,nr eq close clo3 closer x1 eq close clo4 closer x1,nr eq close clo5 closer x1,unload eq close clo6 close x1,return eq close clo7 close x1 eq close clo8 close x1,unload eq close end ident open entry open sst b1=1 title open - open file for processing. comment open file for processing. open space 4,10 *** open - open file for processing. * * call open (file,option) * * entry (file) = first word of the fet * (option) = a hollerith string or character variable * with any of the following values. * = 0 or blanks, same as ^alter^ * = ^alter^, open with rewind for i-o * = ^alternr^, open for i-o * = ^nr^, open * = ^read^, open with rewind for input * = ^readnr^, open for input * = ^reel^, open reel with rewind * = ^reelnr^, open reel * = ^write^, open with rewind for output * = ^writenr^, open for output * * exit to argument-error processor if option is unrecognized * else none open subr sb1 1 sa1 a1+b1 point to option rj =xmacwal= word align option sa1 a1-b1 reset x1 to be fet address zr,x2 ope1 sa3 =0halter sa4 =0halternr sa5 =0hnr bx3 x2-x3 bx4 x2-x4 zr,x3 ope2 if alter bx5 x2-x5 zr,x4 ope3 if alternr zr,x5 ope4 if nr sa3 =0hread sa4 =0hreadnr sa5 =0hreel bx3 x2-x3 bx4 x2-x4 zr,x3 ope5 if read bx5 x2-x5 zr,x4 ope6 if readnr zr,x5 ope7 if reel sa3 =0hreelnr sa4 =0hwrite sa5 =0hwritenr bx3 x2-x3 bx4 x2-x4 zr,x3 ope8 if reelnr bx5 x2-x5 zr,x4 ope9 if write zr,x5 ope10 if writenr sa1 =0lopen rj =xmacrel= diagnose illegal argument eq open ope1 open x1 eq open ope2 open x1,alter eq open ope3 open x1,alternr eq open ope4 open x1,nr eq open ope5 open x1,read eq open ope6 open x1,readnr eq open ope7 open x1,reel eq open ope8 open x1,reelnr eq open ope9 open x1,write eq open ope10 open x1,writenr eq open end ident read entry read sst b1=1 title read - read file to cio buffer. comment read file to cio buffer. read space 4,10 *** read - read file to cio buffer. * * call read (file) * * entry (file) = first word of the fet read subr sb1 1 read x1 eq read end ident writer entry writer sst b1=1 title writer - write end of record. comment write end of record. writer space 4,10 *** writer - write end of record. * * call writer (file,level) * * entry (file) = first word of the fet * (level) = record level writer subr sb1 1 sa3 a1+b1 address of level sa3 x3 level writer x1,x3 eq writer end ident readc entry readc sst b1=1 title readc - read coded line in *c* format. comment read coded line in *c* format. readc space 4,10 *** readc - read coded line in *c* format. * * call readc (file,buf,n,status) * * transfers data until the end of line byte (0000) is sensed. * * entry (file) = first word of the fet * (buf) = first word of the working buffer * (n) = word count of the working buffer * * exit (status) = 0, transfer complete * = -1, end-of-file detected on file * = -2, end-of-information detected on file * = lwa, end-of-record detected on file before * transfer was complete * lwa = address + 1 of last word transferred to * working buffer readc subr sb1 1 sa3 a1+b1 fwa of working buffer sa4 a3+b1 address of word count sa5 a4+b1 (x5) = address of status word bx6 x5 sa4 x4 word count readc x1,x3,x4 bx6 x1 sa6 x5 eq readc end ident readw entry readw sst b1=1 title readw - read data to working buffer. comment read data to working buffer. readw space 4,10 *** readw - read data to working buffer. * * call readw (file,buf,n,status) * * entry (file) = first word of the fet * (buf) = first word of the working buffer * (n) = word count of the working buffer * * exit (status) = 0, transfer complete * = -1, end-of-file detected on file * = -2, end-of-information detected on file * = lwa, end-of-record detected on file before * transfer was complete * lwa = address + 1 of last word transferred to * working buffer readw subr sb1 1 sa3 a1+b1 fwa of working buffer sa4 a3+b1 address of word count sa5 a4+b1 (x5) = address of status word sa4 x4 word count readw x1,x3,x4 bx6 x1 sa6 x5 eq readw end ident writew entry writew sst b1=1 title writew - write data from working buffer. comment write data from working buffer. writew space 4,10 *** writew - write data from working buffer. * * call writew (file,buf,n) * * entry (file) = first word of the fet * (buf) = first word of the working buffer * (n) = word count of the working buffer writew subr sb1 1 sa3 a1+b1 fwa of working buffer sa4 a3+b1 address of word count sa4 x4 word count writew x1,x3,x4 eq writew end ident mtr entry mtr sst b1=1 mtr title mtr - issue monitor calls from ftn. comment issue monitor calls from ftn. mtr space 4,10 ***** mtr - issue monitor calls from ftn. * * b. l. trumbo. 78-aug-31 * * mtr allows monitor calls to be issued from an ftn program, * either as a 60-bit request, or in the same format as * the *system* macro. mtr space 4,10 *** mtr - issue monitor calls from ftn. * * call mtr (ppcall) * call mtr (ppname,recall) * call mtr (ppname,recall,arg) * call mtr (ppname,recall,arg1,arg2) * * entry *ppcall* is a 60-bit (integer) quantity, and is * issued as a monitor call without modification. * *ppname* is the name of the pp routine to be called, * left justified. only the upper 18 bits are used. * *recall* is either zero or non-zero. if it is zero, * no recall bit is inserted. * *arg* is an argument to be passed to the pp routine * called. the lower 36 bits are passed as the lower * 36 bits of the ra+1 call. * *arg1* is an argument to be passed to the pp routine * called. the lower 18 bits are passed as the lower * 18 bits of the ra+1 call. * *arg2* is an argument to be passed to the pp routine * called. the lower 18 bits are passed as bits 18 * thru 35 of the ra+1 call. * * exit all input arguments preserved, monitor call issued. * if recall bit was set in call, ra+1 will be clear. * * uses a1,a2,a3,a4, a6 * b1 * x1,x2,x3,x4, x6,x7 * * calls sys=. mtr space 4,10 mtr2 bx4 -x6*x4 strip *arg* to 36 bits, assuming no *arg2* lx3 40d position recall bit bx2 x2+x4 combine pp name and arg(s) bx2 x2+x3 or in recall bit mtr1 bx6 x2 system issue the monitor call in x6 mtr subr = entry/exit sb1 1 11th commandment sa2 x1 pick up pp name sa1 a1+b1 pick up address of *recall* arg zr x1,mtr1 if only one arg, issue it as is mx7 18 sa3 x1 pick up *recall* arg mx4 0 assume zero *arg* cx3 x3 convert *recall* to a bit sa1 a1+b1 pick up address of *arg* cx3 x3 bx2 x7*x2 strip pp name down to 3 chars cx3 x3 mx6 -36d mask for use at mtr2 cx3 x3 now have only one recall bit zr x1,mtr2 if no *arg* supplied, use zero sa4 x1 if *arg* supplied, use it sa1 a1+b1 pick up address of *arg2* zr x1,mtr2 if no *arg2* sa1 x1 mx7 -18d bx4 -x7*x4 strip *arg1* down to 18 bits bx1 -x7*x1 strip *arg2* down to 18 bits lx1 18d bx4 x4+x1 x4 contains composite arg eq mtr2 end ident endrun entry endrun sst b1=1 list f title endrun - end central program. comment endrun. endrun space 4,10 *** endrun - end central program. * * call endrun * * entry none * * exit does not exit endrun subr sb1 1 endrun end ident recall entry recall sst b1=1 list f title recall - place program in recall status. comment place program in recall status. recall space 4,10 *** recall - place program in recall status. * * call recall (status) * * entry (status) = 0, one system periodic recall is issued * = other, program is recalled when bit 0 is set * * exit none if (status) =0 * else bit 0 of status is set recall subr sb1 1 sa2 x1 status word zr,x2 rec1 if single recall recall x1 else, auto-recall eq recall rec1 recall eq recall end ident rtime entry rtime sst b1=1 list f title rtime - obtain real time clock reading. comment obtain real time clock reading. rtime space 4,10 *** rtime - obtain real time clock reading. * * call rtime (status) * * entry none * * exit (status) = response * kronos response - **t 24/ seconds,36/ milliseconds * * scope response - **t 24/ junk,24/ seconds,12/ qm * * time is system software clock time since deadstart * qm = 1/4096 of a second rtime subr sb1 1 bx5 x1 rtime x1 sa1 x5 bx6 x1 return response as function result eq rtime end ident movech entry movech sst syscom b1 movech title movech - mvc> interface for ftn. comment (ftn) move character strings. movech space 4,10 ***** movech - mvc> interface for ftn. * * r. o. anderson. 02/17/76. * * ftn interface to the character move subroutine. movech space 4,10 *** movech - move character strings. * * movech source,offsets,destination,offsetd,nchars * * moves *nchars* from *source* to *destination*. * * entry *source* = the address of the first word of the * source string. * *offsets* = the character offset (0 - 131071) into * *source*. * *destination* = the address of the first word of * the destination area. * *offsetd* = the character offset (0 - 131071) into * *destination*. * *nchars* = the number of characters to move. * (b1) = 1. * * exit the string has been moved. * * uses x - 1, 2, 3, 4, 5, 6, 7. * b - 2, 3, 4, 5. * a - 1, 2, 3, 4, 5, 6, 7. * * calls mvc>. purgmac movech movech macro source,offsets,dest,offsetd,nchars r= a1,source r= b2,offsets r= a2,dest r= b3,offsetd r= b4,nchars rj =xmvc> endm movech space 4,10 *** movech provides an ftn callable interface to the university * or arizona character string move subroutine. * * call movech(src,bcps,dest,bcpd,nchr) * * entry *src* is the variable or array containing the first * character of the source string. * *bcps* is the beginning character position for the * string starting in *src* (0 - 131071). * *dest* is the variable or array containing the first * character of the destination string. * *bcpd* is the beginning character position for the * string starting in *dest* (0 - 131071). * *nchr* is the number of characters to move. * * exit movech will return after moveing *src* to *dest*. * * calls mvc>. movech subr entry/exit sb1 1 and b1 shall be 1 bx2 x1 mx0 -6 also used below ax2 24 bx2 -x0*x2 sb2 x2 get character variable offset or zero sa2 a1+b1 sa1 x1 (a1) = address of source string sa3 a2+b1 sa2 x2 sb2 b2+x2 (b2) = bcp of source string sa2 x3 (a2) = address of destination string ax3 24 bx3 -x0*x3 sb3 x3 get character variable offset or zero sa3 a3+b1 sa4 x3 sb3 b3+x4 (b3) = bcp of destination string sa3 a3+b1 sa4 x3 sb4 x4 (b4) = number of characters to move movech a1,b2,a2,b3,b4 move the strings eq movech return end ident xcon entry xcon sst syscom b1 xcon title xcon - connect/disconnect terminal files. xcon space 4,10 ** xcon - connect a file to a terminal. * * call xcon(fet,code) * * entry (fet) = fet address * (code) = <0, disconnect (return) file * 0, dpc connect * 1, 128 character ascii connect * 2, 256 character ascii connect * * exit file connected to the terminal * xcon subr = sb1 1 sx2 x1 (x2) = fet address sa1 a1+b1 sa1 x1 bx3 x1 (x3) = function code ng x3,xcon2 if only disconnect status x2 check if local mx0 11 lx0 1 sa4 x2 get fet+0 bx4 -x0*x4 zr x4,xcon3 if not local xcon1 open x2,nr,r check device type sa4 x2 clear all but fn+complete mx0 43 lx0 1 bx6 x0*x4 sa6 x2 sa4 x2+b1 check for ct device ax4 48 sx4 x4-2rtt nos * sx4 x4-2rct-774000b nos/be zr x4,=xxcon if already ct device, return xcon2 evict x2,r return local copy ng x3,=xxcon if only disconnect, return xcon3 sa1 x2 set filename for assign mx0 48 bx6 x0*x1 sa6 xconb sx3 b1 set complete bx6 x6+x3 sa6 x2 sx4 x2 save fet address * system pcc,ar,xcona create the ct file sx2 x4 xcon4 sa1 x2 get fet+0 mx0 43 keep fn+complete lx0 1 bx1 x0*x1 mx7 1 ascii bit mask lx7 43 nz x3,xcon5 if not dpc char set bx6 x1 store fet+0 sa6 x2 sa1 x2+b1 clear ascii bit bx6 -x7*x1 sa6 a1 eq =xxcon xcon5 sa4 x2+b1 set ascii bit in fet+1 bx6 x4+x7 sb3 x3 sb3 b3-b1 nz b3,xcon6 if 256 char ascii sa6 a4 bx6 x1 set fet+0 sa6 x2 eq =xxcon xcon6 sb3 b3-b1 nz b3,=xxcon if invalid mode sa6 a4 bx6 x1+x3 set odd bit for 256 char ascii sa6 x2 set fet+0 eq =xxcon xcona data h*.assign,ct,* xconb data 0 end ident xscs entry xscs sst b1=1 xscs title xscs - scs interface for ftn. comment (ftn) sense character set. xscs space 4,10 ***** xscs - scs interface for ftn. * * s. h. jay 83/02/04. * * ftn interface to the sense character set routine. xscs space 4,10 *** xscs provides an ftn callable link to the university * of arizona sense character set subroutine. * * n = xscs(fet) * * entry *fet* is array containing an fet. a read should * be done on this fet before calling xscs. * * exit *n* = 1 for display code, * 0 if buffer empty, * -1 if ascii. * * calls scs> xscs subr entry/exit sb1 1 sx2 x1 (x2) = fet address rj =xscs> eq xscs return end ident xsxt entry xsxt syscom b1 xsxt title xsxt - sxt> interface for ftn. comment (ftn) convert sixbit to twelvebit. xsxt space 4,10 ***** xsxt - sxt> interface for ftn. * * r. o. anderson. 02/17/76. * * l. n. shipp. 80/05/09. fix mcs parameter typo. * * ftn interface to the sixbit to twelvebit character conversion * routine. mcs space 4,10 *** mcs - map character sets into other character sets. * * mcs in=,inlen=,inbs=,out=,outbs=,table= * * converts the characters in *in* via *table* placing them * in *out*. * * entry *in=* the address of the first word of the input * character string. * *inlen=* the length of the input string in words. * *inbs=* the byte size (6 or 12) of the input chars. * *out=* the address of the first word of the output * character string buffer. if *outbs* is .le. * *inbs*, *out* and *in* may point to the same * area. * *outbs=* the byte size (6 or 12) of the output chars. * *table=* the address of the character set mapping * table. this table has 1 entry per word, * right justified with binary zero fill. * (b1) = 1. * * exit the characters have been mapped. * * uses x - 1, 2, 6, 7. * b - 2, 3, 4, 5. * a - 1, 2, 6. * * calls sxs>, sxt>, txs>, or txt>. purgmac mcs mcs macroe in,inlen,out,inbs,outbs,table r= b2,in r= b3,inlen r= b4,out r= b5,table ifeq inbs,6,2 ^%s"mcs1 micro 1,, s skip 4 ifeq inbs,12d,2 ^%s"mcs1 micro 1,, t skip 1 err input byte size must be 6 or 12. ifeq outbs,6,2 ^%s"mcs2 micro 1,, s skip 4 ifeq outbs,12d,2 ^%s"mcs2 micro 1,, t skip 1 err output byte size must be 6 or 12. rj =x'^%s"mcs1'x'^%s"mcs2'> endm xsxt space 4,10 *** xsxt provides an ftn callable link to the university of * arizona sixbit to twelvebit character conversion routine. * * call xsxt(in,len,out,tbl) * * entry *in* is a variable or array containing the * characters to be converted (10 per word). * *len* is the word length of the array *in*. * *out* is the variable or array to receive the * converted characters (5 per word). * *tbl* is an array containing the conversion table. * this table contains 1 character per word, * right justified, with binary zero fill. * * exit xsxt will return after doing the conversion. * * calls sxt>. xsxt subr entry/exit sb1 1 and b1 shall be 1 sb2 x1 (b2) = input area address sa1 a1+b1 sa2 x1 sb3 x2 (b3) = word length of input sa1 a1+b1 sb4 x1 (b4) = output area address sa1 a1+b1 sb5 x1 (b5) = conversion table address mcs in=b2,inlen=b3,out=b4,table=b5,inbs=6,outbs=12 eq xsxt return end ident xtxs entry xtxs syscom b1 xtxs title xtxs - txs> interface for ftn. comment (ftn) convert twelvebit to sixbit. xtxs space 4,10 ***** xtxs - txs> interface for ftn. * * r. o. anderson. 02/17/76. * * l. n. shipp. 80/05/09. fix mcs parameter typo. * * ftn interface to the twelvebit to sixbit character conversion * routine. mcs space 4,10 *** mcs - map character sets into other character sets. * * mcs in=,inlen=,inbs=,out=,outbs=,table= * * converts the characters in *in* via *table* placing them * in *out*. * * entry *in=* the address of the first word of the input * character string. * *inlen=* the length of the input string in words. * *inbs=* the byte size (6 or 12) of the input chars. * *out=* the address of the first word of the output * character string buffer. if *outbs* is .le. * *inbs*, *out* and *in* may point to the same * area. * *outbs=* the byte size (6 or 12) of the output chars. * *table=* the address of the character set mapping * table. this table has 1 entry per word, * right justified with binary zero fill. * (b1) = 1. * * exit the characters have been mapped. * * uses x - 1, 2, 6, 7. * b - 2, 3, 4, 5. * a - 1, 2, 6. * * calls sxs>, sxt>, txs>, or txt>. purgmac mcs mcs macroe in,inlen,out,inbs,outbs,table r= b2,in r= b3,inlen r= b4,out r= b5,table ifeq inbs,6,2 ^%s"mcs1 micro 1,, s skip 4 ifeq inbs,12d,2 ^%s"mcs1 micro 1,, t skip 1 err input byte size must be 6 or 12. ifeq outbs,6,2 ^%s"mcs2 micro 1,, s skip 4 ifeq outbs,12d,2 ^%s"mcs2 micro 1,, t skip 1 err output byte size must be 6 or 12. rj =x'^%s"mcs1'x'^%s"mcs2'> endm xtxs space 4,10 *** xtxs provides an ftn callable link to the university of * arizona twelvebit to sixbit character conversion routine. * * call xtxs(in,len,out,tbl) * * entry *in* is a variable or array containing the * characters to be converted (5 per word). * *len* is the word length of the array *in*. * *out* is the variable or array to receive the * converted characters (10 per word). * *tbl* is an array containing the conversion table. * this table contains 1 character per word, * right justified, with binary zero fill. * * exit xtxs will return after doing the conversion. * * calls txs>. xtxs subr entry/exit sb1 1 and b1 shall be 1 sb2 x1 (b2) = input area address sa1 a1+b1 sa2 x1 sb3 x2 (b3) = word length of input sa1 a1+b1 sb4 x1 (b4) = output area address sa1 a1+b1 sb5 x1 (b5) = conversion table address mcs in=b2,inlen=b3,out=b4,table=b5,inbs=12,outbs=6 eq xtxs return end ident xvfn entry xvfn sst syscom b1 title xvfn - validate file name. comment (ftn) validate file name. xvfn space 4,10 *** xvfn - validate file name. * * ans = xvfn (lfn) * * entry *lfn* = logical file name. trailing spaces will be * deleted before name is validated. * * exit *ans* = 0 if file name is valid. xvfn subr entry/exit sb1 1 sb6 xvfna sb7 b1 rj =xmfs> word align the lfn sa1 xvfna rj =xbtz> convert blanks to 00b bx1 x6 rj =xvfn> check out the name bx6 x1 set function value eq xvfnx return xvfna bss 1 end ident retfile sst entry retfile,unlfile syscom b1 retfile title retfile - return/unload a file. comment return/unload a file. space 4,10 *** retfile - return/unload a file. * * call retfile(lfn) * call unlfile(lfn) * * entry lfn = a hollerith string or a character string * containing the name of the file to be returned * (retfile) or unloaded (unlfile). spaces are * removed from lfn before processing. * * exit file is gone. retfile space 4,10 ** retfile - close/return a file. retfile subr entry/exit sb1 1 b1=1 rj sff set file name in fet close retfilea,unload,rcl eq retfilex return unlfile space 4,10 ** unlfile - close/unload a file. unlfile subr entry/exit sb1 1 b1=1 rj sff set file name in fet close retfilea,unload,rcl eq unlfilex return sff space 4,10 ** sff - set file name in fet. * * entry (x1) = ftn parameter pointer for lfn. * * exit (retfilea) contains lfn + complete bit. * * uses x - 1, 2, 6, 7. * b - 2, 3, 4, 5, 6, 7. * a - 2, 6. * * calls btz>, macwal=. sff subr entry/exit rj =xmacwal= get the file name bx1 x2 rj =xbtz> delete any spaces sa1 retfilea sx1 b1 bx6 x6+x1 add complete bit sa6 retfilea stash in fet eq sffx return retfilea vfd 42/**,18/1 con 100b first con 100b in con 100b out con 101b limit end