Trailing-Edge
-
PDP-10 Archives
-
BB-D351B-SM
-
sources/ddt60.mac
There are 2 other files named ddt60.mac in the archive. Click here to see a list.
TITLE DDT60 -- PROGRAM TO DEBUG DN60'S -- V1(51)
; Revision History
; 1(50) 24-Mar-79 JW Add code to run on a 2020
; 1(51) 7-May-79 SMJ Change 2020 code to conditionally execute at run time.
; 1(52) 16-May-79 Fix ASJFN so it doesn't use FE0:
;DDT60 VERSION NUMBER
;
VWHO==0 ;WHO LAST EDITED
VDDT60==1 ;MAJOR VERSION NUMBER
VMINOR==0 ;MINOR VERSION NUMBER
VEDIT==52 ;EDIT NUMBER
;
IFN FTJSYS,<
SEARCH MONSYM,MACSYM,MACTEN
SALL>
FLG=0
F.FLIP==000001
F.FLOP==000002
F.LOPN==000004 ;CURRENT LOCATION IS OPEN
F.MOPN==000010 ;MASK OPEN
F.MASK==000020 ;ESCAPE M TYPED
F.ENDL==000100 ;END OF INPUT LINE (GIVE PROMPT)
F.IOCT==000200 ;ASSEMBLING AN OCTAL NUMBER
F.IDEC==000400 ;ASSEMBLING A DECIMAL NUMBER
F.IHEX==001000 ;ASSEMBLING A HEX NUMBER
F.ISIX==002000 ;ASSEMBLING A SIXBIT SYMBOL
F.SYMB==004000 ;ASSEMBLING A SYMBOL
F.CACH==010000 ;USE CACHE IF POSSIBLE
F.WRIT==020000 ;WE ARE OPENING FILE FOR OUTPUT
F.LOCK==040000 ;PROGRAM IS LOCKED
F.WENB==100000 ;PATCHING WAS ENABLED WITH /PATCH
F.PDP8==200000 ;WORKING WITH 8'S INSTEAD OF 11'S
F..ESC==400000 ;TYPED ESCAPE TWICE
T1=1
T2=T1+1
T3=T2+1
T4=T3+1
T5=T4+1
DOT=6 ;CURRENT LOCATION
DOTFOO=7 ;IN CASE IS 32 OR 48 BIT INSTRUCTION
P1=10 ;FOR PASSING ARGS AROUND SUBR
EXPRESS=11 ;BUILD EXPRESSIONS IN THIS AC
STATE=12
SYM=13 ;PONTER TO SYMBOL BLOCK
SYMBOL=14 ;CURRENT SYMBOL WE ARE BUILDING
P=17
OPDEF CAL11. [CALLI 125]
OPDEF NODE. [CALLI 157]
OPDEF PJRST [JRST]
INTERNAL .JBVER
.JBVER==137
LOC .JBVER
BYTE (3)VWHO(9)VDDT60(6)VMINOR(18)VEDIT
RELOC 0
EXMAX=140 ;MAXIMUM NUMBER OF BYTES TO EXAMINE AT ONCE
IFNDEF FT2SEG <
FT2SEG=0 ;IF NONZERO MAKE 2 SEGMANT PROGRAM
>
IFNDEF FTPROM <FTPROM=1 >;IF NONZERO INCLUDE CODE TO PUNCH ROMS.
IFN FTPROM <
IFNDEF ROMTYP <ROMTYP=1 ;DEFAULT ROM IS M9301
; ;FOR BM873 SET ROMTYP=0
>;END OF IFNDEF ROMTYP
>;END OF IFN FTPROM
COMMENT %
DDT60 VERSION 1 -- DERIVED FROM DDT11 VERSION 1
INITIAL SWITCHES:
/BINARY:FILSPEC READ A ".BIN" FILE (OUTPUT FROM MACDLX)
/DUMP:FILESPEC READ A CORE DUMP LISTING (OUTPUT OF
BOOT11 OR NETLDR)
/DIMAGE:FILESPEC READ A CORE IMAGE FILE (OUTPUT OF
DTELDR OR DASLOD)
/EXIT RETURN TO MONITOR
/LINE SPECIFY LINE FROM NODE (SIMILAR TO
NETLDR)
/NODE SPECIFY NODE TO DEBUG OR (WITH /LINE)
NODE ADJACENT TO NODE TO DEBUG
/PATCH ALLOW WRITING INTO CORE
/PDP8 REMOTE CPU IS A PDP-8 (I.E., DC71 OR DC72)
(THIS FACILITY ONLY PARTIALLY IMPLEMENTED)
/PORT SPECIFY DL10 PORT FOR DC76, DN85, DN87
OR DAS60. (0-3 ON DL10 NUMBER 1, 4-7
ON DL10 NUMBER 2, 10-13 ARE DTE 0-3.)
/SYMBOLS:FILESPEC READ SYMBOL TABLE FROM A CROSS-REFERENCE
LISTING. (OUTPUT FROM MACDLX)
NOTE: /BINARY, /DUMP, /DIMAGE, /NODE AND /PORT CAUSE
IMMEDIATE EXIT FROM INITIAL DIALOG, WITHOUT PROCESSING
ANY SUBSEQUENT TEXT ON THE LINE.
DEBUGGING LANGUAGE:
THE LANGUAGE MIMICS DDT-10 FOR EXAMINING MEMORY AND
BUILDING SYMBOLS. SPECIAL FUNCTIONS ARE INTRODUCED BY "ESC".
NUMERIC ARGUMENTS GO BETWEEN THE "ESC" AND THE LETTER.
LOWER CASE LETTERS ARE PERMITTED. THE NOTATION "TEMP/PERM"
MEANS THE MODE IS SET UNTIL A CARRIAGE RETURN IS INPUT
UNLESS IT IS INTRODUCED BY TWO "ESC"S, JUST AS IN DDT-10.
THE FOLLOWING IS THE LIST OF FUNCTION LETTERS INTRODUCED
BY "ESC".
A SET "ADDRESS" TYPEOUT MODE. TEMP/PERM. ARG=LENGTH
B SET "BYTE" TYPEOUT MODE. TEMP/PERM. ARG=LENGTH
C SET "NUMERIC" (CONSTANT) TYPEOUT MODE. TEMP/PERM.
ARG=LENGTH
D DUMP MEMORY ONTO A FILE. THE RANGE IS SPECIFIED
AS: LOW<HIGH>ESC D. ARG = DUMP TYPE: 0 = NORMAL,
1 = NO INSTRUCTION TYPEOUT
G CAUSE CPU TO BRANCH TO EXPRESSION. (ONLY WITH /NODE)
I SET "EBCDIC" OUTPUT MODE. TEMP/PERM. ARG=LENGTH
K SUPPRESS TYPEOUT OF PRECEEDING SYMBOL.
M LOCATION FOR "MASK" FOR SEARCHES
N "NOT WORD" SEARCH FOR PRECEEDING EXPRESSION. SEARCH
IS MASKED BY LOCATION "$M" AND LIMITED BY RANGE,
EXPRESSED AS FOR $D.
P PUNCH BINARY TAPE OF CORE IMAGE (NOT YET
IMPLEMENTED)
R SET RADIX IN RANGE 2 TO 15. TEMP/PERM. ARG=RADIX
S SET "INSTRUCTION" OUTPUT MODE (DEFAULT). TEMP/PERM.
ARG=LENGTH
T SET "ASCII" OUTPUT MODE. TEMP/PERM. ARG=LENGTH
V WATCH OPEN LOCATION, TYPE OUT CHANGES, STOP WHEN
CARRIAGE RETURN TYPED.
W "WORD" SEARCH, SIMILAR TO $N.
%
;
IFN FTJSYS,<
; THE FOLLOWING DATA STRUCTURE IS USED FOR SENDING AND RECEIVING
; DATA TO/FROM THE FRONT-END PDP-11
;
DEFSTR(D10DF,SBUF,^D15,^D16) ;FUNCTION FOR SENDING TO FE
DEFSTR(D10AD,SBUF,^D31,^D16) ;ADDRESS FOR EX/DEP FUNCTION
DEFSTR(D10DT,SBUF+1,^D15,^D16) ;DATA FOR DEPOSIT
;
DEFSTR(D11RS,RBUF,^D7,^D8) ;RESULT CODE FROM FE
DEFSTR(D11DF,RBUF,^D15,^D8) ;FUNCTION CODE
DEFSTR(D11AD,RBUF,^D31,^D16) ;ADDRESS FOR EX/DEP
DEFSTR(D11DT,RBUF+1,^D15,^D16) ;DATA FOR EXAMINE
;
DEXFUN=11 ;EXAMINE FUNCTION
DEPFUN=12 ;DEPOSIT FUNCTION
>
IFN FT2SEG <
TWOSEG
RELOC 400000
>
DDT60: JFCL
RESET
SETZ 0, ;ZERO FIRST AC
MOVEI 17,1 ;MAKE BLT POINTER
BLT 17,17 ;CLEAR ALL AC'S
MOVE P,[IOWD PDLEN,PDL]
PUSHJ P,IDTYPE ;IDENTIFY OURSELF
PUSHJ P,CRLTYP ;END WITH A FLOURISH
MOVE T1,[0,,0] ;DEFAULT OUTPUT MODE IS SYMBOLIC
MOVEM T1,O.MODE
SETZM MEMORY
SETZM CACHEL ;HIGHEST ADDR IN CACHE
SETZM NODE ;HAVEN'T SPECIFIED NODE YET
SETZM LINE ;OR LINE ON NODE
JRST INI.03
INI.00: OUTSTR [ASCIZ \
?Respond with /PORT:#, /NODE:#, /NODE:name,
/BINARY:filespec, /DIMAGE:filespec or /DUMP:filspec\]
CLRBFI ;FLUSH TYPEAHEAD
INI.03: TRZ FLG,F.ENDL ;DONT CARE IF END OF LINE
OUTSTR [ASCIZ \
Input: \]
INI.XX: TRZE FLG,F.ENDL ;END OF LINE?
JRST INI.03 ;YES, GIVE PROMPT AGAIN.
PUSHJ P,SIXIN ;SHOULD RETURN JUST "/"
JRST INI.00
JUMPN T1,INI.00
CAIN T5,15 ;END OF LINE?
JRST INI.03 ;YES, GIVE PROMPT AGAIN.
CAIE T5,"/"
JRST INI.00
INI.YY: PUSHJ P,SIXIN ;GET COMMAND
JRST INI.00
MOVNI T2,1 ;BUILD MASK
INI.04: MOVSI T3,-4
INI.05: SKIPN T4,[ SIXBIT \BINARY\ ;FILE IS BINARY
SIXBIT \DUMP\ ;FILE IS A DUMP
SIXBIT \DIMAGE\ ;FILE IS A DUMP IMAGE
SIXBIT \EXIT\ ;EXIT TO MONITOR
SIXBIT \LINE\ ;SPECIFY LINE FROM NODE
SIXBIT \NODE\ ;SPECIFY NODE TO DEBUG
SIXBIT \PATCH\ ;ENABLE PATCHING
SIXBIT \PDP8\ ;DO PDP-8'S, NOT PDP-11'S
SIXBIT \PORT\ ;SPECIFY PORT OF LOCAL PDP-11
SIXBIT \SYMBOL\ ;SPECIFY FILE OF SYMBOLS
Z ](T3)
JRST INI.06
AND T4,T2
CAMN T1,T4 ;MATCH ?
JRST INI.08 ;FOUND MATCH
AOJA T3,INI.05 ;ON TO NEXT ENTRY
INI.06: LSH T2,6 ;ADJUST MASK
JUMPN T2,INI.04
JRST INI.00 ;DON'T UNDERSTAND
INI.08: JRST @[ SETBIN ;/BINARY
SETDMP ;/DUMP
SETIMG ;/DIMAGE
SETXIT ;/EXIT
SETLIN ;/LINE
SETNOD ;/NODE
SETWEN ;/PATCH
SETPD8 ;/PDP8
SETPRT ;/PORT
RSYMB ;/SYMBOL
](T3)
;HERE BECAUSE FILE TO BE READ IS BINARY TAPE
SETBIN: TRO FLG,F.FLOP
PUSHJ P,RDDUMP ;READ THE BINARY FILE
JRST LEVL.0 ;GO DEBUG IT
;HERE BECAUSE FILE TO BE READ IS NETLDR (OR EQUIVALENT) DUMP
SETDMP: TRZ FLG,F.FLOP
PUSHJ P,RDDUMP ;READ THE DUMP FILE
JRST LEVL.0 ;GO DEBUG IT
;HERE FOR /DIMAGE
SETIMG: PUSHJ P,RDDIMG ;READ DUMP IMAGE
JRST LEVL.0 ;GO DEBUG IT
;HERE FOR /PATCH
SETWEN: TRO FLG,F.WENB ;ENABLE PATCHING
JRST SET.X9
SETLIN: PUSHJ P,SIXIN ;GET LINE ARGUMENT
JRST INI.00
PUSHJ P,SIXOCT ;CONVERT TO NUMBER
JFCL
AOS T1
MOVEM T1,LINE
SET.X9: CAIE T5,"/"
JRST INI.XX
JRST INI.YY
SETPD8: TRO FLG,F.PDP8
JRST SET.X9
SETNOD: PUSHJ P,SIXIN ;GET NODE ARGUMENT
JRST INI.00
PUSHJ P,SIXOCT ;CONVERT TO NUMBER
JFCL
MOVEM T1,NODE ;SAVE NODE NAME
MOVEI T1,1 ;CODE TO LOCK
LOCK T1,
JRST LOCKER
TRO FLG,F.LOCK ;REMEMBER WE DID
JRST LEVL.0
;
SETPRT: PUSHJ P,SIXIN ;GET SIXBIT ARGUMENT
JRST INI.00
PUSHJ P,SIXOCT ;CONVERT TO OCTAL
JRST INI.00
CAILE T1,13 ;UNREASONABLE?
JRST INI.00 ;YES, REJECT.
MOVEM T1,PORT# ;NO, SAVE PORT NUMBER
IFN FTJSYS,<
PUSHJ P,ASJFN ;GET JFN FOR FE DEVICE
>
JRST LEVL.0
RSYMB: PUSHJ P,RDSYMB ;READ IN SYMBOLS
MOVE T5,LASCAR ;RETRIEVE LAST CHAR INPUT
JRST SET.X9 ;AND LOOK FOR MORE SWITCHES
SETXIT: EXIT ;EXIT TO THE MONITOR
IFN FTJSYS,<
; THIS SECTION OF CODE ASSIGNS A JFN TO DEVICE FE
; OPENS IT AND SPECIFIES ITS FRONT-END
;
ASJFN:
SKIPN APRNUM ; Check for proccessor type known yet
PUSHJ P,PRCTYP ; No .. go get it
SKIPN KSFLG ; Check for a 2020
JRST ASJF.1 ; No .. go do SIN/SOUT type FE I/O
MOVE T1,PORT# ;GET THE PORT NUMBERT
SUBI T1,10 ;GET THE DMC LINE #
MOVEM T1,D60JFN ;STORE AS THE "JFN"
POPJ P, ;RETURN TO CALLER
ASJF.1: SETZB P1,D60JFN ;INITIALIZE PTR TO JFN
MOVEI P1,1 ; Start looking at FE1:
D60ST2: MOVE T1,[POINT 7,D60BUF] ;BUFFER TO HOLD JFN
MOVEI T2,"F" ;STICK FE FOR DEVICE IN THE BUFFER
IDPB T2,T1 ;IN THE JFN
MOVEI T2,"E" ;PUT IN E OF THE "FE"
IDPB T2,T1 ;IN THE JFN BUFFER
LDB T2,[POINT 3,P1,32] ;3-BIT BYTE PTR
JUMPE T2,D60ST3
ADDI T2,"0" ;FOR FE 0
IDPB T2,T1 ;PUT IN THE JFN
D60ST3: LDB T2,[POINT 3,P1,35] ;BUILD A 3-BIT BYTE PTR
ADDI T2,"0" ;FOR FE "0"
IDPB T2,T1 ;DEPOSIT IN JFN
MOVEI T2,":" ;COMPLETES DEVICE NAME
IDPB T2,T1 ;IN THE JFN
SETZ T2, ;ZERO BYTE AT THE END
IDPB T2,T1 ;IN THE JFN
MOVX T1,GJ%OLD!GJ%SHT ;OLD FILE,SHORT JFN
HRROI T2,D60BUF ;BUFFER TO HOLD JFN
GTJFN ;GO GET JFN FOR FE DEVICE
ERJMP D60ST4 ;UNABLE TO GET JFN FOR THIS FE#
MOVEM T1,D60JFN ;GOT IT ,SAVE JFN
PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE
MOVE T1,D60JFN ;FET JFN IN T1
MOVX T2,<^D8>B5!OF%RD!OF%WR ;WRITE ,READ,8 LONG JFN
OPENF ;OPEN THE DEVICE
ERJMP D60ST5 ;UNABLE TO OPEN THIS DEVICE
MOVX T2,.MODTE ;FUNCTION CODE TO GET DTE FE
MOVE T3,PORT# ;GET THE PORT NO
SUBI T3,10 ;GET THE DTE#
MTOPR ;GET A DTE FE
ERJMP FATAL ;MUST NOT HAPPEN
PUSHJ P,DEQDEV ;RELEASE DEVICE IF LOCKED
POPJ P, ;RETURN TO CALLER
;
;
;SUBROUTINE TO RELEASE A DEVICE IF LOCKED
;
DEQDEV: SKIPN ENQFLG ;DO WE HAVE THE DEVICE LOCKED?
JRST DQEXIT ;NO,JUST EXIT
SETZM ENQFLG ;FLAG DEVICE RELEASED
MOVX T1,.DEQDR ;DEQ FUNCTION CODE
MOVEI T2,ENQBLK ;POINT TO THE FUN BLOCK
DEQ ;UNLOCK THE DEVICE
ERJMP FATALQ ;DEQ FAILED
DQEXIT: POPJ P, ;RETURN
;
ENQDEV: MOVE T1,PORT# ;GET THE PORT NO
DPB T1,[POINT 3,ENQBUF+1,20] ;AND PUT IN LOW ORDER DIGIT
LSH T1,-3 ;GET NEXT DIGIT
DPB T1,[POINT 3,ENQBUF+1,13] ;PUT IN HIGH DIGIT
MOVX T1,.ENQBL ;ENQ FUNCTION CODE
MOVEI T2,ENQBLK ;POINT TO ARGUMENT BLOCK
ENQ ;REQUEST ACCESS OF RESOURCE
ERJMP [ CAIE T1,ENQX6 ;LOCK ALREADY REQUESTED?
PJRST FATAL ;FATAL ERROR
MOVEI T1,^D500 ;SLEEP FOR 1-SECOND
DISMS ;SLEEP JSYS
JRST ENQDEV ] ;TRY AGAIN
SETOM ENQFLG ;FLAG THAT WE GOT DEVICE
POPJ P, ;RETURN
;
;
;HERE IF THE GTJFN FAILS
;
D60ST4: CAIE T1,GJFX29 ;DEVICE NOT AVAILABLE
JRST D60STK ;NO,SOMETHING'S WRONG
AOJA P1,D60ST2 ;YES,TRY NEXT FE DEVICE
;
; HERE IF OPENF FAILS
;
D60ST5: CAIE T1,OPNX9 ; Simultanoues access or
CAIN T1,OPNX7 ; device not available?
CAIA ; Yes .. so clean up and move to next one
JRST D60STK ; No, something's wrong
MOVE T1,D60JFN ; Release the JFN
RLJFN ; JSYS to do release
ERJMP D60STK ; JSYS error in release
PUSHJ P,DEQDEV ; Unlock the device
AOJA P1,D60ST2 ; Get another JFN
;
; HERE IF A FATAL JSYS ERROR
;
D60STK: JRST FATAL ;FATAL ERROR
;
FATAL: PUSHJ P,DEQDEV ;UNLOCK DEVICE IF LOCKED
FATALQ: HRROI T1,[ASCIZ/
?/]
PUSHJ P,ERROR ;GO TO PRINT THE ERROR
HALTF ;STOP
;
ERROR: PSOUT ;PUT OUT THE STRING
MOVE T1,[.PRIOU] ;OUTPUT DEVICE FOR ERROR MESSAGES
MOVE T2,[.FHSLF,,-1] ;CURRENT FORK,,LAST ERROR
SETZB T3,T4 ;NO LIMIT,FULL MESSAGE
ERSTR ;JSYS TO OUTPUT ERROR MESSAGE
JFCL ;IGNORE UNDEFINED ERROR NUMBER
JFCL ;IGNORE ERROR DURING EXECUTION OG ERSTR
POPJ P, ;RETURN TO CALLER
;
ENQFLG: BLOCK 1 ;IF NON-ZERO,WE HAVE DEVICE
ENQBLK: XWD 1,5 ;1 LOCK,,LENGH IS 5
XWD 0,0 ;CHN 0,,ID
EXP EN%BLN+EN%LTL+<0,,-3> ;FLAGS,,WHEEL OR OPR
POINT 7,ENQBUF ;STRING POINTER
XWD 0,0 ;1 RESOURCE,,NO OF ACCESSES
;
ENQBUF: ASCIZ \DN60-P00\ ;BUILD ENQ/DEQ STRING HERE
;
>
LEVL.0: OUTSTR [BYTE (7)15,12,0]
LEVEL0: SETZM OHD
TRZ FLG,F.LOPN!F.MASK!F.MOPN!F.CACH!F.WRIT
HLRS ORADIX ;RESET OUTPUT RADIX
HLRS O.MODE ;RESET CURRENT OUTPUT MODE FROM PERMANENT
HLRS BYTCNT ;RESET REPETITION COUNT
LEVEL1: MOVE P,[IOWD PDLEN,PDL]
TRZ FLG,F.SYMB!F.IOCT!F.IDEC!F.IHEX
LEVEL2: MOVEI STATE,STATE0 ;DISPATCH TABLE WHEN IDLE
LEVEL3: TRZ FLG,F..ESC
SETZM INPOPR ;CLEAR INPUT OPERATOR
SETZM EXPRESS ;EXPRESSION WE HAVE BUILT
SETZM OCTIN#
SETZM DECIN#
SETZM HEXIN#
SETZM SYMBOL
MOVE T4,[POINT 6,SYMBOL]
LOOP: PUSHJ P,GETCHR ;GET A COMMAND CHAR
MOVEM T1,T2
ADD T2,STATE
JRST @(T2) ;DISPATCH ON CHARACTER
;HERE WHEN USER TYPES IN AN ILLEGAL CHARACTER
ILLCHR: OUTSTR [BYTE (7)7,"?",7,11,7,0]
CLRBFI ;CLEAR TYPEAHEAD
JRST LEVEL1
;HERE WHEN THE USER TYPES A TAB COMMAND
COMHT: OUTSTR [BYTE (7)15,12,0]
SKIPN DOT,LSTADR ;IN CASE SET IN FUNNY WAY
MOVE DOT,DATA ;LAST DATA BECOMES ADR
JRST COMLF1
;HERE WHEN THE USER TYPES A LINE FEED COMMAND
COMLF: SKIPE DOTFOO
MOVE DOT,DOTFOO
SETZM DOTFOO
OUTCHR [15] ;CARRIAGE RETURN
ADDI DOT,2
COMLF1: TRO FLG,F.LOPN ;FLAG LOCATION IS OPEN
ANDI DOT,177776 ;FLUSH EXTRA BITS
MOVE T1,DOT
PUSHJ P,ADRTYP ;TYPE ADR
MOVEI T1,"/"
PUSHJ P,TYPCHR
COMLF2: CAMGE DOT,CACHEL ;IS THIS ALREADY IN CACHE ?
SETZM CACHEL ;YES SO FLUSH CACHE
PUSHJ P,TABTYP
TRO FLG,F.CACH ;USE CACHE AFTER 1ST WORD
PUSHJ P,DATYPE
JRST LEVEL2
;HERE WHEN USER TYPES =
EQUALS: TRNN FLG,F.LOPN ;IS LOCATION OPEN ?
JRST ILLCHR ;NO SO ILLEGAL
PUSH P,O.MODE ;SAVE OUTPUT MODE
MOVEI T1,2 ;OUTPUT AS NUMERIC
HRRM T1,O.MODE
PUSH P,BYTCNT
SKIPN T5,DOTFOO
HRRZ T5,DOT
SUBI T5,-2(DOT)
ANDI T5,777777 ;HALF WORD ONLY
LSH T5,-1
HRRM T5,BYTCNT
PUSH P,DOTFOO
SETZM DOTFOO
TRO FLG,F.CACH ;USE CACHE IF POSSIBLE
PUSHJ P,DATYPE ;TYPE DATA
POP P,DOTFOO
POP P,BYTCNT
POP P,O.MODE ;RESTORE OUTPUT MODE
JRST LOOP
;HERE WHEN USER TYPES / AT END OF A NUMBER
OPNLOC: TRZE FLG,F.MASK ;ASKING ABOUT THE MASK ?
JRST [ PUSHJ P,TABTYP
HRRZ T1,S.MASK ;GET THE MASK
PUSHJ P,RADTYP ;DISPLAY IT
TRO FLG,F.MOPN ;MAKS NOW OPEN
PUSHJ P,TABTYP
JRST LEVEL2 ]
PUSHJ P,ACCUM
HRRZ DOT,EXPRESS
SETZM DOTFOO
TRO FLG,F.LOPN ;FLAG LOCATION IS OPEN
JRST COMLF2
;HERE WHEN USER TYPES A RUBOUT
COMRUB: OUTSTR [ASCIZ \xxx \]
JRST LEVEL1
;HERE WHEN THE USER TYPES AN UP ARROW COMMAND
COMARR: OUTSTR [BYTE (7)15,12,0]
SETZM DOTFOO
HRRZ T1,BYTCNT ;NUMBER OF BYTES
HRRZ T2,O.MODE ;GET OUTPUT MODE
JUMPE T2,COMAR0 ;SYMBOLIC ?
CAIN T2,1 ; OR ADDRESS ?
ASH T1,1 ;CONVERT WORD COUNT TO BYTES
CAIN T2,2 ;OR NUMERIC
ASH T1,1 ;CONVERT WORD COUNT TO BYTES
SUBI DOT,(T1)
JRST COMLF1 ;REST LIKE A LINE FEED COMMAND
;HERE IF DID UP ARROW WHEN IN SYMBOLIC MODE
; TRY TO MAKE A GUESS HOW FAR BACK TO GO
COMAR0: ANDI DOT,177776 ;INSTRUCTIONS BEGIN ON WORD BOUNDRY
TRZ FLG,F.CACH ;DON'T USE CACHE
MOVEI T4,1 ;TRY ONE WORD INSTRUCTION FIRST
;HERE TO COUNT WORDS IN INSTRUCTION
COMAR1: MOVE T2,T4 ;NUMBER OF WORDS TO LOOK FOR
ASH T2,1 ;TIMES 2 FOR BYTES
MOVEI T1,(DOT) ;CURRENT ADR
SUBI T1,(T2) ;BACK UP CURRENT ADR
PUSHJ P,GETWRD ;TRY TO GET THE DATA
JRST COMAR9 ;LOSES
PUSHJ P,INVLFN ;SEE IT THERE IS ANY SUCH INSTRUCTION
JRST COMAR8 ;NO = LOSE
HLLZ T2,1(SYM) ;GET FLAGS FOR INSTRUCTION
AOS T2 ;ONE FOR INSTRUCTION
TLNN T2,SMF.SS ;IS THIS SSDD FORMAT ?
JRST COMAR6 ;NO
LDB T3,[POINT 6,T1,29] ;GET SS FIELD
PUSHJ P,COMARX ;ADJUST NUMBER OF WDS IN INSTRUCTION
COMAR6: TLNN T2,SMF.DD!SMF.SS ;IS DD PRESENT ?
JRST COMAR7 ;NO
LDB T3,[POINT 6,T1,35] ;GET DD FIELD
PUSHJ P,COMARX
COMAR7: CAIE T4,(T2) ;IS THAT WHAT WE WANTED ?
JRST COMAR8 ;NO
SUBI DOT,(T4)
SUBI DOT,(T4)
JRST COMLF1 ;PRINT INSTRUCTION
COMAR8: AOS T4 ;TRY FOR LARGER INSTRUCTION
CAIE T4,4 ;IS THAT TOO LARGE ?
JRST COMAR1 ;NO
COMAR9: SUBI DOT,2 ;JUST BACK UP ONE WORD
JRST COMLF1
COMARX: CAIE T3,27 ;IS THIS IMMEDIATE (#FOO)
CAIN T3,37 ;OR ABSOLUTE
AOS T2 ;YES SO ANOTHER WORD IN INSTRUCTION
LDB T3,[POINT 3,T3,32]
CAIE T3,6 ;IS THIS RELATIVE
CAIN T3,7 ;OR RELATIVE DEFERRED ?
AOS T2 ;YES SO ANOTHER WORD
POPJ P,
;HERE WHEN THE USER TYPE A ^Z
COMCZ: CALLI 1,12
JRST LEVEL0
;HERE WHEN THE USER ENDS AN EXPRESSION WITH A BACKSLASH
COMBSE: PUSHJ P,ACCUM ;FINISH ACCUMULATING EXPRESSION
MOVE T1,EXPRESS ;MAKES ADDRESS
JRST COMBS5
;HERE WHEN THE USER TYPES A BACKSLASH
COMBSL: SKIPN T1,LSTADR
MOVE T1,DATA
COMBS5: PUSHJ P,TABTYP
PUSH P,DOT
MOVEM T1,DOT
PUSHJ P,DATYPE
POP P,DOT
JRST LEVEL2
;HERE WHEN USER TYPE A BACK ARROW
BKARRW: PUSHJ P,ACCUM ;FINISH ACCUMULATING EXPRESSION
MOVE T1,EXPRESS
PUSHJ P,ADRTYP ;AND TYPE OUT SYMBOL FOR IT
PUSHJ P,TABTYP
JRST LEVEL0 ;AND DONE
ACCUM: SETZ T1,
TRZE FLG,F.IOCT
MOVE T1,OCTIN
TRZE FLG,F.IDEC
MOVE T1,DECIN
TRZE FLG,F.IHEX
MOVE T1,HEXIN
TRZE FLG,F.SYMB
PUSHJ P,EVLSYM
ACCUM0: MOVE T2,INPOPR ;GET INPUT OPERATOR
XCT [ ADD EXPRES,T1
SUB EXPRES,T1
IMUL EXPRES,T1
IDIV EXPRES,T1
IOR EXPRES,T1
AND EXPRES,T1
XOR EXPRES,T1 ](T2)
ANDI EXPRESS,177777 ;16 BITS ONLY
MOVEI STATE,STATEE
SETZM OCTIN
SETZM DECIN
SETZM HEXIN
SETZM SYMBOL
MOVE T4,[POINT 6,SYMBOL]
POPJ P,
FINEXP: PUSHJ P,ACCUM ;ACCUMULATE WHATEVER WE HAVE
JRST COMLF2
EXPLUS: TDZA T1,T1 ;CODE FOR NEXT TIME IS 0
EXPMIN: MOVEI T1,1
JRST EXP.DO
EXPMUL: MOVEI T1,2
JRST EXP.DO
EXPDIV: MOVEI T1,3
JRST EXP.DO
EXPIOR: MOVEI T1,4
JRST EXP.DO
EXPAND: MOVEI T1,5
JRST EXP.DO
EXPXOR: MOVEI T1,6
EXP.DO: PUSH P,T1 ;SAVE CODE FOR NEXT TIME
PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION
POP P,INPOPR ;NEXT INPUT OPERATION
JRST LOOP ;THEN DONE
EXPEQU: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION
MOVE T1,EXPRESS ;GET EXPRESSION
PUSHJ P,RADTYP
PUSHJ P,TABTYP
JRST LEVEL2
SLOWLM: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION
MOVE T1,EXPRESS ;GET EXPRESSION
HRRZM T1,SBEGIN ;SET LOWER LIMIT FOR SEARCH
JRST LEVEL2
SUPLIM: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION
MOVE T1,EXPRESS ;GET EXPRESSION
HRRZM T1,S..END ;SET UPPER LIMIT FOR SEARCH
JRST LEVEL2
;HERE WHEN ASSEMBLING NUMBER AND FIND A PERIOD
ASSPER: TRNN FLG,F.IDEC!F.IOCT
JRST ASSYMB
TRO FLG,F.IDEC
TRZ FLG,F.IOCT!F.IHEX
JRST ASYMB2
;HERE WHEN NUMBER MUST BE DECIMAL
ASSDEC: TRO FLG,F.IDEC
TRZ FLG,F.IOCT
;HERE WHEN ASSEMBLING A OCTAL, DECIMAL OR HEX NUMBER
ASSNUM: TRNN FLG,F.IDEC!F.IHEX
TRO FLG,F.IOCT
MOVEI STATE,STATEE
MOVE T2,OCTIN
LSH T2,3
;CAIL T1,70
; TRO FLG,F.IDEC ;NUMBER IS DECIMAL
ADDI T2,-60(T1)
MOVEM T2,OCTIN
MOVE T2,DECIN
IMULI T2,^D10
ADDI T2,-60(T1)
MOVEM T2,DECIN
MOVE T2,HEXIN
LSH T2,4
ADDI T2,-60(T1)
MOVEM T2,HEXIN
;TRNN FLG,F.IDEC!F.IHEX
; TROA FLG,F.IOCT
; TRZ FLG,F.IOCT
JRST ASYMB2
;HERE WHEN ASSEMBLING A SYMBOL
ASSYMB: MOVEI STATE,STATEE
TRO FLG,F.SYMB
TRZ FLG,F.IDEC!F.IOCT!F.IHEX
ASYMB2: SUBI T1,40 ;CONVERT CHAR TO SIXBIT
CAME T4,[POINT 6,SYMBOL,35]
IDPB T1,T4 ;ADD CHAR TO SYMBOL
JRST LOOP
;HERE BECAUSE USER FINISHED SYMBOL WITH ":"
DEFSYM: TRNE FLG,F.SYMB
SKIPN T1,SYMBOL ;SYMBOL HE DEFINED
JRST ILLCHR
HRRZ T2,DOT ;CURRENT ADR
PUSHJ P,ADDSYM
PUSHJ P,TABTYP
JRST LEVEL1
;HERE TO EVALUATE A SYMBOL
EVLSYM: MOVE T1,SYMBOL
CAMN T1,[SIXBIT \.\]
JRST [ HRRZ T1,DOT
POPJ P, ]
PUSHJ P,SYMFND ;TRY TO FIND SYMBOL
JRST SYMERR
MOVE T1,1(SYM) ;GET VALUE OF SYMBOL
TLNN T1,SMF.IN ;WAS THAT AN INSTRUCTION ?
JRST [ ANDI T1,-1 ;STRIP FLAGS
POPJ P, ]
ANDI T1,-1
POPJ P,
SYMERR: OUTSTR [ASCIZ \U \]
JRST LEVEL0
;HERE IF TERMINATES EXPRESSION WITH A HT
STEHT: PUSHJ P,STEFIN
JRST COMHT ;NOW DO TAB FUNCTION
;HERE IF TERMINATES EXPRESSION WITH A CARRIAGE RETURN
STECR: PUSHJ P,STEFIN ;STORE IF APPROPRIATE
JRST LEVEL0
;HERE TO DO DEPOSIT MAYBE AFTER CR OR LF OR UP ARROW
STEFIN: TRZE FLG,F.MOPN ;IS MASK OPEN ?
JRST SETMSK ;SET MASK
TRZN FLG,F.LOPN ;IS LOCATION OPEN ?
POPJ P, ;NO SO JUST RETURN
TRNN FLG,F.WENB ;WAS PATCHING ENABLED ?
JRST WRTLCK ;IS WRITE LOCKED
PUSHJ P,ACCUM ;DO LAST MINUTE ACCUMULATION
MOVE T1,DOT ;GET ADR TO EXAMINE
MOVE T2,EXPRESS ;GET JUNK TO DEPOSIT
PUSHJ P,PUTWRD ;TRY TO DEPOSIT IT
PUSHJ P,CAL1ER
POPJ P,
WRTLCK: OUTSTR [ASCIZ \?patching was not enabled by /PATCH
\]
JRST LEVEL0
;HERE TO SET MASK
SETMSK: PUSHJ P,ACCUM ;DO LAST MINUTE ACCUMULATION
HRRM EXPRESS,S.MASK ;SET MASK
POPJ P,
;HERE IF TERMINATES EXPRESSION WITH A LF
STELF: PUSHJ P,STEFIN ;DEPOSIT LOCATION MAYBE
JRST COMLF ;DID DEPOSIT
;HERE IF TERMINATES EXPRESSION WITH AN UP ARROW
STEARR: PUSHJ P,STEFIN
JRST COMARR
;HERE IS USER TYPES ESCAPE WHILE INPUTTING AN EXPRESSION
ESCEXP: PUSHJ P,ACCUM ;ACCUMULATE EXPRESSION SO FAR
;HERE IF USER TYPES ESCAPE
ESCAPE: PUSHJ P,ACCUM ;FINISH PREVIOUS INPUT
MOVEI STATE,STATSC ;SET ESCAPE FLAG
SETZ T5,
JRST LOOP
ESCESC: TRO FLG,F..ESC
JRST LOOP
;HERE TO ACCUMULATE NUMBER AFTER ESCAPE
ESC..0: IMULI T5,^D10
ADDI T5,-60(T1) ;ACCUMULATE NUMBER
JRST LOOP
ESC..A: MOVEI T1,1 ;SETTING ADDRESS MODE
JRST ESCMOD
ESC..B: MOVEI T1,3 ;SETTING BYTE MODE
SKIPN T5 ;DID HE TYPE NUMBER ?
MOVEI T5,2 ;NO SO 2 BYTES
JRST ESCMOD
ESC..C: MOVEI T1,2 ;SETTING NUMERIC MODE
JRST ESCMOD
ESC..G: MOVE T1,EXPRESS ;GET ADDRESS HE TYPED
MOVEM T1,GOTO ;REMEMBER IT FOR LATER
SKIPE MEMORY ;ARE DIDDLING DUMP OR BIN FILE ?
JRST TABDNE ;YES SO DONE
SKIPN NODE ;ARE WE DOING STUFF WITH A NODE ?
JRST ILLCHR ;NO SO THIS IS IMPOSSIBLE
TRNN FLG,F.WENB ;WAS PATCHING ENABLED ?
JRST WRTLCK ;CAN'T DO IT
MOVE T1,EXPRESS ;GET ADDRESS HE TYPED
PUSHJ P,SETUPN ;SETUP NODE UUO
EXP 3 ;CODE FOR GOTO IS 3
PUSHJ P,NODSET ;GO DO NODE UUO
TABDNE: OUTSTR [" "]
JRST LEVEL2 ;WE DID IT
ESC..K: JUMPE SYM,ILLCHR ;DID A SYMBOL PRECEDE $K ?
PUSHJ P,TABTYP ;TYPE TAB SO HE KNOWS HE WON
MOVSI T1,SMF.SU ;FLAG TO SUPRESS OUTPUT
IORM T1,1(SYM) ;SUPRESS SYMBOL
TRZN FLG,F..ESC ;DID HE WANT TO FLUSH SYMBOL ?
JRST LEVEL2 ;NO SO DONE
JRST LEVEL2
ESC..R: CAIG T5,^D16
CAIG T5,1 ;IS RADIX REASONABLE ?
JRST ILLCHR ;NO SO FLUSH REQUEST
HRRM T5,ORADIX ;YES SET NEW RADIX
TRZE FLG,F..ESC ;SETTING PERMANENT MODE ?
HRLM T5,ORADIX ;YES
PUSHJ P,TABTYP
JRST LEVEL2 ;AND KEEP GOING
ESC..S: MOVEI T1,0 ;SETTING INSTRUCTION MODE
JRST ESCMOD
ESC..I: SKIPA T1,[EXP 5] ;SETTING EBCDIC OUTPUT
ESC..T: MOVEI T1,4 ;SETTING ASCII OUTPUT
SKIPN T5 ;DID USER SPECIFY NUMBER OF BYTES ?
MOVEI T5,2 ;DEFAULT IS 2
ESCMOD: SKIPN T5
MOVEI T5,1 ;DEFAULT IS ONLY ONE
HRRM T5,BYTCNT
PUSHJ P,TABTYP
HRRM T1,O.MODE ;SET CURRENT MODE
TRZN FLG,F..ESC
JRST LEVEL2 ;NOT SETTING PERMANENT MODE
HRLS BYTCNT ;LOCAL COUNT IS PERMANT COUNT
HRLM T1,O.MODE ;SET PERMANT MODE
JRST LEVEL2
;ESCAPE V - WATCH A LOCATION FOR VARIANCE
ESC..V: SKIPE MEMORY
JRST ILLCHR
TRNN FLG,F.LOPN ;IS LOCATION OPEN ?
JRST ILLCHR ;GIVE USER "?"
TRO FLG,F.FLOP
ESC.V0: MOVEI T1,0 ;MINIMUM SLEEP
SLEEP T1,
MOVE T1,DOT ;GET ADDRESS TO WATCH
HRRZ T2,BYTCNT ;NUMBER OF BYTES TO DISPLAY
HRRZ T3,O.MODE ;OUTPUT MODE
CAIG T3,2
ASH T2,1 ;WORD MODE SO TIMES 2 BYTES
TRZ FLG,F.CACH
PUSHJ P,GETWRD ;GET DATA
JRST ILLCHR
MOVE T2,T1 ;COPY DATA
XOR T2,DATA ;COMPARE TO LAST TIME
AND T2,S.MASK ;MASK OFF IRREVELANT BITS
TRZN FLG,F.FLOP
JUMPE T2,ESC.V9 ;BRANCH IF SAME AS BEFORE
ESC.V2: OUTSTR [BYTE (7)15,12,0]
PUSH P,T1 ;SAVE NEW DATA
MOVEM T1,DATA ;SAVE NEW DATA
MOVE T1,DOT ;GET ADDRESS
PUSHJ P,ADRTYP
OUTSTR [ASCIZ \/ \]
TRO FLG,F.CACH
PUSHJ P,DATYPE ;TYPE NEW DATA
POP P,DATA ;IN CASE DATYPE CHANGED IT
ESC.V9: SKPINC ;HAS USER TYPED A CHARACTER ?
JRST ESC.V0 ;NO SO KEEP WATCHING
OUTSTR [ASCIZ \
<done watching>
\]
JRST LEVEL2 ;GO PROCESS NEXT COMMAND
ESC..M: TRO FLG,F.MASK ;MASK IS OPEN
MOVEI STATE,STATEE ;EVALUATE AS AN EXPRESSION
JRST LEVEL3 ;GET REST OF COMMAND
ESC..N: TROA FLG,F.FLIP ;FLAG WE ARE DOING NOT SEARCH
;HERE FOR (ALTMODE)W WHICH IS WORD SEARCH
ESC..W: TRZ FLG,F.FLIP ;FLAG WE WANT MATCHES
MOVE T1,EXPRESS ;GET WHAT TO SEARCH FOR
AND T1,S.MASK
MOVEM T1,S.WORD
MOVE DOT,SBEGIN
SETZM CACHEL ;NOTHING IN CACHE SO FAR
TRO FLG,F.CACH ;USE CACHE IF WE CAN
ESC.W2: MOVE T1,DOT
MOVE T2,S..END
ADDI T2,2
SUB T2,T1 ;NUMBER OF WORDS TO GET TO FINSIH SEARCH
CAILE T2,EXMAX
MOVEI T2,EXMAX ;MAXIMUM NUMBER OF WORDS FOR THIS REQUEST
PUSHJ P,GETWRD
JRST LEVEL0
MOVEM T1,DATA ;SAVE DATA
AND T1,S.MASK ;MASK SOME OF THE BITS
TRNE FLG,F.FLIP ;ARE WE LOOKING FOR MATCH ?
JRST [ CAMN T1,S.WORD ;DON'T WANT MATCH
JRST ESCW.8
JRST ESCW.6 ]
CAME T1,S.WORD
JRST ESCW.8
ESCW.6: OUTSTR [BYTE (7)15,12,0]
MOVE T1,DOT ;GET ADDRESS
PUSHJ P,ADRTYP
OUTSTR [ASCIZ \/ \]
PUSHJ P,DATYPE
SKPINC ;ANY TYPEAHEAD ?
JRST ESCW.8
JRST ESCW.9 ;YES SO STOP
ESCW.8: ADDI DOT,2
CAMLE DOT,S..END
JRST ESCW.9
TRNN DOT,377 ;DON'T DO TOO MANY UUO'S
SKPINC ;TYPEING AHEAD ?
JRST ESC.W2 ;NO
ESCW.9: OUTSTR [ASCIZ \
<search done>
\]
JRST LEVEL2
;ROUTINE TO GET A WORD FROM THE PDP-11
; CALL PUSHJ P,GETWRD ;WITH ADR IN T1, NUMBER OF BYTES IN T2
; ERROR RETURN
; SUCCES DATA IN T1
GETWRD: PUSH P,T3
PUSH P,T4
SKIPN T2
HALT
SKIPE CACHEL ;IS THERE DATA IN CACHE ?
TRNN FLG,F.CACH ;AND MAY WE USE CACHE ?
JRST GETWD1 ;NO CACHE OR CAN'T USE IT
CAMGE T1,CACHEL ;IS REQUEST TOO LARGE ?
CAMGE T1,CACHEA ;OR TOO SMALL
JRST GETWD1 ;NO
GETWD0: MOVE T4,[POINT 8,CACHE] ;POINTER TO CACHE
MOVE T3,T1 ;COPY ADDRESS OF BYTE TO GET
SUB T3,CACHEA ;MAKE RELATIVE
CAIA
IBP T4 ;SKIP NEXT BYTE
SOJGE T3,.-1
ILDB T1,T4 ;GET LOW ORDER BYTE OF REQUESTED WORD
ILDB T2,T4 ;GET HIGH ORDER BYTE OF REQUESTED WORD
DPB T2,[POINT 8,T1,27]
GETWD3: AOS -2(P) ;SKIP RETURN
GETWD4: POP P,T4
POP P,T3
POPJ P,
GETWD1: SKIPE T4,MEMORY ;DO WE HAVE MEMORY IN CORE ?
JRST GETMEM ;YUP
SKIPE NODE ;ARE WE WORKING REMOTELY ?
JRST GETNOD ;YES SO DO IT
IFE FTJSYS,<
;HERE TO DO CALL11 UUO TO GET DATA
SETZ T4,
HRRZM T1,T3
MOVEI T2,1 ;FUNCTION 1
GETWD2: MOVE T1,[3,,T2]
HRL T2,PORT# ;ADD PORT NUMBER
CAL11. T1,
JRST [CAIE T1,4 ;FACILITY IN USE?
JRST GETWD4 ;NO, ERROR RETURN.
MOVEI T1,1 ;YES, SLEEP A SECOND
SLEEP T1,
JRST GETWD2] ; AND TRY AGAIN.
>
;
IFN FTJSYS,<
;
;TO DO EXAMINES FUNCTION 11(OCTAL) IS SENT TO THE FE AND
;THE RESULT OF EXAMINE IS READ BY DOING A SIN JSYS.
;
HRRZM T1,SAVT3 ;SAVE ADR IN T3
MOVEM T4,SAVT4 ;SAVE T4
MOVEI T4,DEXFUN ;EXAMINE FUNCTION
STOR T4,D10DF ;SET IN THE HEADER
STOR T1,D10AD ;THE ADDRESS TO EXAMINE IN -11
SETZ T4, ;CLEAR T4
STOR T4,D10DT ;CLEAR THE CELL
PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE
SKIPE KSFLG ;Check for a 2020
PUSHJ P,FLSHFE ; Yes .. flush any ddcmp buffers hanging around
MOVE T1,D60JFN ;JFN IN T1
MOVE T2,[POINT 8,SBUF] ;BUILD PTR TO SEND BUFFR
MOVNI T3,6 ;#OF BYTES TO XFER
SKIPE KSFLG ;Check for a 2020
JRST EXS.1 ; Yes .. go do 2020 style I/O
SOUT ;SEND IT TO FE
MOVEI T3,1 ;DO NOT SEND EOF
MOVE T1,D60JFN ;JFN
MOVEI T2,.MOEOF ;FORCE PARTIAL RECORDS
MTOPR ;TO THE FE DEVICE
ERJMP FATAL ;SHOULD NOT HAPPEN
MOVEI T4,^D1000 ;MAX 2-SECOND WAIT
INPWT:
MOVE T1,D60JFN ;JFN IN T1
SIBE ;CHECK IF MONITOR BUFFER IS EMPTY?
JRST SOMEIN ;GOT SOME INPUT
MOVEI T1,2 ;SLEEP FOR 2 MS
DISMS ;DISMISS PROCESS FOR 2MS
SOJG T4,INPWT ;DONE WAITING?
JRST FATAL ;FATAL ERROR,BUFFER EMPTY
EXS.1: CALL WR200 ;WRITE TO THE DN200
JRST FATAL ;FATAL ERROR
SOMEIN: MOVE T1,D60JFN ;GET JFN
MOVE T2,[POINT 8,RBUF] ;BUILD A BYTE PTR TO RECV BUFFER
MOVNI T3,6 ;6 BYTES TO BE READ
SKIPE KSFLG ;Check for a 2020
JRST EXS.5 ; Yes go talk to DDCMP link
SIN ;READ IN THE STRING
ERJMP FATAL ;SIN ERROR RETURN
MOVEI T3,1 ;DO NOT SEND EOF
MOVE T1,D60JFN ;JFN
MOVEI T2,.MOEOF ;SEND THE ACK
MTOPR ;TO THE FE DEVICE
ERJMP FATAL ;SHOULD NOT HAPPEN
JRST EXS.6
EXS.5: CALL RD200 ;READ IN STING
JRST FATAL ;ERROR
EXS.6: PUSHJ P,DEQDEV ;DEQ DEVICE IF LOCKED
LOAD T1,D11RS ;HOW DID WE DO IN EXAMINE?
CAIE T1,1 ;SUCCESSFUL??
JRST GETWD4 ;NO,ERROR RETURN
MOVE T3,SAVT3 ;RESTORE T3
MOVE T4,SAVT4 ;RESTORE T4
LOAD T1,D11DT ;DATA IN T1
>
;
;
; HERE WHEN WE MUST EXAMINE MORE
;
GETWD5: HRRZ T2,T3 ;GET ADDRESS WE WERE GETTING
PUSHJ P,PUTBCH ;PUT BYTE INTO THE CACHE
LSH T1,-^D8 ;ADJUST DATA
AOS T2
PUSHJ P,PUTBCH ;ALSO HIGH ORDER BYTE
MOVE T1,T3 ;GET ADDRESS AGAIN
MOVEI T2,2 ;NUMBER OF BYTES TO GET
JRST GETWD0 ;GET DATA FROM THE CACHE
;HERE TO GET A WORD FROM CORE IN 10 MEMORY
GETMEM: CAMLE T1,MEMLIM ;IS IT IN RANGE ?
JRST GETWD4 ;ERROR RETURN
IDIVI T1,4 ;WE KEEP 4 BYTES IN 36BIT WORD
ADD T1,MEMORY ;ADD RELOCATION
ADD T1,[ POINT 9,0,8
POINT 9,0,17
POINT 9,0,26
POINT 9,0,35 ](T2)
LDB T2,T1
ILDB T1,T1
ROT T2,-^D8
LSHC T1,^D8
ANDI T1,177777 ;STRIP EXTRA BITS
JRST GETWD3
;HERE TO EXAMINE MEMORY FROM ANOTHER NETWORK NODE
GETNOD: PUSHJ P,SETUPN ;BEGIN BUILDING MSG<LINE><CODE><ADR>
EXP 1 ;CODE FOR EXAMINE REQUESTS IS 1
MOVEM T1,T3 ;SAVE ADDRESS
ADDI T1,(T2) ;MAKE LIMIT ADDRESS
PUSHJ P,PUTADR ;PUT LIMIT ADDRESS INTO THE MESSAGE
PUSHJ P,NODSET ;DO NODE UUO
CAIE T1,12 ;CODE FOR EXAMINE DATA IS 12
JRST STCERR
PUSH P,T3 ;SAVE ADDRESS WE WENT FOR
HLRZ T3,NODARG+3 ;GET BYTE COUNT FROM MSG
SUBI T3,4 ;SUBTRACT BYTES WE ALREADY READ
ILDB T2,T4 ;GET LOW ORDER 8 BITS OF ADDRESS
ILDB T1,T4 ;GET HIGH ORDER 8 BITS
DPB T1,[POINT 8,T2,27]
TRNE FLG,F.PDP8
JRST GTNOD3
SOS T3 ;COUNT BYTE
ILDB T1,T4
DPB T1,[POINT 8,T2,19]
GTNOD3: ILDB T1,T4 ;GET NEXT BYTE OF DATA
PUSHJ P,PUTBCH ;PUT BYTE INTO THE CACHE
AOS T2 ;ADVANCE ADDRESS
SOJG T3,GTNOD3
POP P,T1 ;GET ADDRESS WE WENT FOR
JRST GETWD0
;HERE TO BEGIN A NODE UUO MSG <LINE><CODE><ADDRESS>
; CALL MOVE T1,<ADR>
; PUSHJ P,SETUPN
; EXP <CODE>
SETUPN: PUSH P,T1 ;SAVE ADDRESS
MOVE T4,[POINT 8,STCMSG] ;POINTER TO STATION CONTROL MSG
MOVE T1,LINE ;0 = SELF, 1-N IS LINE NUMBER
IDPB T1,T4 ;MSG IS FOR NODE
MOVE T1,@-1(P) ;GET CODE
IDPB T1,T4
POP P,T1 ;GET ADDRESS BACK
PUSHJ P,PUTADR ;PUT ADDRESS INTO THE MESSAGE
AOS (P) ;SKIP ARGUMENT
POPJ P,
;HERE TO DO A NODE UUO
; CALL MOVEI T1,<COUNT> ;OF BYTES IN MSG TO SEND
; RETURNS WITH T4 POINTING TO INPUT MSG AND CODE IN T1
NODSET: PUSH P,[POINT 8,STCMSG]
MOVEI T1,1 ;INITIALIZE LENGTH COUNTER
IBP (P) ;ADVANCE DUMMY POINTER
CAME T4,(P)
AOJA T1,.-2
HRLI T1,STCMSG
MOVSM T1,NODARG+2
POP P,T1 ;CLEAN OFF STACK
MOVEI T1,4 ;NUMBER OF WORDS IN ARGUMENT
MOVEM T1,NODARG
MOVE T1,NODE ;NODE NAME
MOVEM T1,NODARG+1
MOVE T1,[400,,STCIMS] ;INPUT MSG SLOT
MOVEM T1,NODARG+3
MOVE T1,[3,,NODARG] ;FUNCTION IS SEND STC MSG
NODE. T1,
JRST NODERR
MOVE T4,[POINT 8,STCIMS] ;POINTER TO INPUT MESSAGE
ILDB T1,T4 ;GET FIRST BYTE (= LINE# OR SELF)
CAME T1,LINE
JRST NODERR
ILDB T1,T4 ;GET MESSAGE SUBTYPE
POPJ P,
STCERR: OUTSTR [ASCIZ \STC error - msg =\]
HLRZ T4,NODARG+3
SKIPA T5,[POINT 8,STCIMS]
STCER3: OUTCHR [","]
OUTCHR ["<"]
ILDB T1,T5
PUSHJ P,OCTYPE
OUTCHR [">"]
SOJG T4,STCER3
JRST LEVEL0
;HERE TO PUT A BYTE INTO THE CACHE
; CALL MOVE T1,<BYTE>
; MOVE T2,<ADR>
; PUSHJ P,PUTBCH
; RETURN
PUTBCH: PUSH P,T1
PUSH P,T2
PUSH P,T3
PUSH P,T4
SKIPE T3,CACHEL ;IS CACHE EMPTY ?
CAMG T2,CACHEA ;IS NEW BYTE BELOW CACHE ADDRESS ?
JRST PTBCH2 ;FLUSH CACHE
SUB T3,CACHEA ;HOW MANY BYTES ALREADY IN THE CACHE ?
CAIGE T3,CACHSZ ;SMALL ENOUGH ?
JRST PTBCH1 ;YES
MOVEI T3,4 ;REDUCE CONTENTS BY 4 BYTES = ON 10 WORD
ADDM T3,CACHEA
MOVE T3,[CACHE+1,,CACHE] ;BLT POINTER
BLT T3,CACHE+<CACHSZ/4>-1 ;SHUFFLE CACHE
PTBCH1: CAMN T2,CACHEL ;ARE TRYING TO ADD ONE BYTE TO CACHE ?
JRST PTBCH4 ;YES
PTBCH2: MOVEM T2,CACHEA ;BEGIN CACHE HERE
PTBCH4: MOVEM T2,CACHEL ;THIS IS THE NEW CACHE LIMIT
AOS CACHEL ;MAKE ONE PLUS
SUB T2,CACHEA ;HOW MANY BYTES TO NEW BYTE ?
MOVE T3,[POINT 8,CACHE]
CAIA
IBP T3
SOJGE T2,.-1
IDPB T1,T3 ;PUT BYTE INTO THE CACHE
POP P,T4
POP P,T3
POP P,T2
POP P,T1
POPJ P,
;ROUTINE TO DEPOSIT A WORD IN PDP-11 MEMORY
; CALL PUSHJ P,PUTWRD ;WITH ADR IN T1 & DATA IN T2
PUTWRD: PUSH P,T3
PUSH P,T4
MOVEM T1,T3
PUTWD1: SKIPE T4,MEMORY ;DID WE READ A DUMP ?
JRST PUTMEM ;DEPOSIT INTO MEMORY
SKIPE NODE ;WORKING REMOTELY ?
JRST PUTNOD ;YES
IFE FTJSYS,< ;THE FOLLOWING ASSEMBLES FOR TEN
MOVEM T2,T4
MOVEI T2,0 ;FUNCTION 0
PUTWD2: MOVE T1,[3,,T2]
HRL T2,PORT# ;ADD PORT NUMBER
CAL11. T1,
JRST [CAIE T1,4 ;FACILITY IN USE?
JRST GETWD4 ;NO, ERROR RETURN.
MOVEI T1,1 ;YES, WAIT A SECOND
SLEEP T1,
JRST PUTWD2] ; AND TRY AGAIN.
>
;
; HERE TO USE SIN/SOUT FOR TOPS-20 F.E. DEVICE
;
IFN FTJSYS,<
MOVEM T3,SAVT3 ;SAVE T3
MOVEM T4,SAVT4 ;SAVE T4
MOVEI T4,DEPFUN ;DEPOSIT FUNCTION
STOR T4,D10DF ;SETUP IN HEADER TO FE
STOR T1,D10AD ;ADR TO EXAMINE IN THE -11
SETZ T4, ;CLEAR T4
STOR T2,D10DT ;DATA TO DEPOSIT IN ABOVE ADR
PUSHJ P,ENQDEV ;LOCK DEVICE FOR OUR USE
SKIPE KSFLG ;Check for a 2020
PUSHJ P,FLSHFE ; Yes .. flush any ddcmp buffers hanging around
MOVE T1,D60JFN ;ADR OF JFN
MOVE T2,[POINT 8,SBUF] ;BYTE PTR TO SEND BUFFER
MOVNI T3,6 ;6 BYTES TO XFER
SKIPE KSFLG ;Check for a 2020
JRST SS20.1 ; Yes .. go talk to DDCMP link
SOUT ;SEND TO THE FE
MOVEI T3,1 ;DO NOT SEND EOF
MOVE T1,D60JFN ;JFN
MOVEI T2,.MOEOF ;WRITE PARTIAL RECORDS
MTOPR ;WITH THIS JSYS
ERJMP FATAL ;SHOULD NOT HAPPEN
MOVE T4,^D1000 ;2-SECOND MAXIMUM WAIT
INWAIT:
MOVE T1,D60JFN ;JFN
SIBE ;CHECK IF MONITOR BUFFER EMPTY
JRST SOMINP ;GOT SOME INPUT
MOVEI T1,2 ;SLEEP FOR 2 MS
DISMS ;JSYS FOR SLEEPING
SOJG T4,INWAIT ;WAITED ENOUGH?
JRST FATAL ;YES,TIMEOUT FATAL ERROR
SS20.1: CALL WR200 ;SEND TO REMOTE CPU
JRST FATAL
SOMINP: MOVE T1,D60JFN ;GET JFN
MOVE T2,[POINT 8,RBUF] ;BYTE PTR TO REC BUFFER
MOVNI T3,6 ;#BYTES TO BE READ
SKIPE KSFLG ;Check for a 2020
JRST SS20.5 ; Yes .. talk to DDCMP
SIN ;READ STRING DATA
MOVEI T3,1 ;DO NOT SEND EOF
ERJMP FATAL ;SIN FATAL ERROR
MOVE T1,D60JFN ;JFN
MOVEI T2,.MOEOF ;WRITE PARTIAL RECORDS
MTOPR ;WITH THIS JSYS
ERJMP FATAL ;SHOULD NOT HAPPEN
JRST SS20.6
SS20.5: CALL RD200 ;READ THE ANSWER
JRST FATAL
SS20.6: PUSHJ P,DEQDEV ;DEQ IF LOCKED
LOAD T1,D11RS ;CHECK THE RESULT CODE
CAIE T1,1 ;SUCCESSFUL??
JRST GETWD4 ;NO,ERROR RETURN
;
>
JRST GETWD3 ;YES,WIN RETURN
;
PUTMEM: CAML T1,MEMLIM ;IS ADR IN RANGE ?
JRST GETWD4 ;NO SO REJECT IT
EXCH T1,T2 ;SWAP ADR AND DATA
PUSHJ P,PUTBYT ;PUT LOW ORDER BYTE INTO MEMORY
LSH T1,-^D8 ;POSITION HIGH ORDER BYTE
AOS T2
PUSHJ P,PUTBYT
JRST GETWD3
PUTNOD: PUSHJ P,SETUPN ;BEGIN NODE. MSG <LINE><CODE><ADR>
EXP 2 ;CODE FOR DEPOSIT IS 2
IDPB T2,T4 ;PUT HIGH ORDER BYTE OF DATA INTO MSG
LSH T2,-^D8
IDPB T2,T4
PUSHJ P,NODSET ;SEND MSG
CAIE T1,11 ;DID WE GET AN ACCEPT ?
JRST STCERR
JRST GETWD3
PUTADR: PUSH P,T1
TRNE FLG,F.PDP8
ANDI T1,077777 ;STRIP EXTRA BITS
IDPB T1,T4 ;PUT LOW ORDER BYTE OF ADR INTO MSG
ROT T1,-^D8
IDPB T1,T4
ROT T1,-^D8
TRNE FLG,F.PDP8
JRST TPOPJ
IDPB T1,T4
TPOPJ: POP P,T1
POPJ P,
CAL1ER: OUTCHR ["?"]
PUSHJ P,OCTYPE
OUTSTR [ASCIZ \? \]
POPJ P,
IFN FT2SEG <RELOC>
NODARG: BLOCK 5
STCMSG: BLOCK 20
STCIMS: BLOCK 110
IFN FT2SEG <RELOC>
SUBTTL SYMBOL TABLE ROUTINES
;SYMBOLS ARE KEPT IN THREE WORD BLOCKS(ALPHABETIZED)
; STARTING AT LOCATION POINTED TO BY SYMBEG
; 1ST WORD IN BLOCK IS SIXBIT SYMBOL
; 2ND WORD IS HALF WORD FLAGS,,VALUE
SMF.SU==000001 ;SYMBOL IS SUPPRESSED(DEFINED WITH =)
SMF.RG==000002 ;SYMBOL IS A REGISTER VALUE
SMF.MK==000004 ;MARK NN
SMF.IN==000010 ;SYMBOL IS AN INSTRUCTION
SMF.DD==000020 ;LOW ORDER SIX BITS ARE DESTINATION
SMF.SS==000040 ;LOW ORDER 12 BITS ARE SSDD
SMF.XX==000100 ;LOW ORDER 8 BITS ARE XXX(E.G. BR)
SMF.SB==000200 ;SOB TYPE ADDRESS
SMF.RT==000400 ;RTS TYPE REGISTER USAGE
SMF.JS==001000 ;JSR TYPE REGISTER USAGE
SMF.EM==002000 ;EMT TYPE ARGUMENT
SMF.AS==004000 ;ASH TYPE NN ARG
SMF.PL==010000 ;SET PROCESSOR LEVEL
SMF.FL==020000 ;FLOATING POINT (FP11-B)
; 3RD WORD IS LINK TO NEXT SYMBOL BLOCK
;HERE TO FIND A MATCH FOR A SYMBOL
; CALL MOVE T1,[SIXBIT \SYMBOL\]
; PUSHJ P,SYMFND
; ERROR RETURN
; SUCCESS RETURN SYM POINTS TO SYMBOL
SYMFND: SKIPN SYM,SYMBEG ;GET ADR OF BEGINING OF SYMBOL TABLE
POPJ P, ;CAN'T FIND SYMBOL
SYMFN1: CAMN T1,(SYM) ;HAVE WE FOUND THE SYMBOL ?
JRST CPOPJ1 ;YES
HRRZ SYM,2(SYM) ;GET ADR OF NEXT SYMBOL BLOCK
JUMPN SYM,SYMFN1
POPJ P, ;CAN'T FIND SYMBOL
;HERE TO SEE IF WE CAN FIND A MATCH FOR AN INSTRUCTION
; CALL MOVEI T1,<VALUE>
; PUSHJ P,INVLFN
; LOSE RETURN
; WIN RETURN WITH SYM SET UP
INVLFN: SKIPN SYM,SYMBEG ;ADDRESS OF FIRST SYMBOL BLOCK
POPJ P, ;NO SYMBOL TABLE
INVLF1: MOVE T2,1(SYM) ;GET SYMBOL VALUE
TLNN T2,SMF.IN ;IS THIS AN INSTRUCTION ?
JRST INVLF8
TLNE T2,SMF.SU ;IS INSTRUCTION SUPPRESSED?
JRST INVLF8 ;YES, DON'T USE IT.
LDB T3,[POINT 4,1(SYM),3] ;GET NUMBER OF BITS IN INSTRUCTION -1
MOVE T3,MASKTB(T3) ;GET MASK FOR INSTRUCTION
AND T3,T1 ;MASK ARGUMENT
CAIE T3,(T2) ;IS THIS A MATCH ?
JRST INVLF8 ;NO
CPOPJ1: AOS (P) ;FOR SKIP RETURN
CPOPJ: POPJ P,
INVLF8: HRRZ SYM,2(SYM) ;GET ADR OF NEXT SYMBOL BLOCK
JUMPN SYM,INVLF1
POPJ P,
MASKTB: EXP 100000
EXP 140000,160000,170000
EXP 174000,176000,177000
EXP 177400,177600,177700
EXP 177740,177760,177770
EXP 177774,177776,177777
IFN FTJSYS,<
;THE FOLLOWING BUFFERS ARE USED BY DECSYSTEM-20 ONLY
;
SBUF: BLOCK 2 ;FOR SENDING HEADER TO FE
RBUF: BLOCK 2 ;FOR RECEIVING HEADERS FROM FE
D60JFN: BLOCK 1 ;TO HOLD JFN
D60BUF: BLOCK 20 ;TO HOLD JFN
SAVT3: BLOCK 1 ;TO SAVE T3
SAVT4: BLOCK 1 ;TO SAVE T4
;
>
;HERE TO FIND A NAME FOR A REGISTER
; CALL: MOVEI T1,# ;REGISTER NUMBER
; PUSHJ P,RGFNDN
; LOSE
; BINGO
RGFNDN: SKIPN SYM,SYMBEG ;GET FIRST SYMBOL BLOCK ADR
POPJ P, ;NO SYMBOL TABLE
RGFND1: MOVE T2,1(SYM) ;GET SYMBOL VALUE
TLNN T2,SMF.RG ;IS THIS A REGISTER ?
JRST RGFND8 ;NO
CAIE T1,(T2) ;IS THIS WHAT WE WANTED ?
JRST RGFND8 ;NO
TLNE T2,SMF.SU ;IS SYMBOL SUPPRESSED?
JRST RGFND8 ;YES, DON'T USE IT.
AOS (P) ;SKIP RETURN
POPJ P,
RGFND8: HRRZ SYM,2(SYM) ;GET NEXT SYMBOL BLOCK
JUMPN SYM,RGFND1 ;NOT YET
POPJ P, ;ERROR RETURN
;HERE TO ADD A SYMBOL TO TABLE
; CALL PUT SYMBOL IN T1, PUT VALUE AND FLAGS IN T2, MISC IN T3
ADDSYM: MOVE SYM,SYMBEG ;GET ADDRESS OF FIRST SYMBOL BLOCK
ADSYM1: CAMN T1,@SYM ;DOES THIS MATCH ?
JRST [ MOVEM T2,1(SYM) ;YES SO THIS REPLACES PREVIOUS
POPJ P, ]
HRRZ SYM,2(SYM) ;GET ADDRESS OF NEXT SYMBOL BLOCK
JUMPN SYM,ADSYM1
;MAKE A NEW SYMBOL BLOCK
MOVE T4,.JBFF ;ADDRESS OF NEW SYMBOL BLOCK
ADDI T4,3
MOVEM T4,.JBFF
HRLM T4,.JBSA##
PUSHJ P,GETCOR
SUBI T4,3 ;MAKE ADDRESS OF BLOCK AGAIN
MOVE SYM,SYMEND ;GET ADDRESS OF LAST SYMBOL BLOCK
HRRZM T4,2(SYM)
HRRZM T4,SYMEND
MOVEM T4,SYM
MOVEM T1,0(SYM)
MOVEM T2,1(SYM)
SETZM 2(SYM)
POPJ P,
;HERE TO FIND A NEAR MATCH FOR A VALUE
; CALL MOVEI T1,VALUE TO MATCH
; PUSHJ P,VALFND
; ERROR RETURN
; RETURN WITH SYM SET UP
VALFND: PUSH P,T4
SETZ SYM,
MOVE T2,SYMBEG ;ADR OF FIRST SYMBOL BLOCK
VLFND1: MOVE T3,1(T2) ;GET SYMBOL'S VALUE
TRNE T3,177777 ;IS VALUE ZERO ?
TLNE T3,SMF.SU!SMF.IN!SMF.RG ;IS SYMBOL SUPPRESSED OR INSTRUCTION ?
JRST VLFND7 ;YES SO DON'T TRY IT
CAIGE T1,400(T3) ;IS SYMBOL VALUE MUCH LESS THAN DESIRED ?
CAIGE T1,(T3) ;IS SYMBOL VALUE .LE. DESIRED VALUE ?
JRST VLFND7 ;NO
JUMPE SYM,VLFND4
CAIL T4,(T3) ;IS SYMBOL BETTER THAN LAST MATCH ?
JRST VLFND7 ;NO
VLFND4: MOVE SYM,T2 ;BEST MATCH SO FAR
HRRZ T4,T3 ;COPY VALUE FOR FUTURE REFERENCE
VLFND7: HRRZ T2,2(T2) ;GET ADDRESS OF NEXT BLOCK
JUMPN T2,VLFND1
SKIPE SYM
AOS -1(P)
POP P,T4
POPJ P,
GETCOR: PUSH P,T1
HRRZ T1,.JBFF## ;GET NEW AMOUNT OF CORE WE NEED
CAMG T1,.JBREL##
JRST GTCOR9
TRNE FLG,F.LOCK
JRST [ MOVEI T1,1 ;CODE FOR LOW SEG
UNLOK. T1, ;CAN'T BE LOCKED WHEN WE DO THIS
JRST LOCKER ;OLD MONITOR PERHAPS ?
HRRZ T1,.JBFF## ;GET CORE ARG BACK
CORE T1,
JRST CORERR ;CAN'T HAVE MORE ?
MOVEI T1,1 ;CODE TO LOCK LOW SEG
LOCK T1,
JRST LOCKER
JRST GTCOR6 ]
CORE T1,
JRST CORERR
GTCOR6:
REPEAT 0,<
OUTCHR ["["]
PUSH P,T2
PUSH P,T3
HRRZ T1,.JBREL##
AOS T1
LSH T1,-^D9
PUSHJ P,DECTYP
POP P,T3
POP P,T2
OUTSTR [ASCIZ \P core]
\]
>
GTCOR9: POP P,T1
POPJ P,
;HERE IF CAN'T GET CORE WE WANT
CORERR: OUTSTR [ASCIZ \ CORE UUO failed\]
EXIT
;HERE TO READ A SYMBOL TABLE FROM A LISTING
RDSYMB: MOVE T1,[SIXBIT \FOOBAR\] ;DEFAUL FILE NAME
MOVE T2,[SIXBIT \LSTCRF\] ;DEFAULT EXTENSIONS
PUSHJ P,OPNFL0 ;OPEN FILE TO READ SYMBOLS FROM
JRST LEVEL0
MOVE T1,[FILDEV,,SYMDEV]
BLT T1,SYMDEV+3
GETSC0: SETZ T5, ;COUNT OF SYMBOLS
PUSHJ P,GETSCH
CAIE T1,14 ;IS THIS A FORM FEED ?
JRST GETSC0 ;LOOK FOR ONE
GETSC1: PUSHJ P,GETSCH
CAIE T1,12 ;IS THIS A LINE FEED ?
JRST GETSC1 ;LOOK FOR ONE
GETSC2: PUSHJ P,GETSCH
CAIE T1,12 ;IS THIS A LINE FEED ?
JRST GETSC2 ;LOOK FOR ONE
SETZB T3,SYMBOL ;BUILD SYMBOL HERE
MOVE T2,[POINT 6,SYMBOL]
GETSC3: PUSHJ P,GETSCH
CAIN T1,"=" ;EQUAL SIGN?
JRST [CAME T2,[POINT 6,SYMBOL,35]
JRST GETSC2
JRST GETSC7]
CAIG T1,40 ;IN SIXBIT RANGE (EXCEPT BLANK)?
JRST GETSC4 ;IF NOT HAVE FINISHED SYMBOL
SUBI T1,40 ;CONVERT TO SIXBIT
CAMN T2,[POINT 6,SYMBOL,35] ;FILLED WORD YET ?
JRST GETSC2 ;YES, MUST NOT BE A SYMBOL
IDPB T1,T2 ;NO SO KEEP FILLING
JRST GETSC3
;
GETSC4: CAIE T1,40 ;SYMBOLS END WITH A SPACE
JRST GETSC2 ;NOT SYMBOL - FLUSH LINE
GETSC7: JUMPE SYMBOL,GETSC2 ;IF NO SYMBOL FLUSH LINE
TDZA T4,T4 ;FLAGS
GETSC5: PUSHJ P,GETSCH
CAIN T1,40
JRST GETSC5
CAIN T1,"="
JRST [ TRO T4,SMF.SU ;SUPPRESSED SYMBOL
JRST GETSC5 ]
CAIN T1,"%"
JRST [ TRO T4,SMF.RG ;REGISTER NAME
TRZ T4,SMF.SU ;NOT SUPPRESSED
JRST GETSC5 ]
CAIL T1,60
CAILE T1,67
JRST GETSC2 ;FLUSH REST OF LINE
GETSC6: IMULI T3,^D8
ADDI T3,-60(T1)
PUSHJ P,GETSCH
CAIL T1,60
CAILE T1,67
CAIA
JRST GETSC6
MOVE T1,SYMBOL ;COPY SYMBOL
HRRZ T2,T3 ;VALUE
HRL T2,T4 ;FLAGS
SETZ T3,
PUSH P,SYMEND
PUSHJ P,ADDSYM
POP P,T1 ;GET OLD SYMEND
CAME T1,SYMEND
AOS T5 ;COUNT SYMBOL
JRST GETSC2 ;FLUSH REST OF LINE
GETSCH: SOSGE IHD+2
JRST GTSCH5
ILDB T1,IHD+1
POPJ P,
GTSCH5: IN
JRST GETSCH
OUTSTR [ASCIZ \ Loaded \]
MOVE T1,T5
PUSHJ P,DECTYP
OUTSTR [ASCIZ \ symbols
\]
POP P,T1 ;ADJUST THE STACK
POPJ P,
SYMDEV: EXP 0
EXP 0
EXP 0
EXP 0
SUBTTL GENERAL FILE ROUTINES
;HERE TO OPEN A FILE TO READ
; CALL MOVE T1,[SIXBIT \FILE\] ;DEFAULT FILE NAME
; MOVE T2,[SIXBIT \EXTEXT\] ;DEFAULT EXTENSIONS
; PUSHJ P,OPNFIL
; LOSE RETURN
; WIN RETURN
OPNFIL: TROA FLG,F.FLIP ;FLAG WE SHOULD PROMPT
OPNFL0: TRZ FLG,F.FLIP ;NO PROMPT PLEASE
MOVEM T1,FILNAM ;SAVE DEFAULT FILE NAME
MOVEM T2,FILEXT ;SAVE DEFAULT EXTENSIONS
SETZM FILPPN
OPFIL1: MOVSI T1,'DSK' ;DEFAULT DEVICE NAME
MOVEM T1,FILDEV
TROE FLG,F.FLIP ;WANT PROMPT ?
OUTSTR [ASCIZ \
FILE: \]
PUSHJ P,SIXIN ;GET FILE NAME
JRST OPFIL1
CAIE T5,":" ;WAS THIS A DEVICE SPECIFICATION ?
JRST OPFIL5
MOVEM T1,FILDEV ;YES SO WAS A DEVICE
PUSHJ P,SIXIN ;GET FILE NAME
JRST OPFIL1
OPFIL5: SKIPE T1 ;WAS THERE A FILE NAME ?
MOVEM T1,FILNAM ;SAVE FILE NAME
CAIE T5,"." ;GIVING AN EXTENSION ?
JRST OPFIL6 ;NO
PUSHJ P,SIXIN ;GET EXTENSION
JRST OPFIL1
HLLZM T1,FILEXT
OPFIL6: CAIE T5,"[" ;GIVING A PPN ?
JRST OPFIL7
PUSHJ P,SIXIN
JRST OPFIL7
CAIE T5,","
JRST OPFIL7
PUSHJ P,SIXOCT
JRST OPFIL7
HRLM T1,FILPPN
PUSHJ P,SIXIN
JRST OPFIL1
PUSHJ P,SIXOCT
JRST OPFIL1
HRRM T1,FILPPN
OPFIL7: SETZ T1,
MOVE T2,FILDEV
MOVEI T3,IHD
TRNE FLG,F.WRIT
HRLZI T3,OHD
OPEN T1
JRST FILER0
PUSH P,.JBFF##
MOVEI T2,INPBUF
MOVEM T2,.JBFF##
MOVE T1,[INBUF 1]
TRNE FLG,F.WRIT
HRLI T1,(OUTBUF)
XCT T1
JFCL
POP P,.JBFF##
OPNFL8: MOVE T1,[LOOKUP T2]
TRNE FLG,F.WRIT
HRLI T1,(ENTER)
MOVE T2,FILNAM
HLLZ T3,FILEXT ;GET DEFAULT EXTENSION
SETZ T4,
MOVE T5,FILPPN
XCT T1
CAIA ;LOOKUP OR ENTER LOST
JRST OPNFL9
TRNE FLG,F.WRIT ;WRITING ?
JRST FILER0 ;HE LOSES
HRLZS T3,FILEXT ;TRY DEFAULT EXTENSION
JUMPE T3,FILER0 ;IF NONE DON'T TRY AGAIN
JRST OPNFL8
OPNFL9: HLLZS FILEXT ;SAVE REAL FILE EXTENSION
JRST CPOPJ1 ;RETURN TO CALLER
FILER0: OUTSTR [ASCIZ \can't LOOKUP/ENTER file \]
FILERR: MOVEI T1,FILDEV
PUSHJ P,FILTYP
OUTSTR [ASCIZ \
\]
POPJ P,
FILTYP: PUSH P,T1 ;SAVE POINTER TO FILE DESCRIPTOR
MOVE T1,@(P) ;GET DEVICE NAME
PUSHJ P,SIXTYP
MOVEI T1,":"
PUSHJ P,TYPCHR
AOS (P)
MOVE T1,@(P) ;GET FILE NAME
PUSHJ P,SIXTYP
MOVEI T1,"."
PUSHJ P,TYPCHR
AOS (P) ;ADVANCE TO FILE EXTENSION
HLLZ T1,@(P) ;GET EXTENSION
PUSHJ P,SIXTYP
AOS (P)
SKIPN T1,@(P)
JRST FILTY6
PUSH P,T1 ;SAVE PPN
MOVEI T1,"["
PUSHJ P,TYPCHR
HLRZ T1,(P)
PUSHJ P,OCTYPE
MOVEI T1,","
PUSHJ P,TYPCHR
POP P,T1 ;GET RH OF PPN
ANDI T1,-1
PUSHJ P,OCTYPE
MOVEI T1,"]"
PUSHJ P,TYPCHR
FILTY6: POP P,T1
POPJ P,
;HERE TO CLOSE OUTPUT FILE
DONE.W: SKIPN OHD
POPJ P,
OUT
CLOSE
RELEASE
SETZM OHD
POPJ P,
IFN FT2SEG < RELOC >
IHD: BLOCK 3
INPBUF: BLOCK 203
FILDEV: SIXBIT \DSK\
FILNAM: BLOCK 1
FILEXT: BLOCK 1
FILPPN: BLOCK 1
IFN FT2SEG < RELOC >
;HERE TO GET NEXT CHAR FROM A FILE
; CALL PUSHJ P,FILCHR
; ERROR RETURN
; NORMAL RETURN WITH CHAR IN T1
FILCHR: SOSGE T1,IHD+2 ;IS THERE MORE STUFF IN BUFFER ?
JRST FLCHR5 ;NO
ILDB T1,IHD+1 ;GET NEXT CHAR
JUMPE T1,FILCHR ;FLUSH NULLS
AOS (P) ;SKIP RETURN
POPJ P,
FLCHR5: IN ;GET NEXT BUFFER
JRST FILCHR ;TRY AGAIN
POPJ P,
;HERE TO INPUT AN OCTAL NUMBER
; CALL: PUSHJ P,INPOCT
; ERROR RETURN
; RETURN WITH OCTAL NUMBER IN T1, BREAK CHAR IN T2
INPOCT: PUSH P,T3
PUSH P,T4
SETZB T3,T4
INPRD2: PUSHJ P,FILCHR ;GET NEXT INPUT CHAR
JRST INPRD9 ;NO MORE IN FILE
JUMPE T1,INPRD2
CAIE T1," " ;LEADING SPACE ?
CAIN T1," " ;OR TAB ?
JRST INPRD2 ;YES
INPRD5: CAIL T1,"0"
CAILE T1,"7"
JRST INPRD7
IMULI T3,^D8
ADDI T3,-60(T1)
PUSHJ P,FILCHR
CAIA ;EOF
JRST INPRD5
INPRD7: MOVE T2,T1
MOVE T1,T3
AOS -2(P) ;SKIP RETURN
INPRD9: POP P,T4
POP P,T3
POPJ P,
;HERE TO GET A SIXBIT WORD FROM TTY
SIXIN: MOVE T4,[POINT 6,T5]
SETZ T5,
SIXIN2: PUSHJ P,RDCHAR ;GET A CHAR FROM TTY
CAIN T1,177
JRST [ OUTSTR [ASCIZ \xxx\]
POPJ P, ]
CAIL T1,"0"
CAILE T1,"Z"
JRST SIXIN9 ;RETURN
CAILE T1,"9"
CAIL T1,"A"
CAIA
JRST SIXIN9 ;RETURN
SUBI T1,40
CAME T4,[POINT 6,T5,35] ;HAVE WE ALREADY FILLED WORD ?
IDPB T1,T4 ;NOT YET
JRST SIXIN2
SIXIN9: EXCH T1,T5
CAIN T5,15 ;END OF LINE?
TRO FLG,F.ENDL ;YES, NOTE THAT.
JRST CPOPJ1
;HERE TO CONVERT SIXBIT TO OCTAL
SIXOCT: MOVE T4,[POINT 6,T1]
SETZ T2,
SIXOC1: ILDB T3,T4
JUMPE T3,SIXOC9
CAIL T3,20
CAILE T3,27
POPJ P, ;CAN'T CONVERT
IMULI T2,^D8
ADDI T2,-20(T3)
CAME T4,[POINT 6,T1,35] ;DONE ALL OF WORD ?
JRST SIXOC1
SIXOC9: EXCH T1,T2
JRST CPOPJ1
SUBTTL TTY ROUTINES
;HERE TO DISPLAY CONTENTS OF T1 AS AN ADDRESS
ADRTYP: ANDI T1,177777 ;SIXTEEN BITS ONLY PLEASE
HRROM T1,LSTADR ;SAVE LAST ADDRESS DISPLAYED
PUSHJ P,VALFND ;SEE IF WE CAN FIND A SYMBOL
JRST RADTYP ;TYPE ADDR IN CURRENT RADIX
PUSH P,T1 ;SAVE VALUE
MOVE T1,(SYM) ;GET SYMBOL NAME
PUSHJ P,SIXTYP ;TYPE SYMBOL
POP P,T1 ;GET VALUE AGAIN
SUB T1,1(SYM) ;GET DISPLACEMENT
ANDI T1,177777 ;STRIP EXTRA BITS
JUMPE T1,CPOPJ ;IF EXACT WE ARE DONE
PUSH P,T1 ;SAVE REMAINDER
MOVEI T1,"+"
PUSHJ P,TYPCHR
POP P,T1
JRST RADTYP ;TYPE REST IN CURRENT RADIX
;HERE TYPE DATA
DATYPE: MOVE T1,DOT
HRRZ T2,BYTCNT ;BYTE COUNT
HRRZ T3,O.MODE ;OUTPUT MODE
CAIG T3,2 ;IS THIS A WORD MODE
ASH T2,1 ;YES SO BYTE=WORDS*2
PUSHJ P,GETWRD
JRST [ PUSHJ P,CAL1ER
JRST LEVEL0 ]
MOVEM T1,DATA
HRRZ T5,BYTCNT ;REPETITION COUNT
SETZM LSTADR
SETZM DOTFOO
MOVE T1,DATA ;GET DATA TO TYPE
HRRZ T2,O.MODE ;GET OUTPUT MODE
PUSHJ P,@[EXP DATINS,DATADR,DATNUM,DATBYT,DATASC,DATEBC](T2)
MOVEI T1,[ASCIZ \ \]
PJRST TYPSTR
;
DATNUM: PUSHJ P,RADTYP ;TYPE AS NUMERIC
SOJLE T5,DATYP8
PUSHJ P,BLANKT
PUSHJ P,NXTDWD ;GET NEXT DATA WORD
JRST DATNUM
NXTDWD: SKIPN DOTFOO ;DONE 2ND WORD YET
MOVE DOTFOO,DOT
ADDI DOTFOO,2
MOVE T1,DOTFOO
MOVEI T2,2
PUSHJ P,GETWRD ;FIND WHAT NEXT WORD IS
JRST DATYP8 ;CAN'T READ NEXT WORD !
MOVEM T1,DATA
POPJ P,
;HERE TO TYPE DATA AS AN ADDRESS
DATADR: PUSHJ P,ADRTYP
SOJLE T5,DATYP8 ;HAVE WE DONE ENOUGH ?
PUSHJ P,BLANKT ;TYPE A SPACE TO SEPERATE FIELDS
PUSHJ P,NXTDWD ;GET NEXT DATA WORD
JRST DATADR ;AND TYPE NEXT WORD
;HERE TO TYP DATA AS INSTRUCTIONS
DATINS: PUSHJ P,INVLFN ;SEE IF WE CAN FIND AN INSTRUCTION TO MATCH
JRST DATNUM
MOVE T1,(SYM) ;GET INSTRUCTION NAME
PUSHJ P,SIXTYP
MOVE T5,1(SYM) ;GET FLAGS AGAIN
PUSHJ P,BLANKT ;TYPE A BLANK
TLNE T5,SMF.MK ;MARK INSTRUCTION?
JRST [ LDB T1,[POINT 6,DATA,35]
PUSHJ P,OCTYPE
JRST DATYP8]
TLNE T5,SMF.PL ;SPL TYPE INSTRUCTION ?
JRST [ LDB T1,[POINT 3,DATA,35] ;GET ARGUMENT
PUSHJ P,OCTYPE
JRST DATYP8 ]
TLNE T5,SMF.EM ;EMT TYPE ARGUMENTS ?
JRST [ LDB T1,[POINT 8,DATA,35] ;GET ARGUMENT
PUSHJ P,RADTYP ;TYPE ARGUMENT AS NUMBER
JRST DATYP8 ]
TLNE T5,SMF.RT ;RTS TYPE ?
JRST [ LDB T1,[POINT 3,DATA,35] ;GET REG ADR
PUSHJ P,DATIN9 ;TYPE REG NAME
JRST DATYP8 ]
TLNE T5,SMF.JS ;JSR TYPE ?
JRST [ LDB T1,[POINT 3,DATA,29]
PUSHJ P,DATIN9 ;TYPE REG NAME
PUSHJ P,COMTYP
JRST .+1 ]
TLNE T5,SMF.AS ;ASH TYPE NN ?
JRST [ LDB T1,[POINT 6,DATA,29] ;GET NN
TRNE T1,40 ;CHECK FOR NEGATIVE
IORI T1,177740 ;EXTEND SIGN
JRST RADTYP ]
TLNE T5,SMF.SB ;SOB TYPE ?
JRST [ LDB T1,[POINT 3,DATA,29] ;GET REGISTER
PUSHJ P,DATIN9 ;TYPE REG NAME
PUSHJ P,COMTYP
LDB T1,[POINT 6,DATA,35] ;GET OFFSET
IMULI T1,-2
ADDI T1,2(DOT)
ANDI T1,177777
PUSHJ P,ADRTYP
JRST DATYP8 ]
TLNN T5,SMF.SS ;12BIT SSDD FORMAT ?
JRST DATIN2 ;NO
LDB T4,[POINT 6,DATA,29] ;GET SS CODE
PUSHJ P,DATIN8
PUSHJ P,COMTYP
DATIN2: TLNN T5,SMF.SS!SMF.DD ;IS THERE A 6 BIT DESTINATION CODE ?
JRST DATIN4 ;NO
LDB T4,[POINT 6,DATA,35] ;GET DD CODE
PUSHJ P,DATIN8
DATIN4: TLNN T5,SMF.XX ;IS THIS BR TYPE ADDRESSING ?
JRST DATIN6 ;NO
LDB T1,[POINT 8,DATA,35] ;GET OFFSET
TRNE T1,200 ;CHECK FOR NEGATIVE OFFSET
IORI T1,177400
AOS T1
LSH T1,1 ;MAKE WORD ADDRESS
ADD T1,DOT
ANDI T1,177777 ;16 BITS ONLY
PUSHJ P,ADRTYP ;TYPE ADDRESS
DATIN6: JRST DATYP8
DATIN8: CAIN T4,27 ;CHECK FOR IMMEDIATE MODE
JRST [ PUSHJ P,HSHTYP ;TYPE A #
SKIPN DOTFOO
MOVE DOTFOO,DOT
ADDI DOTFOO,2
MOVE T1,DOTFOO
MOVEI T2,2
PUSHJ P,GETWRD
POPJ P,
JRST ADRTYP ]
CAIN T4,37 ;CHECK FOR ABSOLUTE MODE
JRST [ SKIPN DOTFOO
MOVE DOTFOO,DOT
ADDI DOTFOO,2
MOVE T1,DOTFOO
MOVEI T2,2
PUSHJ P,GETWRD
POPJ P,
JRST ADRTYP ]
CAIL T4,10 ;IS THIS (REGSITER)?
CAILE T4,16 ;EXCEPT (PC)?
SKIPA ;NO.
JRST [ MOVEI T1,"(" ;YES.
PUSHJ P,TYPCHR
LDB T1,[POINT 3,T4,35]
PUSHJ P,DATIN9
MOVEI T1,")"
PJRST TYPCHR]
TRNE T4,10 ;CHECK FOR DEFERRED MODE
PUSHJ P,[ MOVEI T1,"@"
PJRST TYPCHR ]
CAIE T4,77 ;CHECK FOR RELATIVE DEFERRED MODE
CAIN T4,67 ;CHECK FOR RELATIVE MODE
JRST [ SKIPN DOTFOO
MOVE DOTFOO,DOT
ADDI DOTFOO,2
MOVE T1,DOTFOO
MOVEI T2,2
PUSHJ P,GETWRD
POPJ P,
ADD T1,DOTFOO ;MAKE RELATIVE
ADDI T1,2
JRST ADRTYP ]
LDB T1,[POINT 3,T4,32] ;GET MODE
CAIE T1,4
CAIN T1,5
PUSHJ P,MINTYP
CAIL T1,6 ;CHECK FOR INDEX OR INDEX DEFERRED
JRST [ SKIPN DOTFOO
MOVE DOTFOO,DOT
ADDI DOTFOO,2
MOVE T1,DOTFOO
MOVEI T2,2
PUSHJ P,GETWRD
POPJ P,
PUSHJ P,ADRTYP
JRST .+2 ]
TRNE T1,6
PUSHJ P,[ MOVEI T1,"("
PJRST TYPCHR ]
LDB T1,[POINT 3,T4,35] ;GET REGISTER VALUE
PUSHJ P,DATIN9 ;TYPE REGISTER NAME
TRNN T4,60
POPJ P, ;PLAIN REGISTER MODE
MOVEI T1,")"
PUSHJ P,TYPCHR
LDB T1,[POINT 3,T4,32]
CAIE T1,2
CAIN T1,3
PUSHJ P,PLUTYP
POPJ P,
DATIN9: PUSHJ P,RGFNDN ;FIND REGISTERS NAME
JRST [ PUSHJ P,PCNTYP ;TYPE A %
PUSHJ P,OCTYPE
POPJ P, ]
MOVE T1,(SYM) ;GET REGISTERS NAME
JRST SIXTYP
;HERE TO TYPE DATA AS ASCII TEXT
DATASC: ANDI T1,377
MOVEM T1,T3
PUSHJ P,DATAS3
SOJLE T5,DATYP8
LDB T1,[POINT 8,DATA,27]
MOVEM T1,T3 ;SAVE IN CASE ILLEGAL
PUSHJ P,DATAS3
SOJLE T5,DATYP8
PUSHJ P,NXTDWD ;GET NEXT DATA WORD
JRST DATASC
DATAS3: ANDI T1,177 ;STRIP PARITY BIT
CAIL T1,40
CAILE T1,176
CAIA ;SPECIAL HANDLING
JRST TYPCHR ;JUST TYPE CHARACTER
DATAS4: PUSH P,T3 ;SAVE WEIRD CHARACTER
MOVEI T1,"<"
PUSHJ P,TYPCHR
POP P,T1 ;GET CHAR
PUSHJ P,RADTYP
MOVEI T1,">"
PJRST TYPCHR
;HERE TO TYPE DATA AS TEXT
DATEBC: PUSHJ P,DATEB3
SOJLE T5,DATYP8
LDB T1,[POINT 8,DATA,27]
PUSHJ P,DATEB3
SOJLE T5,DATYP8
PUSHJ P,NXTDWD ;GET NEXT DATA WORD
JRST DATEBC
DATEB3: ANDI T1,377
MOVEM T1,T3
SETZ T2,
LSHC T1,-2
ROT T2,2
LDB T1,[ POINT 8,EB.TRN(T1),7
POINT 8,EB.TRN(T1),15
POINT 8,EB.TRN(T1),23
POINT 8,EB.TRN(T1),31 ](T2)
PJRST DATAS3
;HERE TO TYPE DATA AS BYTES
DATBYT: ANDI T1,377
PUSHJ P,RADTYP
SOJLE T5,DATYP8
MOVEI T1,","
PUSHJ P,TYPCHR
LDB T1,[POINT 8,DATA,27]
PUSHJ P,RADTYP ;TYPE IN CURRENT RADIX
SOJLE T5,DATYP8
MOVEI T1,","
PUSHJ P,TYPCHR
PUSHJ P,NXTDWD ;GET NEXT DATA WORD
JRST DATBYT
;
DATYP8: POPJ P, ;RETURN.
DECTYP: SKIPA T3,[EXP ^D10]
OCTYPE: MOVEI T3,^D8
JRST RADTY2
RADTYP: HRRZ T3,ORADIX
CAIE T3,^D10
JRST RADTY2
PUSHJ P,RADTY2
MOVEI T1,"."
PJRST TYPCHR
RADTY2: JUMPGE T1,RADTY5
MOVMS T1
PUSH P,T1
PUSHJ P,MINTYP
POP P,T1
RADTY5: IDIVI T1,(T3)
HRLM T2,(P)
SKIPE T1
PUSHJ P,RADTY5
HLRZ T1,(P)
ADDI T1,"0"
CAILE T1,"9"
ADDI T1,7 ;DOING HEX
PJRST TYPCHR
SIXTYP: MOVEM T1,T2
SXTYP1: SETZ T1,
LSHC T1,6
ADDI T1,40
PUSHJ P,TYPCHR
JUMPN T2,SXTYP1
POPJ P,
TABTYP: PUSH P,T1
MOVEI T1," "
TYPEIT: PUSHJ P,TYPCHR
POP P,T1
POPJ P,
CRLTYP: PUSH P,T1
MOVEI T1,15 ;CARRIAGE RETURN
PUSHJ P,TYPCHR
MOVEI T1,12 ;LINEFEED
PJRST TYPEIT
BLANKT: PUSH P,T1
MOVEI T1," "
PJRST TYPEIT
COMTYP: PUSH P,T1
MOVEI T1,","
PJRST TYPEIT
PCNTYP: PUSH P,T1
MOVEI T1,"%"
PJRST TYPEIT
HSHTYP: PUSH P,T1
MOVEI T1,"#"
PJRST TYPEIT
MINTYP: PUSH P,T1
MOVEI T1,"-"
PJRST TYPEIT
PLUTYP: PUSH P,T1
MOVEI T1,"+"
PJRST TYPEIT
;HERE TO TYPE OR PRINT A STRING OF CHARACTERS
TYPSTR: PUSH P,T2
MOVE T2,[POINT 7,0]
ADDI T2,(T1) ;COPY STRING POINTER
TYPST3: ILDB T1,T2 ;GET NEXT CHAR
JUMPE T1,TYPST5
PUSHJ P,TYPCHR ;TYPE THE CHARACTER
JRST TYPST3
TYPST5: POP P,T2 ;RESTORE REGISTER
POPJ P,
;HERE TO TYPE A SPACE
SP.TYP: MOVEI T1," " ;A SPACE
;HERE TO TYPE OR PRINT A SINGLE CHARACTER
TYPCHR: SKIPE OHD ;DOING A DUMP ?
JRST TYPCH3 ;YES
OUTCHR T1
POPJ P,
TYPCH3: SOSGE OHD+2 ;ROOM IN BUFFER
JRST TYPCH4 ;NO
IDPB T1,OHD+1
POPJ P,
TYPCH4: OUT
JRST TYPCH3
HALT
IFN FT2SEG < RELOC >
OHD: BLOCK 3
IFN FT2SEG < RELOC >
;HERE
;HERE TO TYPE PROGRAM NAME
IDTYPE: MOVEI T1,[ASCIZ \DDT60 \]
PUSHJ P,TYPSTR
LDB T1,[POINT 9,.JBVER,11]
PUSHJ P,OCTYPE
LDB T1,[POINT 6,.JBVER,17]
MOVEI T1,100(T1)
CAIE T1,100
PUSHJ P,TYPCHR
MOVEI T1,"("
PUSHJ P,TYPCHR
HRRZ T1,.JBVER
PUSHJ P,OCTYPE
MOVEI T1,")"
PUSHJ P,TYPCHR
LDB T1,[POINT 3,.JBVER,2]
MOVNS T1
SKIPE T1
PUSHJ P,OCTYPE
HRROI T1,3 ;CODE FOR PROGRAM NAME
GETTAB T1,
JRST IDTYP2
CAMN T1,[SIXBIT \DDT60\]
JRST IDTYP2
PUSH P,T1
MOVEI T1,[ASCIZ \ = \]
PUSHJ P,TYPSTR
POP P,T1
PUSHJ P,SIXTYP
IDTYP2: SKIPN SYMDEV
JRST IDTYP3
MOVEI T1,[ASCIZ \ /Symbols:\]
PUSHJ P,TYPSTR
MOVEI T1,SYMDEV
PUSHJ P,FILTYP
IDTYP3: PUSHJ P,SP.TYP
POPJ P,
;NOW TYPE THE DATE
DATETY: DATE T1,
IDIVI T1,^D31*^D12 ;LEAVE YEAR-64 IN T1
ADDI T1,^D64
PUSH P,T1 ;SAVE YEAR
IDIVI T2,^D31
LSH T2,1 ;MULTIPLY BY 2
ADDI T2,MONTAB
PUSH P,T2 ;SAVE ADR OF MONTH NAME
AOS T1,T3 ;GET DAY
PUSHJ P,DECTYP
POP P,T1 ;GET MONTH
PUSHJ P,TYPSTR ;TYPE MONTH NAME
POP P,T1 ;GET YEAR
PUSHJ P,DECTYP
PUSHJ P,BLANKT ;TYPE A SPACE
;HERE TO TYPE THE TIME OF DAY
TIMTYP: PUSH P,T1
PUSH P,T2
PUSH P,T3
MSTIME T1, ;GET TIME OF DAY IN MS
IDIVI T1,^D1000 ;GET RID OF MS
IDIVI T1,^D60 ;LEAVES SECONDS IN T2
PUSH P,T2
IDIVI T1,^D60 ;LEAVES MIN IN T2
PUSH P,T2
PUSHJ P,DECTYP
MOVEI T1,":"
PUSHJ P,TYPCHR
POP P,T1
PUSHJ P,DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER
MOVEI T1,":"
PUSHJ P,TYPCHR
POP P,T1
PUSHJ P,DC2TYP ;TYPE 2 DIGIT DECIMAL NUMBER
POP P,T3
POP P,T2
POP P,T1
POPJ P,
DC2TYP: CAIL T1,^D10
JRST DECTYP
PUSH P,T1
MOVEI T1,"0"
PUSHJ P,TYPCHR
POP P,T1
JRST DECTYP
MONTAB: ASCIZ \-Jan-\
ASCIZ \-Feb-\
ASCIZ \-Mar-\
ASCIZ \-April-\
ASCIZ \-May-\
ASCIZ \-June-\
ASCIZ \-July-\
ASCIZ \-Aug-\
ASCIZ \-Sept-\
ASCIZ \-Oct-\
ASCIZ \-Nov-\
ASCIZ \-Dec-\
LOCKER: OUTSTR [ASCIZ \?LOCK UUO failed - code \]
PUSHJ P,OCTYPE
EXIT
NODERR: PUSHJ P,DONE.W ;CLOSE OUTPUT IF ANY
OUTSTR [ASCIZ \?NODE UUO failed - code \]
PUSHJ P,OCTYPE
EXIT
SUBTTL DUMP TO FILE
ESC..D: MOVEM T5,DUMPF ;SAVE ARG TO $D COMMAND
TRO FLG,F.WRIT ;REMEMBER WE ARE WRITING
HRROI T1,3
GETTAB T1, ;GET NAME OF JOB
MOVE T1,[SIXBIT \DDT60\]
MOVSI T2,'LSD'
PUSHJ P,OPNFIL
JRST DUMP9
SETZM CACHEL ;SWEEP CACHE
TRO FLG,F.CACH ;PUT USE IT AFTER IT IS SET UP
MOVE DOT,SBEGIN ;WHERE TO BEGIN DUMP
SETZM DUMPL ;FORCE TOP OF PAGE
;
; COME HERE TO DUMP THE NEXT WORD
;
DUMP3: PUSHJ P,CRLTYP ;GO TO NEXT LINE
SOSG DUMPL ;ROOM ON PAGE?
PUSHJ P,DUMP7 ;NO, GO TO NEXT.
HRRZ T1,DOT ;CURRENT LOCATION
ANDI T1,177777
PUSHJ P,OCTYPE ;LOCATION IN OCTAL
PUSHJ P,TABTYP
HRRZ T1,DOT
PUSHJ P,VALFND ;FIND SYMBOL, IF ANY.
JRST DUMP1 ;THERE IS NONE.
MOVE T1,0(SYM) ;GET SYMBOL NAME
PUSHJ P,SIXTYP
PUSHJ P,TABTYP
HRRZ T1,DOT
SUB T1,1(SYM) ;COMPUTE OFFSET
ANDI T1,177777
JUMPE T1,DUMP2 ;THERE IS NONE
PUSH P,T1 ;SAVE OFFSET
PUSHJ P,PLUTYP ; TYPE "+"
POP P,T1 ;GET OFFSET
PUSHJ P,OCTYPE ;TYPE OFFSET
JRST DUMP2 ;ONLYTWO TABS
DUMP1: PUSHJ P,TABTYP
DUMP2: PUSHJ P,TABTYP
PUSHJ P,TABTYP
MOVE T1,DOT
MOVE T2,S..END
SUB T2,T1 ;COMPUTE BYTES TO GO IN DUMP
CAIL T2,EXMAX ;TOO MANY?
SKIPA T2,[EXP EXMAX] ;YES, REDUCE TO MAX
ADDI T2,2
PUSHJ P,GETWRD ;GET THIS WORD (AND SOME FOLLOWING)
JRST DUMP8 ;NOT AVAILABLE, END THE DUMP
MOVEM T1,DATA ;SAVE VALUE GOTTEN
PUSHJ P,OCTYPE ;TYPE AS OCTAL WORD
PUSHJ P,TABTYP
MOVE T1,DATA
ANDI T1,377 ;LOW BYTE
PUSHJ P,OCTYPE
PUSHJ P,COMTYP
LDB T1,[POINT 8,DATA,27] ;HIGH BYTE
PUSHJ P,OCTYPE
PUSHJ P,TABTYP
;
; NOW TYPE AS DECIMAL
;
MOVE T1,DATA
PUSHJ P,DECTYP
PUSHJ P,TABTYP
MOVE T1,DATA
ANDI T1,377 ;LOW BYTE
PUSHJ P,DECTYP
PUSHJ P,COMTYP
LDB T1,[POINT 8,DATA,27] ;HIGH BYTE
PUSHJ P,DECTYP
PUSHJ P,TABTYP
HRRZ T1,DATA
PUSHJ P,VALFND ;FIND SYMBOL FOR ADDRESS
JRST DUMP4
MOVE T1,0(SYM)
PUSHJ P,SIXTYP
PUSHJ P,TABTYP
HRRZ T1,DATA
SUB T1,1(SYM) ;COMPUTE OFFSET
ANDI T1,177777
JUMPE T1,DUMP5 ;OFFSET IS ZERO
PUSH P,T1 ;SAVE OFFSET
PUSHJ P,PLUTYP
POP P,T1
PUSHJ P,OCTYPE ;TYPE OFFSET
JRST DUMP5
DUMP4: PUSHJ P,TABTYP
DUMP5: PUSHJ P,TABTYP
MOVE T1,DATA
ANDI T1,377 ;LOW BYTE
MOVE T3,T1
PUSHJ P,DUMP6 ;PRINT AS ASCII
PUSHJ P,COMTYP
LDB T1,[POINT 8,DATA,27]
MOVE T3,T1
PUSHJ P,DUMP6 ;LIKEWISE HIGH BYTE
PUSHJ P,TABTYP
;
; NOW TYPE AS EBCDIC
;
MOVE T1,DATA
ANDI T1,377
MOVE T3,T1
SETZ T2,
LSHC T1,-2
ROT T2,2
LDB T1,[POINT 8,EB.TRN(T1),7
POINT 8,EB.TRN(T1),15
POINT 8,EB.TRN(T1),23
POINT 8,EB.TRN(T1),31](T2)
PUSHJ P,DUMP6
PUSHJ P,COMTYP
LDB T1,[POINT 8,DATA,27]
ANDI T1,377
MOVE T3,T1
SETZ T2,
LSHC T1,-2
ROT T2,2
LDB T1,[POINT 8,EB.TRN(T1),7
POINT 8,EB.TRN(T1),15
POINT 8,EB.TRN(T1),23
POINT 8,EB.TRN(T1),31](T2)
PUSHJ P,DUMP6
PUSHJ P,TABTYP
SETZ T5, ;ONLY ONE INSTRUCTION
SETZ DOTFOO,
MOVE T1,DATA
SKIPN DUMPF ;IF $1D, DON'T PRINT INSTRUCTION
PUSHJ P,DATINS
ADDI DOT,2
CAMG DOT,S..END
JRST DUMP3 ;DUMP NEXT WORD
DUMP8: PUSHJ P,CRLTYP
PUSHJ P,DONE.W
OUTSTR [ASCIZ \
Dump done
\]
JRST LEVEL0
;
; SUBROUTINE TO PRINT A CHARACTER, OR ITS OCTAL IF THIS IS
; NOT PRINTABLE
;
DUMP6: CAIL T1,40
CAILE T1,175 ;LOWER CASE PRINTER ASSUMED
SKIPA
PJRST TYPCHR ;CHAR OK, PRINT IT.
MOVEI T1,[ASCIZ \??\]
PUSHJ P,TYPSTR
POPJ P,
;
; HERE ON ERROR.
;
DUMP9: OUTSTR [ASCIZ \error writing \]
JRST FILERR
JRST LEVEL0
DUMPL: BLOCK 1 ;LINES TO GO ON THIS PAGE
DUMPF: BLOCK 1 ;ARG TO $D COMMAND
;
; SUBROUTINE TO PRINT DUMP PAGE HEADER
;
DUMP7: MOVEI T1,14 ;FORM FEED
PUSHJ P,TYPCHR
MOVEI T1,[ASCIZ \Dump of \]
PUSHJ P,TYPSTR
SKIPE MEMORY
JRST [ MOVEI T1,DMPDEV
PUSHJ P,FILTYP ;TYPE FILE ID
JRST DUMP0 ]
MOVE T1,[SIXBIT \/PORT:\]
SKIPE NODE
MOVE T1,[SIXBIT \/NODE:\]
PUSHJ P,SIXTYP
SKIPN T1,NODE
HRRZ T1,PORT
MOVEI T2,OCTYPE
TLNE T1,-1
MOVEI T2,SIXTYP
PUSHJ P,(T2)
DUMP0: MOVEI T1,[ASCIZ \ by \]
PUSHJ P,TYPSTR
PUSHJ P,IDTYPE
PUSHJ P,DATETY ;TYPE DATE AND TIME
PUSHJ P,CRLTYP
PUSHJ P,CRLTYP
MOVEI T1,[ASCIZ \Location Octal Decimal Address ASCII EBCDIC Instruction\]
PUSHJ P,TYPSTR
PUSHJ P,CRLTYP
MOVEI T1,[ASCIZ \value symbol word byte word byte\]
PUSHJ P,TYPSTR
PUSHJ P,CRLTYP
MOVEI T2,^D132
MOVEI T1,"-"
PUSHJ P,TYPCHR
SOJG T2,.-1
PUSHJ P,CRLTYP
PUSHJ P,CRLTYP
MOVEI T1,^D60-7 ;REMAINING PAGE LENGTH
MOVEM T1,DUMPL
POPJ P,
SUBTTL DUMP TO A BINARY FILE
ESC..P: TRO FLG,F.WRIT ;REMEMBER WE ARE WRITING
MOVE T1,[SIXBIT /KRUFT/] ;DEFAULT FILE NAME
MOVSI T2,'BIN' ;DEFAULT EXTENSION
PUSHJ P,OPNFIL ;OPEN FILE
HALT
MOVEI T1,1
PUSHJ P,WRTWRD ;WRITE BINARY WORD
HALT
WRTWRD: SOSGE OHD+2 ;IS THERE ROOM IN BUFFER ?
JRST WRTBN9 ;NO ROOM
IDPB T1,OHD+1 ;PUT BYTE INTO BUFFER
POPJ P,
WRTBN9: OUT
CAIA
JRST FILERR ;COMPLAIN
PUSH P,T1 ;SAVE DATA
LDB T1,[POINT 6,OHD+1,11] ;GET S FROM BYTE POINTER
TRNE FLG,F..ESC ;PUNCHING TAPE ?
JRST WRTWD6 ;YES
WRTWD6:
WRTWD7: POP P,T1 ;GET DATA BACK
JRST WRTWRD
IFN FTPROM <
PROM: INIT 10
SIXBIT /PTP/
OHD,,0
JRST DUMP9
OUTBUF 1 ;GET ONE BUFFER
PUSHJ P,PROM.7
JFCL
PUSHJ P,PROM.7
LSH T1,-^D4
IFN ROMTYP < ;IF M9301
PUSHJ P,PROM.7
LSH T1,-^D8
PUSHJ P,PROM.7
LSH T1,-^D12
>;END OF IFN ROMTYP
PJRST DUMP8+1
PROM.7: MOVEI T1,377
PUSHJ P,TYPCHR
MOVE DOT,SBEGIN
IFE ROMTYP < ;ONLY BM873
MOVEI T4,^D128
>;END OF IFE ROMTYP
IFN ROMTYP < ;ONLY M9301
MOVEI T4,^D256
>;END OF IFN ROMTYP
PROM.8: MOVE T1,DOT
IFN ROMTYP < ;M9301 ONLY
MOVEI T2,2 ;REQUEST 2 BYTES
>;END OF IFN ROMTYP
PUSHJ P,GETWRD
SETZ T1,
XCT @(P)
IFE ROMTYP < ;ONLY BM873
PUSH P,T1
>;END OF IFE ROMTYP
ANDI T1,17
PUSHJ P,TYPCHR
IFE ROMTYP < ;ONLY BM873
POP P,T1
LSH T1,-^D8
ANDI T1,17
PUSHJ P,TYPCHR
>;END OF IFE ROMTYP
ADDI DOT,2
SOJG T4,PROM.8
IFN ROMTYP < ;ONLY M9301
MOVE DOT,S..END
MOVEI T4,^D256
PROM.9: MOVE T1,DOT
MOVEI T2,2
PUSHJ P,GETWRD
SETZ T1,
XCT @(P)
ANDI T1,17
PUSHJ P,TYPCHR
ADDI DOT,2
SOJG T4,PROM.9
>;END OF IFN ROMTYP
MOVEI T4,^D256
SETZ T1,
PUSHJ P,TYPCHR
SOJGE T4,.-1
AOS (P)
POPJ P,
>;END OF IFN FTPROM
RDCHAR: INCHWL T1 ;GET THE NEXT CHAR
PUSHJ P,GETCH0
JRST RDCHAR
POPJ P,
;HERE TO GET A CHARACTER FROM THE TTY
GETCHR: INCHRW T1 ;GET THE NEXT CHAR
PUSHJ P,GETCH0
JRST GETCHR
POPJ P,
GETCH0: JUMPE T1,CPOPJ ;FLUSH NULLS
CAIN T1,15 ;IS THIS A CARRIAGE RETURN ?
JRST [ PUSHJ P,GETCHR ;GET LF
MOVEI T1,15 ;MAKE LF
JRST .+1 ]
CAIL T1,40+"A" ;CHECK FOR LOWER CASE
CAILE T1,40+"Z"
CAIA
TRZ T1,40 ;CONVERT TO UPPER CASE
MOVEM T1,LASCAR# ;REMEMBER LAST CHARACTER INPUT
JRST CPOPJ1
SUBTTL /BIN: AND /DUMP: FILE HANDLING
;HERE BECAUSE WE FOUND /BIN OR /DUMP IN INITIAL DIALOG
; READ EITHER A BOOT11 OR NETLDR DUMP OR A BINARY FILE
RDDUMP: MOVE T1,[SIXBIT \PDPXI0\] ;DEFAULT FILE NAME
MOVSI T2,'LSD' ;DEFAULT EXTENSION
TRNE FLG,F.FLOP ;READING BINARY FILE ?
MOVSI T2,'BIN' ;DEFAULT EXTENSION FOR BIN FILES
PUSHJ P,OPNFL0
JRST DDT60 ;BEGIN ALL OVER AGAIN
MOVE T1,[FILDEV,,DMPDEV]
BLT T1,DMPDEV+3 ;COPY FILDEV, FILNAM, FILEXT, FILPPN
HLRZ T1,FILEXT ;GET FILE EXTENSION
HRRZ T1,.JBFF## ;GET FIRST FREE LOCATION
MOVEM T1,MEMORY ;SAVE ADDRESS OF SIMULATED MEMORY
SETZM MEMLIM ;FIRST NONEXISTENT ADDRESS IN DUMP MEMORY
AOS .JBFF##
PUSHJ P,GETCOR
TRZN FLG,F.FLOP ;READING A BINARY FILE ?
JRST RDUMP0 ;NO READING A DUMP
SETZB T5,T4 ;ACCUMULATE CHECKSUM HERE
LDB T1,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER
CAIN T1,^D36 ;WORD POINTER ?
JRST RDBN10 ;YEH
CAIE T1,^D7 ;ASCII POINTER ?
EXIT
MOVEI T1,^D36
DPB T1,[POINT 6,IHD+1,11] ;CHANGE POINTER
MOVE T1,IHD+2 ;GET COUNT
IDIVI T1,5 ;CONVERT TO WORD COUNT
MOVEM T1,IHD+2
;HERE TO LOOK FOR INITIAL 1
RDBN10: PUSHJ P,RDBN70 ;GET NEXT CHAR
JRST RDUMP9 ;ALL DONE
JUMPE T1,RDBN10 ;LOOP ON HEADER
CAIE T1,1 ;IS THIS LEADING 1 ?
JRST [OUTSTR [ASCIZ \improper format in input tape\]
EXIT ]
PUSHJ P,RDBN70 ;GET NEXT WORD = 0
EXIT
JUMPN T1,[ EXIT ]
PUSHJ P,RDBN60 ;GET 16BIT WORD = COUNT
MOVEI T3,-6(T1) ;MAKE BYTE COUNT
PUSHJ P,RDBN60 ;GET 16BIT WORD = ADR
MOVE T2,T1 ;COPY ADDRESS
JUMPE T3,RDBN30
RDBN20: PUSHJ P,RDBN70 ;GET NEXT BYTE TO STUFF
EXIT
PUSHJ P,PUTBYT ;PUT BYTE INTO MEMORY
AOS T2 ;ADVANCE LOCATION COUNTER
SOJG T3,RDBN20
RDBN30: PUSHJ P,RDBN60 ;INCLUDE CHECKSUM IN CALC
TRNE T5,377 ;TEST CHECKSUM
JRST [ OUTSTR [ASCIZ \CHECKSUM ERROR\]
EXIT ]
JRST RDBN10
;HERE TO GET SIXTEEN BITS
RDBN60: PUSHJ P,RDBN70 ;GET LOW ORDER BITS
EXIT
PUSH P,T2
LSHC T1,-^D8 ;SHOVE EM INTO T2
PUSHJ P,RDBN70 ;GET HIGH ORDER BITS
EXIT
ROTC T1,^D8 ;ADD LOW ORDER BITS
POP P,T2
POPJ P, ;RETURN TO CALLER
;HERE TO GET NEXT BYTE FROM BINARY FILE
RDBN70: JUMPE T4,RDBN74 ;HALF OF PREVIOUS WORD LEFT ?
LDB T1,[POINT 8,T4,27] ;LOW ORDER BITS FROM PREV HLF WRD
SETZ T4, ;DONE WITH HALF WORD
JRST RDBN79
RDBN74: SOSGE IHD+2 ;MORE DATA IN BUFFER ?
JRST RDBN80 ;NO SO READ MORE
ILDB T1,IHD+1
TRNN FLG,F.FLOP ;IS THIS PACKED FILE ?
JRST RDBN79 ;NO
HRRO T4,T1 ;COPY HALF WORD
LDB T1,[POINT 8,T4,35] ;GET HIGH ORDER BITS
RDBN79: ANDI T1,377 ;STRIP EXTRA BITS
ADDI T5,(T1) ;INCLUDE IN CHECKSUM
JRST CPOPJ1
RDBN80: IN ;GET NEXT BUFFER
JRST RDBN85 ;GOT NEXT BUFFER
POPJ P,
RDBN85: HRRZ T1,IHD ;GET ADDRES OF CURRENT BUFFER
HLRE T1,2(T1) ;GET FIRST WORD IN BUFFER
JUMPL T1,RDIMAG ;THIS IS A DTELDR BINARY FILE
JUMPE T1,RDBN70 ;PROCEED
TRO FLG,F.FLOP ;IS PACKED FILE
LDB T1,[POINT 6,IHD+1,11] ;GET S FIELD FROM INPUT POINTER
CAIN T1,^D18 ;HALF WORD POINTER
JRST RDBN70 ;YES
MOVEI T1,^D18
DPB T1,[POINT 6,IHD+1,11] ;CHANGE POINTER
MOVE T1,IHD+2 ;GET WORD COUNT
LSH T1,1 ;MULTIPLY BY 2
MOVEM T1,IHD+2
JRST RDBN70
DMPDEV: EXP 0
EXP 0
EXP 0
EXP 0
;
; COME HERE IF WE HAVE A DTELDR BINARY FILE
;
;HERE IF WE HAVE A DTELDR DUMP (A .BIN FILE WITH THE SIGN BIT ON IN
;THE FIRST WORD). READ ALL THE DATA AND STORE IN CONTIGUOUS MEMORY
RDIMAG: SETO T2, ;THIS WILL INCREMENT TO 0 FOR FIRST BYTE
RDIMA1: SOSL IHD+2 ;ANY DATA LEFT IN BUFFER?
JRST RDIMA2 ;YES, USE IT
IN ;NO, GET A NEW BUFFER
JRST RDIMA1 ;OK. TRY AGAIN
POPJ P, ;ERROR - ASSUME EOF
RDIMA2: ILDB T1,IHD+1 ;GET NEXT WORD
MOVS T1,T1 ;GET BYTES IN REVERSE ORDER (3,2,,1,0)
PUSHJ P,PUTBYI ;STUFF 0 IN NEXT LOCATION
ROT T1,-^D8 ;POSITION TO NEXT BYTE
PUSHJ P,PUTBYI ;STUFF
ROT T1,-^D10 ;THIRD, ACCOUNT FOR 2 EXTRA BITS
PUSHJ P,PUTBYI
ROT T1,-^D8 ;FOURTH AND LAST
PUSHJ P,PUTBYI
JRST RDIMA1 ;NEXT WORD
; COME HERE IF WE HAVE A DUMP IMAGE FILE. SUCH A FILE HAS EACH 16-BIT
; WORD FROM THE PDP-11 IN A HALF-WORD OF THE FILE.
; DUMPS OF THIS KIND ARE PRODUCED BY DTELDR AND BY DASLOD.
;
; THE /BIN SWITCH WILL READ DTELDR DUMPS BY RECOGNIZING A SPECIAL FLAG
; IN THE FIRST WORD OF THE FILE. THIS SUBROUTINE WILL READ EITHER
; KIND OF FILE.
;
RDDIMG: MOVE T1,[SIXBIT /DTED01/] ;DEFAULT FILE NAME
MOVSI T2,'BIN' ;DEFAULT EXTENSION
PUSHJ P,OPNFL0 ;OPEN THE FILE (NO DIALOG)
JRST DDT60 ;CAN'T, RESTART.
HRRZ T1,.JBFF## ;BUILD CORE IMAGE AT END OF MEMORY
MOVEM T1,MEMORY
SETZM MEMLIM ;AS YET, MEMORY IS EMPTY
AOS .JBFF## ;WE HAVE USED THAT WORD
PUSHJ P,GETCOR ;BE SURE MEMORY IS ALLOCATED
MOVEI T1,^D36 ;SET BYTE POINTER TO 36-BIT MODE
DPB T1,[POINT 6,IHD+1,11]
MOVE T1,IHD+2 ;RECOMPUTE FIRST BUFFER COUNT
IDIVI T1,5
MOVEM T1,IHD+2
SETO T2, ;WILL BE INCREMENTED TO 0 BY FIRST CALL TO PUTBYI
;
; PROCESS ANOTHER FILE WORD
;
RDDIM1: SOSL IHD+2 ;ANY DATA LEFT IN BUFFER?
JRST RDDIM2 ;YES, PROCESS IT.
IN ;NO, GET A NEW BUFFER
JRST RDDIM1 ;GOT ONE, PROCESS IT.
JRST RDUMP9 ;ASSUME EOF, PRINT MEMORY SIZE
RDDIM2: ILDB T1,IHD+1 ;GET WORD FROM FILE
MOVSS T1 ;PUT PDP-11 BYTES IN RATIONAL ORDER
PUSHJ P,PUTBYI ;STORE FIRST BYTE IN MEMORY
ROT T1,-10
PUSHJ P,PUTBYI ;SECOND BYTE
ROT T1,-12
PUSHJ P,PUTBYI ;THIRD BYTE
ROT T1,-10
PUSHJ P,PUTBYI ;FOURTH BYTE
JRST RDDIM1 ;PROCESS REST OF FILE
;
;HERE TO PUT A BYTE INTO A CORE DUMP
; CALL PUSHJ P,PUTBYT WITH DATA IN T1, ADR IN T2
;
PUTBYI: ADDI T2,1 ;PUT IN NEXT LOCATION
PUTBYT: PUSHJ P,SAVE4
SKIPE MEMORY ;DO WE HAVE A BASE ADDRESS FOR DUMPS ?
JRST PUTBY4
PUSH P,T1
MOVE T1,.JBFF## ;ADDRESS OF FIRST FREE WORD
MOVEM T1,MEMORY
AOS .JBFF
PUSHJ P,GETCOR
SETZM MEMLIM
SETZM @MEMORY
POP P,T1
PUTBY4: CAMG T2,MEMLIM ;IS ADDRESS LARGER THAN PREVIOUS LIMIT ?
JRST PUTBY8 ;NO
PUSH P,T1 ;SAVE DATA
PUSH P,T2 ;SAVE ADDRESS
AOS T2,MEMLIM ;INCREASE LIMIT
TRNE T2,3 ;ADVANCING TO NEXT WORD ?
JRST PUTBY6
AOS .JBFF## ;GET ANOTHER WORD FOR CORE
PUSHJ P,GETCOR
PUTBY6: SETZ T1, ;FOR MEMORY
PUSHJ P,PUTBY9 ;PUT ZERO BYTE INTO SIMULATED MEMORY
POP P,T2
POP P,T1
JRST PUTBY4
PUTBY8: IORI T1,400
PUTBY9: IDIVI T2,^D4
ADD T2,MEMORY ;RELOCATE
ADD T2,[ POINT 9,0,8
POINT 9,0,17
POINT 9,0,26
POINT 9,0,35 ](T3)
DPB T1,T2
POPJ P,
SAVE4: PUSH P,T1
PUSH P,T2
PUSH P,T3
PUSH P,T4
PUSHJ P,@-4(P)
POP P,T4
POP P,T3
POP P,T2
POP P,T1
POP P,(P)
POPJ P,
;ROUTINES TO READ BOOT11 OR NETLDR DUMPS
;HERE TO FLUSH REST OF INPUT LINE
RDUMP0: PUSHJ P,FILCHR ;GET NEXT CHAR FROM DUMP
JRST RDUMP9 ;END OF DUMP
CAIE T1,12 ;WE ARE LOOKING FOR A LINE FEED
JRST RDUMP0 ;AND DIDN'T FIND ONE
RDUMP1: PUSHJ P,INPOCT ;GET ADR
JRST RDUMP9
CAIN T2,12 ;SKIP EXTRA LINE FEEDS
JRST RDUMP1 ; GENERATED BY DTELDR
CAIE T2,":" ;FINISHED READING ADDRESS ?
JRST RDUMP0 ;FLUSH LINE
MOVEM T1,DOT ;SAVE ADDRESS
RDUMP3: PUSHJ P,INPOCT ;GET DATA FOR LINE
JRST RDUMP9 ;END OF DUMP
CAIE T2,15 ;CHECK FOR CR
CAIN T2,11 ;CHECK FOR HT
JRST RDUMP6 ;THAT WAS DATA
JRST RDUMP0 ;FLUSH LINE
RDUMP6: MOVE T2,DOT ;GET ADDRESS
PUSHJ P,PUTBYT
LSH T1,-^D8
AOS T2,DOT
PUSHJ P,PUTBYT
AOJA DOT,RDUMP3 ;BACK FOR MORE DATA
RDUMP9: MOVE T1,MEMLIM ;HIGHEST ADDRESS READ
MOVEM T1,S..END ;END OF SEARCH
SUBI T1,1
OUTSTR [ASCIZ \ highest location is \]
MOVE T1,MEMLIM
PUSHJ P,OCTYPE
OUTSTR [ASCIZ \
\]
POPJ P,
SUBTTL Routines to write/read the DN200
IFN FTJSYS,<
;
; The SINs and SOUTs are merely replaced by calls to the BOOT JSYS.
; JFN is in this case used for the line number over which we are talking
; to the DN200. It may be 0 or 1.
.BTLEN=2
.BTMSG=1
MAXBYT==274 ;cannot send more than this
RTRIES==10 ;Number of times to try for response
BTSIZ==20 ;size of BOOT JSYS argument block
BTARG: BLOCK BTSIZ ;The BOOT JSYS argument block
RETRY: BLOCK 1
RDLIN: BLOCK 1
RDMSG: BLOCK 1
RDLEN: BLOCK 1
MOPMSG: BLOCK MAXBYT_<-2>+1 ;ADD ONE TIL KDPSRV BUG FIXED;!!;
APRNUM: BLOCK 1 ; Processor serial number
KSFLG: BLOCK 1 ; Flag for 2020 (non-zero)
;routine to clear the BOOT JSYS argument block
CLRBOT:
HRRI T4,1+BTARG ;address of arg block
HRLI T4,-1(T4) ;address,,address+1 for blt
SETZM BTARG ;zero 1st word
BLT T4,BTSIZ-1+BTARG ;clear rest
POPJ P,
WR200:
PUSHJ P,CLRBOT ;clear
MOVEI T4,BTARG ;address of
MOVEM T1,.BTDTE(T4) ;line # over which we are conversing
MOVMM T3,.BTLEN(T4) ;the number of bytes
MOVE T4,[POINT 8,MOPMSG] ;WHERE TO COPY MESSAGE
SKIPN T3 ;ZERO LENGTH NO ALLOWED
POPJ P,
WRLOP: ILDB T1,T2 ;GET A BYTE FROM INPUT
IDPB T1,T4 ;DEPOSIT IN BUFFER
AOJL T3,WRLOP ;LOOP OVER ALL BYTES
MOVEI T2,BTARG ;ADDRESS OF ARG BLOCK FOR BOOT JSYS
MOVE T1,[POINT 8,MOPMSG]
MOVEM T1,.BTMSG(T2) ;STORE IN BOOT ARG BLOCK
MOVEI T1,21 ;function code for write
BOOT
ERJMP .+2
AOS (P)
POPJ P, ;success return
RD200: MOVEM T1,RDLIN
MOVEM T2,RDMSG
MOVEM T3,RDLEN
MOVEI T4,RTRIES ;RETRY COUNTER
MOVEM T4,RETRY
RD2RTY: PUSHJ P,CLRBOT ;clear
MOVEI T4,BTARG ;address of
MOVEM T1,.BTDTE(T4) ;line # over which we are conversing
MOVE T2,[POINT 8,MOPMSG]
MOVEM T2,.BTMSG(T4) ;pointer to data
MOVMM T3,.BTLEN(T4) ;the number of bytes
MOVE T2,T4 ;where the BOOT jsys expects arg address
MOVEI T1,22 ;function code for read
BOOT
ERJMP RD2ERR
SKIPLE T1,.BTLEN(T4) ;POSITIVE MEANS WE GOT DATA
JRST RD2OK ;RETURN OKAY
SKIPE T1 ;NEGATIVE MEANS
JRST [HRRZS T1 ;
CAIN T1,1 ;LINE CAME UP
JRST RD2AGN ;READ NEXT MESSAGE
CAIN T1,3 ;TRANSMISSION COMPLETE
JRST RD2AGN ;READ NEXT MESSAGE
JRST RD2ERR ;ERROR
]
SOSGE RETRY ;HAVE WE ALREADY TRIED TWICE?
JRST RD2ERR ;YES
MOVEI T1,^D100 ;WAIT 1/10 SECOND
DISMS
RD2AGN: MOVE T1,RDLIN
MOVE T2,RDMSG
MOVE T3,RDLEN
JRST RD2RTY ;RETRY
RD2OK: MOVN T3,T1 ;GET RECEIVED LENGTH
MOVE T4,[POINT 8,MOPMSG]
MOVE T2,RDMSG
CAMN T2,T4 ;IF SOURCE AND DESTINATION SAME
JRST RD2RET ;NO NEED TO COPY
RDLOP:
ILDB T1,T4 ;GET A BYTE FROM MESSAGE
IDPB T1,T2 ;PUT WHERE USER WANTS IT
AOJL T3,RDLOP
RD2RET: AOS (P)
RD2ERR: POPJ P, ;success return
;ROUTINE TO FLUSH THE DDCMP BUFFERS
FLSHFE:
MOVE T1,D60JFN ;THE FE LINE
MOVE T2,[POINT 8,MOPMSG] ;WHERE TO PUT FLUSHD DATA
MOVEI T3,MAXBYT ;MAXIMUM SIZE OF MESSAGE
CALL RD200 ;DO THE FLUSH
JFCL ;IGNORE ERRORS
JUMPN T1,FLSHFE ;IF MORE , FLUSH THAT TOO
POPJ P, ;RETURN WHEN DONE
SUBTTL PRCTYP -- Routine to type the processor
; Routine - PRCTYP
;
; Function -
;
; This routine determines whether we are running on a KL or KS system.
;
; Parameters - none
;
; Returns - True always
;
; APRNUM/ Contains the processor serial number
; KSFLG/ 0 if KL, non-zero if KS
PRCTYP: PUSH P,T1 ; Save some registers
PUSH P,T2
MOVE T1,[SIXBIT \APRID\] ; Table in TOPS20 to check
SYSGT ; for the processor serial number
MOVEM T1,APRNUM ; Save the processor serial number
SETZM KSFLG ; Default to KL
CAIL T1,^d4096 ; Test for a KS serial number
SETOM KSFLG ; Yes .. so set such an indicator
POP P,T2 ; Restore registers
POP P,T1
POPJ P,
> ;End if TOPS20 (FTJSYS)
;PDP11 WORDS ARE READ INTO PDP10 HALF WORDS WITH AN INCREMENTING BYTE POINTER
; IF PDP11 WORD WAS READ IN THE BIT 200000 OF THE HALF WORD WILL BE SET
; IF PDP11 WORD IS MODIFIED, BIT 400000 OF THE HALF WORD WILL BE SET
IFN FT2SEG < RELOC >
MEMORY: EXP Z ;ADDRESS OF DUMP MEMORY
MEMLIM: EXP Z ;HIGHEST LOCATION IN DUMP
IFN FT2SEG < RELOC >
;TRANSLATION TABLE FROM EBCDIC TO ASCII
EB.TRN: BYTE (8)000,001,002,003,000,011,000,177 ;000-007
BYTE (8)000,000,000,013,014,015,000,000 ;010-017
BYTE (8)000,021,022,000,000,000,000,000 ;020-027
BYTE (8)000,000,000,000,000,000,000,000 ;030-037
BYTE (8)000,000,000,000,000,000,000,000 ;040-047
BYTE (8)000,000,000,000,000,000,000,000 ;050-057
BYTE (8)000,000,000,000,000,000,000,000 ;060-067
BYTE (8)000,000,000,000,000,000,000,000 ;070-077
BYTE (8)040,000,000,000,000,000,000,000 ;100-107
BYTE (8)000,000,133,056,074,050,053,041 ;110-117
BYTE (8)046,000,000,000,000,000,000,000 ;120-127
BYTE (8)000,000,135,044,052,051,073,136 ;130-137
BYTE (8)055,057,000,000,000,000,000,000 ;140-147
BYTE (8)000,000,174,054,045,137,076,077 ;150-157
BYTE (8)000,000,000,000,000,000,000,000 ;160-167
BYTE (8)000,140,072,043,100,047,075,042 ;170-177
BYTE (8)000,141,142,143,144,145,146,147 ;200-207
BYTE (8)150,151,000,000,000,000,000,000 ;210-217
BYTE (8)000,152,153,154,155,156,157,160 ;220-227
BYTE (8)161,162,000,000,000,000,000,000 ;230-237
BYTE (8)000,176,163,164,165,166,167,170 ;240-247
BYTE (8)171,172,000,000,000,000,000,000 ;250-257
BYTE (8)000,000,000,000,000,000,000,000 ;260-267
BYTE (8)000,000,000,000,000,000,000,000 ;270-277
BYTE (8)173,101,102,103,104,105,106,107 ;300-307
BYTE (8)110,111,000,000,000,000,000,000 ;310-317
BYTE (8)175,112,113,114,115,116,117,120 ;320-327
BYTE (8)121,122,000,000,000,000,000,000 ;330-337
BYTE (8)134,000,123,124,125,126,127,130 ;340-347
BYTE (8)131,132,000,000,000,000,000,000 ;350-357
BYTE (8)060,061,062,063,064,065,066,067 ;360-367
BYTE (8)070,071,000,000,000,000,000,000 ;370-377
SUBTTL STATE TABLES
STATE0: EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07
EXP ILLCHR,COMHT ,COMLF ,ILLCHR,ILLCHR,LEVEL0,ILLCHR,ILLCHR ;10-17
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27
EXP EXPXOR,ILLCHR,COMCZ ,ESCAPE,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37
EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ASSYMB,ILLCHR,ILLCHR,ILLCHR ;40-47
EXP ILLCHR,ILLCHR,ILLCHR,EXPLUS,ILLCHR,EXPMIN,ASSYMB,ILLCHR ;50-57
EXP ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM ;60-67
EXP ASSDEC,ASSDEC,ILLCHR,ILLCHR,ILLCHR,EQUALS,ILLCHR,ILLCHR ;70-77
EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;100-107
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;110-117
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;120-127
EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,COMBSL,ILLCHR,COMARR,ILLCHR ;130-137
EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;140-147
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;150-157
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;160-167
EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177
;STATE TABLE WHEN BUILDING AN EXPRESSION
STATEE: EXP LOOP ,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07
EXP ILLCHR,STEHT ,STELF ,ILLCHR,ILLCHR,STECR ,ILLCHR,ILLCHR ;10-17
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27
EXP EXPXOR,ILLCHR,COMCZ ,ESCEXP,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37
EXP EXPLUS,EXPIOR,ILLCHR,ILLCHR,ASSYMB,ILLCHR,EXPAND,EXPDIV ;40-47
EXP ILLCHR,ILLCHR,EXPMUL,EXPLUS,ILLCHR,EXPMIN,ASSPER,OPNLOC ;50-57
EXP ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM,ASSNUM ;60-67
EXP ASSDEC,ASSDEC,DEFSYM,ILLCHR,SLOWLM,EXPEQU,SUPLIM,ILLCHR ;70-77
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;100-107
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;110-117
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;120-127
EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,COMBSE,ILLCHR,STEARR,BKARRW ;130-137
EXP ILLCHR,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;140-147
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;150-157
EXP ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB,ASSYMB ;160-167
EXP ASSYMB,ASSYMB,ASSYMB,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177
;STATE TABLE WHEN USER TYPES ALTMODE
STATSC: EXP LOOP,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;00-07
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;10-17
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;20-27
EXP ILLCHR,ILLCHR,COMCZ ,ESCESC,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;30-37
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;40-47
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;50-57
EXP ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0,ESC..0 ;60-67
EXP ESC..0,ESC..0,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;70-77
EXP ILLCHR,ESC..A,ESC..B,ESC..C,ESC..D,ILLCHR,ILLCHR,ESC..G ;100-107
EXP ILLCHR,ESC..I,ILLCHR,ESC..K,ILLCHR,ESC..M,ESC..N,ILLCHR ;110-117
EXP ESC..P,ILLCHR,ESC..R,ESC..S,ESC..T,ILLCHR,ESC..V,ESC..W ;120-127
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR ;130-137
EXP ILLCHR,ESC..A,ESC..B,ESC..C,ESC..D,ILLCHR,ILLCHR,ESC..G ;140-147
EXP ILLCHR,ESC..I,ILLCHR,ESC..K,ILLCHR,ESC..M,ESC..N,ILLCHR ;150-157
EXP ESC..P,ILLCHR,ESC..R,ESC..S,ESC..T,ILLCHR,ESC..V,ESC..W ;160-167
EXP ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,ILLCHR,COMRUB ;170-177
IFN FT2SEG < RELOC >
GOTO: EXP 0 ;STARTING ADDRESS FOR PROGRAM
NODE: Z ;NAME OR NODE NUMBER WE ARE WORKING WITH
LINE: Z ;LINE NUMBER ON NODE WE ARE WORKING WITH
DATA: BLOCK ^D20
SBEGIN: EXP 0 ;FIRST ADDRESS FOR SEARCH
S..END: EXP 0 ;LAST ADDRESS FOR SEACRH
S.WORD: EXP 0 ;WORD TO SEARCH FOR
SZMASK: EXP 1 ;NUMBER OF WORDS IN MASK
S.MASK: EXP 177777 ;MASK FOR WORD SEARCH
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
EXP 177777 ;MORE OF MASK
INPOPR: EXP 0 ;INPUT OPERATION (0=+,1=-,2=*,3=',4=!,5=&,6=^X)
BYTCNT: XWD 1,1 ;REPEITION COUNTS FOR OUPUT BYTES ETC.
O.MODE: EXP 0 ;OUTPUT MODE LH = PERMANENT, RH = CURRENT
; (0=SYMBOLIC, 1=ADDRESS, 2=NUMERIC, 3=BYTES,
; 4=ASCII TEXT, 5=EBCDIC TEXT)
ORADIX: ^D8,,^D8 ;OUTPUT RADIX
; LH IS PERMANENT SETTING, RH IS CURRENT
LSTADR: Z ;LAST ADDRESS DISPLAYED
;THE CACHE IS SO WORK OVER SYNCHRONOUS LINE WILL BE FASTER
CACHEL: 0 ;CACHE LIMIT, I.E. 1ST NONEXISTEN BYTE ADR IN CACHE
CACHEA: 0 ;ADDRESS REPRESENTED BY FIRST ADR IN CACHE
CACHSZ=400 ;NUMBER OF WORDS IN CACHE
CACHE: BLOCK <CACHSZ/4>
IFNDEF PDLEN <PDLEN=40>
PDL: BLOCK PDLEN
LIT
VAR
SUBTTL SYMBOL TABLES
DEFINE X (VAL,BIT,NAME,FLAG) <
EXP .+1
SIXBIT \NAME\
BYTE (4)<<BIT>-1>(14)FLAG(18)VAL
>;END OF DEFINE X
SYMBEG: X 000000,^D16,HALT,<SMF.IN>
X 000001,^D16,WAIT,<SMF.IN>
X 000002,^D16,RTI,<SMF.IN>
X 000003,^D16,BPT,<SMF.IN>
X 000004,^D16,IOT,<SMF.IN>
X 000005,^D16,RESET,<SMF.IN>
X 000006,^D16,RTT,<SMF.IN>
X 000100,^D10,JMP,<SMF.IN!SMF.DD>
X 000200,^D13,RTS,<SMF.IN!SMF.RT>
X 000230,^D13,SPL,<SMF.IN!SMF.PL>
X 000240,^D16,NOP,<SMF.IN>
X 000241,^D16,CLC,<SMF.IN>
X 000242,^D16,CLV,<SMF.IN>
X 000244,^D16,CLZ,<SMF.IN>
X 000250,^D16,CLN,<SMF.IN>
X 000257,^D16,CCC,<SMF.IN>
X 000261,^D16,SEC,<SMF.IN>
X 000262,^D16,SEV,<SMF.IN>
X 000264,^D16,SEZ,<SMF.IN>
X 000270,^D16,SEN,<SMF.IN>
X 000277,^D16,SCC,<SMF.IN>
X 000300,^D10,SWAB,<SMF.IN!SMF.DD>
X 000400,^D8,BR,<SMF.IN!SMF.XX>
X 001000,^D8,BNE,<SMF.IN!SMF.XX>
X 001400,^D8,BEQ,<SMF.IN!SMF.XX>
X 002000,^D8,BGE,<SMF.IN!SMF.XX>
X 002400,^D8,BLT,<SMF.IN!SMF.XX>
X 003000,^D8,BGT,<SMF.IN!SMF.XX>
X 003400,^D8,BLE,<SMF.IN!SMF.XX>
X 004000,^D7,JSR,<SMF.IN!SMF.DD!SMF.JS>
X 005000,^D10,CLR,<SMF.IN!SMF.DD>
X 005100,^D10,COM,<SMF.IN!SMF.DD>
X 005200,^D10,INC,<SMF.IN!SMF.DD>
X 005300,^D10,DEC,<SMF.IN!SMF.DD>
X 005400,^D10,NEG,<SMF.IN!SMF.DD>
X 005500,^D10,ADC,<SMF.IN!SMF.DD>
X 005600,^D10,SBC,<SMF.IN!SMF.DD>
X 005700,^D10,TST,<SMF.IN!SMF.DD>
X 006000,^D10,ROR,<SMF.IN!SMF.DD>
X 006100,^D10,ROL,<SMF.IN!SMF.DD>
X 006200,^D10,ASR,<SMF.IN!SMF.DD>
X 006300,^D10,ASL,<SMF.IN!SMF.DD>
X 006400,^D10,MARK,<SMF.IN!SMF.MK>
X 006500,^D10,MFPI,<SMF.IN!SMF.DD>
X 006600,^D10,MTPI,<SMF.IN!SMF.DD>
X 006700,^D10,SXT,<SMF.IN!SMF.DD>
X 010000,^D4,MOV,<SMF.IN!SMF.SS>
X 020000,^D4,CMP,<SMF.IN!SMF.SS>
X 030000,^D4,BIT,<SMF.IN!SMF.SS>
X 040000,^D4,BIC,<SMF.IN!SMF.SS>
X 050000,^D4,BIS,<SMF.IN!SMF.SS>
X 060000,^D4,ADD,<SMF.IN!SMF.SS>
X 070000,^D7,MUL,<SMF.IN!SMF.JS!SMF.DD>
X 071000,^D7,DIV,<SMF.IN!SMF.JS!SMF.DD>
X 072000,^D7,ASH,<SMF.IN!SMF.JS!SMF.DD>
X 073000,^D7,ASHC,<SMF.IN!SMF.JS!SMF.DD>
X 074000,^D7,XOR,<SMF.IN!SMF.JS!SMF.DD>
X 075000,^D13,FADD,<SMF.IN!SMF.RT>
X 075010,^D13,FSUB,<SMF.IN!SMF.RT>
X 075020,^D13,FMUL,<SMF.IN!SMF.RT>
X 075030,^D13,FDIV,<SMF.IN!SMF.RT>
X 077000,^D7,SOB,<SMF.IN!SMF.SB>
X 100000,^D8,BPL,<SMF.IN!SMF.XX>
X 100400,^D8,BMI,<SMF.IN!SMF.XX>
X 101000,^D8,BHI,<SMF.IN!SMF.XX>
X 101400,^D8,BLOS,<SMF.IN!SMF.XX>
X 102000,^D8,BVC,<SMF.IN!SMF.XX>
X 102400,^D8,BVS,<SMF.IN!SMF.XX>
X 103000,^D8,BCC,<SMF.IN!SMF.XX>
X 103000,^D8,BHIS,<SMF.IN!SMF.XX>
X 103400,^D8,BCS,<SMF.IN!SMF.XX>
X 103400,^D8,BLO,<SMF.IN!SMF.XX>
X 104000,^D8,EMT,<SMF.IN!SMF.EM>
X 104400,^D8,TRAP,<SMF.IN!SMF.EM>
X 105000,^D10,CLRB,<SMF.IN!SMF.DD>
X 105100,^D10,COMB,<SMF.IN!SMF.DD>
X 105200,^D10,INCB,<SMF.IN!SMF.DD>
X 105300,^D10,DECB,<SMF.IN!SMF.DD>
X 105400,^D10,NEGB,<SMF.IN!SMF.DD>
X 105500,^D10,ADCB,<SMF.IN!SMF.DD>
X 105600,^D10,SBCB,<SMF.IN!SMF.DD>
X 105700,^D10,TSTB,<SMF.IN!SMF.DD>
X 106000,^D10,RORB,<SMF.IN!SMF.DD>
X 106100,^D10,ROLB,<SMF.IN!SMF.DD>
X 106200,^D10,ASRB,<SMF.IN!SMF.DD>
X 106300,^D10,ASLB,<SMF.IN!SMF.DD>
X 106400,^D10,MTPS,<SMF.IN!SMF.DD>
X 106500,^D10,MFPD,<SMF.IN!SMF.DD>
X 106600,^D10,MTPI,<SMF.IN!SMF.DD>
X 106700,^D10,MFPS,<SMF.IN!SMF.DD>
X 110000,^D4,MOVB,<SMF.IN!SMF.SS>
X 120000,^D4,CMPB,<SMF.IN!SMF.SS>
X 130000,^D4,BITB,<SMF.IN!SMF.SS>
X 140000,^D4,BICB,<SMF.IN!SMF.SS>
X 150000,^D4,BISB,<SMF.IN!SMF.SS>
X 160000,^D4,SUB,<SMF.IN!SMF.SS>
;
; FLOATING POINT (17XXXX) OMITTED IN THIS VERSION
;
EXP Z
SYMEND: EXP .-3
DDTEND: END DDT60