1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-14 03:44:08 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/galtol/qsrcv2.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

320 lines
12 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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