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

239 lines
8.3 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 OBJECT Type out Enter Passive connect strings.
SUBTTL Tarl Neustaedter
SEARCH DCN,MACSYM,D36PAR,SCPAR
$ONLY==I.LUO!I.GTT
$INIT OBJ
OPDEF ADR2PG [LSH -11]
XP PAGNUM,100 ;MAX NUMBER OF PAGES TO MAP
XP PAGLOC,400 ;WHERE WE START MAPPING THEM
$BLOCK PAGTAB,PAGNUM ;TABLE DEFINING WHAT PAGES ARE MAPPED WHERE
;FORMAT: LH, NUMBER OF USERS OF PAGE,
; RH, MONITOR PAGE NUMBER
START: $SETUP ;INITIALIZE
;First, map in all of DECnet. We know that we will be using it, and
;we might as well have it mapped contiguosly.
GTTAB. T2,[%DNPTR] ;GET POINTER TO BIT TABLE
TLZ T2,400000 ;%%%%
PEEK T2, ;GET THE ACTUAL POINTER
HLRO T2,T2 ;GET NEGATIVE NUMBER OF WORDS IN TABLE
IMUL T2,[-^D36*4] ;CONVERT TO NUMBER OF WORDS ALLOCATED
GTTAB. T1,[%DNLOC] ;GET POINTER TO DECNET FREECORE
TLZ T1,400000 ;%%%%
PEEK T1, ;GET THE ACTUAL POINTER
CALL MAPMON ;MAP IT IN
GTTAB. P1,[%DNNDT] ;GET POINTER TO SCTNDT
TLZ P1,400000 ;%%%%
ADDI P1,16 ;** CROCK - GET POINTER TO SCTASQ
PEEK P1, ;NOW HAVE POINTER TO FIRST SLB.
NXTSLB: MOVE T1,P1 ;GET MONITOR'S POINTER TO SLB
MOVEI T2,SL.CBP ;GET ME ENOUGH SLB TO FIND SLCBP
CALL MAPMON ;MAP IT IN
MOVE P1,T1 ;SAVE POINTER TO SLB
LOAD T1,SLCBP,(P1) ;GET CONNECT BLOCK POINTER
JUMPE T1,TYPSL9 ;IF NONE, TRY FOR NEXT
MOVEI T2,CB.LEN ;GET ME THE FULL CONNECT BLOCK
CALL MAPMON ;MAP IN THE CONNECT BLOCK
MOVE P2,T1 ;SAVE POINTER TO THE CONNECT BLOCK
LOAD T1,SLSJB,(P1) ;GET POINTER TO SJB
MOVEI T2,SJ.JOB ;GET AS FAR AS THE JOB NUMBER
CALL MAPMON ;MAP HIM IN TOO.
MOVE P3,T1 ;SAVE THE POINTER TO THE SJB
LOAD T1,SJJOB,(P3) ;GET THE JOB NUMBER
TSTRG. [ASCIZ \Job \] ;HEADER
TDECW. T1, ;TYPE OUT THE JOB NUMBER
JUMPE T1,[MOVE T1,[SIXBIT 'NRTSER']
JRST NXTSL1]
MOVS T1,T1 ;JOB IN LEFT HALF
HRRI T1,.GTPRG ;FUNCTION IN RIGHT HALF
GTTAB. T1,T1 ;FIND OUT THE PROGRAM NAME
NXTSL1: TCHRI. "(" ;OPEN PARENS
TSIXN. T1, ;TYPE OUT PROGRAM NAME
TCHRI. ")" ;CLOSE PARENS
TCHRI. .CHTAB ;TAB OVER A LITTLE
LOAD T1,CBNAM,(P2) ;GET NODE NAME THIS WANTS
SKIPN T1 ;DO WE HAVE A VALUE?
MOVSI T1,'* ' ;NOPE, WILDCARD
TSIXN. T1, ;TYPE IT OUT IN SIXBIT
TSTRG. [ASCIZ \::\] ;TYPE OUT NODE SEPERATOR
MOVEI T1,CB.DST(P2) ;POINTER TO DESTINATION PDB
CALL TYPPDB ;TYPE IT OUT
TCHRI. "=" ;SEPERATE FROM SOURCE
MOVEI T1,CB.SRC(P2) ;POINTER TO SOURCE PDB
CALL TYPPDB ;TYPE IT OUT
LOAD T2,CBUCT,(P2) ;GET USER ID BYTECOUNT
JUMPE T2,TYPSL2 ;NONE, TRY PASSWORD
TSTRG. [ASCIZ \/USER:\] ;NOISE
MOVEI T1,CB.UID(P2) ;WHERE THE STRING IS
CALL TYP8 ;TYPE IT OUT FROM 8BIT ASCII
TYPSL2: LOAD T2,CBPCT,(P2) ;GET PASSWORD BYTE COUNT
JUMPE T2,TYPSL3 ;IF NONE, TRY ACCOUNT
TSTRG. [ASCIZ \/PASSWORD:\]
MOVEI T1,CB.PSW(P2) ;POINTER TO PASSWORD STRING
CALL TYP8
TYPSL3: LOAD T2,CBACT,(P2) ;GET ACCOUNT BYTE COUNT
JUMPE T2,TYPSL4 ;IF NONE, TRY USER DATA
TSTRG. [ASCIZ \/ACCOUNT:\]
MOVEI T1,CB.ACC(P2) ;POINTER TO ACCOUNT STRING
CALL TYP8
TYPSL4: LOAD T2,CBCCT,(P2) ;GET USER DATA BYTE COUNT
JUMPE T2,TYPSL5 ;TRY MORE
TSTRG. [ASCIZ \/DATA:\]
MOVEI T1,CB.UDA(P2) ;POINTER TO USER DATA
CALL TYP8
TYPSL5:
TCRLF. ;END OF LINE
TYPSL9:
LOAD P1,SLASQ,(P1) ;GET POINTER TO NEXT SLB IN QUEUE
JUMPN P1,NXTSLB ;AND TYPE IT OUT IF IT EXISTS
EXIT
;TYPPDB - Type out BEGSTR PB in a readable format
; Format 0: #nnn
; Format 1: xxxx
; Format 2: [nn,nn]xxxx
;Call
; T1/ Pointer to PB
;Return
; RET
TYPPDB: CALL .SAVE1## ;WORK REGISTER
MOVE P1,T1 ;SAVE POINTER TO PDB
LOAD T1,PBFOR,(P1) ;GET FORMAT TYPE
CAILE T1,2 ;MAKE SURE IT IS A FORMAT WE RECOGNIZE
$DIE BPF,<Bad PDB format type>
JRST @.+1(T1) ;DISPATCH TO CORRECT TYPEOUT ROUTINE
IFIW TYPFO0 ;FORMAT 0
IFIW TYPFO1 ;FORMAT 1
IFIW TYPFO2 ;FORMAT 2
TYPFO0: TCHRI. "#" ;INDICATE NUMBER
LOAD T1,PBOBJ,(P1) ;GET OBJECT NUMBER
TDECW. T1, ;TYPE IT OUT IN DECIMAL
RET ;RETURN
TYPFO2: TCHRI. "[" ;OPEN PPN FIELD
LOAD T1,PBGRP,(P1) ;GET GROUP CODE
TOCTW. T1, ;TYPE IT OUT IN OCTAL
TCHRI. "," ;SEPERATE
LOAD T1,PBUSR,(P1) ;GET USER CODE
TOCTW. T1, ;TYPE IT OUT
TCHRI. "]" ;CLOSE BRACKET
TYPFO1: TCHRI. """" ;TYPE A QUOTE
LOAD T2,PBNCT,(P1) ;GET COUNT OF BYTES IN NAME STRING
MOVEI T1,PB.NAM(P1) ;POINTER TO STRING
CALL TYP8 ;AND TYPE IT OUT IN 8 BIT
TCHRI. """" ;CLOSE QUOTE
RET
;TYP8 - Type an 8 bit string.
;Call
; T1/ Pointer to string
; T2/ Number of bytes to type
;Return
; RET
TYP8: HRLI T1,(POINT 8,) ;MAKE POINTER A BYTE POINTER
TYP81: SOJL T2,.POPJ## ;RETURN WHEN DONE
ILDB T3,T1 ;GET A BYTE
TCHRI. (T3) ;TYPE IT OUT
JRST TYP81 ;AND LOOP
;MAPMON - Map monitor pages into user space
;Call
; T1/ Beginning address in monitor desired
; T2/ Size
;Return
; T1/ Pointer in monitor space to buffer
MAPMON: PUSHJ P,.SAVE4## ;SAVE SOME WORKING SPACE
MOVSI P4,1 ;FLAG WE ARE MAPPING PAGES
MAPMO0: MOVE P1,T1 ;SAVE STARTING ADDRESS
LDB P2,[POINT 9,P1,35] ;GET MODULO PAGE BITS
ADD P2,T2 ;ADD IN SIZE
ADR2PG P2, ;CONVERT TO PAGES
ADDI P2,1 ;AND ROUND UP (ALWAYS!)
CAIL P2,40 ;MAKE SURE NO RIDICULOUS SIZED REQUEST
$DIE RSZ,<Ridiculous sized request to MAPMON>
ADR2PG T1, ;CONVERT ADDRESS TO PAGE NUMBER
MOVE P3,[IOWD PAGNUM,PAGTAB] ;AOBJN POINTER TO PAGTAB
MAPMO1: AOBJP P3,MAPMAK ;AT END OF LIST, JUST MAP IT IN.
HRRZ T3,(P3) ;GET A PAGE NUMBER
CAME T1,T3 ;IS THIS THE PAGE WE ARE LOOKING FOR?
JRST MAPMO1 ;NOPE, KEEP ON LOOKING.
;Check to see if we have all pages contiguous here
MOVE T2,P2 ;FIND OUT NUMBER OF PAGES TO CHECK
MOVE T4,P3 ;COPY AOBJN POINTER FOR OUR PURPOSES
MAPMO2: SOJLE T2,MAPMO3 ;IF END, ALL PAGES ARE ALREADY MAPPED.
ADDI T1,1 ;INCREMENT PAGE WE ARE INTERESTED IN
AOBJP T4,MAPMAK ;IF WE RUN OVER, NOT ALL PAGES ARE MAPPED
HRRZ T3,(T4) ;GET NEXT PAGE FROM TABLE
CAMN T1,T3 ;IS THIS THE PAGE WE NEED?
JRST MAPMO2 ;YES, TRY FOR NEXT PAGE
MOVE T1,P1 ;FAILED, GET BACK ORIGINAL ADDRESS
ADR2PG T1, ;CONVERT TO PAGE NUMBER
JRST MAPMO1 ;AND KEEP ON TRYING
;Here when all pages are mapped in.
;P1/ Original requested address
;P2/ Number of pages to be mapped
;P3/ Entry in PAGTAB where pages start.
;P4/ Flag indicating mapping or unmapping pages.
MAPMO3: MOVSI T1,1 ;LEFT HALF ONE, TO INCREMENT NUMBER OF USERS
MOVN T2,P2 ;GET NUMBER OF ENTRIES TO MARK
MOVS T2,T2 ;LEFT HALF FOR AOBJN POINTER
HRRI T2,P3 ;RIGHT HALF TO TABLE
MAPMO4: ADDM T1,(P3) ;INCREMENT NUMBER OF USERS OF PAGE
AOBJN T2,MAPMO4 ;LOOP UNTIL ALL ARE INCREMENTED
MOVEI T2,-PAGTAB(P3) ;GET OFFSET INTO PAGTAB FOR FIRST PAGE
ADDI T2,PAGLOC ;CONVERT TO VIRTUAL PAGE NUMBER
MOVE T1,P1 ;GET ORIGINAL REQUESTED ADDRESS
DPB T2,[POINT 9,T1,26] ;CONVERT TO VIRTUAL MAPPED ADDRESS
RET ;AND RETURN
;Here when the pages we need are not mapped in.
;P1/ Original address requested
;P2/ Number of pages to do
MAPMAK:
;Turn interrupts off for this entire thing.
;First, find the number or contiguous free slots in PAGTAB that we need
MOVE P3,[IOWD PAGNUM,PAGTAB] ;AOBJN POINTER TO TABLE SLOTS
MAPMK1: AOBJP P3,MAPMK9 ;IF END OF LIST AND HERE, WE FAILED
SKIPE (P3) ;IS THIS SLOT EMPTY?
JRST MAPMK1 ;NOPE, KEEP ON LOOKING.
DMOVE T2,P2 ;NUMBER OF PAGES TO DO, POINTER TO PAGTAB
MAPMK2: SOJLE T2,MAPMK3 ;DECREMENT NUMBER OF PAGES TO GO
AOBJP T3,MAPMK9 ;IF END OF LIST, WE LOSE
SKIPN (P3) ;IS THIS SLOT EMPTY?
JRST MAPMK2 ;YES, KEEP ON TRYING
MOVE P3,T3 ;NO, HAVE OTHER ROUTINE USE THIS POINTER
JRST MAPMK1 ;AND LOOK FOR ANOTHER EMPTY SLOT
MAPMK3: MOVEI T3,-PAGTAB(P3) ;GET OFFSET INTO PAGTAB
ADDI T3,PAGLOC ;CONVERT INTO USER PAGE NUMBER
MOVN T2,P2 ;GET NUMBER OF PAGES TO DO
LDB T1,[POINT 18,P1,26] ;GET MONITOR PAGE NUMBER
HRLM T1,T3 ;SAVE FOR PAGE UUO
MOVE T1,[.PAGSP,,T2] ;PAGE UUO ARGUMENTS
PAGE. T1, ;AND MAP THE STUFF IN
$ERROR PUF,<PAGE. uuo failed, reason >,.TOCTW##,T1
;Now the pages are mapped in, lets mark in PAGTAB the fact that we did.
HLRZ T1,T3 ;GET MONITOR PAGE NUMBER
MOVS T2,T2 ;NEGATIVE PAGES TO DO IN LH
HRR T2,P3 ;POINTER TO OUR SLOT IN PAGTAB
MAPMK4: MOVEM T1,(T2) ;SAVE PAGE NUMBER IN PAGTAB
ADDI T1,1 ;INCREMENT MONITOR PAGE NUMBER
AOBJN T2,MAPMK4 ;AND LOOP
JRST MAPMO3 ;AND MARK THOSE PAGES AS BEING IN USE
MAPMK9: $ERROR NEP,<Not enough free pages>
END START