Google
 

Trailing-Edge - PDP-10 Archives - bb-x130a-sb - object.mac
There are 5 other files named object.mac in the archive. Click here to see a list.
	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