Trailing-Edge
-
PDP-10 Archives
-
tops10_tools_bb-fp64b-sb
-
10,7/galtol/qsrcv2.mac
There are 5 other files named qsrcv2.mac in the archive. Click here to see a list.
TITLE QSRCV2 - Convert master queues
SUBTTL Universals
IF1,<PRINTX [Requires version 2 QSRMAC.UNV file called QSRMV2.UNV] >
; These are here since otherwise it will use the ones from GLXMAC
.FDSTR==0
.FDNAM==1
.FDEXT==2
.FDPPN==3
.FDPAT==4
FDXSIZ==11
SEARCH GLXMAC
SEARCH QSRMV2 ; Get version 2 QSRMAC
PROLOG QSRCV2 ; Generate GLXLIB info
%%.QV2==:%%.QSR ; Define version 2 QSRMAC version
EXTERN EQBUFF ; Make the buffer accessible
SUBTTL REDQV2 - Read a version 2 EQ block
; This routine will read a version 2 EQ block into the low segment
;data storage.
REDQV2::MOVE S1,EQBUFF+.EQITN ; Get the internal task name
MOVEM S1,EQITN## ; Save it
MOVE S1,EQBUFF+.EQRDV ; Get the request device
MOVEM S1,EQRDV## ; Save it
MOVE S1,EQBUFF+.EQJOB ; Get the job name
MOVEM S1,EQJOB## ; Save it
LOAD S1,.EQSEQ+EQBUFF,EQ.SEQ ; Get the sequence
MOVEM S1,EQSEQ## ; Save it
LOAD S1,.EQSEQ+EQBUFF,EQ.DSN ; Get the station number
MOVEM S1,EQDSN## ; Save it
LOAD S1,.EQSEQ+EQBUFF,EQ.PRV ; Get the 'creator priv'ed' bit
MOVEM S1,EQPRV## ; Save it
LOAD S1,.EQSEQ+EQBUFF,EQ.SPL ; Get the spooled bit
MOVEM S1,EQSPL## ; Save it
LOAD S1,.EQSEQ+EQBUFF,EQ.PRI ; Get the priority
MOVEM S1,EQPRI## ; Store it
LOAD S1,.EQSPC+EQBUFF,EQ.PRO ; Get the request protection
MOVEM S1,EQPRO## ; Save it
LOAD S1,.EQSPC+EQBUFF,EQ.NUM ; Get the number of files
MOVEM S1,EQNUM## ; Store it
LOAD S1,.EQAFT+EQBUFF ; Get the after time
MOVEM S1,EQAFT## ; Store it
LOAD S1,.EQLM1+EQBUFF,EQ.DEP ; Get the dependency count
MOVEM S1,EQDEP## ; Store it
LOAD S1,.EQLM1+EQBUFF,EQ.UNI ; Get the unit number
MOVEM S1,EQUNI## ; Save it
LOAD S1,.EQLM1+EQBUFF,EQ.NRS ; Get the non-restart
MOVEM S1,EQNRS## ; Save it
LOAD S1,.EQLM1+EQBUFF,EQ.OUT ; Get the output type
MOVEM S1,EQOUT## ; Store it
LOAD S1,.EQLM1+EQBUFF ; Get the forms type (maybe)
MOVEM S1,EQFRM## ; Store it
LOAD S1,.EQLM2+EQBUFF,EQ.NBL ; Get the number of blocks
MOVEM S1,EQNBL## ; STore it
LOAD S1,.EQLM2+EQBUFF,EQ.PGS ; Get the page limit
MOVEM S1,EQPGS## ; Store it
LOAD S1,.EQLM2+EQBUFF,EQ.COR ; Get the core limit
MOVEM S1,EQCOR## ; Store it
LOAD S1,.EQLM2+EQBUFF,EQ.TIM ; Get the time limit
MOVEM S1,EQTIM## ; Save it
LOAD S1,.EQLM3+EQBUFF,EQ.LPT ; Get the printer limit (input)
MOVEM S1,EQLPT## ; Store it
LOAD S1,.EQLM3+EQBUFF,EQ.CDP ; Get the card punch limit (input)
MOVEM S1,EQCDP## ; store it
LOAD S1,.EQLM4+EQBUFF,EQ.PTP ; Get the paper tape limit (input)
MOVEM S1,EQPTP## ; Stuff
LOAD S1,.EQLM4+EQBUFF,EQ.PLT ; Get the plotter limit
MOVEM S1,EQPLT## ; Store it
DMOVE S1,.EQLM3+EQBUFF ; Get the /NOTE value
DMOVEM S1,EQNOT## ; Save it
MOVE S1,[XWD .EQACT+EQBUFF,EQACT##] ; Get the BLT pointer
BLT S1,.EQACT+EQBUFF+7 ; Move the account string
DMOVE S1,.EQUSR+EQBUFF ; Get the user name
DMOVEM S1,EQUSR## ; Save it
MOVE S1,.EQOWN+EQBUFF ; Get the owner's PPN
MOVEM S1,EQOWN## ; Stuff it
LOAD S1,.EQLEN+EQBUFF,EQ.LOH ; Get the length of the header
;;; CAXGE S1,.EQFLG ; Flag word there?
;;; JRST REQ.1 ; No, all done
;;; LOAD S2,.EQFLG+EQBUFF,EQ.SCN ; Get the scan flag
;;; MOVEM S2,EQSCN## ; Store it
CAXGE S1,.EQPAT+1 ; Path there?
JRST REQ.1 ; No, all done
MOVE S2,[XWD .EQPAT+EQBUFF,EQPAT##] ; Get the pointer
BLT S2,EQPAT##+.EQPSZ-.EQPAT ; Move the path
REQ.1: ADDI S1,EQBUFF ; Plus the base address
HRL S1,EQNUM## ; Get the number of files
POPJ P, ; And return
SUBTTL WRTQV2 - Write a version 2 EQ block
; This routine will write a version 2 EQ block.
WRTQV2::$SAVE <P1,P2> ; Save P1
MOVE S1,CURPAG## ; Get the page address
$CALL .ZPAGA ; And clear it
MOVE P1,CURPAG## ; Get the address
MOVX S1,<<XWD %%.QSR,.EQPSZ>> ; Get the size of the block and the version
MOVEM S1,.EQLEN(P1) ; Store it
MOVE S1,EQRDV## ; Get the device
MOVEM S1,.EQRDV(P1) ; Save it
SETZ P2, ; Assume output request
HLRZ S1,S1 ; Get the device name
CAXE S1,'INP' ; Is this an input queue?
CAXN S1,'FFS' ; . . .
SETO P2, ; Yes, flag it
LOAD S1,EQITN## ; Get the internal task name
STORE S1,.EQITN(P1) ; Save it
LOAD S1,EQJOB## ; Get the job name
STORE S1,.EQJOB(P1) ; Save it
LOAD S1,EQSEQ## ; Get the sequence
STORE S1,.EQSEQ(P1),EQ.SEQ ; Save it
LOAD S1,EQDSN## ; Get the station number
STORE S1,.EQSEQ(P1),EQ.DSN ; Save it
LOAD S1,EQPRV## ; Get the 'creator priv'ed' bit
STORE S1,.EQSEQ(P1),EQ.PRV ; Save it
LOAD S1,EQSPL## ; Get the spooled bit
STORE S1,.EQSEQ(P1),EQ.SPL ; Save it
LOAD S1,EQPRI## ; Get the priority
STORE S1,.EQSEQ(P1),EQ.PRI ; Store it
LOAD S1,EQPRO## ; Get the request protection
STORE S1,.EQSPC(P1),EQ.PRO ; Save it
LOAD S1,EQNUM## ; Get the number of files
STORE S1,.EQSPC(P1),EQ.NUM ; Store it
LOAD S1,EQAFT## ; Get the after time
STORE S1,.EQAFT(P1) ; Store it
JUMPE P2,WRTQ.2 ; Is this an input request?
LOAD S1,EQDEP## ; Get the dependency count
STORE S1,.EQLM1(P1),EQ.DEP ; Store it
LOAD S1,EQUNI## ; Get the unit number
STORE S1,.EQLM1(P1),EQ.UNI ; Save it
LOAD S1,EQNRS## ; Get the non-restart
STORE S1,.EQLM1(P1),EQ.NRS ; Save it
LOAD S1,EQOUT## ; Get the output type
STORE S1,.EQLM1(P1),EQ.OUT ; Store it
LOAD S1,EQCOR## ; Get the core limit
STORE S1,.EQLM2(P1),EQ.COR ; Store it
LOAD S1,EQTIM## ; Get the time limit
STORE S1,.EQLM2(P1),EQ.TIM ; Save it
LOAD S1,EQLPT## ; Get the printer limit (input)
STORE S1,.EQLM3(P1),EQ.LPT ; Store it
LOAD S1,EQCDP## ; Get the card punch limit (input)
STORE S1,.EQLM3(P1),EQ.CDP ; store it
LOAD S1,EQPTP## ; Get the paper tape limit (input)
STORE S1,.EQLM4(P1),EQ.PTP ; Stuff
LOAD S1,EQPLT## ; Get the plotter limit
STORE S1,.EQLM4(P1),EQ.PLT ; Store it
JRST WRTQ.3 ; Skip output items
WRTQ.2: LOAD S1,EQNBL## ; Get the number of blocks
STORE S1,.EQLM2(P1),EQ.NBL ; STore it
LOAD S1,EQPGS## ; Get the page limit
STORE S1,.EQLM2(P1),EQ.PGS ; Store it
LOAD S1,EQFRM## ; Get the forms type (maybe)
STORE S1,.EQLM1(P1) ; Store it
DMOVE S1,EQNOT## ; Get the /NOTE value
DMOVEM S1,.EQLM3(P1) ; Save it
WRTQ.3: MOVEI S1,.EQACT(P1) ; Get the address to move to
HRLI S1,EQACT## ; And from
BLT S1,.EQACT+7(P1) ; Move the account string
DMOVE S1,EQUSR## ; Get the user name
DMOVEM S1,.EQUSR(P1) ; Save it
LOAD S1,EQOWN## ; Get the owner's PPN
STORE S1,.EQOWN(P1) ; Stuff it
;;; LOAD S2,EQSCN## ; Get the /SCAN flag
;;; STORE S2,.EQFLG(P1),EQ.SCN ; Store it
MOVEI S2,.EQPAT(P1) ; Point to the path
HRLI S2,EQPAT## ; And set up the from address
BLT S2,.EQPSZ-1(P1) ; Move the path
MOVEI S1,.EQPSZ(P1) ; Get the end of the header
HRL S1,EQNUM## ; Get the number of files
$RETT ; All done
SUBTTL RFDQV2 - Read a version 2 FP/FD combination
; This routine will read an FP/FD combination into the low segment
RFDQV2::$SAVE <P1,P2> ; Save P1
TXNN S1,LHMASK ; Any FP/FD's left
PJRST [SETZ S1, ; Clear S1
$RETT] ; And return
MOVE P1,S1 ; Copy the pointer to the FD/FP
LOAD S1,.FPINF(P1),FP.FFF ; Get the file format
STORE S1,FPFFF## ; Save it
LOAD S1,.FPINF(P1),FP.FPF ; Get the paper format
STORE S1,FPFPF## ; Save in interface loc
LOAD S1,.FPINF(P1),FP.FSP ; Get the spacing
STORE S1,FPFSP## ; Save it
LOAD S1,.FPINF(P1),FP.DEL ; Get the delete flag
STORE S1,FPDEL## ; Save it
LOAD S1,.FPINF(P1),FP.FLG ; Get the log file flag
STORE S1,FPFLG## ; Save it
LOAD S1,.FPINF(P1),FP.NFH ; Get the no-file header bit
STORE S1,FPNFH## ; Save it
LOAD S1,.FPINF(P1),FP.SPL ; Get the spool bit
STORE S1,FPSPL## ; Save(it
LOAD S1,.FPINF(P1),FP.IGN ; Get the ignore flag
STORE S1,FPIGN## ; Save it
LOAD S1,.FPINF(P1),FP.FCY ; Get the copy count
STORE S1,FPFCY## ; Store it
LOAD S1,.FPFST(P1) ; Get the starting loc
STORE S1,FPFST## ; Save it
LOAD S1,.FPFR1(P1) ; Get the first report word
STORE S1,FPFR1## ; Save it
LOAD S1,.FPFR2(P1) ; Get the second word
STORE S1,FPFR2## ; Save it
LOAD P2,.FPSIZ(P1),FP.FFS ; Get the FD size
LOAD S1,.FPSIZ(P1),FP.FHD ; Get the FP size
ADDI P1,(S1) ; Bump the pointer
LOAD S1,.FDSTR(P1) ; Get the structure name
STORE S1,FDSTR## ; Save it
LOAD S1,.FDNAM(P1) ; Get the name
STORE S1,FDNAM## ; Save it
LOAD S1,.FDEXT(P1) ; Get the extension
STORE S1,FDEXT## ; Save it
LOAD S1,.FDPPN(P1) ; Get the PPN
STORE S1,FDPPN## ; Save it
MOVX S2,.FDPAT ; Get the offset to first word of path
SUBI S2,(P2) ; Get the number of words of path (negative)
MOVSI S2,(S2) ; Put in left half
JUMPGE S2,RDFD.1 ; Any at all?
RDFD.2: MOVEI S1,.FDPAT(P1) ; Yes, get the address
ADDI S1,(S2) ; . . .
MOVE S1,(S1) ; Get the word
MOVEM S1,FDPAT(S2) ; Save it
AOBJN S2,RDFD.2 ; Loop
RDFD.1: SUB P1,[XWD 1,0] ; Count the FD
ADDI P1,(P2) ; Point to next FP (if any)
MOVE S1,P1 ; Get the updated pointer
$RETT ; And return
SUBTTL WFDQV2 - Write a version 2 FP/FD combination
; This routine will write a version 2 FD into the current part of
;an EQ block
WFDQV2::$SAVE <P1> ; Save an ac
MOVE P1,S1 ; Get the pointer
MOVX S1,<<XWD FPXSIZ,FDXSIZ>> ; Get the sizes
STORE S1,.FPSIZ(P1) ; Store it
LOAD S1,FPFFF## ; Get the file format
STORE S1,.FPINF(P1),FP.FFF ; Save it
LOAD S1,FPFPF## ; Get the paper format
STORE S1,.FPINF(P1),FP.FPF ; Save in interface loc
LOAD S1,FPFSP## ; Get the spacing
STORE S1,.FPINF(P1),FP.FSP ; Save it
LOAD S1,FPDEL## ; Get the delete flag
STORE S1,.FPINF(P1),FP.DEL ; Save it
LOAD S1,FPFLG## ; Get the log file flag
STORE S1,.FPINF(P1),FP.FLG ; Save it
LOAD S1,FPNFH## ; Get the no-file header bit
STORE S1,.FPINF(P1),FP.NFH ; Save it
LOAD S1,FPSPL## ; Get the spool bit
STORE S1,.FPINF(P1),FP.SPL ; Save(it
LOAD S1,FPIGN## ; Get the ignore flag
STORE S1,.FPINF(P1),FP.IGN ; Save it
LOAD S1,FPFCY## ; Get the copy count
STORE S1,.FPINF(P1),FP.FCY ; Store it
LOAD S1,FPFST## ; Get the starting loc
STORE S1,.FPFST(P1) ; Save it
LOAD S1,FPFR1## ; Get the first report word
STORE S1,.FPFR1(P1) ; Save it
LOAD S1,FPFR2## ; Get the second word
STORE S1,.FPFR2(P1) ; Save it
LOAD P2,.FPSIZ(P1),FP.FHD ; Get the FD size
ADDX P1,FPXSIZ ; Move down to the FD
LOAD S1,FDSTR## ; Get the structure name
STORE S1,.FDSTR(P1) ; Save it
LOAD S1,FDNAM## ; Get the name
STORE S1,.FDNAM(P1) ; Save it
LOAD S1,FDEXT## ; Get the extension
STORE S1,.FDEXT(P1) ; Save it
LOAD S1,FDPPN## ; Get the PPN
STORE S1,.FDPPN(P1) ; Save it
HRRI S1,.FDPAT(P1) ; Get the address of the path
HRLI S1,FDPAT## ; And where to put it
BLT S1,FDXSIZ-1(P1) ; And move the path
SUB P1,[XWD 1,0] ; Count down the file
ADDX P1,FDXSIZ ; Advance the pointer
MOVE S1,P1 ; Get the updated pointer
$RETT ; And return
SUBTTL ENDQV2 - End a version 2 EQ block
ENDQV2::$SAVE <P1> ; Save P1
MOVE P1,CURPAG## ; Get the address of the message
SUBI S1,(P1) ; Get the length of the packet
STORE S1,.MSTYP(P1),MS.CNT ; Store it
ZERO .MSTYP(P1),MS.ACK ; Clear the ACK bit
MOVX S1,.QOCRE ; Get the function code
STORE S1,.MSTYP(P1),MS.TYP ; Store it
STORE P1,SAB.MS+QSRSAB## ; Stor the address
MOVX S1,PAGSIZ ; Get the size of the message
STORE S1,SAB.LN+QSRSAB## ; And store it for the send
MOVX S1,SAB.SZ ; Get the size of the SAB
MOVEI S2,QSRSAB## ; And the address
$CALL C%SEND ; Send the message
SETZM CURPAG## ; No page left now
$RETIT ; All done if it worked
$FATAL (<Cannot send message to [SYSTEM]QUASAR - ^E/S1/>)
SUBTTL End of QSRCV2
END ; End of program