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/map/map.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

3402 lines
107 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 MAP - DECsystem-10 page mapper
SUBTTL D. P. Mastrovito /DPM
;COPYRIGHT (C) 1980,1981,1982,1983,1984,1985,1986 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
; Version numbers
;
MAPMAJ==2 ;MAJOR VERSION
MAPMIN==0 ;MINOR VERSION
MAPEDT==57 ;EDIT NUMBER
MAPWHO==0 ;WHO DID IT
%%MAP==<BYTE(3)MAPWHO(9)MAPMAJ(6)MAPMIN(18)MAPEDT>
MAPDAY=="20" ;BUILD DAY
MAPMON=="Mar" ;BUILD MONTH
MAPYER=="86" ;BUILD YEAR
SALL ;FOR CLEAN LISTINGS
.DIRECT FLBLST ;FOR CLEANER LISTINGS
SUBTTL Table of Contents
; Table of Contents for MAP %2(35)
;
;
; Section Page
; 1. Table of contents. . . . . . . . . . . . . . . . . . . 2
; 2. Revision history . . . . . . . . . . . . . . . . . . . 3
; 3. Compiler interface setup . . . . . . . . . . . . . . . 5
; 4. Program interface definitions. . . . . . . . . . . . . 8
; 5. Internal definitions . . . . . . . . . . . . . . . . . 9
; 6. .MAPD - Deposit. . . . . . . . . . . . . . . . . . . . 11
; 7. .MAPE - Examine. . . . . . . . . . . . . . . . . . . . 12
; 8. .MAPG - GETTAB UUO simulation. . . . . . . . . . . . . 13
; 9. .MAPI - Initialization . . . . . . . . . . . . . . . . 18
; 10. .MAPJ - JOBPEK UUO simulation. . . . . . . . . . . . . 25
; 11. Address mapping
; 11.1. Compute a mapped address. . . . . . . . . . . 27
; 11.2. Convert virtual to physical addresses . . . . 28
; 11.3. Copy a block of mapped data . . . . . . . . . 30
; 11.4. KA relocation and protection. . . . . . . . . 31
; 11.5. KI paging . . . . . . . . . . . . . . . . . . 32
; 11.6. KL paging . . . . . . . . . . . . . . . . . . 33
; 11.7. Dispatch tables . . . . . . . . . . . . . . . 35
; 11.8. Monitor . . . . . . . . . . . . . . . . . . . 36
; 11.9. Job . . . . . . . . . . . . . . . . . . . . . 38
; 11.10. File. . . . . . . . . . . . . . . . . . . . . 40
; 12. Cache management
; 12.1. Clear out the cache . . . . . . . . . . . . . 42
; 12.2. Map the cache . . . . . . . . . . . . . . . . 43
; 12.3. Set up the hash tables and links. . . . . . . 45
; 12.4. Set cache size. . . . . . . . . . . . . . . . 46
; 12.5. Allocate a chunk for the cache. . . . . . . . 47
; 12.6. Deallocate a page from the cache. . . . . . . 48
; 12.7. Find an entry in the cache. . . . . . . . . . 49
; 12.8. Insert (replace) a new page in the cache. . . 50
; 12.9. Move entry to top of list . . . . . . . . . . 51
; 13. Text I/O
; 13.1. Character . . . . . . . . . . . . . . . . . . 52
; 13.2. ASCIZ . . . . . . . . . . . . . . . . . . . . 53
; 13.3. Sixbit. . . . . . . . . . . . . . . . . . . . 54
; 13.4. Octal . . . . . . . . . . . . . . . . . . . . 55
; 13.5. Filespec. . . . . . . . . . . . . . . . . . . 56
; 13.6. Miscellaneous . . . . . . . . . . . . . . . . 57
; 14. Paging
; 14.1. Check accessibility . . . . . . . . . . . . . 58
; 14.2. Create/Destroy. . . . . . . . . . . . . . . . 59
; 14.3. SPY page creation . . . . . . . . . . . . . . 60
; 15. File I/O
; 15.1. Open a file . . . . . . . . . . . . . . . . . 61
; 15.2. Close a file. . . . . . . . . . . . . . . . . 63
; 15.3. Position a file . . . . . . . . . . . . . . . 64
; 15.4. Input/Output. . . . . . . . . . . . . . . . . 65
; 15.5. Scan a filespec . . . . . . . . . . . . . . . 66
; 16. EXE file routines
; 16.1. Load and validate directory . . . . . . . . . 69
; 16.2. Find a file page. . . . . . . . . . . . . . . 71
; 16.3. Find a directory block. . . . . . . . . . . . 72
; 17. FORTRAN interface. . . . . . . . . . . . . . . . . . . 73
; 18. Context switch . . . . . . . . . . . . . . . . . . . . 74
; 19. Error handling . . . . . . . . . . . . . . . . . . . . 75
; 20. AC save routines . . . . . . . . . . . . . . . . . . . 82
; 21. Literals . . . . . . . . . . . . . . . . . . . . . . . 84
; 22. Data storage . . . . . . . . . . . . . . . . . . . . . 85
; 23. End. . . . . . . . . . . . . . . . . . . . . . . . . . 86
SUBTTL Revision history
; 1 Creation. Map virtual monitor addresses.
;
; 2 Map physical monitor addresses.
;
; 3 Add job mapping.
;
; 4 Start adding code for file mapping.
;
; 5 Change calling conventions to always use a single AC. Add
; FORTRAN interface.
;
; 6 More work on file mapping. Accept ASCIZ filespecs.
;
; 7 Handle multiple directory page EXE files.
;
; 10 Implement new page caching routines.
;
; 11 Add TITLE. macro.
;
; 12 Shuffle lots of code into a more logical organization. Start
; to clean up initialization code.
;
; 13 Begin adding intelligent error handling.
;
; 14 Edit 10 broke file mapping badly. Make it work again. Remove
; all references to AC 'I' as well as the old paralell mapping
; tables.
;
; 15 Finally add code to handle GETTAB immediate of the range table.
;
; 16 Add support for pathological names.
;
; 17 Attempt to close off old channel from previous call early
; in the .MAPI routine.
;
; 20 Rewrite the FORTRAN interface. /WSM
;
; 21 Finish adding error handling for all non-I/O errors.
;
; 22 Store the CPU and paging type in the data block.
;
; 23 Add support for KL paging shared and indirect pointers.
;
; 24 Avoid an extra GETTAB simulation by reading low core location 22
; to get paging type and APR serial number. Then convert serial
; number to CPU type. Always use physical addressing when looking
; at low core.
;
; 25 Redefine all FL.??? and FR.??? flags as 18 bit quantities. Fix
; bug in testing for physical pages that caused CSHFND to never
; find a page in the cache sometimes. Add AC save co-routines.
; 26 Remove .MPCOR mapping code and add code to handle virtual vs.
; physical memory addressing correctly. If the first 112K of the
; monitor is mapped one for one virtual to physical, remember this
; so subsequent address calculations can bypass expensive exec
; page mapping code.
;
; 27 Enhance the FORTRAN interface again by making it type out errors
; if the caller doesn't setup a return address. /WSM
;
; 30 Don't terminate text blocks with a NUL. This confuses FORTRAN.
; Zero the blocks instead. Don't use the caller's stack, set up
; an internal one. Invent a flag word in the data block which is
; non-zero if SPYing. Add flag MP.SPY to require SPYing if so
; requested. Remove the 20 page restriction on cache size. The
; sky's the limit or CORMAX (which ever comes first). Return the
; sixbit prefix so a superior program can do intelligent things.
;
; 31 Add support for reading funny space. Also fix bugs associated
; with KL paging indirect pointers.
;
; 32 GETTAB values for start and end of funny space, and the highest
; unmapped exec address. Remove code to compute these values and
; associated flags.
;
; 33 Speed up JOBPEK simulation by doing either a MOVE and MOVEM,
; DMOVE and DMOVEM, or a BLT to transfer data from mapped pages
; to user pages. Remove COUNT. macro.
;
; 34 Fix up filespec defaulting and better handle sixbit PPNs.
; Remove last references to ACs P1 and P2.
;
; 35 Incorporate the FORTRAN INCLUDE file in the MACRO sources.
;
; 36 Make hardware KI paging work. It's about time!
;
; 37 Make use of new FILOP. function to return the filespec of crash file.
;
; 40 Speed up initialization by a factor of two.
;
; 41 Edit 15 didn't quite make it. Teach OCTOUT about negative numbers.
; Type negative GETTAB tables as -n.
;
; 42 Rework GTBINI extensively by removing old BOOTWD hack to determine
; the CPU and paging type. Use the Exec Data Vector if we can.
;
; 43 Rewrite the TITLE. macro, add build string for WSM. Add symbolic
; offsets for initialization block. Add routine .MAPC to clear
; out the mapper statistics block. Don't set a PATH. block pointer
; if there's no directory (default [-] correctly).
;
; 44 Add crock to check for monitor's high segment being mapped. This
; will allow GETTABs of values in the high segment to work on unrun
; monitors.
;
; 45 In file mode, get the returned filespec with one FILOP. UUO, not
; two. Replace MPIFF% (Initialization Failed for File mapping) with
; a the more general code MPMIP% (Mapper Initialization failure).
;
; 46 Add .MAPI argument .MPDSN to specify the default section number to
; use if an address of 400000,,n is given. This will normally be set
; to zero to things don't break. Also, add an internal argument block
; so programs have to assemble in the argument block length.
;
; 47 Include cosmetic improvements and KL paging patch supplied by
; Joe Smith of the Colorado School of Mines. The KL paging stuff
; fixes an old WHO bug that caused address calculations to fail while
; trying to examine non-zero section addresses in a crash file.
;
; 50 Add copyrights to .MAC, .REL, and .FOR files.
;
; MAP %2(50) released with 7.02
;
; 51 Add counter .MPJPU to tally up the number of JOBPEK UUOs executed.
;
; 52 Remove references to PAGADR. It's not needed.
;
; 53 During GETTAB initialization, if the highest unmapped exec address
; is known, use it instead of defaulting it to DEFUEA.
;
; 54 Correct FORTRAN definition of .MPJPU (JOBPEK UUOs executed).
;
; 55 Fix typo in error message. Update copyrights.
;
; 56 (RDH) Fix to handle extended/PSECTed monitors - use %CNSUP system
; uptime as "mapped" flag for .EXE files.
;
; 57 Process entry vector blocks in .EXE directories.
SUBTTL Macros
; Macros to accumulate text
;
DEFINE INIT. (ARG),<
DEFINE ARG'.. (TEXT),<
DEFINE APPND. (X,Y,Z),<ARG'.. (<TEXT''X'Y'Z>)>
DEFINE ARG'.,<TEXT>
> ;END ARG'..
ARG'..
> ;END INIT.
; Macro to build a byte pointer to a masked quantity
;
DEFINE POINTR (A,M),<POINT <^L<-<<M>_<^L<M>>>-1>>,A,<<^L<<M>&<-<M>>>>>>
; Macro to generate calls to the error handler
;
DEFINE ERR. (COD,RET),<
PUSHJ P,[PUSHJ P,ERROR
IFNB <COD>,<MP'COD'%>,,RET]
>
; Macro to generate mapping error table entries
;
DEFINE MERR. (SYM,TXT),<
.XCREF ...ERR, MP'SYM'%
...ERR==...ERR+1
MP'SYM'%==:...ERR
''SYM'',,[ASCIZ |TXT|]
>
; Macro to generate a TITLE, build, and version text
;
DEFINE TITLE. (NAM,ABV,TXT),<
MN1==<ABV'MIN/^D26>
IFE MN1,<MN2==ABV'MIN>
IFG MN1,<MN2=ABV'MIN-<^D26*MN1>>
IFE ABV'MIN-^D26,<MN2==<ABV'MIN+<MN1==0>>>
IFE ABV'MIN-^D52,<MN2==<<^D26-1>+<MN1==1>>>
IFN MN1,<MN1==MN1+"@">
IFN MN2,<MN2==MN2+"@">
MNV==<<MN1_7>!MN2>
;; Generate TITLE
INIT. (TTL)
APPND. (<TITLE 'NAM %>,\ABV'MAJ,)
IFN MNV,<APPND. (,\"MNV,)>
APPND. (<(>,\ABV'EDT,<)>)
IFN ABV'WHO,<APPND. (<->,\ABV'WHO,)>
APPND. (< >,'TXT,)
TTL.
;; Generate PRINTX
INIT. (PTX)
APPND. (<PRINTX ['NAM %>,\ABV'MAJ,)
IFN MNV,<APPND. (,\"MNV,)>
APPND. (<(>,\ABV'EDT,<)>)
IFN ABV'WHO,<APPND. (<->,\ABV'WHO,)>
APPND. (< >,'TXT,)
IFN FTFORTRAN,<APPND. (< FORTRAN interface>,,)>
appnd. (<]>,,)
IF2,<PTX.>
;; Generate build date
INIT. (BLD)
APPND. (<ASCIZ |'NAM version >,\ABV'MAJ,)
IFN MNV,<APPND. (,\"MNV,)>
APPND. (<(>,\ABV'EDT,<)>)
IFN ABV'WHO,<APPND. (<->,\ABV'WHO,)>
APPND. (< built on >,\"ABV'DAY,<->)
APPND. (\"ABV'MON,<->,\"ABV'YER)
APPND. (<|>,,)
;; Generate program version
INIT. (VER)
APPND. (<ASCIZ |'NAM %>,\ABV'MAJ,)
IFN MNV,<APPND. (,\"MNV,)>
APPND. (<(>,\ABV'EDT,<)>)
IFN ABV'WHO,<APPND. (<->,\ABV'WHO,)>
APPND. (<|>,,)
;; Generate copyright text
INIT. (CPY)
IFE COMPILER,<
APPND. (<ASCIZ |>,\"15,\"12)
APPND. (<'NAM %>,\ABV'MAJ,)
IFN MNV,<APPND. (,\"MNV,)>
APPND. (<(>,\ABV'EDT,<)>)
IFN ABV'WHO,<APPND. (<->,\ABV'WHO,)>
APPND. (< 'TXT>,\"15,\"12)
>
IFN COMPILER,<
APPND. (<ASCIZ |>,,)
>
APPND. (<COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION >,,)
APPND. (<1980,1986. ALL RIGHTS RESERVED.>,,)
APPND. (\"15,\"12,<|>)
>
TITLE. (MAP,MAP,<DECsystem-10 page mapper>)
DEFINE STR (TEXT),<IFN COMPILER,<ASCIZ |TEXT|>>
DEFINE CRLF,<IFN COMPILER,<BYTE(7)15,12>>
DEFINE BLK% (MAC,FOR,WDS),<
MAC==:<FOR==:OFFSET>
CRLF
STR < PARAMETER 'FOR = ">
STR (\OFFSET)
OFFSET==OFFSET+WDS
> ;END DEFINE BLK%
DEFINE SYM% (MAC,FOR,VAL),<
IFDIF <None><MAC>,<MAC==:VAL>
IFDIF <None><FOR>,<
CRLF
STR < PARAMETER 'FOR = "'VAL>
> ;END IFDIF
> ;END DEFINE SYM%
SUBTTL MACRO-10/compiler interface setup
OFF==0 ;TURNS A FEATURE TEST OFF
ON==1 ;TURNS A FEATURE TEST ON
COMPILER==0 ;INITIALLY NO COMPILER CODE
HGHORG==400000 ;HIGH SEGMENT ORIGIN
DEFINE FT (FTS,VAL),<
IFNDEF FT'FTS,FT'FTS==VAL ;;SET DEFAULT VALUE
IFN FT'FTS,<FT'FTS==FT'FTS&1> ;;NORMALIZE SETTING
COMPILER==COMPILER+<IFN FT'FTS,<1>> ;;MAYBE TURN ON COMPILER CODE
> ;END DEFINE FT
FT FORTRAN,OFF ;FORTRAN INTERFACE
IFG COMPILER-1,<
PRINTX ? Multiple interfaces selected
PASS2
END
>
IFE COMPILER,<
SEARCH UUOSYM ;FOR TOPS-10 UUO SYMBOLS
TWOSEG ;MAKE US SHARABLE
RELOC HGHORG ;START LOADING HERE
.MAP:: ENTRY .MAP,.MAPI,MAPI ;LOAD IF LIBRARY SEARCH
COPYRI: CPY. ;GENERATE COPYRIGHT TEXT
BUILD: BLD. ;GENERATE BUILD TEXT
VERSIO: VER. ;GENERATE VERSION TEXT
> ;END IFE COMPILER
IFN COMPILER,<RIM10>
SUBTTL Program interface definitions
STR <
! >
IFN COMPILER,<VER.>
STR <
! Definitions for the FORTRAN interface
!
!>
IFN COMPILER,<CPY.>
STR <!
! This file should be INCLUDEd any FORTRAN program
! wanting to use the MAP subroutine. Only flag,
! constants, and offset definitions are in this
! file. Read MAP.MAC for a complete discription of
! the calling sequences for the FORTRAN and MACRO
! interfaces to MAP.
>
OFFSET==0
STR <
! Initialization block offsets
>
BLK% .MPFNC, MPIFNC, 1 ; Flag and function code word
BLK% .MPNPC, MPINPC, 1 ; Number of pages to cache
BLK% .MPSPN, MPISPN, 1 ; Starting page number
BLK% .MPDSN, MPIDSN, 1 ; Default section number
BLK% .MPARG, MPIARG, 1 ; Function dependant argument
; zero for .MPMON
; job number for .MPJOB
; address of filespec for .MPFIL
BLK% .MPMAX, MPDMAX, 0 ; Length of argument block
STR <
! Initialization flags
>
SYM% MP.PPM, MPFPPM, 200000000000 ; Physical page mapping
SYM% MP.PAT, MPFPAT, 100000000000 ; Enable patching
SYM% MP.EXE, MPFEXE, 040000000000 ; EXE file mapping
SYM% MP.PIO, MPFPIO, 020000000000 ; Physical-only OPEN/LOOKUP on file
SYM% MP.RTM, MPFRTM, 010000000000 ; Return run time statistics
SYM% MP.SIO, MPFSIO, 004000000000 ; Super I/O
SYM% MP.JRM, MPFJRM, 002000000000 ; Use JOBPEK UUOs instead of simulation
SYM% MP.SPY, MPFSPY, 001000000000 ; Job needs to SPY
STR <
! Mapping functions
>
SYM% .MPMON, MPFMON, 0 ; Map the running monitor (PEEK)
SYM% .MPJOB, MPFJOB, 1 ; Map a job in the running monitor (JOBPEK)
SYM% .MPFIL, MPFFIL, 2 ; Map a data or EXE file (FILDDT)
SYM% .MPFMX, MPFFMX, 2 ; Highest known mapping code
STR <
! CPU type codes
>
SYM% .PDP6, PDP6, 1 ; CP166 processor
SYM% .KA10, KA10, 2 ; KA10 processor
SYM% .KI10, KI10, 3 ; KI10 processor
SYM% .KL10, KL10, 4 ; KL10 processor
SYM% .KS10, KS10, 5 ; KS10 processor
SYM% .KC10, KC10, 6 ; KC10 processor
STR <
! Paging codes
>
SYM% .KARPR, KARPR, 1 ; KA Relocation & Protection Registers
SYM% .KIPAG, KIPAG, 2 ; KI paging on a KI10, KL10, or KS10
SYM% .KLPAG, KLPAG, 3 ; KL paging on a KL10 or KS10
SYM% .KCPAG, KCPAG, 4 ; KL paging on a KC10
STR <
! Random constants
>
SYM% .AP, None, 1 ; MACRO AC for argument passing
SYM% .MPEWD, MPFEWD, 30 ; Length of ASCIZ error buffers
SYM% .MPFWD, MPFFWD, 21 ; Length of ASCIZ filespec in words
OFFSET==0
STR <
! Data block offsets
>
BLK% .MPDAT, MPDDAT, 1 ; Count of words in data block
BLK% .MPVER, MPDVER, 1 ; MAP version number
BLK% .MPSPY, MPDSPY, 1 ; Non-zero if SPYing
BLK% .MPCPU, MPDCPU, 1 ; CPU type
BLK% .MPPAG, MPDPAG, 1 ; Paging type
BLK% .MPPGS, MPDPGS, 1 ; Number of pages availble for mapping
BLK% .MPCPC, MPDCPC, 1 ; Cached page count
BLK% .MPCPN, MPDCPN, 1 ; Starting cached page number
BLK% .MPSEC, MPDSEC, 1 ; Default section number
Z.BSTS==OFFSET
BLK% .MPPGC, MPDPGC, 1 ; Count of mapped page creates
BLK% .MPPGD, MPDPGD, 1 ; Count of mapped page destroys
BLK% .MPADR, MPDADR, 1 ; Count of mapped address computations
BLK% .MPEXM, MPDEXM, 1 ; Count of mapped examines
BLK% .MPDEP, MPDDEP, 1 ; Count of mapped deposits
BLK% .MPGTB, MPDGTB, 1 ; Count of mapped GETTABs
BLK% .MPGTU, MPDGTU, 1 ; Count of GETTAB UUOs executed
BLK% .MPJPK, MPDJPK, 1 ; Count of mapped JOBPEK UUOs
BLK% .MPJPU, MPDJPU, 1 ; Count of JOBPEK UUOs executed
BLK% .MPRTM, MPDRTM, 1 ; Run time
BLK% .MPHSF, MPDHSF, 1 ; Count of hash table searches
Z.ESTS==OFFSET
BLK% .MPHSC, MPDHSC, 1 ; Count of hash table collisions
BLK% .MPAFS, MPDAFS, .MPFWD ; Actual filespec
BLK% .MPECD, MPDECD, 1 ; Mapping error code
BLK% .MPPFX, MPDPFX, 1 ; Right justified sixbit prefix
BLK% .MPMET, MPDMET, .MPEWD ; Mapping error text
BLK% .MPXET, MPDXET, .MPEWD ; Extended error text
BLK% .MPLEN, MPDLEN, 0 ; Length of data block
IFN COMPILER,<END>
SUBTTL Internal definitions
; Accumulators
;
T1==1 ;FOUR
T2==2 ; TEMPORARY
T3==3 ; ACS
T4==4 ; ...
A1==5 ;4 ACS USED FOR
A2==6 ; MAPPED ADDRESS
A3==7 ; CALCULATIONS &
A4==10 ; CACHE HANDLING
VMA==11 ;VIRTUAL MEMORY ADDRESS
PMA==12 ;PHYSICAL MEMORY ADDRESS
SPT==13 ;SPT BASE ADDRESS
F==14 ;FLAGS
P==17 ;PDL
.AP==T1 ;USER COMMUMICATES THROUGH THIS AC
; Random values
;
PDLSIZ==50 ;INTERNAL PDL SIZE
PAGSIZ==1000 ;SIZE OF A PAGE IN WORDS
PAGNUM==^D20 ;DEFAULT NUMBER OF PAGES TO MAP
HGHPAG==700 ;HIGHEST PAGE NUMBER +1 TO USE
DEFPAG==HGHPAG-PAGNUM ;DEFAULT STARTING PAGE NUMBER
ABSTAB==410 ;ADDRESS OF POINTER TO NUMTAB
DEFEPT==1000 ;DEFAULT EPT ADDRESS
DEFUEA==<<^D112*^D1024>-1> ;DEFAULT HIGHEST UNMAPPED EXEC ADDRESS
DEFPBA==<^D112*^D1024> ;DEFAULT PER-PROCESS BEGINNING ADDRESS
DEFPEA==<<^D112+^D16>*^D1024> ;DEFAULT PER-PROCESS ENDING ADDRESS
DEFORG==400000 ;DEFAULT MONITOR'S HIGH SEGMENT ORIGIN
FOPSIZ==.FOMAX ;SIZE OF A FILOP. UUO BLOCK
LERSIZ==.RBMAX ;SIZE OF A LOOKUP/ENTER UUO BLOCK
PTHSIZ==.PTLEL ;SIZE OF A PATH. UUO BLOCK
FILSIZ==.FOFMX ;SIZE OF A RETURNED FILESPEC BLOCK
; Cache blocks
;
...X==.
PHASE 0
.CBNHB:! BLOCK 1 ;NEXT HASH BLOCK
.CBPHB:! BLOCK 1 ;PREVIOUS HASH BLOCK
.CBNAB:! BLOCK 1 ;NEXT ACCESSED BLOCK
.CBPAB:! BLOCK 1 ;PREVIOUS ACCESS BLOCK
.CBPRC:! BLOCK 1 ;PROCESS PAGE NUMBER
.CBUSR:! BLOCK 1 ;USER PAGE NUMBER
.CBFLG:! BLOCK 1 ;FLAGS
CB.AVA==1B0 ;CHUNK IS FREE
CB.CRE==1B1 ;USER PAGE HAS BEEN CREATED
CB.PHY==1B2 ;PHYSICAL PAGE (NOT VIRTUAL)
CB.UPD==1B3 ;UPDATE PAGE ON NEXT REPLACE
.CBLEN:! ;LENGTH
DEPHASE
; RELOC ...X
PURGE ...X
; Copy block offsets
;
...X==.
PHASE 0
.CBWCT:! BLOCK 1 ;WORD COUNT
.CBRAD:! BLOCK 1 ;READ ADDRESS (SOURCE)
.CBWAD:! BLOCK 1 ;WRITE ADDRESS (DESTINATION)
.CBXLN:! ;LENGTH
DEPHASE
; RELOC ...X
PURGE ...X
SECTAB==540 ;OFFSET IN EPT OR UPT OF FIRST SECTION MAP POINTER
MXSECN==37 ;MAXIMUM NUMBER OF SECTIONS ON A KL10
; Flags in AC 'F'
;
FL.XXX==400000 ;RESERVED
FL.PPM==200000 ;.MAPI FLAG - PHYSICAL PAGE MAPPING
FL.PAT==100000 ;.MAPI FLAG - PATCH
FL.EXE== 40000 ;.MAPI FLAG - .EXE FILE MAPPING
FL.PIO== 20000 ;.MAPI FLAG - PHYSICAL FILE I/O
FL.RTM== 10000 ;.MAPI FLAG - RETURN RUNTIM STATISTICS
FL.SIO== 4000 ;.MAPI FLAG - SUPER I/O
FL.JRM== 2000 ;.MAPI FLAG - JOBPEK UUOS ON MONITOR
FL.SPY== 1000 ;.MAPI FLAG - JOB NEEDS SPY/WE CAN SPY
FL.INI==377000 ;.MAPI FLAGS
FL.EPM== 100 ;EXEC PHYSICAL PAGE MAPPING
FL.TPP== 40 ;TEMPORARY PHYSICAL PAGE MAPPING
FL.GTS== 20 ;GETTAB SIMULATION SETUP
FL.DEV== 10 ;FILESPEC SCANNER - DEVICE
FL.NAM== 4 ;FILESPEC SCANNER - FILE NAME
FL.EXT== 2 ;FILESPEC SCANNER - EXTENSION
FL.DIR== 1 ;FILESPEC SCANNER - DIRECTORY
FR.TYP==777777 ;MAPPING TYPE
SUBTTL .MAPC - Clear out mapper statistics
; Routine to clear out the mapper statistics block
; Call: PUSHJ P,.MAPC
; <NON-SKIP>
; <SKIP>
;
.MAPC:: PUSHJ P,CONTXT ;CONTEXT SWITCH
MOVEI T1,MAPDAT ;POINT TO START OF MAPPER DATA
SETZM Z.BSTS(T1) ;CLEAR FIRST WORD
MOVSI T2,Z.BSTS(T1) ;GET START ADDRESS
HRRI T2,Z.BSTS+1(T1) ;MAKE A BLT POINTER
BLT T2,Z.ESTS-1(T1) ;CLEAR THE BLOCK
JRST CPOPJ1 ;AND RETURN
SUBTTL .MAPD - Deposit
; Deposit into a mapped location
; Call: MOVE .AP, ADDR
; PUSHJ P,.MAPD
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED, ACS UNCHANGED
;
; ADDR: address to deposit into
; old contents
; new contents
;
.MAPD:: PUSHJ P,CONTXT ;CONTEXT SWITCH
MOVEI T1,3 ;3 WORDS IN BLOCK
MOVE T2,USRACS+.AP ;GET ARG POINTER
MOVE T1,0(T2) ;GET WORD 0
MOVEM T1,POKBLK+0 ;SAVE
MOVE T1,1(T2) ;GET WORD 1
MOVEM T1,POKBLK+1 ;SAVE
MOVE T1,2(T2) ;GET WORD 2
MOVEM T1,POKBLK+2 ;SAVE
MOVE T1,POKBLK+0 ;GET ADDRESS TO DESPOSIT INTO
PUSHJ P,ADDRESS ;COMPUTE A MAPPED ADDRESS
ERR. (DAF,CPOPJ) ;DEPOSIT ADDRESS FAILURE
MOVE T2,(T1) ;GET CONTENTS
CAME T2,POKBLK+1 ;WHAT THE USER THINKS IT SHOULD BE?
ERR. (DVM,CPOPJ) ;DEPOSIT VALUE DOESN'T MATCH
CAMN T2,POKBLK+2 ;OLD CONTENTS SAME AS NEW CONTENTS?
JRST CPOPJ1 ;YES - THEN NOTHING TO DO
MOVE T3,POKBLK+2 ;GET WORD TO DEPOSIT
PUSHJ P,@DEPTAB(F) ;DO IT
POPJ P, ;FAILED
AOS MAPDAT+.MPDEP ;COUNT THE DEPOSIT
JRST CPOPJ1 ;RETURN
SUBTTL .MAPE - Examine
; Examine a mapped location
; Call: MOVE T1, address
; PUSHJ P,.MAPE
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED, T1:= C(ADDR)
;
.MAPE:: PUSHJ P,CONTXT ;CONTEXT SWITCH
MOVE T1,USRACS+.AP ;GET REAL T1
PUSHJ P,EXAMINE ;DO THE EXAMINE
POPJ P, ;CAN'T
MOVEM T1,USRACS+.AP ;STORE IN REAL T1
JRST CPOPJ1 ;RETURN
PEXAMINE:TLOA F,FL.TPP ;ALLOW PHYSICAL PAGE MAPPING
VEXAMINE:TLZ F,FL.TPP ;ALLOW VIRTUAL PAGE MAPPING
EXAMINE:PUSHJ P,ADDRESS ;COMPUTE MAPPED ADDRESS
ERR. (EAF,CPOPJ) ;EXAMINE ADDRESS FAILURE
MOVE T1,(T1) ;GET CONTENTS
AOS MAPDAT+.MPEXM ;COUNT THE EXAMINE
JRST CPOPJ1 ;AND RETURN
SUBTTL .MAPG - GETTAB UUO simulation
; This routine will simulate a GETTAB UUO. The calling sequence is exactly
; like a GETTAB UUO. If the simulation fails, and monitor mapping is being
; done, a GETTAB UUO will be tried. A skip return implies the requested
; monitor information has been retrieved. A non-skip return means the GETTAB
; arguments are illegal.
;
; Historical note:
; The GETTAB UUO (CALLI 41) is new with the 3.19 monitor release. The UUO was
; implemented to allow unprivileged programs to examine various monitor tables.
; CALL: HRROI AC, MONITOR JOB TABLE NUMBER ;NEG. TABLES FOR CUSTOMER
; HRLI AC, JOB NUMBER ;LH .EQ. -1 CURRENT JOB
; ;LH .EQ. -2 CURRENT HIGH-SEG
; CALL AC, [SIXBIT /GETTAB/] ;OR CALLI AC,41
;
.MAPG:: PUSHJ P,CONTXT ;CONTEXT SWITCH
MOVE T1,USRACS+.AP ;GET REAL T1
PUSHJ P,GTBSIM ;DO THE GETTAB SIMULATION
SKIPA ;FAILED
AOS (P) ;SKIP
MOVEM T1,USRACS+.AP ;STORE IN REAL T1
POPJ P, ;AND RETURN
GTBSIM: MOVEM T1,GTBARG ;SAVE THE ARGUMENT
HRRES T1 ;GET THE TABLE NUMBER
CAIN T1,.GTIDX ;RANGE TABLE?
HLRE T1,GTBARG ;YES--GET INDEX (TABLE NUMBER)
ADD T1,NUMTAB ;OFFSET INTO NUMTAB
PUSHJ P,EXAMINE ;READ NUMTAB ENTRY
JRST GTBS.1 ;MAYBE NO PRIVS
MOVEM T1,GTBNUM ;STORE FOR LATER
LDB T1,GTBTYP ;GET TABLE TYPE CODE
TLNE F,FL.GTS ;GETTAB SIMULATION SETUP?
CAIL T1,GTBLEN ;DO WE KNOW ABOUT THIS TABLE?
GTBS.1: MOVEI T1,0 ;NO--INDEX ZERO TO ATTEMPT GETTAB UUO
MOVEM T1,GTBIDX ;SAVE INDEX FOR LATER
HRRZ T2,GTBARG ;GET THE TABLE NUMBER
CAIN T2,.GTIDX ;THE RANGE TABLE?
MOVEI T1,.SLIXR ;YES
PUSHJ P,@GTBTAB(T1) ;DO SOMETHING
SKIPA T1,GTBIDX ;GET INDEX IF SIMULATION FAILED
JRST GTBS.2 ;GOT IT
JUMPN T1,GTBS.1 ;TRY THE UUO IF WE CAN
MOVE T1,GTBARG ;LOST AGAIN--RELOAD THE ARGUMENT
ERR. (GUF,CPOPJ) ;GETTAB UUO/SIMULATION FAILED
GTBS.2: AOS MAPDAT+.MPGTB ;COUNT THE GETTAB
JRST CPOPJ1 ;RETURN
; GETTAB simulator dispatch table
;
GTBTAB: EXP UNKNTB ;UNKNOWN TABLE
EXP ITEMTB ;ITEM NUMBER
EXP JOBNTB ;JOB NUMBER
EXP SEGNTB ;SEGMENT NUMBER
EXP JPDBTB ;JOB NUMBER (DATA IN PDB)
EXP RNGETB ;NEGATIVE AND POSITIVE NUMBERS
GTBLEN==.-GTBTAB ;LENGTH OF TABLE
; Byte pointers to parts of GETTAB arguments.
;
GTBMAX: POINTR (GTBNUM,SL.MAX) ;MAXIMUM ITEM NUMBER IN TABLE
GTBTYP: POINTR (GTBNUM,SL.TYP) ;TYPE OF TABLE IDENTIFIER
GTBMAC: POINTR (GTBNUM,SL.MAC) ;A MONITOR AC NUMBER
GTBADR: POINTR (GTBNUM,SL.ADR) ;EXECUTIVE MODE ADDRESS OF TABLE IF
; SL.TYP=1,2,3 OR OFFSET TO PDB IF
; SL.TYP=4
; GETTAB table types. The values here MUST correspond to the order of
; GTBTAB. They are included for documentation purposes and to force
; them into the symbol table, but are never referenced directly.
;
.SLNIC==.SLNIC ;(0) NOT INCLUDED IN THIS CONFIGURATION
.SLIXI==.SLIXI ;(1) INDEX BY ITEM NUMBER
.SLIXJ==.SLIXJ ;(2) INDEX BY JOB NUMBER
.SLIXS==.SLIXS ;(3) INDEX BY JOB NUMBER OR SEGMENT NUMBER
.SLIXP==.SLIXP ;(4) INDEX BY JOB NUMBER (DATA IN PDB)
.SLIXR==.SLIXR ;(5) INDEX BY NEGATIVE AND POSITIVE OFFSETS
; BITS 12,13 RESERVED FOR DEC
; Masks of low and high ranges of GETTAB tables indexed by negative and
; positive numbers (table type SL.IXR). These are never referenced but
; are included for documantaion and to force the symbols into the symbol
; table.
;
ID.MIN==ID.MIN ;LOW RANGE OF TABLE
ID.MAX==ID.MAX ;HIGH RANGE OF TABLE
; Unknown table type
;
UNKNTB: MOVE T1,GTBARG ;PICK UP USER ARGUMENTS
HRRZ T2,F ;GET JUST THE MAPPING TYPE
CAIN T2,.MPMON ;MAPPING A RUNNING MONITOR?
GETTAB T1, ;YES - TRY THE GETTAB UUO
SOS (P) ;LOSE
AOS MAPDAT+.MPGTU ;COUNT NUMBER OF GETTAB UUOS EXECUTED
JRST CPOPJ1 ;RETURN
; Item table type
;
ITEMTB: HLRE T1,GTBARG ;GET REQUESTED ITEM NUMBER
LDB T2,GTBMAX ;GET MAXIMUM LENGTH OF THE TABLE
SKIPL T1 ;NEGATIVE INDEX IS ILLEGAL
CAMLE T1,T2 ;WITHIN LEGAL RANGE?
POPJ P, ;NOPE
LDB T2,GTBADR ;GET TABLE BASE ADDRESS
ADD T1,T2 ;OFFSET INTO TABLE
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN SUCESSFUL
; Job table type
;
JOBNTB: HLRE T1,GTBARG ;GET JOB NUMBER
CAMN T1,[-1] ;OUR JOB?
MOVE T1,USRJOB ;YES - GET IT
SKIPL T1 ;CAN'T HAVE A NEGATIVE JOB NUMBER
CAMLE T1,JOBN ;WITHIN LEGAL RANGE?
POPJ P, ;NOPE
LDB T2,GTBADR ;GET TABLE BASE ADDRESS
ADD T1,T2 ;INDEX INTO TABLE
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN SUCESSFUL
; Segment table type
;
SEGNTB: HLRE T1,GTBARG ;GET SEGMENT NUMBER
CAMN T1,[-1] ;OUR JOB NUMBER?
MOVE T1,USRJOB ;YES - LOAD OUR JOB NUMBER
CAME T1,[-2] ;OUR SEGMENT NUMBER?
JRST SEGN.1 ;NO
MOVE T1,JBTSGN ;GET JOB TO SEG TRANSLATION
ADD T1,USRJOB ;ADD IN OUR JOB NUMBER
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
HRRZS T1 ;KEEP JUST THE SEGMENT NUMBER
JUMPE T1,CPOPJ ;RETURN IF NO HIGH SEGMENT
SEGN.1: SKIPL T1 ;CAN'T HAVE NEGATIVE JOB OR SEG NUMBERS
CAMLE T1,SEGN ;WITHIN LEGAL RANGE?
POPJ P, ;NOPE
LDB T2,GTBADR ;GET TABLE BASE ADDRESS
ADD T1,T2 ;OFFSET INTO TABLE
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN SUCESSFUL
; PDB table type
;
JPDBTB: HLRE T1,GTBARG ;GET INDEX
CAMN T1,[-1] ;IS IT OUR JOB?
MOVE T1,USRJOB ;YES - LOAD JOB NUMBER
SKIPL T1 ;CAN'T HAVE NEGATIVE JOB NUMBERS
CAMLE T1,JOBN ;WITHIN LEGAL RANGE?
POPJ P, ;NOPE
ADD T1,JBTPDB ;OFFSET INTO JBTPDB
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JUMPE T1,CPOPJ ;A PDB FOR REQUESTED JOB?
HRRZS T1 ;KEEP JUST THE ADDRESS
LDB T2,GTBADR ;GET INDEX INTO THE PDB
ADD T1,T2 ;OFFSET INTO THE PDB
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN SUCESSFUL
RNGETB: LDB T1,GTBMAX ;GET MAXIMUM LENGTH OF THE TABLE
LDB T2,GTBTYP ;GET TABLE TYPE?
CAIE T2,.SLIXR ;INDEXED BY RANGE?
JRST CPOPJ1 ;NO--FAKED OUT BY GTBSIM
ADD T1,RNGTAB ;INDEX INTO RNGTAB
PUSHJ P,EXAMINE ;GET RANGE OF GETTAB TABLE
POPJ P, ;CAN'T
MOVEM T1,GTBRNG ;SAVE RANGE
HLRE T2,T1 ;GET LOWER LIMIT
HRRE T3,T1 ;GET UPPER LIMIT
HLRE T1,GTBARG ;GET USER SUPPLIED INDEX
CAMG T1,T3 ;GREATER THAN UPPER LIMIT?
CAMGE T1,T2 ;GREATER THAN OR EQUAL TO LOWER LIMIT?
POPJ P, ;NOPE
HRRE T2,GTBARG ;GET SUPPLIED TABLE NUMBER
CAIN T2,.GTIDX ;RANGE TABLE?
JRST RNGE.1 ;YES
LDB T2,GTBADR ;GET THE BASE ADDRESS OF THE TABLE
ADD T1,T2 ;ADD OFFSET
PUSHJ P,EXAMINE ;GET C(T1)
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN SUCESSFUL
RNGE.1: MOVE T1,GTBRNG ;GET LOWER,,UPPER LIMITS
JRST CPOPJ1 ;AND RETURN
SUBTTL .MAPI - Initialization
; This routine MUST be called before all others
; Call: MOVE .AP, flags + argument
; PUSHJ P,.MAPI
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED
;
.MAPI:: PUSH P,T1 ;SAVE T1
PUSH P,FILCHN ;SAVE OLD CHANNEL NUMBER
MOVE T1,[ZBEG,,ZBEG+1] ;SET UP BLT
SETZM ZBEG ;CLEAR FIRST WORD
BLT T1,ZEND-1 ;CLEAR OUR DATA STORAGE
POP P,FILCHN ;RESTORE OLD CHANNEL NUMBER
POP P,T1 ;RESTORE T1
SETOM CTXFLG ;INIT CONTEXT FLAG
PUSHJ P,CONTXT ;SAVE THE WORLD
PUSHJ P,DATINI ;GET INITIALIZE DATA
JRST MAPI.E ;CAN'T
PUSHJ P,CSHCLR ;CLEAR OUT THE CACHE
PUSHJ P,CSHMAP ;MAP THE HASH TABLE AND CHUNK PAGES
JRST MAPI.E ;FAILED
PUSHJ P,FILCLS ;CLOSE OFF CHANNEL FROM PREVIOUS CALL
PUSHJ P,@INITAB(F) ;SETUP MAPPING
JRST MAPI.E ;FAILED
PUSHJ P,CSHINI ;SET UP HASH TABLE CHUNKS AND LINKS
MOVE A1,PAGCNT ;GET COUNT OF AVAILABLE PAGES
SETZM PAGCNT ;SO WE DON'T CONFUSE THINGS
PUSHJ P,CSHSIZ ;SET UP CACHE SIZE
JRST MAPI.E ;CAN'T
PUSHJ P,SPYCHK ;SEE IF WE NEED TO SPY
JRST MAPI.E ;NEED TO BUT CAN'T DO IT
PUSHJ P,GTBINI ;INITIALIZE GETTAB STUFF
AOS (P) ;SKIP
MAPI.E: MOVEI T1,MAPDAT ;GET ADDRESS OF DATA BLOCK
MOVEM T1,USRACS+.AP ;GIVE IT TO THE CALLER
POPJ P, ;RETURN
; Data block setup
;
DATINI: MOVEI T1,.MPLEN ;GET LENGTH OF DATA BLOCK
MOVEM T1,MAPDAT+.MPDAT ;SAVE IT
MOVE T1,[%%MAP] ;GET OUR VERSION
MOVEM T1,MAPDAT+.MPVER ;SAVE IT
MOVE T2,USRACS+.AP ;GET ARG POINTER
MOVE F,.MPFNC(T2) ;GET FLAGS AND MAPPING TYPE
AND F,[FL.INI,,FR.TYP] ;MAKE SURE THERE'S NO JUNK
HRRZ T1,F ;JUST THE MAPPING TYPE
CAILE T1,.MPFMX ;A GOOD NUMBER?
ERR. (IMC,CPOPJ) ;ILLEGAL MAPPING TYPE
DATI.1: SKIPN T1,.MPNPC(T2) ;GET NUMBER OF PAGES TO USE
MOVEI T1,PAGNUM ;NONE--LOAD DEFAULT
SKIPE T3,.MPSPN(T2) ;GET STARTING PAGE NUMBER
JRST DATI.2 ;GOT SOMETHING
MOVEI T3,HGHPAG ;GET HIGHEST PAGE TO USE
SUBI T3,(T1) ;T2:= STARTING PAGE NUMBER
DATI.2: MOVEM T1,MAPDAT+.MPPGS ;SAVE FOR CURIOUS PROGRAMS
MOVEM T1,PAGCNT ;SAVE PAGE COUNT
MOVEM T3,MAPDAT+.MPCPN ;SAVE FOR CURIOUS PROGRAMS
SKIPGE T1,.MPDSN(T2) ;GET DEFAULT SECTION NUMBER
MOVEI T1,0 ;ASSUME ZERO IF CALLER IS STUPID
MOVEM T1,MAPDAT+.MPSEC ;SAVE IT
JRST CPOPJ1 ;RETURN
; See if we can SPY and if it's required
;
SPYCHK: MOVEM F,MAPFLG ;SAVE THE FLAGS
AOS MAPDAT+.MPSPY ;ASSUME IT'S ALL GONNA WORK
TLO F,FL.SPY ;CHEAT AND PRETEND WE CAN SPY
MOVEI T1,0 ;AN ADDRESS TO LOOK AT
PUSHJ P,PADDRESS ;LOAD IT INTO THE CACHE
SKIPA F,MAPFLG ;CAN'T
JRST CPOPJ1 ;GUESS WE CAN SPY
SETZM MAPDAT+.MPSPY ;SO THE CALLER KNOW WHATS GOING ON
TLZE F,FL.SPY ;DO WE NEED TO SPY?
ERR. (ECS,CPOPJ) ;YES--AND WE CAN'T DO IT!
JRST CPOPJ1 ;RETURN
; Determine the environment for GETTABing. This routine will try
; to figure out the CPU and paging type by looking at the Exec Data
; Vector and other data. If sucessful, some basic GETTABs will be
; performed for use later during GETTAB simulation.
;
GTBINI: TLNE F,FL.PPM ;PHYSICAL PAGE MAPPING?
POPJ P, ;THEN GETTABS ARE MEANINGLESS
SETZM HGHUEA ;DON'T KNOW THIS ONE YET
PJOB T1, ;GET OUR JOB NUMBER
MOVEM T1,USRJOB ;SAVE IT
SETZ T2, ;INIT INDEX
GTBI.1: MOVE T1,GTBEXT+0(T2) ;GET LOCATION
SKIPE GTBEXT+1(T2) ;HAVE AN OFFSET?
ADD T1,@GTBEXT+1(T2) ;YES--ADD IT IN
PUSHJ P,PEXAMINE ;GET C(T1)
JRST GTBI.2 ;CAN'T
MOVEM T1,@GTBEXT+2(T2) ;STORE RESULT
ADDI T2,3 ;ACCOUNT FOR THREE WORD ENTRIES
CAIGE T2,GTBEXL ;OFF THE END OF THE TABLE?
JRST GTBI.1 ;NO--LOOP
HLRZ T1,EDVCNT ;GET EDV CODE
HRRZ T2,EDVCNT ;GET WORD COUNT
CAIN T1,'EDV' ;LOOKING AT AN EDV?
CAIGE T2,.EDEPT ;AND DOES THIS EDV CONTAIN NEEDED DATA?
JRST GTBI.2 ;NO
MOVE T1,EDVDAT ;GET FLAGS AND CPU DATA
TLNE T1,(ED.KLP) ;THIS A KL PAGING MACHING?
SETOM KLPFLG ;YES
HRRZM T1,MAPDAT+.MPCPU ;SAVE CPU TYPE
JRST GTBI.3 ;GO CHECKOUT THE PAGING
; Determine the CPU type. Here if the EDV contains junk or unreasonable
; data. We know at this point that the monitor is pre-702 because the EDV
; is invalid. This implies that the first 112K of the monitor is unmapped
; (KA10 or KI10), or mapped one-for-one virtual-to-physical (KL10).
;
GTBI.2: MOVE T1,[%CCTYP] ;ARGUMENT TO RETURN CPU TYPE
PUSHJ P,GTBFRC ;TRY THE BRUTE FORCE METHOD
POPJ P, ;CAN'T
MOVEM T1,MAPDAT+.MPCPU ;SAVE IT
SETZM EPTADR ;DON'T BELEIVE THE EPT ADDRESS
SETZM KLPFLG ;CLEAR THE KL PAGING FLAG
; Get the paging type
;
GTBI.3: SKIPN T1,MAPDAT+.MPCPU ;GET CPU TYPE CODE
POPJ P, ;UNKNOWN CPU TYPE
MOVEI T2,.KARPR ;KA RELOCATION AND PROTECTION REGISTERS
CAIE T1,.PDP6 ;CP166 CPU?
CAIN T1,.KA10 ;KA10 CPU?
JRST GTBI.4 ;YES TO EITHER
CAIE T1,.KI10 ;A KI10 CPU?
SKIPN KLPFLG ;WHAT KIND OF PAGING?
SKIPA T2,[.KIPAG] ;KI10
MOVEI T2,.KLPAG ;KL10
CAIN T1,.KC10 ;KC10 CPU?
MOVEI T2,.KCPAG ;A DIFFERENT FLAVOR OF KL PAGING
GTBI.4: MOVEM T2,MAPDAT+.MPPAG ;SAVE PAGING TYPE
SKIPLE EPTADR ;HAVE AN EDV?
JRST GTBI.5 ;YES--MUST ASSUME THE EPT IS OK
MOVE T1,[%CCTOS] ;ARGUMENT TO RETURN THE EPT ADDRESS
PUSHJ P,GTBFRC ;TRY TO GET IT
POPJ P, ;LOSE
MOVEM T1,EPTADR ;SET IT
JRST GTBI.5 ;GO DO SOME BASIC GETTABS
; Do some basic GETTABs needed later for GETTAB simulation
;
GTBI.5: TLO F,FL.GTS ;LET GTBSIM DO IT'S STUFF
SETZ T4, ;CLEAR INDEX
GTBI.6: MOVE T1,GTBGTT+0(T4) ;GET A GETTAB ARGUMENT
PUSHJ P,GTBSIM ;SIMULATE A GETTAB
XCT GTBGTT+1(T4) ;DEFAULT VALUE OR RETURN
XCT GTBGTT+2(T4) ;SAVE VALUE
ADDI T4,2 ;ACCOUNT FOR THREE WORD ENTRIES
CAIGE T4,GTBGTL-1 ;END OF THE TABLE?
AOJA T4,GTBI.6 ;NO--LOOP
MOVMS SEGN ;MAKE SEGN POSITIVE
MOVE T1,JOBN ;GET THE NUMBER OF JOBS
ADDM T1,SEGN ;ADD TO TOTAL OF SEGMENTS
; Here to see if the monitor's high segment is mapped yet. We GETTAB
; the system uptime. If it's not equal to zero, then the monitor
; probably ran for some amount of time and the high segment must have
; been mapped.
;
GTBI.7: MOVE T1,[%CNSUP] ;SYSTEM UPTIME IN TICS
PUSHJ P,GTBFRC ;READ FROM MONITOR/.EXE FILE
SETZ T1, ;CAN'T READ, ASSUME NOT "MAPPED"
MOVEM T1,HIFLAG ;IF .NE. 0 THEN "HISEG MAPPED"
POPJ P, ;RETURN
; Here to do a GETTAB by the brute force method
;
GTBFRC: SKIPE HGHUEA ;KNOW THIS ADDR YET?
JRST GTBF.1 ;YES
MOVEI T2,DEFUEA ;GET DEFAULT HIGHEST UNMAPPED ADDR
MOVEM T2,HGHUEA ;SAVE TO WE DON'T DO PHYSICAL MAPPING
PUSHJ P,GTBF.1 ;DO THE GETTAB
SKIPA ;FAILED
AOS (P) ;SKIP
SETZM HGHUEA ;PUT BACK THE WAY WE FOUND IT
POPJ P, ;AND RETURN
GTBF.1: TLO F,FL.GTS ;ALLOW GTBSIM TO DO ITS STUFF
PUSHJ P,GTBSIM ;TRY THE GETTAB
POPJ P, ;FAILED
JRST CPOPJ1 ;RETURN
; Here when we can't determine how to do GETTABs
;
GTBI.E: TLZ F,FL.GTS ;COULDN'T SETUP GETTAB SIMULATION
POPJ P, ;RETURN
; Table of locations, offsets, and storage words
;
GTBEXT: EXP ABSTAB,000000,NUMTAB ;TABLE OF GETTAB TABLE POINTERS
EXP .JBEDV,000000,EDVADR ;EDV ADDRESS
EXP .EDCNT,EDVADR,EDVCNT ;EDV CODE AND WORD COUNT
EXP .EDDAT,EDVADR,EDVDAT ;FLAGS AND CPU DATA
EXP .EDEPT,EDVADR,EPTADR ;EPT ADDRESS
EXP .EDSPT,EDVADR,SPTADR ;SPT ADDRESS
GTBEXL==<.-GTBEXT> ;LENGTH OF TABLE
; Table of GETTAB arguments, defaults, and storage words
;
GTBGTT:
EXP <%VMHUA>,<MOVEI T1,DEFUEA>,<MOVEM T1,HGHUEA>;HIGHEST UNMAPPED EXEC ADDRESS
EXP <%VMPPB>,<MOVEI T1,DEFPBA>,<MOVEM T1,PPABEG>;BEGINING PER-PROCESS ADDRESS
EXP <%VMPPE>,<MOVEI T1,DEFPEA>,<MOVEM T1,PPAEND>;END PER-PROCESS ADDRESS
EXP <%CNSJN>,<POPJ P,>,<HRRZM T1,JOBN> ;HIGHEST LEGAL JOB
EXP <%CNSJN>,<POPJ P,>,<HLREM T1,SEGN> ;HIGHEST LEGAL SEGMENT
EXP <%CNPDB>,<POPJ P,>,<HRRZM T1,JBTPDB> ;JBTPDB POINTER
EXP <%CNVSH>,<MOVEI T1,DEFORG>,<MOVEM T1,HIORG> ;HIGH SEGMENT ORIGIN
EXP <.GTSGN,,.GTSLF>,<POPJ P,>,<HRRZM T1,JBTSGN>;JBTSGN POINTER
EXP <.GTIDX,,.GTSLF>,<POPJ P,>,<HRRZM T1,RNGTAB>;RNGTAB POINTER
EXP <.GTADR,,.GTSLF>,<POPJ P,>,<HRRZM T1,JBTADR>;JBTADR POINTER
EXP <.GTUPM,,.GTSLF>,<POPJ P,>,<HRRZM T1,JBTUPM>;JBTUPM POINTER
GTBGTL==.-GTBGTT ;LENGTH OF TABLE
SUBTTL .MAPJ - JOBPEK UUO simulation
; Simulate the JOBPEK UUO by by actually tracing down section and
; page maps for all types of paging.
; Call: MOVE .AP, argument address
; PUSHJ P,.MAPJ
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED
;
; Arg + 0/ <flags>B9+<job>B17+<wordcount>B35
; Arg + 1/ read address,,write address
;
; All legal JOBPEK flags are valid
;
.MAPJ:: PUSHJ P,CONTXT ;CONTEXT SWITCH
MOVE T2,USRACS+.AP ;GET ARG POINTER
HRRZ T3,F ;GET MAPPING CODE
CAIN T3,.MPMON ;MAPPING THE RUNNING MONITOR?
TLNN F,FL.JRM ;JOBPEK UUOS ON THE RUNNING MONITOR?
SKIPA T1,.MPFNC(T2) ;NO--GET FLAG WORD
JRST [JOBPEK T2, ;DO THE UUO
ERR. (JRW,CPOPJ) ;JOBPEK FAILED TO READ/WRITE JOB
AOS MAPDAT+.MPJPU ;COUNT THE JOBPEK UUO EXECUTION
JRST CPOPJ1] ;RETURN
MOVEM T1,JPKFLG ;SAVE
HRRZM T1,CPYBLK+.CBWCT ;SAVE WORD COUNT
HLRZ T1,1(T2) ;GET THE READ ADDRESS
MOVEM T1,CPYBLK+.CBRAD ;SAVE IT
HRRZ T1,1(T2) ;GET THE WRITE ADDRESS
MOVEM T1,CPYBLK+.CBWAD ;SAVE IT
PUSHJ P,JPKSIM ;SIMULATE A JOBPEK UUO
POPJ P, ;CAN'T
JRST CPOPJ1 ;AND RETURN
; Here on internal calls
;
JPKSIM: MOVE T1,JPKFLG ;GET FLAG WORD
TLNE T1,(JK.UPM) ;READ A UPMP?
JRST JPKUPM ;YES
TLNE T1,(JK.EVA) ;READ EVM?
JRST JPKEVA ;YES
JRST JPKRED ;GO READ
; All sucessful JOBPEK code should exit through here
;
JPKXIT: AOS MAPDAT+.MPJPK ;COUNT THE JOBPEK SIMULATION
JRST CPOPJ1 ;RETURN
; JOBPEK read
;
JPKRED: LDB T1,[POINT 9,JPKFLG,17] ;GET JOB NUMBER
PUSHJ P,PHYUPT ;GET UPT ADDRESS
POPJ P, ;CAN'T
MOVE VMA,CPYBLK+.CBRAD ;GET READ ADDRESS
PUSHJ P,PHYADR ;MAKE IT ADDRESSIBLE
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
MOVEM PMA,CPYBLK+.CBRAD ;SAVE READ ADDRESS
MOVEI T1,CPYBLK ;POINT TO COPY BLOCK
PUSHJ P,ADRCPY ;MOVE SOME DATA
SKIPE .CBWCT(T1) ;MORE WORDS TO PROCESS?
JRST JPKRED ;YES--LOOP BACK FOR MORE
JRST JPKXIT ;FINISH UP
; JOBPEK UPMP read
;
JPKUPM: TLNE T1,(JK.WRT) ;WANT TO WRITE THE UPMP?
ERR. (IWU,CPOPJ) ;ILLEGAL TO WRITE THE UPMP
HLRZS T1 ;GET HALF WORD WITH JOB NUMBER
ANDI T1,777 ;KEEP JUST THE JOB NUMBER
PUSHJ P,PHYUPT ;GET THE UPT ADDRESS
POPJ P, ;CAN'T
MOVE T1,PMA ;GET UPMP ADDRESS
PUSHJ P,PADDRESS ;MAKE IT ADDRESSABLE
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
MOVEM T1,CPYBLK+.CBRAD ;SAVE READ ADDRESS
MOVEI T1,CPYBLK ;POINT TO COPY BLOCK
PUSHJ P,ADRCPY ;MOVE SOME DATA
SKIPE .CBWCT(T1) ;MORE WORDS TO PROCESS?
JRST JPKUPM ;YES--LOOP BACK FOR MORE
JRST JPKXIT ;FINISH UP
; JOBPEK exec virtual address read
;
JPKEVA: TLNE T1,(JK.WRT) ;WANT TO WRITE EVM?
ERR. (IWE,CPOPJ) ;ILLEGAL TO WRITE EVM
JPKE.1: LDB T1,[POINT 9,JPKFLG,17] ;GET JOB WE'RE GONNA LOOK AT
PUSHJ P,PHYUPT ;GET IT'S UPT ADDRESS
POPJ P, ;CAN'T
MOVE VMA,CPYBLK+.CBRAD ;GET ADDRESS TO CONVERT
PUSHJ P,PHYFUN ;COMPUTE MAPPED PHYSICAL FUNNY ADDRESS
POPJ P, ;CAN'T
MOVEM PMA,CPYBLK+.CBRAD ;SAVE READ ADDRESS
MOVEI T1,CPYBLK ;POINT TO COPY BLOCK
PUSHJ P,ADRCPY ;MOVE SOME DATA
SKIPE .CBWCT(T1) ;MORE WORDS TO PROCESS?
JRST JPKE.1 ;YES--LOOP BACK FOR MORE
JRST JPKXIT ;FINISH UP
SUBTTL Address mapping -- Compute a mapped address
; Call: MOVE T1, address
; PUSHJ P,ADDRESS
; <return>
;
PADDRESS:TLOA F,FL.TPP ;ALLOW PHYSICAL PAGE MAPPING
VADDRESS:TLZ F,FL.TPP ;ALLOW VIRTUAL PAGE MAPPING
ADDRESS:TLZE T1,400000 ;CLEAR "SECTION RELATIVE" REFERENCES
HRL T1,MAPDAT+.MPSEC ;LOAD DEFAULT SECTION NUMBER
TLNN F,FL.SPY ;CAN WE SPY?
ERR. (ECS,CPOPJ) ;NO
TLNN F,FL.PPM!FL.TPP ;PHYSICAL PAGE MAPPING?
PUSHJ P,@CVTTAB(F) ;SEE IF NECESSARY TO CONVERT ADDRESS
JRST ADDR.1 ;NO ADDRESS FIXUP NECESSARY
PUSHJ P,SAVEF ;SAVE F
PUSHJ P,PHYEPT ;GET PHYSICAL EPT ADDRESS
POPJ P, ;CAN'T
MOVE VMA,T1 ;GET ADDRESS TO CONVERT
PUSHJ P,PHYADR ;COMPUTE MAPPED PHYSICAL ADDRESS
POPJ P, ;CAN'T
MOVE T1,PMA ;GET ADDRESS OF MAPPED PHYSICAL ADDRESS
AOS MAPDAT+.MPADR ;COUNT ADDRESS COMPUTATIONS
JRST CPOPJ1 ;AND RETURN
ADDR.1: MOVE A1,T1 ;GET ADDRESS TO MAP
LSH A1,-11 ;CONVERT TO A PAGE NUMBER
PUSHJ P,CSHFND ;SEE IF PAGE IN CACHE
JRST ADDR.2 ;NOT FOUND
PUSHJ P,CSHMRU ;MOVE TO TOP OF LIST
JRST ADDR.4 ;ONWARD
ADDR.2: PUSHJ P,CSHINS ;INSERT PAGE IN CACHE
MOVSI A3,(CB.CRE) ;GET A BIT
TDNN A3,.CBFLG(A2) ;PAGE ALREADY EXIST?
JRST ADDR.3 ;NO
PUSHJ P,@DESTAB(F) ;DESTROY THE PAGE
POPJ P, ;CAN'T
AOS MAPDAT+.MPPGD ;COUNT PAGE DESTROY
ADDR.3: MOVE A1,T1 ;GET ADDRESS WE'RE GOING TO MAP
LSH A1,-11 ;KEEP JUST THE PAGE NUMBER
MOVEM A1,.CBPRC(A2) ;STORE NEW PROCESS PAGE NUMBER
PUSHJ P,@CRETAB(F) ;CREATE THE PAGE
POPJ P, ;CAN'T
AOS MAPDAT+.MPPGC ;COUNT PAGE CREATE
ADDR.4: MOVE A1,.CBUSR(A2) ;GET USER PAGE NUMBER
LSH A1,11 ;CONVERT TO AN ADDRESS
ANDI T1,PAGSIZ-1 ;KEEP JUST THE OFFSET INTO THE PAGE
IOR T1,A1 ;FORM THE MAPPED ADDRESS
AOS MAPDAT+.MPADR ;COUNT ADDRESS COMPUTATIONS
JRST CPOPJ1 ;AND RETURN
SUBTTL Address mapping -- Convert virtual to physical addresses
; Convert an exec virtual "funny" address to a mapped physical address
; Call: MOVE PMA, physcial address of UPT
; MOVE VMA, exec virtual "funny" address
; PUSHJ P,PHYFUN
; <NON-SKIP> ;FAILED
; <SKIP> ;PMA:= MAPPED PHYSICAL ADDRESS
;
PHYFUN: CAML VMA,PPABEG ;RANGE CHECK IT
CAML VMA,PPAEND ;MUST BE A "FUNNY PAGE" ADDRESS
ERR. (IAD,CPOPJ) ;ILLEGAL ADDRESS
MOVEM T1,PAGFUN ;SAVE T1
MOVE T1,MAPDAT+.MPPAG ;GET PAGING TYPE
MOVE T1,FUNTAB-1(T1) ;GET FUNNY PAGE POINTER OFFSET IN UPT
EXCH T1,PAGFUN ;SAVE IT AND RESTORE T1
JRST PHYCOM ;ENTER COMMON PHYSICAL ADDRESS CODE
; KA rel/prot: No per-process space to map.
; KI paging: The pointer to the first age of funny space (340) comes
; immediately after the pointer for the user's page 777.
; KL paging: The ADDI T1,SECTAB(T4) has to be cancelled, since
; the pointer to page 340 is the 340th word in the
; UPT. TOPS-10 changes the first (and only) word of
; the SPT to contain the address of the UPT whenever
; a context switch occurs.
FUNTAB: EXP 0 ;KA RELOCATION AND PROTECTION REGISTERS
EXP <777+1>-340 ;KI PAGING ON A KI10, KL10 OR KS10
EXP -SECTAB ;KL PAGING ON A KL10 OR KS10
EXP -SECTAB ;KL PAGING ON A KC10
; Convert a virtual address to a mapped physical address
; Call: MOVE PMA, physical address of EPT or UPT
; MOVE VMA, virtual address
; PUSHJ P,PHYADR
; <NON-SKIP> ;FAILED
; <SKIP> ;PMA:= MAPPED PHYSICAL ADDRESS
;
PHYADR: SETZM PAGFUN ;CLEAR FUNNY PAGE UPT OFFSET
PHYCOM: PUSHJ P,SAVT4 ;SAVE T1, T2, T3, AND T4
MOVE T1,PMA ;GET EPT OR UPT ADDRESS
MOVE T2,VMA ;GET VIRTUAL ADDRESS TO CONVERT
MOVE T3,T2 ;COPY ADDRESS
LSH T3,-11 ;CONVERT TO PAGE NUMBER
MOVE T4,MAPDAT+.MPPAG ;GET PAGING TYPE
PUSHJ P,@PHYTAB-1(T4) ;DISPATCH TO THE PROPER PAGING ROUTINES
POPJ P, ;CAN'T CONVERT VRT TO PHY ADDRESS
MOVE PMA,T1 ;GET PHYSICAL ADDRESS
JRST CPOPJ1 ;AND RETURN
PHYTAB: EXP KARPR ;KA RELOCATION AND PROTECTION REGISTERS
EXP KIPAG ;KI PAGING ON A KI10, KL10 OR KS10
EXP KLPAG ;KL PAGING ON A KL10 OR KS10
; EXP KCPAG ;KL PAGING ON A KC10
; Return the physical address of the boot CPU's EPT
; Call: PUSHJ P,PHYEPT
; <NON-SKIP> ;FAILED
; <SKIP> ;PMA:= PHYSICAL ADDRESS, SPT:= SPT BASE
;
PHYEPT: MOVE PMA,EPTADR ;GET THE EPT ADDRESS
MOVE SPT,PMA ;HACK FOR TOPS-10 ONE WORD SPT
TLO F,FL.EPM ;FLAG EXEC MAPPING TO TAKE PLACE
JRST CPOPJ1 ;RETURN
; Return the physical address of a UPT
; Call: MOVE T1, job number
; PUSHJ P,PHYUPT
; <NON-SKIP> ;FAILED
; <SKIP> ;PMA:= PHYSICAL ADDRESS, SPT:= SPT BASE
;
PHYUPT: CAMLE T1,JOBN ;RANGE CHECK
ERR. (IJN,CPOPJ) ;ILLEGAL JOB NUMBER
PUSHJ P,SAVT1 ;SAVE T1
ADD T1,JBTUPM ;OFFSET TO THE JOB'S UPMP ENTRY
PUSHJ P,EXAMINE ;READ IT
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
HRRZ PMA,T1 ;UPMP PAGE NUMBER IS A RH QUANTITY
JUMPE PMA,[ERR. (JSO,CPOPJ)] ;JOB SWAPPED OUT
LSH PMA,11 ;CONVERT TO AN ADDRESS
MOVE SPT,PMA ;HACK FOR TOPS-10 ONE WORD SPT
JRST CPOPJ1 ;AND RETURN
SUBTTL Address mapping -- Copy a block of mapped data
; Copy a mapped block of data
; Call: MOVE T1, copy-block-address
; PUSHJ P,ADRCPY
;
ADRCPY: SKIPN A1,.CBWCT(T1) ;GET NUMBER OF WORDS TO MOVE
POPJ P, ;NOTHING TO DO
CAIG A1,2 ;MOVING A WORD OR TWO?
JRST @[EXP ADRC.1 ;1 WORD
EXP ADRC.2]-1(A1) ;2 WORDS
JRST ADRC.3 ;MORE THAN 2 WORDS
ADRC.1: MOVE A2,@.CBRAD(T1) ;GET A WORD
MOVEM A2,@.CBWAD(T1) ;PUT A WORD
JRST ADRC.4 ;UPDATE ADDRESSES AND RETURN
ADRC.2: MOVE A2,.CBRAD(T1) ;GET ADDRESS
ADDI A2,1 ;PLUS ONE
TRNN A2,PAGSIZ-1 ;OVERFLOW TO THE NEXT PAGE?
SOJA A1,ADRC.1 ;YES--JUST MOVE A SINGLE WORD
DMOVE A2,@.CBRAD(T1) ;GET TWO WORDS
DMOVEM A2,@.CBWAD(T1) ;PUT TWO WORDS
JRST ADRC.4 ;UPDATE ADDRESSES AND RETURN
ADRC.3: HRLZ A2,.CBRAD(T1) ;GET READ ADDRESS
HRR A2,.CBWAD(T1) ;GET WRITE ADDRESS
MOVE A3,.CBRAD(T1) ;GET READ ADDRESS AGAIN
ADDI A3,PAGSIZ ;ROUND UP A PAGE
TRZ A3,PAGSIZ-1 ; BUT NOT BEYOND A PAGE BOUNDRY
SUB A3,.CBRAD(T1) ;GET MAXIMUM WORDS WE CAN BLT
CAMLE A3,A1 ;TRYING TO MOVE TOO MANY WORDS?
SKIPA A3,A1 ;YES--ONLY COPY AS MANY AS REQUESTED
MOVE A1,A3 ;MAKE SURE THE COUNTS AGREE
ADD A3,.CBWAD(T1) ;COMPUTE LAST ADDRESS +1
BLT A2,-1(A3) ;COPY DATA
ADRC.4: EXCH A1,.CBWCT(T1) ;SWAP WORDS XFERED AND REQUESTED NUMBER
SUBM A1,.CBWCT(T1) ;UPDATE COUNT
ADDM A1,.CBRAD(T1) ;ADJUST SOURCE ADDRESS
ADDM A1,.CBWAD(T1) ;ADJUST DESTINATION ADDRESS
POPJ P, ;RETURN
SUBTTL Address mapping -- KA relocation and protection
KARPR: MOVE T3,T1 ;SAVE THE JOB NUMBER
ADD T1,JBTADR ;OFFSET INTO THE RELOC AND PROT TABLE
TLNN T2,777777 ;256K ADDRESS LIMITATION ON A KA10
PUSHJ P,EXAMINE ;READ THE ENTRY FOR JOB'S LOW SEGMENT
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
HLRZ T4,T1 ;GET PROTECTION
CAMG T2,T4 ;WITHIN THE LOW SEGMENT?
JRST KARPR3 ;YES
KARPR1: SKIPN T1,JBTUPM ;HAVE THIS TABLE?
JRST KARPR2 ;NO
ADD T1,T3 ;INDEX TO THE LOW SEG ENTRY
ADD T1,JOBN ;INDEX TO THE HIGH SEG ENTRY
PUSHJ P,EXAMINE ;READ THAT WORD
SETZ T1, ;CAN'T
JUMPE T1,[ERR. (JNA,CPOPJ)] ;JOB NOT ADDRESSABLE
HLRZ T4,T1 ;GET THE HIGH SEGMENT ORIGIN
TRZA T4,PAGSIZ-1 ;CLEAR ANY JUNK
KARPR2: MOVEI T4,400000 ;USE DEFAULT HIGH SEG ORIGIN
MOVE T1,T3 ;GET THE JOB NUMBER BACK AGAIN
ADD T1,JBTADR ;OFFSET INTO THE RELOC AND PROT TABLE
ADD T1,JOBN ;PLUS JOBN TO GET SEGMENT ENTRY
PUSHJ P,EXAMINE ;READ THE ENTRY FOR JOB'S HIGH SEGMENT
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
HLRZ T3,T1 ;GET HIGH SEGMENT LENGTH (PROTECTION)
ADDI T3,(T4) ;COMPUTE THE END OF THE SEGMENT
CAMG T2,T3 ;ADDRESS WITHIN THE BOUNDS
CAMGE T2,T4 ; OF THE HIGH SEGMENT?
ERR. (IAD,CPOPJ) ;ILLEGAL ADDRESS
SKIPA ;JOIN COMMON CODE
KARPR3: MOVEI T4,0 ;LOW SEG ORIGIN IS ZERO
TLZ T1,777777 ;KEEP ONLY PHYSICAL RELOCATION ADDRESS
SUB T2,T4 ;SUBTRACT SEGMENT ORIGIN
ADDI T1,(T2) ;OFFSET TO DESIRED VIRTUAL ADDRESS
PUSHJ P,PADDRESS ;MAKE IT ADDRESSIBLE
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
JRST CPOPJ1 ;AND RETURN
SUBTTL Address mapping -- KI paging
KIPAG: TLZN F,FL.EPM ;DOING EXEC PHYSICAL MAPPING?
JRST KIPAG1 ;NO--UPMP DECODING
CAIGE T2,^D112*^D1024 ;IS THE ADDRESS IN THE LOWER 112K?
JRST KIPAG2 ;YES--THAT'S EASY
CAIGE T2,^D128*^D1024 ;BETTER NOT BE IN FUNNY SPACE
ERR. (IAD,CPOPJ) ;BECAUSE THATS AN ILLEGAL ADDRESS
KIPAG1: LDB T3,[POINT 9,T2,26] ;GET THE TARGET PAGE NUMBER
ADD T3,PAGFUN ;INCLUDE FUNNY PAGE OFFSET (IF ANY)
LSHC T3,-1 ;DIVIDE BY TWO
ADDI T1,(T3) ;COMPUTE UPMP INDEX
PUSHJ P,PEXAMINE ;READ THE UPMP ENTRY FOR THAT PAGE
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
TLNN T4,400000 ;ODD PAGE?
MOVSS T1 ;NO--SWAP HALVES SO LDB GETS RIGHT PAGE
LDB T1,[POINT 13,T1,35] ;GET PAGE NUMBER OF TARGET PAGE
LSH T1,11 ;CONVERT TO AN ADDRESS
TDZA T2,[-1-<PAGSIZ-1>] ;GET OFFSET INTO THE PAGE
KIPAG2: SKIPA T1,T2 ;GET PHYSICAL EXEC ADDRESS
ADDI T1,(T2) ;COMPUTE PHYSICAL TARGET ADDRESS
PUSHJ P,PADDRESS ;MAKE IT ADDRESSIBLE
ERR. (IAD,CPOPJ) ;ILLEGAL ADDRESS
JRST CPOPJ1 ;AND RETURN
SUBTTL Address mapping -- KL paging
KLPAG: MOVNI T4,2 ;GET INITIAL VALUE FOR POINTER FLAG
MOVEM T4,PAGFLG ;SET IT
HLRZ T4,T2 ;GET SECTION NUMBER
CAILE T4,MXSECN ;RANGE CHECK SECTION NUMBER
ERR. (IAD,CPOPJ) ;ILLEGAL ADDRESS
ADDI T1,SECTAB(T4) ;INDEX INTO SECTION MAP POINTERS
SKIPN T4,PAGFUN ;HAVE A FUNNY PAGE OFFSET?
JRST KLPAGM ;NO--ONWARD
ADD T1,PAGFUN ;INCLUDE FUNNY PAGE OFFSET (IF ANY)
ADDI T1,(T3) ;AND OFFSET BY THE FUNNY PAGE NUMBER
SETZ T3, ;SO WE DON'T DO USE IT TWICE
AOS PAGFLG ;SAY WE'RE POINTING TO A PAGE MAP NOW
; Decode a map entry
; If PAGFLG = -2, T1 has addr in the section map part of EPT/UPT
; If PAGFLG = -1, T1 has addr of entry in the page map for this section
; If PAGFLG = 0, T1 had the mapping for the page in question
;
; T2 has virtual address
; T3 has virtual page number
;
KLPAGM: PUSHJ P,PADDRESS ;COMPUTE THE ADDRESS OF A MAP ENTRY
ERR. (JNA,CPOPJ) ;JOB NOT ADDRESSABLE
AOSLE PAGFLG ;FLAG WHAT WE'RE LOOKING AT
JRST KLPAGX ;FOUND THE PAGE WE'RE LOOKING FOR
LDB T4,[POINT 3,(T1),2] ;GET THE ENTRY TYPE
JRST @KLPAGT(T4) ;DISPATCH BASED ON POINTER TYPE
KLPAGT: EXP KLPAG0 ;(0) NO ACCESS
EXP KLPAG1 ;(1) IMMEDIATE
EXP KLPAG2 ;(2) SHARED
EXP KLPAG3 ;(3) INDIRECT
EXP KLPAGE ;(4) ILLEGAL
EXP KLPAGE ;(5) ILLEGAL
EXP KLPAGE ;(6) ILLEGAL
EXP KLPAGE ;(7) ILLEGAL
KLPAGX: ANDI T2,PAGSIZ-1 ;GET JUST THE INDEX INTO THE PAGE
ADDI T1,(T2) ;GET TARGET ADDRESS TO EXAMINE
JRST CPOPJ1 ;RETURN
KLPAGE: ERR. (UPC,CPOPJ) ;UNIMPLEMENTED KL PAGING CODE
; KL paging code 0 - No access
;
KLPAG0: ERR. (NAP,CPOPJ) ;NO ACCESS TO REQUESTED PAGE
; KL paging code 1 - Immediate
;
KLPAG1: MOVE T1,(T1) ;GET POINTER
TLNE T1,77 ;STORAGE MEDIUM NON-ZERO? (TOPS20)
ERR. (PNC,CPOPJ) ;PAGE NOT IN CORE
ANDI T1,17777 ;KEEP JUST THE PAGE MAP PAGE NUMBER
LSH T1,11 ;CONVERT TO AN ADDRESS
SKIPN PAGFLG ;POINTING TO A PAGE MAP FOR A SECTION?
JRST KLPAGM ;NO--LOOP BACK AND DECODE MAP POINTER
ANDI T3,777 ;KEEP ONLY RELATIVE PAGE # IN SECTION
ADDI T1,(T3) ;INDEX INTO PAGE MAP FOR TARGET PAGE
SETZ T3, ;CLEAR FOR NEXT TIME
JRST KLPAGM ;LOOP BACK AND DECODE MAP POINTER
; KL paging code 2 - Shared
;
KLPAG2: HRRZ T1,(T1) ;GET INDEX INTO THE SPT
CAIE T1,0 ;RANGE CHECK
ERR. (SIR,CPOPJ) ;SPT INDEX OUT OF RANGE
ADD T1,SPT ;OFFSET
SETOM PAGFLG ;STILL LOOKING AT A PAGE MAP
JRST KLPAGM ;LOOP BACK AND DECODE MAP POINTER
; KL paging code 3 - Indirect
;
KLPAG3: LDB T4,[POINT 9,(T1),17] ;GET INDEX INTO SECONDARY PAGE MAP
HRRZ T1,(T1) ;GET INDEX INTO THE SPT
CAIE T1,0 ;RANGE CHECK
ERR. (SIR,CPOPJ) ;SPT INDEX OUT OF RANGE
ADD T1,SPT ;OFFSET
ADDI T1,(T4) ;OFFSET INTO THE SECONDARY PAGE MAP
SETOM PAGFLG ;STILL LOOKING AT A PAGE MAP
JRST KLPAGM ;LOOP BACK AND DECODE MAP POINTER
SUBTTL Address mapping -- Dispatch tables
; Initialization
;
INITAB: EXP MONINI ;MONITOR
EXP JOBINI ;JOB
EXP FILINI ;FILE
; Page creation
;
CRETAB: EXP MONCRE ;MONITOR
EXP JOBCRE ;JOB
EXP FILCRE ;FILE
; Page destruction
;
DESTAB: EXP MONDES ;MONITOR
EXP JOBDES ;JOB
EXP FILDES ;FILE
; Deposit
;
DEPTAB: EXP MONDEP ;MONITOR
EXP JOBDEP ;JOB
EXP FILDEP ;FILE
; Mapping code names
;
CODTAB: [ASCIZ |monitor|] ;MONITOR
[ASCIZ |job|] ;JOB
[ASCIZ |file|] ;FILE
; Convert virtual to physical address
;
CVTTAB: EXP MONCVT ;MONITOR
EXP JOBCVT ;JOB
EXP FILCVT ;FILE
SUBTTL Address mapping -- Monitor
; Here at initialization to setup the page tables
;
MONINI: TLNE F,FL.EXE ;CHECK FOR ILLEGAL FLAGS
ERR. (CMF,CPOPJ) ;CONFLICTING MAPPING CODE AND FLAGS
JRST CPOPJ1 ;RETURN
; Here to create a SPY page
; Call: MOVE A2, cache chunk address
; PUSHJ P,MONCRE
; <NON-SKIP> ;SPY PAGE CREATE FAILED
; <SKIP> ;PAGE CREATED
;
MONCRE: PUSHJ P,SAVT2 ;SAVE T1 AND T2
MOVE T1,.CBPRC(A2) ;GET PROCESS PAGE NUMBER TO MAP
MOVE T2,.CBUSR(A2) ;GET USER PAGE NUMBER TO MAP INTO
PUSHJ P,PAGSPY ;CREATE A SPY PAGE
POPJ P, ;CAN'T
MOVE T1,.CBFLG(A2) ;GET FLAGS
TLO T1,(CB.CRE) ;PAGE WAS JUST CREATED
TLNE F,FL.PPM!FL.TPP ;PHYSICAL PAGE MAPPING?
TLO T1,(CB.PHY) ;YES
MOVEM T1,.CBFLG(A2) ;UPDATE FLAGS
JRST CPOPJ1 ;RETURN
; Here to destroy a page
; Call: MOVE A2, cache chunk address
; PUSHJ P,MONDES
; <NON-SKIP> ;DESTROY FAILED
; <SKIP> ;USER PAGE DESTROYED
;
MONDES: PUSHJ P,SAVT2 ;VE T1 AND T2
MOVSI T2,(CB.CRE) ;GET PAGE CREATED BIT
TDNN T2,.CBFLG(A2) ;HAVE A PAGE THERE?
POPJ P, ;NO
MOVE T1,.CBUSR(A2) ;GET THE USER PAGE NUMBER
PUSHJ P,PAGDES ;DESTROY IT
POPJ P, ;CAN'T
MOVSI T2,(CB.CRE!CB.PHY) ;GET SOME BITS
ANDCAM T2,.CBFLG(A2) ;CLEAR THEM
JRST CPOPJ1 ;RETURN
; Here to deposit a word in the running monitor. The arguments are
; nicely setup for the POKE. UUO and validity checking has already
; been done, so there's little to do.
; Call: MOVE T1, mapped address
; MOVE T2, old contents
; MOVE T3, new contents
; PUSHJ P,MONDEP
;
MONDEP:
; *** TURN OFF PHYSICAL POKE FOR NOW ***
; TLNN F,FL.PPM ;PHYSICAL PAGE MAPPING?
TDZA T2,T2 ;MONITOR VIRTUAL ADDRESSING
MOVEI T2,UU.PHY ;PHYSICAL CORE ADDRESSING
MOVE T1,[3,,POKBLK] ;SET UP UUO
TLNE F,FL.PAT ;PATCHING?
POKE. T1,(T2) ;WRITE A WORD
ERR. (,CPOPJ) ;POKE. UUO FAILURE
JRST CPOPJ1 ;RETURN
; Test if conversion from virtual to physical address is needed
; Call: PUSHJ P,MONCVT
; <NON-SKIP> ;NO CONVERSION NECESSARY
; <SKIP> ;CONVERT
;
MONCVT: POPJ P, ;NEVER CONVERT
SUBTTL Address mapping -- Job
; Here at initialization to validate arguments and pick up the
; job number.
;
JOBINI: TLNN F,FL.PPM!FL.EXE ;CHECK FOR ILLEGAL FLAGS
ERR. (CMF,CPOPJ) ;CONFLICTING MAPPING CODE AND FLAGS
MOVE T1,USRACS+.AP ;GET ARGUMENT
SKIPG T1,.MPARG(T1) ;GET JOB NUMBER
ERR. (IJN,CPOPJ) ;ILLEGAL JOB NUMBER
MOVEM T1,USRJOB ;WHICH IS THE JOB NUMBER FOR JOB MODE
JRST CPOPJ1 ;RETURN
; Here to create a page and map in one page from the target job
; Call: MOVE A2, index into page tables
; PUSHJ P,JOBCRE
; <NON-SKIP> ;COULDN'T MAP PAGE
; <SKIP> ;PAGE MAPPED
;
JOBCRE: TLNE F,FL.PPM!FL.TPP ;PHYSICAL PAGE MAPPING?
POPJ P, ;CAN'T DO THAT FOR A JOB
PUSHJ P,SAVT2 ;SAVE T1 AND T2
MOVSI T1,(CB.CRE) ;GET A BIT
TDNE T1,.CBFLG(A2) ;HAS A PAGE BEEN CREATED?
JRST JOBC.1 ;YES
MOVE T1,.CBUSR(A2) ;GET A OUR PAGE NUMBER
PUSHJ P,PAGACC ;CHECK PAGE ACCESSIBILITY
SKIPA ;NOT THERE
JRST JOBC.1 ;ONWARD
PUSHJ P,PAGCRE ;DO IT
POPJ P, ;CAN'T
JOBC.1: MOVSI T2,(CB.CRE) ;GET A BIT
IORM T2,.CBFLG(A2) ;MARK PAGE AS BEING CREATED
JOBC.2: HRLZ T1,USRJOB ;GET JOB NUMBER
HRRI T1,PAGSIZ ;WANT A WHOLE PAGE
MOVEM T1,UUOARG+0 ;SAVE IT
MOVE T1,.CBUSR(A2) ;GET OUR PAGE NUMBER
HRL T1,.CBPRC(A2) ;GET PAGE WE'RE MAPPING
LSH T1,11 ;CONVERT TO MAPPED ADDR,,USER ADDR
MOVEM T1,UUOARG+1 ;SAVE IT
MOVEI T1,UUOARG ;SET UP UUO
JOBPEK T1, ;MAP THE JOB'S PAGE INTO OURS
ERR. (,CPOPJ) ;JOBPEK UUO FAILURE
PUSHJ P,JOBDES ;ZAP THE PAGE TABLE ENTRIES
JFCL ;CAN'T FAIL
JRST CPOPJ1 ;RETURN
; All that is needed to invalidate a mapped job page is to
; zap a couple of entries. It would be counterproductive
; to actually destroy the pages in question.
;
JOBDES: PUSHJ P,SAVT1 ;SAVE T1
MOVSI T1,(CB.CRE) ;GET THE CREATED BIT
ANDCAM T1,.CBFLG(A2) ;CLEAR IT
JRST CPOPJ1 ;RETURN
JOBDEP: TLNN F,FL.PAT ;PATCHING?
POPJ P, ;NO
HRLZ T4,USRJOB ;GET THE JOB NUMBER
TLO T4,(JK.WRT) ;LITE THE WRITE BIT
HRRI T4,1 ;WRITE ONLY ONE WORD
MOVEM T4,UUOARG+0 ;SAVE FLAG WORD
MOVSI T4,POKBLK+2 ;WORD TO WRITE IS IN POKBLK+2
HRR T4,POKBLK+0 ;GET USER VIRTUAL ADDRESS FOR JOB
MOVEM T4,UUOARG+1 ;SAVE IT
MOVEI T4,UUOARG ;SET UP UUO
JOBPEK T4, ;WRITE THAT JOB'S CORE IMAGE
ERR. (,CPOPJ) ;JOBPEK UUO FAILURE
JRST JOBDES ;INVALIDATE THAT PAGE AND RETURN
; Test if conversion from virtual to physical address is needed
; Call: PUSHJ P,JOBCVT
; <NON-SKIP> ;NO CONVERSION NECESSARY
; <SKIP> ;CONVERT
;
JOBCVT: POPJ P, ;NEVER CONVERT
SUBTTL Address mapping -- File
FILINI: MOVE T1,USRACS+.AP ;GET USER'S ARG POINTER
MOVE T1,.MPARG(T1) ;GET ADDRESS OF FILESPEC
PUSHJ P,FILOPN ;OPEN THE FILE
ERR. (MIF,CPOPJ) ;MAPPER INITIALIZATION FAILURE
TLNN F,FL.EXE ;EXE FILE MAPPING?
JRST CPOPJ1 ;NO - ALL DONE
PUSHJ P,EXEDIR ;LOAD .EXE DIRECTORY INTO CORE
ERR. (MIF,CPOPJ) ;MAPPER INITIALIZATION FAILURE
JRST CPOPJ1 ;RETURN
; Here to create a page and map in one page from a file
; Call: MOVE A2, index into page tables
; PUSHJ P,FILCRE
; <NON-SKIP> ;COULDN'T MAP PAGE
; <SKIP> ;PAGE MAPPED
;
FILCRE: PUSHJ P,SAVT4 ;SAVE T1, T2, T3, AND T4
MOVSI T1,(CB.PHY) ;GET PHYSICAL BIT
TLNE F,FL.PPM!FL.TPP ;DOING SOME FLAVOR OF PHYSICAL MAPPING?
IORM T1,.CBFLG(A2) ;YES
TLZ F,FL.TPP ;CLEAR TEMPORARY PHYSICAL PAGE MAPPING
MOVE T1,.CBUSR(A2) ;GET PAGE IN QUESTION
PUSHJ P,PAGCHK ;DOES IT EXIST
POPJ P, ;NO--AND WE CAN'T CREATE IT
MOVSI T1,(CB.CRE) ;GET A BIT
IORM T1,.CBFLG(A2) ;REMEMBER WE JUST CREATED THE PAGE
MOVE T1,.CBPRC(A2) ;GET PROCESS PAGE NUMBER
PUSHJ P,EXEPAG ;FIND THE FILE PAGE NUMBER
POPJ P, ;CAN'T
LSH T1,2 ;MULTIPLY TIMES 4 TO GET BLOCK NUMBER
TLNN F,FL.SIO ;SUPER I/O?
ADDI T1,1 ;NO - ADJUST BLOCK NUMBER
PUSHJ P,FILIPS ;POSITION FOR INPUT
POPJ P, ;CAN'T
MOVE T1,.CBUSR(A2) ;GET OUR PAGE NUMBER
LSH T1,11 ;COMVERT TO AN ADDRESS
SUBI T1,1 ;-1
HRLI T1,-PAGSIZ ;MAKE AN IOWD
MOVEM T1,IOLIST ;SAVE IT
PUSHJ P,FILRED ;READ THE PAGE
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN
; Here to destroy a page
; Call: MOVE A2, index into page tables
; PUSHJ P,MONDES
; <NON-SKIP> ;DESTROY FAILED
; <SKIP> ;USER PAGE DESTROYED
;
FILDES: PUSHJ P,SAVT1 ;SAVE T1
MOVSI T1,(CB.CRE) ;GET A BIT
TDNN T1,.CBFLG(A2) ;PAGE MUST EXIST
POPJ P, ;LOSE
MOVE T1,.CBUSR(A2) ;GET OUR PAGE NUMBER
PUSHJ P,PAGDES ;DESTROY IT
POPJ P, ;CAN'T
MOVSI T1,(CB.CRE) ;GET THE CREATED BIT
ANDCAM T1,.CBFLG(A2) ;CLEAR IT
JRST CPOPJ1 ;RETURN
FILDEP: TLNN F,FL.PAT ;PATCHING?
POPJ P, ;NO
HALT .
; Test if conversion from virtual to physical address is needed
; Call: PUSHJ P,FILCVT
; <NON-SKIP> ;NO CONVERSION NECESSARY
; <SKIP> ;CONVERT
;
FILCVT: TLNN F,FL.GTS ;GETTABS SETUP?
POPJ P, ;NOT A MONITOR IF NO GETTABS SIMULATION
SKIPE HIORG ;SKIP IF WE DON'T KNOW THE HISEG ORIGIN
CAMGE T1,HIORG ;BELOW THE HIGH SEG ORIGIN?
JRST FILC.1 ;YES
SKIPE HIFLAG ;HIGH SEGMENT MAPPED?
AOS (P) ;YES--DECODE PAGE MAP
POPJ P, ;ELSE TREAT AS A PHYSICAL REFERENCE
FILC.1: CAMLE T1,HGHUEA ;BEYOND HIGHEST UNMAPPED EXEC ADDRESS?
AOS (P) ;NEED TO CONVERT
POPJ P, ;RETURN
SUBTTL Cache management -- Clear out the cache
; This routine must be called at the start of cache initialization.
; It will attempt to destroy any pages available for caching so
; we can get a fresh start.
;
CSHCLR: MOVE A1,MAPDAT+.MPCPN ;GET FIRST PAGE NUMBER
MOVE A2,PAGCNT ;GET COUNT OF AVAILABLE PAGES
CSHC.1: MOVE T1,A1 ;LOAD A PAGE NUMBER
PUSHJ P,PAGACC ;DOES THE PAGE EXIST?
SKIPA ;NO
PUSHJ P,PAGDES ;DESTROY IT
JFCL ;MAYBE THE PAGE WASN'T THERE
ADDI A1,1 ;ADVANCE PAGE NUMBER
SOJG A2,CSHC.1 ;LOOP FOR ALL PAGES
POPJ P, ;AND RETURN
SUBTTL Cache management -- Map the cache
; This routine will dynamically allocate the hash table
; and chunks out of the pages allotted for mapping. It is
; also responsible for setting and/or adjusting the count
; of available pages for caching and the starting page to
; cache.
;
CSHMAP: MOVE A1,MAPDAT+.MPCPN ;GET FIRST PAGE NUMBER TO USE
LSH A1,11 ;CONVERT TO AN ADDRESS
MOVEM A1,HASHTA ;SAVE HASH TABLE ADDRESS
MOVE A1,PAGCNT ;GET NUMBER OF PAGES TO CACHE
LSH A1,2 ;MULTIPLY BY 4 TO GET HASH TABLE SIZE
MOVEM A1,HASHTL ;SAVE LENGTH OF HASH TABLE
ADD A1,HASHTA ;GET LAST ADDRESS IN HASH TABLE
MOVEM A1,HASHCA ;SAVE AS ADDRESS OF FIRST CHUNK
MOVE A2,PAGCNT ;GET NUMBER OF PAGES TO CACHE
IMULI A2,.CBLEN ;GET WORDS NEEDED FOR CHUNKS
ADDI A1,(A2) ;TOTAL UP WORDS NEEDED
MOVE A2,A1 ;COPY NUMBER OF WORDS
SUB A1,HASHCA ;GET LENGTH OF CHUNK AREA
MOVEM A1,HASHCL ;SAVE IT
TRZE A2,PAGSIZ-1 ;ON A PAGE BOUNDRY?
ADDI A2,PAGSIZ ;ROUND UP
LSH A2,-11 ;GET FIRST AVAILABLE PAGE FOR MAPPING
MOVEM A2,CSHPAG ;SAVE IT
SUB A2,MAPDAT+.MPCPN ;GET PAGES USED FOR TABLE AND CHUNKS
MOVN A3,A2 ;GET NEGATIVE COUNT
CAML A2,PAGCNT ;HAVE ENOUGH AVAILABLE?
ERR. (HAF,CPOPJ) ;HASH TABLE ALLOCATION FAILURE
EXCH A2,PAGCNT ;SWAP
SUBM A2,PAGCNT ;UPDATE NEW NUMBER OF PAGES AVAILABLE
IMULI A3,.CBLEN ;GET WORDS TO TRIM
ADDM A3,HASHCL ;ADJUST LENGTH OF CHUNK AREA
MOVE A1,HASHTA ;GET ADDRESS OF HASH TABLE
LSH A1,-11 ;CONVERT TO A PAGE NUMBER
MOVE A2,CSHPAG ;GET FIRST PAGE TO CACHE
SUB A2,A1 ;GET NUMBER OF PAGES TO CREATE
CSHM.1: MOVE T1,A1 ;GET A PAGE NUMBER
PUSHJ P,PAGACC ;DOES THE PAGE ALREADY EXIST?
SKIPA ;NOT THERE
JRST CSHM.2 ;ON TO THE NEXT PAGE
PUSHJ P,PAGCRE ;CREATE IT
ERR. (HAF,CPOPJ) ;HASH TABLE ALLOCATION FAILURE
CSHM.2: ADDI A1,1 ;POINT TO NEXT PAGE
SOJG A2,CSHM.1 ;LOOP FOR ALL PAGES
JRST CPOPJ1 ;RETURN
SUBTTL Cache management -- Set up the hash tables and links
;Call: PUSHJ P,CSHINI
; <return>
;
CSHINI: MOVE A1,HASHTA ;GET STARTING ADDRESS OF HASH TABLE
SKIPA A2,HASHTL ;GET LENGTH OF HASH TABLE
; Link all hash entries to themselves
CSHI.1: ADDI A1,2 ;ADDRESS OF SELF
MOVEM A1,.CBNHB(A1) ;STORE NEXT
MOVEM A1,.CBPHB(A1) ;AND PREVIOUS TO SELF
SUBI A2,1 ;ADVANCE TO NEXT
SOJG A2,CSHI.1 ;AND LOOP FOR ALL
; Link header entry links to themselves
MOVEI A1,CBHEAD ;ADDRESS OF HEADER
MOVEM A1,CBHEAD+.CBNAB ;STORE NEXT
MOVEM A1,CBHEAD+.CBPAB ;AND PREVIOUS TO SELF
MOVEM A1,CBHEAD+.CBNHB ;STORE NEXT IN INVALID LIST
MOVEM A1,CBHEAD+.CBPHB ;AND PREVIOUS TO SELF
MOVE A1,HASHCA ;POINT TO START OF CHUNKS
MOVE A2,CSHPAG ;GET STARTING PAGE FOR CACHING
MOVE A3,PAGCNT ;GET COUNT OF PAGES TO CACHE
MOVSI A4,(CB.AVA) ;GET CHUNK AVAILABLE BIT
CSHI.2: MOVEM A2,.CBUSR(A1) ;SAVE PAGE NUMBER FOR THIS CHUNK
MOVEM A4,.CBFLG(A1) ;MARK CHUNK AVAILABLE
MOVE T1,.CBUSR(A1) ;GET A PAGE NUMBER
ADDI A1,.CBLEN ;POINT TO NEXT CHUNK
ADDI A2,1 ;ADVANCE TO NEXT PAGE NUMBER
SOJG A3,CSHI.2 ;LOOP
POPJ P, ;RETURN
SUBTTL Cache management -- Set cache size
; Change the cache size. This routine will increase
; or decrease the size of the cache on the fly.
; Call: MOVE A1, size of cache
; PUSHJ P,CSHSIZ
; <error> ;Cant allocate more space
; <normal> ;cache expanded/contracted
;
CSHSIZ: SKIPGE A1 ;NEGATIVE SIZE IS BAD
ERR. (ICS,CPOPJ) ;ILLEGAL CACHE SIZE REQUESTED
PUSHJ P,SAVT1 ;SAVE T1
MOVE T1,A1 ;COPY SIZE
SUB T1,PAGCNT ;MINUS CURRENT SIZE
JUMPE T1,CPOPJ1 ;RETURN IF NO CHANGE
JUMPG T1,CSHS.2 ;EXPAND CACHE
CSHS.1: PUSHJ P,CSHDEA ;DEALLOCATE A CHUNK
AOJL T1,CSHS.1 ;LOOP FOR ALL
JRST CSHS.3 ;AND EXIT
CSHS.2: PUSHJ P,CSHALC ;ALLOCATE A CHUNK
ERR. (NFC,CPOPJ) ;NO FREE CHUNKS FOR CACHE
SOJG T1,CSHS.2 ;LOOP FOR ALL
CSHS.3: MOVE T1,PAGCNT ;GET UPDATED CACHED PAGE COUNT
MOVEM T1,MAPDAT+.MPCPC ;TELL THE CALLER
JRST CPOPJ1 ;RETURN
SUBTTL Cache management -- Allocate a chunk for the cache
; Call: PUSHJ P,CSHALC
; <error> ;Cant allocate another chunk
; <normal> ;another chunk allocated
;
CSHALC: MOVE A2,HASHCA ;POINT TO START OF CHUNKS
MOVE A3,HASHCL ;GET LENGTH OF CHUNK AREA
MOVSI A4,(CB.AVA) ;GET THE AVAILABLE CHUNK BIT
CSHA.1: TDNE A4,.CBFLG(A2) ;CHUNK FREE?
JRST CSHA.2 ;YES
ADDI A2,.CBLEN ;POINT TO NEXT CHUNK
SUBI A3,.CBLEN ;COUNT
JUMPG A3,CSHA.1 ;LOOP 'TIL WE FIND ONE
POPJ P, ;LOSE
CSHA.2: ANDCAM A4,.CBFLG(A2) ;NO LONGER FREE
AOS PAGCNT ;COUNT CHUNKS INSERTED
;Link new chunk at beginning of "free" hash list
MOVE A3,CBHEAD+.CBNHB ;GET FORWARD FROM HEADER
MOVE A4,.CBPHB(A3) ;AND PREVIOUS FROM TOP
MOVEM A2,CBHEAD+.CBNHB ;INSERT US AT THE TOP
MOVEM A2,.CBPHB(A3) ;PREVIOUS OF OLD TOP IS US
MOVEM A3,.CBNHB(A2) ;NEXT OF US IS OLD TOP
MOVEM A4,.CBPHB(A2) ;PREVIOUS OF US IS HEADER
;Clear out any trash
SETZM .CBPRC(A2) ;CLEAR PROCESS PAGE NUMBER
;Link new chunk at end of accessed list
MOVE A3,CBHEAD+.CBPAB ;GET FORWARD FROM HEADER
MOVE A4,.CBNAB(A3) ;AND NEXT FROM TOP
MOVEM A2,CBHEAD+.CBPAB ;INSERT US AT THE TOP
MOVEM A2,.CBNAB(A3) ;NEXT OF OLD TOP IS US
MOVEM A3,.CBPAB(A2) ;PREVIOUS OF US IS OLD TOP
MOVEM A4,.CBNAB(A2) ;NEXT OF US IS HEADER
JRST CPOPJ1 ;AND SKIP RETURN
SUBTTL Cache management -- Deallocate a page from the cache
; Call: PUSHJ P,CSHDEA
; <return>
;
CSHDEA:
; Delete from access chunk chain
MOVE A2,CBHEAD+.CBPAB ;LAST CHUNK IN CACHE
MOVE A3,.CBNAB(A2) ;GET NEXT
MOVE A4,.CBPAB(A2) ;GET PREVIOUS
MOVEM A3,.CBNAB(A4) ;REMOVE FROM FORWARD CHAIN
MOVEM A4,.CBPAB(A3) ;REMOVE FROM PREVIOUS CHAIN
;Delete from hash chain
MOVE A3,.CBNHB(A2) ;GET NEXT
MOVE A4,.CBPHB(A2) ;GET PREVIOUS
MOVEM A3,.CBNHB(A4) ;REMOVE FROM FORWARD CHAIN
MOVEM A4,.CBPHB(A3) ;REMOVE FROM PREVIOUS CHAIN
;Return core, fix up cache size
MOVE A3,.CBFLG(A2) ;GET THE FLAG WORD
TLZE A3,(CB.CRE) ;PAGE REALLY EXIST?
PUSHJ P,@DESTAB(F) ;YES--DESTROY IT
JFCL
TLO A3,(CB.AVA) ;MARK CHUNK AVAILABLE
MOVEM A3,.CBFLG(A2) ;UPDATE FLAG WORD
SOS PAGCNT ;CACHE IS 1 CHUNK SMALLER
POPJ P, ;AND RETURN
SUBTTL Cache management -- Find an entry in the cache
; Call: MOVE A1, page number
; PUSHJ P,CSHFND
; <error> ;page not in cache T2/ address to insert
; <normal> ;page in cache T2/ address of entry
;
CSHFND:
; Hash page number to initial entry in table
MOVE A4,HASHTL ;GET HASH TABLE LENGTH
LSH A4,-1 ;DIVIDE BY 2
MOVE A2,A1 ;COPY PAGE NUMBER
IDIV A2,A4 ;HASH INTO TABLE
LSH A3,1 ;DOUBLE REMAINDER
MOVE A4,HASHTA ;GET HASH TABLE ADDRESS
ADDI A4,(A3) ;INDEX INTO IT
MOVE A2,A4 ;COPY POINTER TO START
AOS MAPDAT+.MPHSF ;COUNT HASH TABLE SEARCHES
TLNN F,FL.PPM!FL.TPP ;PHYSICAL PAGE MAPPING?
SKIPA A3,[TDNN A3,.CBFLG(A2)] ;GET TEST IF PHYSICAL BIT MUST BE OFF
MOVE A3,[TDNE A3,.CBFLG(A2)] ;GET TEST IF PHYSICAL BIT MUST BE ON
MOVEM A3,CSHXCT ;SAVE IT
MOVSI A3,(CB.PHY) ;GET THE PHYSICAL BIT
; Loop through hash chain from initial probe
;
CSHF.1: CAMN A4,.CBNHB(A2) ;SEE IF LOOPED AROUND
POPJ P, ;YES--NOT IN TABLE
MOVE A2,.CBNHB(A2) ;COPY CURRENT PAGE
XCT CSHXCT ;TEST FOR PHYSICAL PAGE
CAME A1,.CBPRC(A2) ;MATCH THE PROCESS PAGE NUMBER?
SKIPA
JRST CPOPJ1 ;FOUND IT--RETURN
AOS MAPDAT+.MPHSC ;WRONG PAGE--COUNT COLLISIONS
JRST CSHF.1 ;AND LOOP
SUBTTL Cache management -- Insert (replace) a new page in the cache
; Call: MOVE A1, page number
; MOVE A2, entry to add after
; PUSHJ P,CSHINS
; <return>
;
CSHINS: CAMN A2,CBHEAD+.CBPAB ;SAME AS ENTRY WE FIDDLE
JRST [MOVEM A1,.CBPRC(A2) ;SAVE NEW PROCESS PAGE NUMBER
JRST CSHMRU] ;AND MOVE TO TOP
; Store page number, replace last page in access chain
PUSH P,A2 ;SAVE ENTRY TO ADD
MOVE A2,CBHEAD+.CBPAB ;GET LAST IN CHAIN
;Unlink from old hash chain
MOVE A3,.CBNHB(A2) ;GET NEXT
MOVE A4,.CBPHB(A2) ;GET PREVIOUS
MOVEM A3,.CBNHB(A4) ;REMOVE FROM FORWARD CHAIN
MOVEM A4,.CBPHB(A3) ;REMOVE FROM PREVIOUS CHAIN
;Link this chunk into correct hash chain
MOVE A1,A2
POP P,A2 ;RESTORE ENTRY TO ADD
MOVE A4,.CBNHB(A2) ;AND NEXT LINK
MOVEM A1,.CBNHB(A2) ;INSERT AFTER PREVIOUS
MOVEM A1,.CBPHB(A4) ;AND AS PREVIOUS OF OLD
MOVEM A2,.CBPHB(A1) ;STORE PREVIOUS OF OLD AS OURS
MOVEM A4,.CBNHB(A1) ;STORE NEXT OF OLD AS OURS
MOVE A2,A1
JRST CSHMRU ;AND MOVE ENTRY TO TOP OF LIST
SUBTTL Cache management -- Move entry to top of list
; Call: MOVE A2, entry to move
; PUSHJ P,CSHMRU
; <return>
;
CSHMRU: CAMN A2,CBHEAD+.CBNAB ;WE AT THE TOP?
POPJ P, ;YES--SAVE SOME WORK
; Delete from current access chain position
MOVE A3,.CBNAB(A2) ;GET NEXT
MOVE A4,.CBPAB(A2) ;GET PREVIOUS
MOVEM A3,.CBNAB(A4) ;REMOVE FROM FORWARD CHAIN
MOVEM A4,.CBPAB(A3) ;REMOVE FROM PREVIOUS CHAIN
; Relink into "most recently used" position
MOVE A3,CBHEAD+.CBNAB ;GET FORWARD FROM HEADER
MOVE A4,.CBPAB(A3) ;AND PREVIOUS FROM TOP
MOVEM A2,CBHEAD+.CBNAB ;INSERT US AT THE TOP
MOVEM A2,.CBPAB(A3) ;PREVIOUS OF OLD TOP IS US
MOVEM A3,.CBNAB(A2) ;NEXT OF US IS OLD TOP
MOVEM A4,.CBPAB(A2) ;PREVIOUS OF US IS HEADER
POPJ P, ;AND RETURN
SUBTTL Text I/O -- Character
; Input a character converting tabs to spaces and lower to upper case
; Call: PUSHJ P,TYI
; <RETURN> ;T1:= CHARACTER
;
TYI: ILDB T1,BYTPTR ;GET A CHARACTER
CAIN T1,"I"-100 ;TAB?
MOVEI T1," " ;YES - CONVERT TO A SPACE
CAIG T1,"Z"+40 ;CHECK FOR A LOWER CASE
CAIGE T1,"A"+40 ; CHARACTER THAT NEEDS TO BE
SKIPA ; CONVERTED TO AN UPPER CASE
TRZ T1," " ; CHARACTER
POPJ P, ;RETURN
; Output a character
; Call: MOVE T1, character
; PUSHJ P,TYO
; <RETURN>
;
TYO: SKIPN BYTPTR ;OUTPUT TO TTY?
JRST [OUTCHR T1 ;YES
POPJ P,] ;RETURN
SOSLE BYTCNT ;COUNT CHARACTERS
IDPB T1,BYTPTR ;SAVE CHARACTER
POPJ P, ;RETURN
SUBTTL Text I/O -- ASCIZ
; Output an ASCIZ string
; Call: MOVE T1, string address
; PUSHJ P,TSTRG
; <RETURN>
;
TSTRG: HRLI T1,(POINT 7,) ;MAKE A BYTE POINTER
PUSH P,T1 ;SAVE IT
TSTR.1: ILDB T1,(P) ;GET A CHARACTER
JUMPE T1,TSTR.2 ;DONE?
PUSHJ P,TYO ;TYPE IT
JRST TSTR.1 ;LOOP
TSTR.2: POP P,T1 ;PHASE STACK
POPJ P, ;RETURN
SUBTTL Text I/O -- Sixbit
; Input a possibly quoted sixbit word
; Call: PUSHJ P,SIXIN
; <RETURN> ;T1:= WORD, T2:= TERMINATING CHARACTER
;
SIXIN: MOVE T2,[POINT 6,T3] ;GET BYTE POINTER TO ATOM BUFFER
PUSH P,[0] ;RESERVE A WORD
SETZ T3, ;CLEAR RESULT
PUSHJ P,FLUSH ;FLUSH LEADING SPACES AND TABS
CAIN T1,"#" ;WANTS TO INPUT IN OCTAL?
JRST OCTIN ;YES
SKIPA ;ANALYZE CHARACTER
SIXI.1: PUSHJ P,TYI ;GET A CHARACTER
CAIN T1,"""" ;QUOTE CHARACTER?
JRST SIXI.2 ;YES
SKIPE (P) ;QUOTING?
JUMPN T1,SIXI.4 ;ALL CHARACTERS ARE LEGAL
JRST SIXI.3 ;NO
SIXI.2: PUSHJ P,TYI ;GET NEXT CHARACTER
CAIN T1,"""" ;ANOTHER QUOTE?
JRST SIXI.4 ;SAVE IT
SETCMM (P) ;NO - TOGGLE QUOTE FLAG
SKIPE (P) ;QUOTING?
JRST SIXI.4 ;YES
SIXI.3: CAIL T1,"0" ;RANGE
CAILE T1,"9" ; CHECK
CAIL T1,"A" ; THE
CAILE T1,"Z" ; CHARACTER
JRST SIXI.5 ;NOT A GOOD CHARACTER
SIXI.4: TLNE T2,77 ;WORD FULL YET?
JRST SIXI.1 ;YES - IGNORE CHARACTER
SUBI T1," " ;CONVERT ASCII TO SIXBIT
IDPB T1,T2 ;SAVE THE CHARACTER
JRST SIXI.1 ;GET ANOTHER ONE
SIXI.5: MOVE T2,T1 ;GET TERMINATING CHARACTER
MOVE T1,T3 ;GET RESULT
POP P,(P) ;TRIM STACK
POPJ P, ;RETURN
; Output a sixbit word
; Call: MOVE T1, word
; PUSHJ P,SIXOUT
; <RETURN>
;
SIXOUT: SKIPN T2,T1 ;COPY WORD TO OUTPUT
POPJ P, ;NOTHING TO DO
SIXO.1: LSHC T1,6 ;SHIFT IN A CHARACTER
ANDI T1,77 ;NO JUNK
ADDI T1," " ;CONVERT TO ASCII
PUSHJ P,TYO ;OUTPUT IT
JUMPN T2,SIXO.1 ;LOOP
POPJ P, ;RETURN
SUBTTL Text I/O -- Octal
; Input an octal word
; Call: PUSHJ P,OCTIN
; <RETURN> ;T1:= WORD, T2:= TERMINATING CHARACTER
;
OCTIN: SETZ T2, ;CLEAR RESULT AND MASK
PUSHJ P,FLUSH ;EAT LEADING SPACES AND TABS
CAIL T1,"A" ;CHECK FOR
CAILE T1,"Z" ; A LETTER
JRST OCTI.2 ;ASSUME A DIGIT
PUSHJ P,BACKUP ;BACKUP THE BYTE POINTER
JRST SIXIN ;GO INPUT SIXBIT
OCTI.1: PUSHJ P,TYI ;GET A CHARACTER
OCTI.2: CAIL T1,"0" ;RANGE CHECK
CAILE T1,"7" ; FOR AN OCTAL DIGIT
JRST OCTI.3 ;NO GOOD - FINISH UP
LSH T2,3 ;SHIFT RESULT
SUBI T1,"0" ;CONVERT ASCII TO OCTAL
IOR T2,T1 ;INCLUDE THE DIGIT
JRST OCTI.1 ;LOOP
OCTI.3: EXCH T1,T2 ;SWAP RESULT AND TERMINATING CHARACTER
POPJ P, ;RETURN
; Output an octal word
; Call: MOVE T1, word
; PUSHJ P,OCTOUT
;
OCTOUT: SKIPL T1 ;NEGATIVE?
JRST OCTO.1 ;NO
PUSH P,T1 ;SAVE NUMBER
MOVEI T1,"-" ;GET MINUS SIGN
PUSHJ P,TYO ;OUTPUT IT
POP P,T1 ;GET NUMBER
MOVMS T1 ;MAKE IT POSITIVE
OCTO.1: IDIVI T1,10 ;DIVIDE BY RADIX
PUSH P,T2 ;SAVE REMAINDER
SKIPE T1 ;DONE?
PUSHJ P,OCTO.1 ;RECURSE
POP P,T1 ;GET A DIGIT
ADDI T1,"0" ;CONVERT TO ASCII
JRST TYO ;OUTPUT CHARACTER AND RETURN
; Output a CRLF
; Call: PUSHJ P,TCRLF
;
TCRLF: MOVEI T1,15 ;GET A <CR>
PUSHJ P,TYO ;TYPE IT
MOVEI T1,12 ;GET A <LF>
JRST TYO ;TYPE IT AND RETURN
; Output a PC
; Call: MOVE T1, PC
; PUSHJ P,PCOUT
;
PCOUT: TLNN T1,-1 ;A SECTION NUMBER?
JRST PCOU.1 ;NO
PUSH P,T1 ;SAVE PC
HLRZS T1 ;GET SECTION
PUSHJ P,OCTOUT ;TYPE IT
MOVEI T1,"," ;GET SEPARATOR
PUSHJ P,TYO ;TYPE IT
PUSHJ P,TYO ;AGAIN
POP P,T1 ;RESTORE PC
HRRZS T1 ;GET RELATIVE PC
PCOU.1: HRLO T2,T1 ;MAKE IT PC,,-1
PCOU.2: LSHC T1,3 ;SHIFT IN A DIGIT
ANDI T1,7 ;STRIP OFF JUNK
ADDI T1,"0" ;MAKE IT ASCII
PUSHJ P,TYO ;TYPE IT
TRNE T2,-1 ;DONE SIX DIGITS YET?
JRST PCOU.2 ;NO--LOOP
POPJ P, ;RETURN
SUBTTL Text I/O -- Filespec
; Output a filespec
; Call: PUSHJ P,FILOUT
; <RETURN>
;
FILOUT: MOVE T1,FOPBLK+.FODEV ;GET DEVICE
PUSHJ P,SIXOUT ;OUTPUT IT
MOVEI T1,":" ;GET SEPARATOR
PUSHJ P,TYO ;TYPE COLON
MOVE T1,LERBLK+.RBNAM ;GET NAME
PUSHJ P,SIXOUT ;OUTPUT IT
MOVEI T1,"." ;GET SEPARATOR
PUSHJ P,TYO ;OUTPUT PERIOD
HLLZ T1,LERBLK+.RBEXT ;GET EXTENSION
PUSHJ P,SIXOUT ;OUTPUT IT
MOVEI T1,"[" ;GET PATH DELIMITER
PUSHJ P,TYO ;OUTPUT
SKIPGE T1,PTHBLK+.PTPPN ;GET PPN
JRST FILO.1 ;IT'S SIXBIT
HLRZS T1 ;GET PROJECT NUMBER
PUSHJ P,OCTOUT ;OUTPUT IT
MOVEI T1,"," ;GET SEPARATOR
PUSHJ P,TYO ;OUTPUT IT
HRRZ T1,PTHBLK+.PTPPN ;GET PROGRAMMER NUMBER
PUSHJ P,OCTOUT ;OUTPUT
JRST FILO.2 ;ONWARD
FILO.1: PUSHJ P,SIXOUT ;OUTPUT IT
FILO.2: MOVEI T3,PTHBLK+.PTSFD ;POINT TO START OF SFDS
FILO.3: SKIPN (T3) ;HAVE AN SFD
JRST FILO.4 ;END OF PATH
MOVEI T1,"," ;GET SEPARATOR
PUSHJ P,TYO ;OUTPUT IT
MOVE T1,(T3) ;GET AN SFD
PUSHJ P,SIXOUT ;OUTPUT IT
AOJA T3,FILO.3 ;LOOP
FILO.4: MOVEI T1,"]" ;GET END OF PATH
JRST TYO ;OUTPUT IT AND RETURN
SUBTTL Text I/O -- Miscellaneous
; Set up byte pointer and count
; Call: MOVE T1, address to store text or 0 for TTY output
; MOVE T2, character count
; PUSHJ P,TXTSET
;
TXTSET: SKIPE T1 ;OUTPUT TO TTY?
HRLI T1,(POINT 7,) ;NO--MAKE A BYTE POINTER
MOVEM T1,BYTPTR ;SAVE IT
MOVEM T2,BYTCNT ;SAVE CHARACTER COUNT
POPJ P, ;RETURN
; Flush leading spaces and tabs
; Call: PUSHJ P,FLUSH
; <RETURN> ;T1:= FIRST NON-BLANK CHARACTER
;
FLUSH: PUSHJ P,TYI ;GET A CHARACTER
CAIN T1," " ;A SPACE?
JRST FLUSH ;YES - EAT IT
POPJ P, ;RETURN
; Back up the text byte pointer 1 character
; Call: PUSHJ P,BACKUP
;
; On return, T1 has been updated with the current character
;
BACKUP: MOVE T1,BYTPTR ;GET THE BYTE POINTER
ADD T1,[70000,,0] ;BACKUP 1 CHARACTER
SKIPG T1 ;OVER A WORD BOUNDRY?
SUB T1,[430000,,1] ;YES - BACKUP A WORD
MOVEM T1,BYTPTR ;SAVE UPDATED POINTER
LDB T1,BYTPTR ;LOAD THE PREVIOUS CHARACTER
POPJ P, ;RETURN
SUBTTL Paging -- Check accessibility
; Check accessibility of a page in our address space
; Call: MOVE T1, page number
; PUSHJ P,PAGACC
; <NON-SKIP> ;PAGE DOES NOT EXIST
; <SKIP> ;PAGE EXISTS
;
PAGACC: MOVEM T1,UUOARG ;SAVE PAGE NUMBER
HRLI T1,.PAGCA ;LOAD A FUNCTION CODE
PAGE. T1, ;READ ACCESS BITS
SETO T1, ;ASSUME PAGE NOT THERE
TLNN T1,(PA.GNE) ;NON-EXISTANT PAGE?
AOS (P) ;NO
MOVE T1,UUOARG ;RELOAD PAGE NUMBER
POPJ P, ;RETURN
; Check to see if the a reference to a page will cause
; an illegal memory reference. If so, create it.
; Call: MOVE T1, page number
; PUSHJ P,PAGCHK
; <NON-SKIP> ;PAGE CREATE FAILED
; <SKIP> ;PAGE EXISTS
;
PAGCHK: PUSHJ P,PAGACC ;CHECK ACCESSIBILITY
JRST PAGCRE ;CREATE IT AND RETURN
JRST CPOPJ1 ;IT ALREADY EXISTS
SUBTTL Paging -- Create/Destroy
; Create or destroy a page in our address space
; Call: MOVE T1, page number
; PUSHJ P,PAGCRE/PAGDES
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED
;
PAGDES: TLO T1,(PA.GAF) ;LITE THE DESTROY BIT
PAGCRE: MOVEM T1,UUOARG+1 ;SAVE IT
MOVEI T1,1 ;ONE WORD
MOVEM T1,UUOARG+0 ;SAVE WORD COUNT
MOVE T1,[.PAGCD,,UUOARG] ;SET UP UUO
PAGE. T1, ;CREATE OR DESTROY A PAGE
ERR. (,.+2) ;CAN'T
AOS (P) ;FORCE SKIP RETURN
MOVE T1,UUOARG+1 ;RELOAD THE PAGE NUMBER
TLZ T1,(PA.GAF) ;TURN OFF THE ALTERNATE FUNCTION BIT
POPJ P, ;RETURN
SUBTTL Paging -- SPY page creation
; Create a SPY page using physical or virtual mapping
; Call: MOVE T1, monitor page
; MOVE T2, user page
; PUSHJ P,PAGSPY
; <NON-SKIP> ;FAILED
; <SKIP> ;SUCEEDED
;
PAGSPY: HRLZM T1,UUOARG+1 ;SAVE MONITOR PAGE NUMBER
HRRM T2,UUOARG+1 ;SAVE USER PAGE NUMBER
MOVEI T1,1 ;ONE WORD
MOVEM T1,UUOARG+0 ;SAVE WORD COUNT
MOVE T1,[.PAGSP,,UUOARG] ;SET UP UUO
TLNN F,FL.PPM!FL.TPP ;PHYSICAL PAGE MAPPING?
TDZA T2,T2 ;NO
MOVEI T2,UU.PHY ;YES
PAGE. T1,(T2) ;CREATE A SPY PAGE
ERR. (,.+2) ;CAN'T
AOS (P) ;FORCE SKIP RETURN
TLZ F,FL.TPP ;CLEAR TEMPORARY PHYSICAL PAGE MAPPING
HLRZ T1,UUOARG+1 ;RELOAD MONITOR PAGE NUMBER
HRRZ T2,UUOARG+2 ;RELOAD USER PAGE NUMBER
POPJ P, ;RETURN
SUBTTL File I/O -- Open a file
; Open a file pointer to by the calling program
; Call: MOVE T1, address of ASCIZ filespec
; PUSHJ P,FILOPN
;
FILOPN: PUSHJ P,SCAN ;SCAN FILESPEC AND LOAD UUO BLOCKS
POPJ P, ;CAN'T
TLNE F,FL.SIO ;SUPER I/O?
TLNN F,FL.EXE ;AND .EXE FILE?
SKIPA ;OK
ERR. (CMF,CPOPJ) ;CONFLICTING MAPPING CODE AND FLAGS
MOVEI T1,.FORED ;ASSUME ONLY READING
TLNE F,FL.PAT ;PATCHING?
MOVEI T1,.FOSAU ;YES - USE UPDATE MODE
TLNE F,FL.SIO ;SUPER I/O?
MOVEI T1,.FOSIO ;YES - USE SUPER I/O MODE
TLO T1,(FO.ASC) ;ASSIGN A CHANNEL
MOVEM T1,FOPBLK+.FOFNC ;SAVE FUNCTION WORD
MOVEI T1,.IODMP ;DUMP MODE
TLNE F,FL.PIO ;PHYSICAL ONLY LOOKUP/ENTER?
TLO T1,(UU.PHS) ;YES
MOVEM T1,FOPBLK+.FOIOS ;SAVE IT
MOVEI T1,LERBLK ;GET LOOKUP/ENTER BLOCK ADDRESS
MOVEM T1,FOPBLK+.FOLEB ;SAVE IT
MOVEI T1,LERSIZ ;GET SIZE OF LOOKUP/ENTER BLOCK
MOVEM T1,LERBLK+.RBCNT ;SAVE IT
MOVE T1,[PTHSIZ,,PTHBLK] ;GET PATH BLOCK ADDRESS
MOVEM T1,FOPBLK+.FOPAT ;SAVE FOR READING PATH BACK
SKIPE PTHBLK+.PTPPN ;HAVE A DIRECTORY?
HRRZM T1,LERBLK+.RBPPN ;YES--SAVE FOR LOOKUP/ENTER
MOVE T1,[FILSIZ,,FILBLK] ;POINT TO THE BLOCK
MOVEM T1,FOPBLK+.FOFSP ;SAVE RETURNED FILESPEC POINTER
MOVE T1,[FOPSIZ,,FOPBLK] ;SET UP UUO
FILOP. T1, ;OPEN THE FILE
ERR. (,CPOPJ) ;FILOP. UUO FAILURE
MOVE T1,FOPBLK+.FOFNC ;GET FUNCTION CODE WORD
AND T1,[FO.CHN] ;KEEP JUST THE CHANNEL NUMBER
MOVEM T1,FILCHN ;SAVE IT
PUSHJ P,FILXTR ;EXTRACT THE FULL FILESPEC
JRST CPOPJ1 ;RETURN
; Here to extract the actual filespec and return it
; to the caller.
;
FILXTR: MOVE T1,PTHBLK+.PTSTR ;GET DEVICE NAME
MOVEM T1,FOPBLK+.FODEV ;SET IT JUST INCASE PATH. UUO FAILS
MOVEI T1,FILTAB ;POINT TO TABLE
SKIPE FILBLK+.FOFDV ;HAVE A RETURNED FILESPEC?
FILX.1: SKIPN (T1) ;END OF TABLE?
JRST FILX.2 ;YES
HLRZ T2,(T1) ;GET SOURCE ADDRESS
HRRZ T3,(T1) ;GET DESTINATION ADDRESS
SKIPE T4,(T2) ;GET A WORD
MOVEM T4,(T3) ;PUT A WORD
AOJA T1,FILX.1 ;LOOP
FILX.2: SETZM MAPDAT+.MPAFS ;CLEAR FIRST WORD
MOVE T1,[MAPDAT+.MPAFS,,MAPDAT+.MPAFS+1] ;SET UP BLT
BLT T1,MAPDAT+.MPAFS+.MPFWD ;CLEAR BLOCK
MOVEI T1,MAPDAT+.MPAFS ;POINT TO ACTUAL FILESPEC STORAGE
MOVEI T2,<.MPFWD*5>-1 ;GET MAXIMUM BYTE COUNT
PUSHJ P,TXTSET ;SETUP BYTE POINTER AND COUNT
PUSHJ P,FILOUT ;OUTPUT FILESPEC
POPJ P, ;RETURN
; Translation table
;
FILTAB: FILBLK+.FOFDV,,FOPBLK+.FODEV ;DEVICE
FILBLK+.FOFFN,,LERBLK+.RBNAM ;FILE NAME
FILBLK+.FOFEX,,LERBLK+.RBEXT ;EXTENSION
FILBLK+.FOFPP,,PTHBLK+.PTPPN ;PPN
FILBLK+.FOFSF+0,,PTHBLK+.PTSFD+0;SFD #1
FILBLK+.FOFSF+1,,PTHBLK+.PTSFD+1;SFD #2
FILBLK+.FOFSF+2,,PTHBLK+.PTSFD+2;SFD #3
FILBLK+.FOFSF+3,,PTHBLK+.PTSFD+3;SFD #4
FILBLK+.FOFSF+4,,PTHBLK+.PTSFD+4;SFD #5
EXP 0 ;TERMINATE TABLE
SUBTTL File I/O -- Close a file
; Close a file
; Call: PUSHJ P,FILCLS
;
FILCLS: SKIPN T1,FILCHN ;WE ONLY USE EXTENDED CHANNELS
POPJ P, ;DON'T ZAP CHANNEL ZERO
IORI T1,.FOREL ;INCLUDE THE FUNCTION CODE
MOVEM T1,FOPBLK+.FOFNC ;SAVE IT
MOVE T1,[1,,FOPBLK] ;SET UP UUO
FILOP. T1, ;CLOSE THE FILE
JFCL ;IGNORE ERRORS
SETZM FILCHN ;SO WE DON'T TRY THIS AGAIN
POPJ P, ;RETURN
SUBTTL File I/O -- Position a file
; Position file for input or output
; Call: MOVE T1, block number
; PUSHJ P,FILIPS ;INPUT
; PUSHJ P,FILOPS ;OUTPUT
;
FILIPS: MOVEM T1,FOPBLK+.FOIOS ;SAVE BLOCK NUMBER
MOVEI T1,.FOUSI ;USETI FUNCTION
JRST FILPOS ;CONTINUE
FILOPS: MOVEM T1,FOPBLK+.FOIOS ;SAVE BLOCK NUMBER
MOVEI T1,.FOUSO ;USETO FUNCTION
FILPOS: IOR T1,FILCHN ;INCLUDE THE CHANNEL NUMBER
MOVEM T1,FOPBLK+.FOFNC ;SAVE FUNCTION WORD
MOVE T1,[2,,FOPBLK] ;SET UP UUO
FILOP. T1, ;POSITION FOR INPUT OR OUTPUT
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN
SUBTTL File I/O -- Input/Output
FILRED: SKIPA T1,[.FOINP] ;INPUT FUNCTION
FILWRT: MOVEI T1,.FOOUT ;OUTPUT FUNCTION
SETZM IOLIST+1 ;TERMINATE LIST
IOR T1,FILCHN ;INCLUDE THE CHANNEL NUMBER
MOVEM T1,FOPBLK+.FOFNC ;SAVE FUNCTION WORD
MOVEI T1,IOLIST ;POINT TO THE I/O COMMAND LIST
MOVEM T1,FOPBLK+.FOIOS ;TELL THE MONITOR
MOVE T1,[2,,FOPBLK] ;SET UP UUO
FILOP. T1, ;READ OR WRITE THE FILE
POPJ P, ;CAN'T
JRST CPOPJ1 ;RETURN
SUBTTL File I/O -- Scan a filespec
; This routine will scan off a filespec and load the appropriate
; locations in the FILOP., LOOKUP/ENTER and PATH. UUO blocks
; Call: MOVE T1, address of ASCIZ filespec
; PUSHJ P,SCAN
;
SCAN: HRLOI T2,377777 ;A LARGE NUMBER
PUSHJ P,TXTSET ;SET UP FOR TEXT I/O
SETZM FOPBLK ;CLEAR THE FIRST WORD
MOVE T1,[FOPBLK,,FOPBLK+1] ;SET UP BLT
BLT T1,FOPBLK+FOPSIZ-1 ;CLEAR THE FILOP. UUO BLOCK
SETZM LERBLK ;CLEAR THE FIRST WORD
MOVE T1,[LERBLK,,LERBLK+1] ;SET UP BLT
BLT T1,LERBLK+LERSIZ-1 ;CLEAR THE LOOKUP/ENTER UUO BLOCK
SETZM PTHBLK ;CLEAR THE FIRST WORD
MOVE T1,[PTHBLK,,PTHBLK+1] ;SET UP BLT
BLT T1,PTHBLK+PTHSIZ-1 ;CLEAR THE PATH. UUO BLOCK
GETPPN T1, ;GET OUR PPN
JFCL ;INCASE OF JACCT
MOVEM T1,FILPPN ;SAVE IT
TLZ F,FL.DEV!FL.NAM!FL.EXT!FL.DIR ;CLEAR SCANNER FLAGS
SCAN.1: PUSHJ P,SIXIN ;GET A FILESPEC PART
JUMPN T1,SCAN.4 ;SEE WHAT WE GOT
SCAN.2: CAIN T2,"." ;AN EXTENSION?
JRST SCAN.5 ;YES
CAIE T2,"[" ;A PATH?
CAIN T2,"<" ;2741 STYLE?
JRST SCAN.6 ;YES TO EITHER
CAIN T2," " ;SPACE?
JRST SCAN.1 ;KEEP SCANNING
PUSHJ P,BACKUP ;BACKUP TO THE TERMINATING CHARACTER
JRST SCNDEF ;CHECK LEGALITY AND DO DEFAULTING
; Device
;
SCAN.3: TLOE F,FL.DEV ;ALREADY HAVE A DEVICE?
ERR. (DDI,CPOPJ) ;DOUBLE DEVICE ILLEGAL
MOVEM T1,FOPBLK+.FODEV ;SAVE DEVICE
JRST SCAN.1 ;KEEP SCANNING
; File name
;
SCAN.4: CAIN T2,":" ;A DEVICE?
JRST SCAN.3 ;YES
TLOE F,FL.NAM ;ALREADY HAVE A FILE NAME?
ERR. (DFI,CPOPJ) ;DOUBLE FILE NAME ILLEGAL
MOVEM T1,LERBLK+.RBNAM ;SAVE FILE NAME
JRST SCAN.2 ;GO EXAMINE TERMINATOR
; Extension
;
SCAN.5: TLOE F,FL.EXT ;ALREADY HAVE AN EXTENSION
ERR. (DEI,CPOPJ) ;DOUBLE EXTENSION ILLEGAL
PUSHJ P,SIXIN ;GET A WORD
HLLZM T1,LERBLK+.RBEXT ;SAVE EXTENSION
JRST SCAN.2 ;GO EXAMINE TERMINATOR
; Path
;
SCAN.6: TLOE F,FL.DIR ;ALREADY HAVE A DIRECTORY?
ERR. (DPI,CPOPJ) ;DOUBLE PATH ILLEGAL
PUSHJ P,SCNPTH ;SCAN A PATH
POPJ P, ;FAILED
CAIE T2,"]" ;END OF PATH?
CAIN T2,">" ;2741 STYLE?
JRST SCAN.1 ;YES - LOOP BACK FOR MORE
JRST SCAN.2 ;NO - CHECK OTHER TERMINATORS
; Scan a path
;
SCNPTH: PUSHJ P,FLUSH ;EAT LEADING SPACES AND TABS
CAIN T1,"-" ;WANT DEFAULT PATH?
JRST SCNP.4 ;YES
PUSHJ P,BACKUP ;BACKUP THE BYTE POINTER
PUSHJ P,OCTIN ;GET PROJECT NUMBER
TLNN T1,777777 ;SIXBIT PPN?
HRLZS T1 ;NO
TLNN T1,777777 ;HAVE A PROJECT NUMBER?
HLL T1,FILPPN ;NO
IORM T1,PTHBLK+.PTPPN ;SAVE IT
TRNE T1,777777 ;SIXBIT PPN?
JRST SCNP.1 ;YES
CAIE T2,"," ;MUST HAVE A COMMA HERE
ERR. (PSE,CPOPJ) ;PATH SYNTAX ERROR
PUSHJ P,OCTIN ;GET PROGRAMMER NUMBER
TLNE T1,777777 ;SIXBIT PPN?
HLRZS T1 ;YES--TRUNCATE TO 18 BITS
TRNN T1,777777 ;HAVE A PROGRAMMER NUMBER?
HRR T1,FILPPN ;NO
IORM T1,PTHBLK+.PTPPN ;SAVE IT
SCNP.1: MOVEI T4,PTHBLK+.PTSFD ;POINT TO START OF SFDS
HRLI T4,-<PTHSIZ-.PTSFD-1> ;MAKE AN AOBJN POINTER
SCNP.2: CAIE T2,"," ;LEGAL SEPARATOR?
JRST CPOPJ1 ;NO--DONE
PUSHJ P,SIXIN ;GET AN SFD
JUMPE T1,[ERR. (NSI,CPOPJ)] ;NULL SFDS ARE ILLEGAL
MOVEM T1,0(T4) ;SAVE IT
AOBJN T4,SCNP.2 ;LOOP
ERR. (SND,CPOPJ) ;SFDS NESTED TOO DEEP
SCNP.4: SETOM PTHBLK+.PTFCN ;SET FUNCTION CODE
MOVE T1,[PTHSIZ,,PTHBLK] ;SET UP UUO
PATH. T1, ;READ OUR DEFAULT PATH
ERR. (CRP,CPOPJ) ;UUO FAILED--CAN'T READ PATH
PUSHJ P,FLUSH ;EAT SPACES AND TABS
JRST CPOPJ1 ;AND RETURN
; Check for a legal filespec and do extension defaulting
;
SCNDEF: MOVSI T1,'DSK' ;GET A DEVICE
TLNN F,FL.DEV ;ONE SPECIFIED?
MOVEM T1,FOPBLK+.FODEV ;DEFAULT TO DSK
TLNN F,FL.NAM!FL.EXT!FL.DIR ;ANY FILESPEC PARTS?
JRST CPOPJ1 ;NO
TLNN F,FL.EXE ;.EXE FILE?
JRST CPOPJ1 ;A DATA FILE
MOVSI T1,'EXE' ;GET AN EXTENSION
TLNN F,FL.EXT ;EXTENSION SPECIFIED?
MOVEM T1,LERBLK+.RBEXT ;DEFAULT IT
JRST CPOPJ1 ;RETURN
SUBTTL EXE file routines -- Load and validate directory
; Read an .EXE file directory into core
; Call: PUSHJ P,EXEDIR
; <NON-SKIP> ;BAD DIRECTORY OR I/O ERROR
; <SKIP> ;DIRECTORY IN CORE
;
EXEDIR: MOVEI T1,1 ;GET STARTING BLOCK NUMBER OF DIRECTORY
PUSHJ P,FILIPS ;POSITION FOR INPUT
POPJ P, ;CAN'T
MOVE T2,CSHPAG ;GET STARTING PAGE NUMBER IN CACHE
LSH T2,11 ;CONVERT TO AN ADDRESS
MOVEM T2,DIRADR ;SAVE IT
MOVE T3,T2 ;COPY IT
SETZM DIRPGS ;CLEAR COUNT OF DIRECTORY PAGES
EXED.1: MOVE T1,DIRADR ;GET DIRECTORY BASE ADDRESS
MOVE T4,DIRPGS ;GET EXISTING COUNT OF DIRECTORY PAGES
CAIL T4,PAGCNT ;ENOUGH FREE PAGES LEFT FOR MAPPING?
ERR. (NRE,CPOPJ) ;NO ROOM TO CACHE .EXE FILE DIRECTORY
LSH T4,-11 ;CONVERT TO ADDRESS OFFSET
ADDI T1,-1(T4) ;GET ADDRESS OF AVAILABLE BUFFER
HRLI T1,-PAGSIZ ;MAKE AN IOWD
MOVEM T1,IOLIST ;SAVE IT
MOVEI T1,1(T1) ;GET ADDRESS ON NEW PAGE
LSH T1,-11 ;CONVERT TO A PAGE NUMBER
PUSHJ P,PAGCHK ;MAKE SURE THE PAGE IS THERE
POPJ P, ;CAN'T CREATE IT
PUSHJ P,FILRED ;READ A PAGE
ERR. (EIE,CPOPJ) ;.EXE FILE DIRECTORY INPUT ERROR
AOS DIRPGS ;COUNT DIRECTORY PAGES READ INTO CORE
TRZ T3,PAGSIZ-1 ;STRIP OFF INDEX INDEX INTO PAGE
ADDI T3,PAGSIZ ;ROUND UP A PAGE
EXED.2: SKIPE T1,(T2) ;END OF DIRECTORY?
JRST EXED.3 ;NO
MOVN T1,DIRPGS ;GET -NUMBER OF DIRECTORY PAGES
ADDM T1,PAGCNT ;ADJUST COUNT OF FREE PAGES
MOVNS T1 ;GET +NUMBER OF DIRECTORY PAGES
ADDM T1,CSHPAG ;UPDATE FIRST FREE PAGE FOR CACHING
JRST CPOPJ1 ;AND RETURN
EXED.3: HLRZS T1 ;KEEP JUST THE BLOCK TYPE
MOVE T4,[-EXELEN,,EXETAB] ;AOBJN POINTER TO EXE BLOCK TYPES
CAME T1,(T4) ;A MATCH?
AOBJN T4,.-1 ;LOOP
JUMPGE T4,[ERR. (BED,CPOPJ)] ;BAD EXE FILE DIRECTORY
HRRZ T1,(T2) ;GET OFFSET TO NEXT BLOCK
ADD T2,T1 ;POINT TO IT
CAMGE T2,T3 ;NEED ANOTHER DIRECTORY PAGE?
JRST EXED.2 ;CHECK OUT ALL BLOCKS
JRST EXED.1 ;GO READ ANOTHER PAGE INTO CORE
SUBTTL EXE file routines -- Find a file page
; Search a directory for a page
; Call: MOVE T1, page number
; PUSHJ P,EXEPAG
; <NON-SKIP> ;PAGE NOT FOUND, I/O ERROR
; <SKIP> ;PAGE FOUND, T1:= FILE PAGE NUMBER
;
EXEPAG: TLNN F,FL.EXE ;MAPPING AN .EXE FILE?
JRST CPOPJ1 ;NO - THEN ITS A DATA FILE
MOVE T4,T1 ;SAVE PAGE NUMBER
MOVEI T1,.SVDIR ;GET DESIRED BLOCK TYPE
PUSHJ P,EXEBLK ;SEARCH FOR IT
ERR. (BED,CPOPJ) ;BAD EXE FILE DIRECTORY
MOVE T1,T4 ;GET PAGE NUMBER BACK AGAIN
ADDI T2,1 ;POINT TO NEXT WORD
EXEP.1: HLRZ T3,.SVFPF(T2) ;GET POSSIBLE BLOCK TYPE
CAIN T3,.SVEND ;END OF DIRECTORY?
ERR. (NXA,CPOPJ) ;NON-EXISTANT ADDRESS IN FILE
LDB T3,EXEREP ;GET REPEAT COUNT
LDB T4,EXEPPN ;GET PROCESS PAGE NUMBER
ADD T4,T3 ;GET ENDING PAGE NUMBER
CAMGE T4,T1 ;HIGH PAGE LESS THAN TARGET PAGE?
JRST EXEP.3 ;YES
EXEP.2: CAMN T4,T1 ;FOUND THE PAGE WE WANT?
JRST EXEP.4 ;YES
SUBI T4,1 ;DECREMENT PAGE NUMBER
SOJGE T3,EXEP.2 ;LOOP
EXEP.3: ADDI T2,2 ;POINT TO NEXT DIRECTORY PAGE ENTRY
JRST EXEP.1 ;TRY AGAIN
EXEP.4: LDB T1,EXEFPN ;GET FILE PAGE NUMBER
ADD T1,T3 ;ADD REPEAT COUNT
JRST CPOPJ1 ;AND RETURN
; Byte pointers to directory entry parts
;
EXEREP: POINTR (.SVPPC(T2),SV%REP) ;REPEAT COUNT
EXEPPN: POINTR (.SVPPC(T2),SV%PPN) ;PROCESS PAGE NUMBER
EXEFPN: POINTR (.SVFPF(T2),SV%FPN) ;FILE PAGE NUMBER
SUBTTL EXE file routines -- Find a directory block
; Find a block in an .EXE directory
; Call: MOVE T1, block type
; PUSHJ P,EXEBLK
; <NON-SKIP> ;CAN'T FIND IT
; <SKIP> ;BLOCK FOUND
;
; On sucessful return, T1:= block type,,length and T2:= directory address
;
EXEBLK: MOVE T2,[-EXELEN,,EXETAB] ;AOBJN POINTER TO EXE BLOCK TYPES
CAME T1,(T2) ;A MATCH?
AOBJN T2,.-1 ;LOOP
JUMPGE T2,[ERR. (BED,CPOPJ)] ;BAD EXE FILE DIRECTORY
MOVE T2,DIRADR ;GET STARTING ADDRESS OF DIRECTORY
EXEB.1: SKIPN T3,(T2) ;END OF DIRECTORY?
ERR. (BED,CPOPJ) ;BAD EXE FILE DIRECTORY
HLRZS T3 ;PUT IN RH
CAMN T3,T1 ;A MATCH?
JRST EXEB.2 ;YES
HRRZ T3,(T2) ;GET LENGTH
ADD T2,T3 ;POINT TO NEXT BLOCK
JRST EXEB.1 ;LOOP
EXEB.2: MOVE T1,(T2) ;GET BLOCK TYPE,,LENGTH
JRST CPOPJ1 ;AND RETURN
; Table of legal .EXE file directory block types
;
EXETAB: EXP .SVDIR ;START OF FILE TO CORE MAP
EXP .SVEND ;END OF EXE FILE DIRECTORY
EXP .SVSTA ;ENTRY VECTOR
EXELEN==.-EXETAB ;LENGTH OF TABLE
SUBTTL FORTRAN interface
MAPD:: MOVEI .AP,@0(16) ;GET ARGUMENT POINTER
PUSHJ P,.MAPD ;DO A DEPOSIT
JRST MAPFER ;ERROR
POPJ P, ;AND RETURN
MAPE:: MOVE .AP,@0(16) ;GET ARG
PUSHJ P,.MAPE ;EXAMINE
JRST MAPFER ;ERROR
MOVE 0,.AP ;INTO 0 FOR FORTRAN FUNCTION
POPJ P, ;AND RETURN
MAPG:: MOVE .AP,@0(16) ;GET ARG
PUSHJ P,.MAPG ;GETTAB SIMULATION
JRST MAPFER
MOVE 0,.AP ;INTO 0 FOR FORTRAN FUNCTION
POPJ P, ;AND RETURN
MAPI:: MOVEI .AP,@0(16) ;ADDRESS OF ARG BLOCK
PUSHJ P,.MAPI ;INITIALIZE
JRST MAPFER ;ERROR
POPJ P, ;AND RETURN
MAPJ:: MOVEI .AP,@0(16) ;ADDRESS OF ARG BLOCK
PUSHJ P,.MAPJ ;DO A JOBPEK
JRST MAPFER ;ERROR
POPJ P, ;AND RETURN
; Here on an error. See if error dispatch provided on call
;
MAPFER: HLRE T1,-1(16) ;GET ARG COUNT
CAMLE T1,[-2] ;TWO OR MORE?
JRST MAPFE1 ;NO
MOVEI T1,@1(16) ;YES--GET DISPATCH
HRRM T1,(P) ;STUFF ON STACK
POPJ P, ;AND DISPATCH
MAPFE1: OUTSTR [ASCIZ/?Unhandled MAP error: /]
OUTSTR MAPDAT+.MPMET
OUTSTR [BYTE(7) 15,12,0]
OUTSTR MAPDAT+.MPXET
EXIT
SUBTTL Context switch
; Here to save the user's ACs and set up a new stack. This is a
; co-routine that may NOT be called recursively to save 'n' sets
; of ACs. Skip returns are handled.
; Call: PUSHJ P,CONTXT
;
CONTXT: AOSE CTXFLG ;ALREADY CONTEXT SWITCHED?
POPJ P, ;YES - THEN DO NOTHING
MOVEM 0,USRACS+0 ;SAVE AC 0
MOVE 0,[1,,USRACS+1] ;SET UP BLT
BLT 0,USRACS+17 ;SAVE ACS 1 - 17
MOVE P,[IOWD PDLSIZ,MAPPDL] ;SETUP INTERNAL PDL
MOVE F,MAPFLG ;GET MAPPING FLAGS
TLNE F,FL.RTM ;WANT TO ACCUMLATE RUNTIME?
PUSHJ P,GETRTM ;YES
SETZM MAPDAT+.MPECD ;CLEAR OUT ANY OLD ERROR CODE
SETZM MAPDAT+.MPMET ;INSURE NO JUNK MAPPING ERROR TEXT
SETZM MAPDAT+.MPXET ;INSURE NO JUNK EXTENDED ERROR TEXT
MOVE T2,USRACS+P ;GET OLD PDL POINTER
MOVEI T2,@0(T2) ;GET CALLER'S ADDRESS
PUSHJ P,(T2) ;CALL THE CALLER
TDZA T1,T1 ;INDICATE NON-SKIP RETURN
HRROI T1,-1 ;INDICATE SKIP RETURN
MOVEM T1,TFFLAG ;SET TRUE OR FALSE
TLNE F,FL.RTM ;WANT TO ACCUMLATE RUNTIME?
PUSHJ P,GETRTM ;YES
MOVEM F,MAPFLG ;UPDATE MAPPING FLAGS
MOVE 0,[USRACS+1,,1] ;SET UP BLT
BLT 0,17 ;RESTORE THE ACS
MOVE 0,USRACS+0 ;RELOAD AC 0
POP P,(P) ;PRUNE STACK
SETOM CTXFLG ;RESET CONTEXT FLAG
SKIPGE TFFLAG ;FUNCTION FAIL?
CPOPJ1: AOS (P) ;NO - THEN SKIP
CPOPJ: POPJ P, ;RETURN
GETRTM: MOVSI T2,(RN.PCN) ;RETURN PRECISION RUNTIME
RUNTIM T2, ;GET IT
EXCH T2,CPUTIM ;SAVE IT AND GET PREVIOUS
JUMPE T2,CPOPJ ;RETURN IF CALLED AT CONTEXT ENTRY
SETZ T3, ;CLEAR FOR NEXT TIME
EXCH T3,CPUTIM ;AND GET OUR RUNTIME NOW
SUB T3,T2 ;COMPUTE IMCREMENTAL
ADDM T3,MAPDAT+.MPRTM ;ACCUMULATE IT
POPJ P, ;AND RETURN
SUBTTL Error handling
ERROR: DMOVEM T1,ERRACS+0 ;SAVE T1 & T2
DMOVEM T3,ERRACS+2 ;SAVE T3 & T4
MOVEI T1,@(P) ;GET ADDRESS OF ARGUMENTS
MOVE T1,(T1) ;GET ERROR CODE,,RETURN ADDRESS
POP P,(P) ;TRIM STACK
SKIPN MAPDAT+.MPECD ;NESTED ERRORS?
HLRZM T1,MAPDAT+.MPECD ;STORE NEW ERROR CODE
HLL T1,(P) ;GET PC FLAGS OR SECTION NUMBER
EXCH T1,(P) ;SET RETURN PC AND GET PC OF ERROR
MOVEI T1,@T1 ;EXTRACT JUST THE PC
SUBI T1,2 ;POINT TO OFFENDING INSTRUCTION
MOVEM T1,ERRPC ;SAVE IT
LDB T1,[POINT 9,@ERRPC,8] ;GET THE OPCODE
SKIPE T1 ;OPCODE ZERO IS MEANINGLESS
CAILE T1,100 ;A UUO?
SKIPA
PUSHJ P,ERRUUO ;GENERATE UUO ERROR TEXT
PUSHJ P,ERRMAP ;DO THE MAPPING ERROR
DMOVE T1,ERRACS+0 ;RESTORE T1 & T2
DMOVE T3,ERRACS+2 ;RESTORE T3 & T4
POPJ P, ;AND RETURN
; Here to type specific mapping errors
;
ERRMAP: SETZM MAPDAT+.MPMET ;CLEAR THE FIRST WORD
MOVE T1,[MAPDAT+.MPMET,,MAPDAT+.MPMET+1] ;SET UP BLT
BLT T1,MAPDAT+.MPMET+.MPEWD-1 ;CLEAR ENTIRE BLOCK
SKIPN T3,MAPDAT+.MPECD ;HAVE AN ERROR?
POPJ P, ;NO
HLLZ T1,MAPERR-1(T3) ;GET PREFIX
HLRZM T1,MAPDAT+.MPPFX ;SAVE FOR CALLER
MOVEI T1,MAPDAT+.MPMET ;STORE TEXT HERE
MOVEI T2,<.MPEWD*5>-1 ;MAX NUMBER OF CHARACTERS
PUSHJ P,TXTSET ;SET IT UP
HRRZ T1,MAPERR-1(T3) ;GET ASSOCIATED ERROR TEXT
PUSHJ P,TSTRG ;TYPE IT
ERRM.1: CAIE T3,MPGUF% ;GETTAB UUO FAILURE?
JRST ERRM.2 ;NO
MOVEI T1,[ASCIZ |; table = |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
HRRE T1,USRACS+.AP ;GET TABLE NUMBER
PUSHJ P,OCTOUT ;TYPE IT
MOVEI T1,[ASCIZ |, index = |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
HLRE T1,USRACS+.AP ;GET INDEX
PUSHJ P,OCTOUT ;TYPE IT
JRST ERRM.X ;FINISH UP
ERRM.2: CAIE T3,MPDAF% ;DEPOSIT ADDRESS FAILURE?
CAIN T3,MPEAF% ;EXAMINE ADDRESS FAILURE?
SKIPA T1,USRACS+.AP ;YES--GET ARGUMENT
JRST ERRM.3 ;NO
CAIN T3,MPDAF% ;DEPOSIT?
MOVE T1,0(T1) ;GET ADDRESS
PUSH P,T1 ;SAVE IT
MOVEI T1,[ASCIZ |; address = |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
POP P,T1 ;RESTORE ADDRESS
PUSHJ P,PCOUT ;TYPE IT
JRST ERRM.X ;FINISH UP
ERRM.3: CAIE T3,MPMIF% ;MAPPER INITIALIZATION FAILURE
JRST ERRM.X ;NO
HRRZ T3,F ;GET MAPPING CODE
CAIE T3,.MPFIL ;FILE MODE?
JRST ERRM.X ;NO
MOVEI T1,[ASCIZ |; file = |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
MOVE T1,USRACS+.AP ;GET ARGUMENT ADDRESS
MOVE T1,.MPARG(T1) ;GET ADDRESS OF FILESPEC ADDRESS
SKIPE MAPDAT+.MPAFS ;HAVE ACTUAL FILESPEC YET?
MOVEI T1,MAPDAT+.MPAFS ;YES--USE THAT
PUSHJ P,TSTRG ;TYPE IT
JRST ERRM.X ;FINISH UP
ERRM.X: POPJ P, ;AND RETURN
; Table of mapping errors
;
...ERR==0
MAPERR: MERR. (BED,<Bad EXE file directory>)
MERR. (CMF,<Conflicting mapping code and flags>)
MERR. (CRP,<Cannot read default path>)
MERR. (DAF,<Deposit address failure>)
MERR. (DDI,<Double device illegal>)
MERR. (DEI,<Double extension illegal>)
MERR. (DFI,<Double file name illegal>)
MERR. (DPI,<Double path illegal>)
MERR. (DVM,<Deposit value doesn't match existing word>)
MERR. (EAF,<Examine address failure>)
MERR. (ECS,<Left eye can't SPY>)
MERR. (EIE,<EXE file directory input error>)
MERR. (GUF,<GETTAB UUO/simulation failure>)
MERR. (HAF,<Hash table/chunk allocation failure>)
MERR. (IAD,<Illegal address>)
MERR. (ICS,<Illegal cache size requested>)
MERR. (IJN,<Illegal job number>)
MERR. (IMC,<Illegal mapping code>)
MERR. (IWE,<Illegal to write Exec Virtual Memory>)
MERR. (IWU,<Illegal to write the UPMP>)
MERR. (JNA,<Job not addressable>)
MERR. (JRW,<JOBPEK UUO failed to read/write another job>)
MERR. (JSO,<Job swapped out>)
MERR. (MIF,<Mapper initialization failure>)
MERR. (NAP,<No access to requested page>)
MERR. (NEB,<No EPT for boot CPU>)
MERR. (NFC,<No free chunks for cache>)
MERR. (NRE,<No room to cache EXE file directory>)
MERR. (NSI,<Null SFD illegal>)
MERR. (NXA,<Non-existant address in file>)
MERR. (PNC,<Page not in core>)
MERR. (PSE,<Path syntax error>)
MERR. (SIR,<SPT index out of range>)
MERR. (SND,<SFDs nested too deep>)
MERR. (UPC,<Unimplemented KL paging code>)
; Here to type specific UUO error text
;
ERRUUO: PUSHJ P,UUOERR ;TRANSLATE ERROR CODE
SETZM MAPDAT+.MPXET ;CLEAR THE FIRST WORD
MOVE T1,[MAPDAT+.MPXET,,MAPDAT+.MPXET+1] ;SET UP BLT
BLT T1,MAPDAT+.MPXET+.MPEWD-1 ;CLEAR ENTIRE BLOCK
MOVEI T1,MAPDAT+.MPXET ;STORE TEXT HERE
MOVEI T2,<.MPEWD*5>-1 ;MAX NUMBER OF CHARACTERS
PUSHJ P,TXTSET ;SET IT UP
MOVEI T1,11 ;GET A <TAB>
PUSHJ P,TYO ;TYPE IT
MOVE T1,ERRNAM ;GET UUO NAME
PUSHJ P,SIXOUT ;TYPE IT
MOVEI T1,[ASCIZ | UUO error |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
LDB T1,[POINT 4,@ERRPC,12] ;GET UUO AC
CAIG T1,T4 ;WITHIN THE RANGE
CAIGE T1,T1 ;OF T1 - T4?
SKIPA T1,(T1) ;NO--GET THE ERROR CODE
MOVE T1,ERRACS-T1(T1) ;YES--RELOCATE AND GET THE CODE
PUSHJ P,OCTOUT ;TYPE IT
MOVEI T1,[ASCIZ | at PC |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
MOVE T1,ERRPC ;GET PC WHERE UUO FAILED
PUSHJ P,PCOUT ;TYPE IT
MOVEI T1,[ASCIZ |; |] ;GET SEPARATOR
PUSHJ P,TSTRG ;TYPE IT
MOVE T1,ERRTXT ;GET ADDRESS OF TEXT FOR THIS ERROR
PUSHJ P,TSTRG ;TYPE IT
PUSHJ P,TCRLF ;TYPE A CRLF
MOVEI T1,11 ;GET A TAB
PUSHJ P,TYO ;TYPE IT
MOVEI T1,VERSIO ;POINT TO OUR VERSION
PUSHJ P,TSTRG ;TYPE IT
MOVEI T1,[ASCIZ | called from PC |]
PUSHJ P,TSTRG ;TYPE TEXT
MOVE T1,USRACS+P ;GET CALLER'S STACK POINTER
MOVEI T1,@-1(T1) ;GET CALLER'S PC +1
SUBI T1,1 ;ADJUST IT
PUSHJ P,PCOUT ;TYPE THE PC
MOVEI T1,[ASCIZ |, Mode = |] ;GET TEXT
PUSHJ P,TSTRG ;TYPE IT
MOVE T1,CODTAB(F) ;GET MAPPING CODE NAME
PUSHJ P,TSTRG ;TYPE IT
MOVEI T1,[ASCIZ | (physical)|] ;MORE CHATTER
TLNE F,FL.PPM ;PHYSICAL PAGE MAPPING?
PUSHJ P,TSTRG ;YES
POPJ P, ;RETURN
; Translate UUO error code to text
; Note: GETTAB failures are not trapped here
;
UUOERR: MOVE T1,[-UUOTSZ,,UUOTAB] ;AOBJN POINTER
MOVE T2,@ERRPC ;GET UUO IN QUESTION
TDZ T2,[Z 17,@UU.PHY(17)] ;CLEAR OUT JUNK
UUOE.1: CAMN T2,0(T1) ;A MATCH?
JRST UUOE.2 ;YES
ADD T1,[2,,2] ;ACCOUNT FOR THREE WORD ENTRIES
AOBJN T1,UUOE.1 ;TRY THE NEXT ONE
MOVE T2,['??????'] ;DON'T KNOW THAT ONE
JRST UUOE.4 ;STRANGE
UUOE.2: MOVE T2,1(T1) ;GET UUO NAME
MOVE T1,2(T1) ;AOBJN POINTER TO UUO SPECIFIC TABLE
LDB T3,[POINT 4,@ERRPC,12] ;GET UUO AC
CAIG T3,T4 ;WITHIN THE RANGE
CAIGE T3,T1 ;OF T1 - T4?
SKIPA T3,(T3) ;NO--GET THE ERROR CODE
MOVE T3,ERRACS-T1(T3) ;YES--RELOCATE AND GET THE CODE
UUOE.3: HLRZ T4,(T1) ;GET AN ERROR CODE
CAMN T3,T4 ;A MATCH?
JRST UUOE.5 ;YES
AOBJN T1,UUOE.3 ;LOOP
UUOE.4: SKIPA T3,[[ASCIZ |Unknown UUO error code|]]
UUOE.5: HRRZ T3,(T1) ;GET ERROR TEXT
MOVEM T2,ERRNAM ;SAVE UUO NAME
MOVEM T3,ERRTXT ;SAVE ERROR TEXT
POPJ P, ;RETURN
UUOTAB: EXP <FILOP.>,<SIXBIT /FILOP./>,<-FOPESZ,,FOPERR>
EXP <JOBPEK>,<SIXBIT /JOBPEK/>,<-JPKESZ,,JPKERR>
EXP <PAGE. >,<SIXBIT /PAGE. />,<-PAGESZ,,PAGERR>
EXP <PATH. >,<SIXBIT /PATH. />,<-PATESZ,PATERR>
EXP <POKE. >,<SIXBIT /POKE. />,<-POKESZ,,POKERR>
UUOTSZ==.-UUOTAB
; FILOP. UUO errors
;
FOPERR: ERFNF%,,[ASCIZ |File not found|]
ERIPP%,,[ASCIZ |Incorrect PPN|]
ERPRT%,,[ASCIZ |Protection failure|]
ERFBM%,,[ASCIZ |File being modified|]
ERDNA%,,[ASCIZ |Device not available|]
ERNSD%,,[ASCIZ |No such device|]
ERWLK%,,[ASCIZ |Write-locked|]
ERSNF%,,[ASCIZ |SFD not found|]
ERSLE%,,[ASCIZ |Search list empty|]
ERLVL%,,[ASCIZ |SFD nest level too deep|]
ERNCE%,,[ASCIZ |No-creates allowed in search list|]
ERFCU%,,[ASCIZ |Can't update file|]
ERENQ%,,[ASCIZ |File has outstanding locks set|]
ERDDU%,,[ASCIZ |Device "down" and unusable|]
ERDRS%,,[ASCIZ |Device is restricted|]
ERDCM%,,[ASCIZ |Device controlled by MDA|]
ERDAJ%,,[ASCIZ |Device allocated to another job|]
ERIDM%,,[ASCIZ |Illegal I/O data mode|]
ERNPC%,,[ASCIZ |No per-process space for extended channel|]
ERNFC%,,[ASCIZ |No free channels available|]
ERACR%,,[ASCIZ |Address check reading arguments|]
ERACS%,,[ASCIZ |Address check storing answer|]
FOPESZ==.-FOPERR
; JOBPEK UUO errors
;
JPKERR: JKNPV%,,[ASCIZ |No privileges|]
JKIJN%,,[ASCIZ |Illegal job number|]
JKSWP%,,[ASCIZ |Job swapped out or in transit|]
JKIAD%,,[ASCIZ |Illegal address|]
JKDNA%,,[ASCIZ |Data not addressable|]
JKPNC%,,[ASCIZ |Page not in core|]
JKIOE%,,[ASCIZ |I/O error|]
JKABZ%,,[ASCIZ |Allocated but zero page|]
JPKESZ==.-JPKERR
; PAGE. UUO errors
;
PAGERR: PAGUF%,,[ASCIZ |Unimplemented function|]
PAGIA%,,[ASCIZ |Illegal argument|]
PAGIP%,,[ASCIZ |Illegal page number|]
PAGCE%,,[ASCIZ |Page can't exist but does|]
PAGME%,,[ASCIZ |Page must exist but doesn't|]
PAGMI%,,[ASCIZ |Page must be in core but isn't|]
PAGCI%,,[ASCIZ |Page can't be in core but is|]
PAGSH%,,[ASCIZ |Page is in a sharable high segment|]
PAGIO%,,[ASCIZ |Paging I/O error|]
PAGNS%,,[ASCIZ |No swapping space available|]
PAGLE%,,[ASCIZ |Core limit exceeded|]
PAGIL%,,[ASCIZ |Illegal if locked|]
PAGNX%,,[ASCIZ |Cannot create allocated but zero page|]
PAGNP%,,[ASCIZ |Not privileged|]
PAGESZ==.-PAGERR
; PATH. UUO errors
;
PATERR: PTNSJ%,,[ASCIZ |No such job|]
PTNAI%,,[ASCIZ |Number of arguments illegal|]
PATESZ==.-PATERR
; POKE. UUO errors
;
POKERR: PKNPV%,,[ASCIZ |No privileges|]
PKDIF%,,[ASCIZ |Old value doesn't match existing word|]
PKBAD%,,[ASCIZ |Illegal address|]
POKESZ==.-POKERR
SUBTTL AC save routines
; Save T1
;
SAVT1: PUSH P,T1 ;SAVE T1
PUSHJ P,@-1(P) ;CALL THE CALLER
SKIPA ;NON-SKIP RETURN
AOS -2(P) ;ADJUST RETURN PC
POP P,T1 ;RESTORE T1
SUB P,[1,,1] ;ADJUST STACK
POPJ P, ;RETURN
; Save T1 and T2
;
SAVT2: ADD P,[2,,2] ;ADJUST STACK
DMOVEM T1,-1(P) ;SAVE T1 AND T2
PUSHJ P,@-2(P) ;CALL THE CALLER
SKIPA ;NON-SKIP RETURN
AOS -3(P) ;ADJUST RETURN PC
DMOVE T1,-1(P) ;RESTORE T1 AND T2
SUB P,[3,,3] ;ADJUST STACK
POPJ P, ;RETURN
; Save T1, T2, and T3
;
SAVT3: ADD P,[3,,3] ;ADJUST STACK
DMOVEM T1,-2(P) ;SAVE T1 AND T2
MOVEM T3,0(P) ;SAVE T3
PUSHJ P,@-3(P) ;CALL THE CALLER
SKIPA ;NON-SKIP RETURN
AOS -4(P) ;ADJUST RETURN PC
DMOVE T1,-2(P) ;RESTORE T1 AND T2
MOVE T3,0(P) ;RESTORE T3
SUB P,[4,,4] ;ADJUST STACK
POPJ P, ;RETURN
; Save T1, T2, T3, and T4
;
SAVT4: ADD P,[4,,4] ;ADJUST STACK
DMOVEM T1,-3(P) ;SAVE T1 AND T2
DMOVEM T3,-1(P) ;SAVE T3 AND T4
PUSHJ P,@-4(P) ;CALL THE CALLER
SKIPA ;NON-SKIP RETURN
AOS -5(P) ;ADJUST RETURN PC
DMOVE T1,-3(P) ;RESTORE T1 AND T2
DMOVE T3,-1(P) ;RESTORE T3 AND T4
SUB P,[5,,5] ;ADJUST STACK
POPJ P, ;RETURN
; Save F
;
SAVEF: PUSH P,F ;SAVE F
PUSHJ P,@-1(P) ;CALL THE CALLER
SKIPA ;NON-SKIP RETURN
AOS -2(P) ;ADJUST RETURN PC
POP P,F ;RESTORE F
SUB P,[1,,1] ;ADJUST STACK
POPJ P, ;RETURN
SUBTTL Literals
LIT
MPHEND::! ;END OF THE HIGH SEGMENT
HGHSIZ==MPHEND-HGHORG ;LENGTH OF THE HIGH SEGMENT
SUBTTL Data storage
RELOC 0 ;LOW SEGMENT
MAPARG::BLOCK .MPMAX ;PLACE FOR PEOPLE TO PUT ARG BLOCKS
ZBEG:! ;START OF DATA TO ZERO
MAPDAT::BLOCK .MPLEN ;DATA TABLE
CTXFLG: BLOCK 1 ;CONTEXT FLAG
USRACS: BLOCK 20 ;USER'S ACS
MAPPDL: BLOCK PDLSIZ ;INTERNAL PDL
TFFLAG: BLOCK 1 ;TRUE/FALSE FLAG
CPUTIM: BLOCK 1 ;USED FOR RUNTIM ACCUMULATION
ERRACS: BLOCK 4 ;ERROR ACS (T1 - T4)
ERRPC: BLOCK 1 ;ERROR PC
ERRNAM: BLOCK 1 ;NAME OF UUO
ERRTXT: BLOCK 1 ;ADDRESS OF UUO ERROR TEXT
POKBLK: BLOCK 3 ;POKE. UUO BLOCK
CPYBLK: BLOCK .CBXLN ;COPY BLOCK
JPKFLG: BLOCK 1 ;JOBPEK FLAG WORD
MAPFLG: BLOCK 1 ;MAPPING FLAGS
USRJOB: BLOCK 1 ;USER JOB NUMBER
UUOARG: BLOCK 2 ;UUO ARGUMENTS
HASHTA: BLOCK 1 ;HASH TABLE ADDRESS
HASHTL: BLOCK 1 ;HASH TABLE LENGTH
HASHCA: BLOCK 1 ;ADDRESS OF FIRST CHUNK
HASHCL: BLOCK 1 ;LENGTH OF CHUNK AREA
PAGCNT: BLOCK 1 ;COUNT OF AVAILABLE PAGES FOR MAPPING
CSHXCT: BLOCK 1 ;INSTRUCTION TO TEST PHYSICAL PAGE BIT
CSHPAG: BLOCK 1 ;FIRST PAGE NUMBER FOR MAPPING
CBHEAD: BLOCK .CBLEN ;CACHE BLOCK LIST HEADER
PAGFUN: BLOCK 1 ;FUNNY PAGE UPT OFFSET
PAGFLG: BLOCK 1 ;PAGE MAP ENTRY FLAG
PAGIDX: BLOCK 1 ;SECONDARY PAGE MAP INDEX
JOBN: BLOCK 1 ;NUMBER OF JOBS IN THE SYSTEM
SEGN: BLOCK 1 ;NUMBER OF SEGMENTS IN THE SYSTEM
KLPFLG: BLOCK 1 ;KL PAGING FLAG
EDVADR: BLOCK 1 ;EDV ADDRESS
EDVCNT: BLOCK 1 ;EDV COUNT WORD
EDVDAT: BLOCK 1 ;EDV FLAGS AND CPU DATA WORD
EPTADR: BLOCK 1 ;EPT ADDRESS
SPTADR: BLOCK 1 ;SPT ADDRESS
NUMTAB: BLOCK 1 ;POINTER TO NUMTAB IN THE MONITOR
RNGTAB: BLOCK 1 ;POINTER TO RNGTAB IN THE MONITOR
JBTSGN: BLOCK 1 ;POINTER TO JBTSGN IN THE MONITOR
JBTPDB: BLOCK 1 ;POINTER TO JBTPDB IN THE MONITOR
JBTADR: BLOCK 1 ;POINTER TO JBTADR IN THE MONITOR
JBTUPM: BLOCK 1 ;POINTER TO JBTUPM IN THE MONITOR
HIORG: BLOCK 1 ;MONITOR'S HIGH SEGMENT ORIGIN
HIFLAG: BLOCK 1 ;HIGH SEGMENT MAPPED FALG
HGHUEA: BLOCK 1 ;HIGHEST UNMAPPED EXEC ADDRESS
PPABEG: BLOCK 1 ;BEGINING PER-PROCESS ADDRESS
PPAEND: BLOCK 1 ;ENDING PER-PROCESS ADDRESS +1
GTBARG: BLOCK 1 ;GETTAB ARGUMENT
GTBNUM: BLOCK 1 ;NUMTAB ENTRY FOR CURRENT GETTAB
GTBIDX: BLOCK 1 ;INDEX INTO GETTAB DISPATCH TABLE
GTBRNG: BLOCK 1 ;LOWER,,UPPER LIMIT FOR RANGE
BYTPTR: BLOCK 1 ;BYTE POINTER
BYTCNT: BLOCK 1 ;BYTE COUNT
FILCHN: BLOCK 1 ;FILE CHANNEL NUMBER
IOLIST: BLOCK 2 ;IOWD
DIRADR: BLOCK 1 ;.EXE DIRECTORY ADDRESS
DIRPGS: BLOCK 1 ;NUMBER OF PAGES IN .EXE DIRECTORY
FOPBLK: BLOCK FOPSIZ ;FILOP. UUO BLOCK
LERBLK: BLOCK LERSIZ ;LOOKUP/ENTER UUO BLOCK
PTHBLK: BLOCK PTHSIZ ;PATH. UUO BLOCK
FILBLK: BLOCK FILSIZ ;BLOCK TO RETURN FULL FILESPEC
FILPPN: BLOCK 1 ;DEFAULT PPN
ZEND:! ;END OF DATA TO ZERO
SUBTTL End
END