Trailing-Edge
-
PDP-10 Archives
-
BB-JF16A-SB_1986
-
extend.mic
There is 1 other file named extend.mic in the archive. Click here to see a list.
.TOC "EXTEND -- DISPATCH ROM ENTRIES"
.DCODE
001: I, SJCL, J/L-CMS
I, SJCE, J/L-CMS
I, SJCLE, J/L-CMS
I, B/2, J/L-EDIT
I, SJCGE, J/L-CMS
I, SJCN, J/L-CMS
I, SJCG, J/L-CMS
010: I, B/1, J/L-DBIN ;CVTDBO
I, B/4, J/L-DBIN ;CVTDBT
I, B/1, J/L-BDEC ;CVTBDO
I, B/0, J/L-BDEC ;CVTBDT
014: I, B/1, J/L-MVS ;MOVSO
I, B/0, J/L-MVS ;MOVST
I, B/2, J/L-MVS ;MOVSLJ
I, B/3, J/L-MVS ;MOVSRJ
020: I, J/L-XBLT ;XBLT
I, J/L-SPARE-A ;GSNGL
I, J/L-SPARE-B ;GDBLE
I, B/0, J/L-SPARE-C ;GDFIX
I, B/1, J/L-SPARE-C ;GFIX
I, B/2, J/L-SPARE-C ;GDFIXR
I, B/4, J/L-SPARE-C ;GFIXR
I, B/10, J/L-SPARE-C ;DGFLTR
;30: ;GFLTR
;GFSC
.UCODE
1740:
L-CMS: LUUO
1741:
L-EDIT: LUUO
1742:
L-DBIN: LUUO
1743:
L-BDEC: LUUO
1744:
L-MVS: LUUO
1746:
L-XBLT: LUUO
1747:
L-SPARE-A: LUUO
1750:
L-SPARE-B: LUUO
1751:
L-SPARE-C: LUUO
;NOTE: WE DO NOT NEED TO RESERVE 3746 TO 3751 BECAUSE THE CODE
; AT EXTEND DOES A RANGE CHECK.
.TOC "EXTEND -- INSTRUCTION SET DECODING"
;EACH INSTRUCTION IN THE RANGE 1-23 GOES TO 1 OF 2 PLACES
; 1740-1747 IF NOT UNDER EXTEND
; 3740-3747 IF UNDER EXTEND
.DCODE
123: I,READ/1, J/EXTEND
.UCODE
1467:
EXTEND: MEM READ, [BR]_MEM ;FETCH INSTRUCTION
=0** TL [BR], #/760740, ;IN RANGE 0-17 (AND AC#=0)
CALL [BITCHK] ;TRAP IF NON-ZERO BITS FOUND
[BRX]_[HR].AND.# CLR RH, ;SPLIT OUT AC NUMBER
#/000740 ; FROM EXTEND INSTRUCTION
[BR]_[BR].OR.[BRX], ;LOAD IR AND AC #
HOLD RIGHT, LOAD IR ; ..
READ [BR], LOAD BYTE EA, ;LOAD XR #
J/EXTEA0 ;COMPUTE E1
EXTEA0: WORK[E0]_[AR]
EXTEA1: EA MODE DISP
=100*
EXTEA: [BR]_[BR]+XR
EXTDSP: [BR]_EA FROM [BR], LOAD VMA,
B DISP, J/EXTEXT
[BR]_[BR]+XR, START READ, PXCT EXTEND EA, LOAD VMA, J/EXTIND
VMA_[BR], START READ, PXCT EXTEND EA
EXTIND: MEM READ, [BR]_MEM, HOLD LEFT, LOAD BYTE EA, J/EXTEA1
;HERE TO EXTEND SIGN FOR OFFSET MODES
=1110
EXTEXT: WORK[E1]_[BR], ;SAVE E1
DISP/DROM, J/3400 ;GO TO EXTENDED EXECUTE CODE
READ [BR], SKIP DP18 ;NEED TO EXTEND SIGN
=0 WORK[E1]_[BR], ;POSITIVE
DISP/DROM, J/3400
[BR]_#, #/777777, HOLD RIGHT, ;NEGATIVE
J/EXTEXT
.TOC "EXTEND -- MOVE STRING -- SETUP"
;HERE TO MOVE A STRING
;COME HERE WITH:
; AR/ E0
; BR/ E1
;
3744:
MVS: [AR]_[AR]+1, ;GO FETCH FILL
LOAD VMA, ; BYTE
START READ, ; ..
CALL [GTFILL] ;SUBROUTINE TO COMPLETE
3754: [BR]_AC[DLEN] ;GET DEST LENGTH AND FLAGS
=0** TL [BR], #/777000, ;ANY FLAGS SET?
CALL [BITCHK] ;SEE IF ILLEGAL
[AR]_AC ;GET SRC LENGTH AND FLAGS
=0 [BRX]_[AR].AND.# CLR RH, ;COPY FLAGS TO BRX
#/777000, ; ..
CALL [CLRFLG] ;CLEAR FLAGS IN AR
;NEW DLEN IS <SRC LEN>-<DST LEN>
AC[DLEN]_[AR]-[BR], 3T, ;COMPUTE DIFFERENCE
SKIP DP0 ;WHICH IS SHORTER?
=0 [AR]_.NOT.[BR], ;DESTINATION
J/MVS1 ;GET NEGATIVE LENGTH
[AR]_.NOT.[AR] ;SOURCE
MVS1: WORK[SLEN]_[AR], ; ..
B DISP ;SEE WHAT TYPE OF MOVE
;SLEN NOW HAS -<LEN OF SHORTER STRING>-1
=1100
STATE_[SRC], J/MOVELP ;TRANSLATE--ALL SET
[BR]_AC[DSTP], J/MVSO ;OFFSET BUILD MASK
[ARX]_[AR], ;LEFT JUSTIFY
J/MOVST0 ; ..
[ARX]_AC[DLEN], ;RIGHT JUSTIFY
SKIP DP0, 4T, ;WHICH IS SHORTER?
J/MOVRJ
MVSO: READ [BR], FE_S+2 ;GET DST BYTE SIZE
Q_0, BYTE STEP ;BUILD AN S BIT MASK
=0*
MVSO1: GEN MSK [AR], BYTE STEP, J/MVSO1
[AR]_.NOT.Q ;BITS WHICH MUST NOT BE SET
WORK[MSK]_[AR].AND.[MASK], ;SAVE FOR SRCMOD
J/MOVLP0 ;GO ENTER LOOP
.TOC "EXTEND -- MOVE STRING -- OFFSET/TRANSLATE"
;HERE IS THE LOOP FOR OFFSET AND TRANSLATED MOVES
=000
MOVELP: [AR]_WORK[SLEN]+1, ;UPDATE STRING LENGTH
CALL [SRCMOD] ;GET A SOURCE BYTE
=001 [ARX]_[AR], SKIP DP0, ;(1) LENGTH EXHAUSTED
J/MOVST2 ; SEE IF FILL IS NEEDED
=100 [AR]_-WORK[SLEN], ;(4) ABORT
J/MVABT ; ..
STATE_[SRC+DST], ;(5) NORMAL--STORE DST BYTE
CALL [PUTDST] ; ..
=111
MOVLP0: STATE_[SRC], J/MOVELP ;(7) DPB DONE
=
;HERE TO ABORT A STRING MOVE DUE TO TRANSLATE OR OFFSET FAILURE
MVABT: [BR]_AC[DLEN], ;WHICH STRING IS LONGER
SKIP DP0, 4T
=0
MVABT1: AC[DLEN]_[AR], J/MVABT2 ;PUT AWAY DEST LEN
[AR]_[AR]-[BR], ;DEST LEN WAS GREATER
J/MVABT1 ;STICK BACK IN AC
MVABT2: [AR]_.NOT.WORK[SLEN] ;GET UNDECREMENTED SLEN
READ [BR], SKIP DP0 ;NEED TO FIXUP SRC?
=0 [AR]_[AR]+[BR] ;SRC LONGER BY (DLEN)
MVEND: [AR]_[AR].OR.[BRX] ;PUT BACK SRC FLAGS
END STATE, J/STAC ;ALL DONE
.TOC "EXTEND -- MOVE STRING -- MOVSRJ"
=00
MOVRJ: [AR]_AC[SRCP], J/MVSKP ;SRC LONGER, SKIP OVER SOME
STATE_[DSTF], ;DST LONGER, FILL IT
CALL [MOVFIL] ; ..
=11 [ARX]_WORK[SLEN]+1, ;DONE FILLING
J/MOVST1 ;GO MOVE STRING
;HERE TO SKIP OVER EXTRA SOURCE BYTES
MVSKP: AC[SRCP]_[AR], SKIP -1MS ;[121] Is there a timer interrupt?
=0 WORK[SV.AR]_[AR], J/MVSK2 ;[121][123] Yes, save regs for interrupt.
[ARX]_[ARX]-1, 3T, ;DONE SKIPPING?
SKIP DP0
=0 IBP DP, IBP SCAD, ;NO--START THE IBP
SCAD DISP, SKIP IRPT, ;4-WAY DISPATCH
3T, J/MVSKP1 ;GO BUMP POINTER
AC[DLEN]_0, ;LENGTHS ARE NOW EQUAL
J/MOVST4 ;GO MOVE STRING
=00
MVSKP1: [AR]_[BR], J/MVSKP ;NO OVERFLOW
[AR]_.NOT.WORK[SLEN], ;INTERRUPT
J/MVSK3 ; ..
SET P TO 36-S, ;WORD OVERFLOW
J/MVSKP2 ;FIXUP Y
[AR]_.NOT.WORK[SLEN] ;[121] INTERRUPT or timer.
MVSK3: AC[DLEN]_[AR] ;RESET DLEN
=0 [AR]_[AR]+[ARX],
CALL [INCAR] ;ADD 1 TO AR
AC_[AR].OR.[BRX], ;PUT BACK FLAGS
J/ITRAP ;DO INTERRUPT TRAP
MVSKP2: [AR]_[AR]+1, HOLD LEFT, ;BUMP Y
J/MVSKP ;KEEP GOING
;BEGIN EDIT [123]
MVSK2: WORK[SV.BR]_[BR] ;SAVE ALL
WORK[SV.ARX]_[ARX] ;THE REGISTERS
WORK[SV.BRX]_[BRX] ;FOR THE TICK
=0* CALL [TICK] ;UPDATE CLOCK AND SET INTERUPT
[AR]_WORK[SV.AR] ;NOW PUT
[BR]_WORK[SV.BR] ;THEM ALL
[ARX]_WORK[SV.ARX] ;BACK SO WE
[BRX]_WORK[SV.BRX], ;CAN CONTINUE
J/MVSKP
;END EDIT [123]
.TOC "EXTEND -- MOVE STRING -- SIMPLE MOVE LOOP"
;HERE FOR NO-MODIFICATION STRING MOVES
MOVST0: [ARX]_[ARX]+1 ;CANT DO [ARX]_[AR]+1
MOVST1: STATE_[SRC] ;PREPARE FOR PAGE FAIL
=000
WORK[SLEN]_[ARX], ;GO GET A SOURCE BYTE
SKIP DP0, CALL [GSRC] ; ..
MOVSTX: [ARX]_[AR], ;SHORT STRING RAN OUT
SKIP DP0, J/MOVST2 ;GO SEE IF FILL NEEDED
=010 STATE_[SRC+DST], ;WILL NEED TO BACK UP BOTH POINTERS
CALL [PUTDST] ;STORE BYTE
=110
MOVST4: [ARX]_WORK[SLEN]+1, ;COUNT DOWN LENGTH
J/MOVST1 ;LOOP OVER STRING
=
=00
MOVST2: AC[DLEN]_0, J/MOVST3 ;CLEAR DEST LEN, REBUILD SRC
STATE_[DST], CALL [MOVFIL] ;FILL OUT DEST
=11 AC_[BRX], J/ENDSKP ;ALL DONE
MOVST3: AC_[ARX].OR.[BRX] ;REBUILD SRC
END STATE, J/SKIPE ; ..
.TOC "EXTEND -- COMPARE STRING"
3740:
CMS: [ARX]_AC[DLEN] ;GET DEST LEN
=0** TL [ARX], #/777000, CALL [BITCHK]
[BRX]_AC ;GET SRC LEN
=0** TL [BRX], #/777000, CALL [BITCHK]
[BRX]-[ARX], 3T, SKIP DP0 ;WHICH STRING IS LONGER?
=0 [AR]_[AR]+1 ;SRC STRING IS LONGER
VMA_[AR]+1, START READ ;DST STRING
=0 [AR]_0, ;FORCE FIRST COMPARE TO BE
;EQUAL
CALL [LOADQ] ;PUT FILL INTO Q
WORK[FILL]_Q, ;SAVE FILLER
J/CMS2 ;ENTER LOOP
;HERE IS THE COMPARE LOOP.
; ARX/ CONATINS REMAINING DEST LENGTH
; BRX/ CONTAINS REMAINING SOURCE LENGTH
=0
CMS3: ;BYTES ARE NOT EQUAL
END STATE, ;NO MORE SPECIAL PAGE FAIL ACTION
SKIP-COMP DISP ;SEE SKIP-COMP-TABLE
CMS4: [AR]_AC[SRCP] ;GET BYTE POINTER
READ [BRX], SKIP DP0 ;MORE IN SOURCE STRING?
=00 STATE_[EDIT-SRC], ;PREPARE FOR PAGE FAIL
CALL [GETSRC] ; GO GET BYTE
READ [ARX], SKIP DP0, ;NO MORE SRC--SEE IF MORE DEST
J/CMS5 ; ..
WORK[CMS]_[AR] ;SAVE SRC BYTE
=
AC_[BRX] ;PUT BACK SRC LEN
STATE_[COMP-DST] ;HAVE TO BACK UP IF DST FAILS
READ [ARX], SKIP DP0 ;ANY MORE DEST?
=00
CMS6: CALL [CMPDST] ;MORE DEST BYTES
[AR]_WORK[FILL], ;OUT OF DEST BYTES
J/CMS7 ;GO DO COMPARE
AC[DLEN]_[ARX] ;GOT A BYTE, UPDATE LENGTH
=
CMS7: [AR]_[AR].AND.[MASK], ;MAKE MAGNITUDES
WORK[CMS] ;WARM UP RAM
[BR]_[MASK].AND.WORK[CMS], 2T ;GET SRC MAGNITUDE
[AR]_[BR]-[AR] REV ;UNSIGNED COMPARE
CMS2: [ARX]_[ARX]-1 ;UPDATE LENGTHS
[BRX]_[BRX]-1 ; ..
READ [AR], SKIP AD.EQ.0, J/CMS3 ;SEE IF EQUAL
=0
CMS5: Q_WORK[FILL], J/CMS8 ;MORE DST--GET SRC FILL
[AR]_0, J/CMS3 ;STRINGS ARE EQUAL
CMS8: STATE_[EDIT-DST] ;JUST DST POINTER ON PAGE FAIL
WORK[CMS]_Q, J/CMS6 ;MORE DST--SAVE SRC FILL
=0
CMPDST: [AR]_AC[DSTP], ;GET DEST POINTER
CALL [IDST] ;UPDATE IT
READ [AR], ;LOOK AT BYTE POINTER
FE_FE.AND.S#, S#/0770, ;MASK OUT BIT 6
BYTE DISP, J/LDB1 ;GO LOAD BYTE
.TOC "EXTEND -- DECIMAL TO BINARY CONVERSION"
3742:
DBIN: [AR]_[777777] XWD 0 ;IF WE ARE IN OFFSET MODE
WORK[MSK]_[AR] ; ONLY ALLOW 18 BITS
;RANGE CHECKED (0-10) LATER
[AR]_AC ;GET SRC LENGTH
[BRX]_[AR].AND.# CLR RH, ;SPLIT OUT FLAGS
#/777000 ; ..
=0* [ARX]_AC[BIN1], ;GET LOW WORD
CALL [CLARX0] ;CLEAR BIT 0 OF ARX
AC[BIN1]_[ARX] ;STORE BACK
=0 READ [BRX], SKIP DP0, ;IS S ALREADY SET?
CALL [CLRBIN] ;GO CLEAR BIN IF NOT
[AR]_[AR].AND.#, ;CLEAR FLAGS FROM LENGTH
#/000777, HOLD RIGHT, ; ..
B DISP ;SEE IF OFFSET OR TRANSLATE
=1110
DBIN1: STATE_[CVTDB], J/DBIN2 ;TRANSLATE--LEAVE S ALONE
[BRX]_[BRX].OR.#, ;OFFSET--FORCE S TO 1
#/400000, HOLD RIGHT,
J/DBIN1
DBIN2: WORK[SLEN]_.NOT.[AR] ;STORE -SLEN-1
;HERE IS THE MAIN LOOP
=0*0
DBINLP: [AR]_WORK[SLEN]+1, CALL [SRCMOD] ;(0) GET MODIFIED SRC BYTE
TL [BRX], #/100000, ;(1) DONE, IS M SET?
J/DBXIT
[AR]_.NOT.WORK[SLEN], ;(4) ABORT
J/DBABT ; ..
[AR]-#, #/10., ;(5) NORMAL--SEE IF 0-9
4T, SKIP DP18 ; ..
=0 [AR]_.NOT.WORK[SLEN], ;DIGIT TOO BIG
J/DBABT ;GO ABORT CVT
;HERE TO ADD IN A DIGIT
[BR]_AC[BIN0], 4T, ;GET HIGH BINARY
SKIP AD.EQ.0 ;SEE IF SMALL
=00
DBSLO: [ARX]_AC[BIN1], ;TOO BIG
CALL [DBSLOW] ;GO USE DOUBLE PRECISION PATHS
[BR]_AC[BIN1], ;GET LOW WORD
J/DBFAST ;MIGHT FIT IN 1 WORD
J/DBINLP ;RETURN FROM DBSLOW
;GO DO NEXT DIGIT
=
DBFAST: TL [BR], #/760000 ;WILL RESULT FIT IN 36 BITS?
=0 J/DBSLO ;MAY NOT FIT--USE DOUBLE WORD
[BR]_AC[BIN1]*2 ;COMPUTE AC*2
[BR]_[BR]*2, AC[BIN1] ;COMPUTE AC*4
=0 [BR]_[BR]+AC[BIN1], 2T, ;COMPUTE AC*5
CALL [SBRL] ;COMPUTE AC*10
AC[BIN1]_[AR]+[BR], 3T, ;NEW BINARY RESULT
J/DBINLP ;DO NEXT DIGIT
;HERE IF NUMBER DOES NOT FIT IN ONE WORD
=000
DBSLOW: [BR]_AC[BIN0], ;FETCH HIGH WORD
CALL [MULBY4] ;MULTIPLY BY 4
[ARX]_[ARX]+AC[BIN1], ;COMPUTE VALUE * 5
SKIP CRY1, 4T, ;SEE IF OVERFLOW
CALL [ADDCRY] ;GO ADD CARRY
=101 [BR]_[BR]+AC[BIN0] ;ADD IN HIGH WORD
=
=000 CALL [DBLDBL] ;MAKE * 10
[ARX]_[ARX]+[AR], 3T, ;ADD IN NEW DIGIT
SKIP CRY1, ;SEE IF OVERFLOW
CALL [ADDCRY] ;ADD IN THE CARRY
=101 AC[BIN1]_[ARX] ;PUT BACK ANSWER
=
AC[BIN0]_[BR], ; ..
RETURN [2] ;GO DO NEXT BYTE
;HERE TO DOUBLE BR!ARX
=000
MULBY4: CALL [DBLDBL] ;DOUBLE TWICE
DBLDBL: [BR]_[BR]+[BR] ;DOUBLE HIGH WORD FIRST
;(SO WE DON'T DOUBLE CARRY)
[ARX]_[ARX]+[ARX], ;DOUBLE LOW WORD
SKIP CRY1, 3T, ;SEE IF CARRY
CALL [ADDCRY] ;ADD IN CARRY
=110 RETURN [1] ;ALL DONE
=
;HERE TO ADD THE CARRY
=0
ADDCRY: RETURN [4] ;NO CARRY
CLEAR [ARX]0 ;KEEP LOW WORD POSITIVE
[BR]_[BR]+1, ;ADD CARRY
RETURN [4] ;ALL DONE
;HERE TO ABORT CONVERSION
DBABT: [BRX]_[BRX].OR.[AR] ;PUT BACK UNUSED LENGTH
[PC]_[PC]-1, HOLD LEFT, ;DO NOT SKIP
J/DBDONE ;GO FIX UP SIGN COPY
;HERE AT END
=0
DBXIT: [ARX]_AC[BIN1], ;GET LOW WORD
J/DBNEG ;GO NEGATE
DBDONE: [AR]_AC[BIN1] ;FETCH LOW WORD
[BR]_AC[BIN0], 4T, ;GET HIGH WORD
SKIP DP0 ;WHAT SIGN
=0 CLEAR [AR]0, J/DBDN1 ;POSITIVE
[AR]_[AR].OR.#, #/400000, HOLD RIGHT
DBDN1: AC[BIN1]_[AR] ;STORE AC BACK
=0 AC_[BRX] TEST, ;RETURN FLAGS
SKIP DP0, CALL [CLRBIN] ;CLEAR BIN IS S=0
ENDSKP: END STATE, J/SKIP ;NO--ALL DONE
DBNEG: CLEAR ARX0 ;CLEAR EXTRA SIGN BIT
[ARX]_-[ARX], 3T, ;NEGATE AND SEE IF
SKIP AD.EQ.0, AC[BIN0] ; ANY CARRY
=0 [AR]_.NOT.AC[BIN0], 2T, J/STAC34 ;NO CARRY
[AR]_-AC[BIN0], 3T, ;CARRY
SKIP AD.EQ.0 ;SEE IF ALL ZERO
=0 [ARX]_[400000] XWD 0 ;MAKE COPY OF SIGN
; UNLESS HIGH WORD IS ZERO
STAC34: AC[BIN0]_[AR] ;PUT BACK ANSWER
AC[BIN1]_[ARX], J/DBDONE ; ..
;HELPER SUBROUTINE TO CLEAR AC[BIN0] AND AC[BIN1] IF S=0
;CALL WITH:
; READ [BRX], SKIP DP0, CALL [CLRBIN]
;RETURNS 1 ALWAYS
=0
CLRBIN: AC[BIN0]_0, J/CLRB1
RETURN [1]
CLRB1: AC[BIN1]_0, RETURN [1]
.TOC "EXTEND -- BINARY TO DECIMAL CONVERSION"
3743:
BDEC: [BRX]_AC[DLEN], ;GET LENGTH AND FLAGS
SKIP FPD ;CONTINUE FROM INTERUPT?
=0 [BRX]_[BRX].AND.#, ;JUST KEEP THE FLAGS
#/777000, ; ..
J/BDEC0 ;COMPUTE NEW FLAGS
DOCVT: [AR]_AC, J/DOCVT1 ;ALL SET PRIOR TO TRAP
BDEC0: [ARX]_AC[1] ;GET LOW BINARY
[AR]_AC, SC_20. ;GET HIGH WORD, SET STEP COUNT
=0* WORK[BDL]_[ARX], ;SAVE IN CASE OF ABORT
CALL [CLARX0] ;MAKE SURE BIT 0 IS OFF
WORK[BDH]_[AR], ;SAVE HIGH WORD AND
SKIP DP0 ; TEST SIGN
=0
BDEC1: [BRX]_0, HOLD LEFT, ;POSITIVE, CLEAR RH OF BRX
J/BDEC3 ;COMPUTE # OF DIGITS REQUIRED
[BRX]_[BRX].OR.#, ;NEGATIVE, SET M
#/100000, HOLD RIGHT ; ..
=0*
BDEC2: CLEAR ARX0, CALL [DBLNG1] ;NEGATE AR!ARX
AC_[AR] TEST, ;PUT BACK ANSWER
SKIP DP0 ;IF STILL MINUS WE HAVE
; 1B0, AND NO OTHER BITS
=0 AC[1]_[ARX], J/BDEC1 ;POSITIVE NOW
[ARX]_[ARX]+1 ;JUST 1B0--ADD 1
[BRX]_[BRX].OR.#, ;AND REMEMBER THAT WE DID
#/040000, HOLD RIGHT, ; IN LEFT HALF OF AC+3
J/BDEC2 ; NEGATE IT AGAIN
=0
BDEC3: [AR]_AC, J/BDEC4 ;GET HIGH AC
[BRX]_[BRX].OR.#, ;NO LARGER POWER OF 10 FITS
#/200000, ;SET N FLAG (CLEARLY NOT 0)
HOLD RIGHT, J/BDEC5 ;SETUP TO FILL, ETC.
=001
BDEC4: [ARX]_AC[1], ;GET HIGH WORD
CALL [BDSUB] ;SEE IF 10**C(BRX) FITS
=011 [BRX]_[BRX]+1, ;NUMBER FITS--TRY A LARGER ONE
STEP SC, J/BDEC3 ;UNLESS WE ARE OUT OF NUMBERS
=111 TR [BRX], #/777777 ;ANY DIGITS REQUIRED?
=
=0 [BRX]_[BRX].OR.#, ;SOME DIGITS NEEDED,
#/200000, HOLD RIGHT, ; SET N FLAG
J/BDEC5 ;CONTINUE BELOW
[BRX]_[BRX]+1 ;ZERO--FORCE AT LEAST 1 DIGIT
=0
BDEC5: [AR]_AC[DLEN], ;GET LENGTH
CALL [CLRFLG] ;REMOVE FLAGS FROM AR
[BR]_0
[BR]_[BRX], HOLD LEFT ;GET # OF DIGITS NEEDED
[BR]_[BR]-[AR], ;NUMBER OF FILLS NEEDED
SKIP AD.LE.0 ;SEE IF ENOUGH ROOM
=0 [ARX]_WORK[BDL], ;DOES NOT FIT IN SPACE ALLOWED
J/BDABT ; DO NOT DO CONVERT
READ [BRX], SKIP DP0 ;IS L ALREADY SET
=0 AC[DLEN]_[BRX], ;NO--NO FILLERS
J/DOCVT ;GO CHURN OUT THE NUMBER
;HERE TO STORE LEADING FILLERS
[AR]_[BRX], HOLD RIGHT ;MAKE SURE THE FLAGS GET SET
AC[DLEN]_[AR] ; BEFORE WE PAGE FAIL
[AR]_WORK[E0] ;ADDRESS OF FILL (-1)
[AR]_[AR]+1, LOAD VMA, ;FETCH FILLER
START READ
MEM READ, [T0]_MEM ;GET FILLER INTO AR
STATE_[EDIT-DST] ;PAGE FAILS BACKUP DST
WORK[SLEN]_[BR]-1, 3T ;SAVE # OF FILLERS
BDFILL: [AR]_[T0], WORK[SLEN] ;RESTORE FILL BYTE AND
; WARM UP RAM FILE
[BR]_WORK[SLEN]+1, 3T, ;MORE FILLERS NEEDED?
SKIP DP0
=000 AC[DLEN]_[BRX], J/DOCVT ;ALL DONE FIX FLAGS AND CONVERT
=001 WORK[SLEN]_[BR], ;SAVE UPDATED LENGTH
CALL [PUTDST] ; AND STORE FILLER
=111 [BR]_AC[DLEN]-1 ;COUNT DOWN STRING LENGTH
=
AC[DLEN]_[BR], J/BDFILL ;KEEP FILLING
;HERE TO STORE THE ANSWER
DOCVT1: [ARX]_AC[1], ;GET LOW WORD
J/DOCVT2 ;ENTER LOOP FROM BOTTOM
=010
BDECLP: [BR]_[BR]+1, ;COUNT DIGITS
CALL [BDSUB] ;KEEP SUBTRACTING 10**C(BRX)
=110 WORK[BDH]_[AR] ;SAVE BINARY
=
[AR]_[BR]+WORK[E1], ;OFFSET DIGIT
B DISP ;SEE WHICH MODE
=1110 READ [AR], LOAD VMA, ;TRANSLATE, START READING TABLE
START READ, J/BDTBL ; GO GET ENTRY FROM TABLE
BDSET: WORK[BDL]_[ARX] ;SAVE LOW BINARY
=00* STATE_[EDIT-DST], CALL [PUTDST]
=11* [BR]_AC[DLEN]-1 ;UPDATE STRING LENGTH
[AR]_WORK[BDH]
[ARX]_WORK[BDL]
TL [BR], #/040000 ;ARE WE CONVERTING 1B0?
=0 [ARX]_[ARX]+1, J/BDCFLG ;YES--FIX THE NUMBER AND CLEAR FLAG
DOCVT3: AC_[AR]
AC[1]_[ARX]
AC[DLEN]_[BR] ;STORE BACK NEW STRING LENGTH
DOCVT2: [BRX]_[BRX]-1, 3T, SKIP DP18
=0 [BR]_-1, SET FPD, 3T, J/BDECLP
END STATE, CLR FPD, J/SKIP
;HERE TO TRANSLATE 1 DIGIT
=0
BDTBL: END STATE, ;DON'T CHANGE BYTE POINTER IF
; THIS PAGE FAILS
CALL [LOADAR] ;GO PUT WORD IN AR
TR [BRX], #/777777 ;LAST DIGIT
=0 [AR]_0, HOLD RIGHT, J/BDSET
TL [BRX], #/100000 ;AND NEGATIVE
=0 [AR]_[AR] SWAP ;LAST AND MINUS, USE LH
[AR]_0, HOLD RIGHT, J/BDSET
BDABT: [AR]_WORK[BDH], J/DAC
BDCFLG: [BR]_[BR].AND.NOT.#, ;CLEAR FLAG THAT TELLS US
#/040000, HOLD RIGHT, ; TO SUBTRACT 1 AND
J/DOCVT3 ; CONTINUE CONVERTING
;SUBROUTINE TO SUBRTACT A POWER OF 10 FROM AR!ARX
;CALL WITH:
; AR!ARX/ NUMBER TO BE CONVERTED
; BRX(RIGHT)/ POWER OF 10
;RETURNS:
; 2 RESULT IS STILL POSITIVE
; 6 RESULT WOULD HAVE BEEN NEGATIVE (RESTORE DONE)
=0
BDSUB: [T0]_[BRX]+#, 3T, WORK/DECLO, ;ADDRESS OF LOW WORD
J/BDSUB1 ;NO INTERRUPT
J/FIXPC ;INTERRUPT
=0*
BDSUB1: [T1]_[T0], LOAD VMA, ;PUT IN VMA,
CALL [CLARX0] ;FIX UP SIGN OF LOW WORD
[ARX]_[ARX]-RAM, 3T, ;SUBTRACT
SKIP CRY1 ;SEE IF OVERFLOW
=0 [AR]_[AR]-1 ;PROCESS CARRY
[T0]_[BRX]+#, 3T, WORK/DECHI ;ADDRESS OF HIGH WORD
READ [T0], LOAD VMA ;PLACE IN VMA
[AR]_[AR]-RAM, 4T, ;SUBTRACT
SKIP DP0 ;SEE IF IT FIT
=0
CLARX0: CLEAR ARX0, ;IT FIT, KEEP LOW WORD +
RETURN [2] ; AND RETURN
[AR]_[AR]+RAM ;RESTORE
READ [T1], LOAD VMA
[ARX]_[ARX]+RAM, 3T, SKIP CRY1
=0
BDSUB2: CLEAR ARX0, ;KEEP LOW WORD +
RETURN [6] ;RETURN OVERFLOW
[AR]_[AR]+1, ;ADD BACK THE CARRY
J/BDSUB2 ;COMPLETE SUBTRACT
.TOC "EXTEND -- EDIT -- MAIN LOOP"
;HERE FOR EDIT INSTRUCTION
;CALL WITH:
; AR/ E0 ADDRESS OF FILL, FLOAT, AND MESSAGE TABLE
; BR/ E1 TRANSLATE TABLE
;
3741:
EDIT: VMA_[AR]+1, START READ, ;FIRST GET FILL BYTE
CALL [GTFILL] ;GO GET IT
3751: [BRX]_AC ;GET PATTERN POINTER
=0** TL [BRX], #/047777, ;MAKE SURE SECTION 0
CALL [BITCHK] ; ..
EDITLP: VMA_[BRX], START READ ;FETCH PATTERN WORD
END STATE ;NO SPECIAL PAGE FAIL ACTION
[BR]_[BRX] SWAP ;GET PBN IN BITS 20 & 21
=0 [BR]_[BR]*4, ; ..
CALL [LOADAR] ;GET PATTERN WORD
READ [BR], 3T, DISP/DP LEFT
=1100
[AR]_[AR] SWAP, SC_7, J/MOVPAT ;(0) BITS 0-8
[AR]_[AR] SWAP, J/MSKPAT ;(1) BITS 9-17
[AR]_[AR]*.5, SC_6, J/MOVPAT ;(2) BITS 18-27
[AR]_[AR].AND.#, #/777, J/EDISP ;(3) BITS 28-35
=0
MOVPAT: [AR]_[AR]*.5, STEP SC, J/MOVPAT ;SHIFT OVER
MSKPAT: [AR]_[AR].AND.#, #/777
;HERE WITH PATTERN BYTE RIGHT ADJUSTED IN AR
EDISP: [BR]_[AR]*.5, SC_2 ;SHIFT OVER
=0
EDISP1: [BR]_[BR]*.5, STEP SC, J/EDISP1
READ [BR], 3T, DISP/DP ;LOOK AT HIGH 3 BITS
=0001 ;(0) OPERATE GROUP
[AR]-#, #/5, 4T, ; SEE IF 0-4
SKIP DP18, J/EDOPR
;(1) MESSAGE BYTE
READ [BRX], SKIP DP0,
J/EDMSG
;(2) UNDEFINED
J/EDNOP
;(3) UNDEFINED
J/EDNOP
;(4) UNDEFINED
J/EDNOP
;(5) SKIP IF M SET
TL [BRX], #/100000,
J/EDSKP
;(6) SKIP IF N SET
TL [BRX], #/200000,
J/EDSKP
;(7) SKIP ALWAYS
J/EDSKP
.TOC "EXTEND -- EDIT -- DECODE OPERATE GROUP"
;HERE FOR OPERATE GROUP. SKIP IF IN RANGE
=0
EDOPR: J/EDNOP ;OUT OF RANGE
READ [AR], 3T, DISP/DP ;DISPATCH ON TYPE
=1000 [PC]_[PC]+1, J/EDSTOP ;(0) STOP EDIT
STATE_[EDIT-SRC], ;(1) SELECT SOURCE BYTE
J/EDSEL
READ [BRX], SKIP DP0, ;(2) START SIGNIFICANCE
J/EDSSIG
[BRX]_[BRX].AND.#, ;(3) FIELD SEPERATOR
#/77777, HOLD RIGHT,
J/EDNOP
[BR]_AC[MARK] ;(4) EXCHANGE MARK AND DEST
VMA_[BR], START READ,
J/EDEXMD
=
.TOC "EXTEND -- EDIT -- STOP EDIT"
;HERE TO END AN EDIT OPERATION. PC IS SET TO SKIP IF NORMAL END
; OR NON-SKIP IF ABORT
EDSTOP: [BR]_.NOT.[BRX], ;AD WILL NOT DO D.AND.NOT.A
FE_S#, S#/10 ;PRESET FE
[AR]_[BRX], 3T, FE_FE+P ;MOVE POINTER, UPBATE PBN
[BR].AND.#, 3T, ;WAS OLD NUMBER 3?
#/030000, SKIP ADL.EQ.0 ; ..
=0
EDSTP1: [AR]_P, J/STAC ;NO--ALL DONE
[AR]_[AR]+1, ;YES--BUMP WORD #
FE_FE.AND.S#, S#/0700, ;KEEP ONLY FLAG BITS
J/EDSTP1 ;GO STOP EDIT
.TOC "EXTEND -- EDIT -- START SIGNIFICANCE"
;HERE WITH DST POINTER IN AR
=110
EDSSIG: CALL [EDFLT] ;STORE FLT CHAR
J/EDNOP ;DO NEXT PATTERN BYTE
.TOC "EXTEND -- EDIT -- EXCHANGE MARK AND DESTINATION"
;HERE WITH ADDRESS OF MARK POINTER IN BR
=0
EDEXMD: Q_AC[DSTP], ;GET DEST POINTER
CALL [LOADAR] ;GO PUT MARK IN AR
START WRITE ;START WRITE. SEPERATE STEP TO AVOID
; PROBLEM ON DPM5
MEM WRITE, MEM_Q ;PUT OLD DEST IN MARK
AC[DSTP]_[AR], J/EDNOP ;PUT BACK DEST POINTER
.TOC "EXTEND -- EDIT -- PROCESS SOURCE BYTE"
=0*
EDSEL: [AR]_AC[SRCP], ;PICK UP SRC POINTER
CALL [GETSRC] ;GET SOURCE BYTE
[AR]_[AR]*.5, WORK[E1] ;PREPARE TO TRANSLATE
=000 [AR]_[AR]+WORK[E1], ;GO TRANSLATE BY HALFWORDS
2T, CALL [TRNAR] ; ..
=010
EDFILL: READ [AR], ;(2) NO SIGNIFICANCE, GO FILL
SKIP AD.EQ.0, ; SEE IF ANY FILLER
J/EDFIL1 ; GO TO IT
STATE_[EDIT-SRC], ;(3) SIG START, DO FLOAT CHAR
J/EDSFLT
=100 J/EDSTOP ;(4) ABORT
=101
EDSPUT: STATE_[EDIT-S+D], ;(5) NORMAL, STORE AT DST
CALL [PUTDST] ; ..
=111
J/EDNOP ;(7) BYTE STORED
=
;HERE TO COMPLETE STORING FILL
=0
EDFIL1: J/EDSPUT ;STORE FILLER
J/EDNOP ;NO FILLER TO STORE
;HERE TO DO FLOAT BYTE
=110
EDSFLT: WORK[FSIG]_[ARX], ;SAVE SIG CHAR
CALL [EDFLT] ;STORE FLOAT CHAR
[AR]_WORK[FSIG] ;RESTORE CHAR
[AR]_[AR].AND.# CLR LH, ;JUST KEEP THE BYTE IN CASE
#/77777, ; DEST BYTE .GT. 15 BITS
J/EDSPUT ;GO STORE CHAR WHICH STARTED THIS ALL
;SUBRUTINE TO PROCESS FLOAT CHAR
;CALL WITH:
; AR/ POINTER TO STORE @ MARK
;RETURN 7 WITH FLOAT STORED
EDFLT: [BR]_AC[MARK] ;ADDRESS OF MARK POINTER
VMA_[BR], START WRITE ;READY TO STORE
[BR]_AC[DSTP] ;GET DST POINTER
MEM WRITE, MEM_[BR] ;STORE POINTER
=0 [AR]_0 XWD [2], ;FETCH FLOAT CHAR
CALL [EDBYTE] ;GET TBL BYTE
MEM READ, [AR]_MEM, ;GET FLOAT CHAR
SKIP AD.EQ.0 ;SEE IF NULL
=000
[FLG]_[FLG].OR.#, ;REMEMBER TO BACKUP DST POINTER
STATE/EDIT-DST, ; WILL ALSO BACKUP SRC IF CALLED
HOLD LEFT, ; FROM SELECT
CALL [PUTDST] ; STORE FLOAT
=001 [BRX]_[BRX].OR.#, #/400000,
HOLD RIGHT, J/EDFLT1 ;NULL
=110 [BRX]_[BRX].OR.#, #/400000,
HOLD RIGHT, J/EDFLT1 ;MARK STORED
=
EDFLT1: AC_[BRX], ;SAVE FLAGS SO WE DON'T
;TRY TO DO THIS AGAIN IF
;NEXT STORE PAGE FAILS
RETURN [7] ;AND RETURN
.TOC "EXTEND -- EDIT -- MESSAGE BYTE"
;HERE WITH SKIP ON S
=0
EDMSG: [AR]_WORK[FILL], ;GET FILL BYTE
SKIP AD.EQ.0, 4T, ;SEE IF NULL
J/EDMSG1 ;GO STORE
[AR]_[AR].AND.# CLR LH, ;GET OFFSET INTO TABLE
#/77
=0 [AR]_[AR]+1, WORK[E0], ;PLUS 1
CALL [EDBYTE] ;GET TBL BYTE
MEM READ, [AR]_MEM ;FROM MEMORY
=000
EDMSG1: STATE_[EDIT-DST], ;WHAT TO DO ON PAGE FAILS
CALL [PUTDST] ;STORE MESSAGE BYTE
=001 J/EDNOP ;NULL FILLER
=110 J/EDNOP ;NEXT BYTE
=
EDBYTE: [AR]_[AR]+WORK[E0] ;GET OFFSET INTO TABLE
VMA_[AR], START READ, ;START MEMORY CYCLE
RETURN [1] ;RETURN TO CALLER
.TOC "EXTEND -- EDIT -- SKIP"
=0
;HERE TO SKIP ALWAYS
EDSKP: [AR]_[AR].AND.#, #/77, ;JUST KEEP SKIP DISTANCE
J/EDSKP1 ;CONTINUE BELOW
;HERE IF WE DO NOT WANT TO SKIP
J/EDNOP
EDSKP1: [AR]_([AR]+1)*2 ;GIVE 1 EXTRA SKIP
READ [AR], SCAD/A*2, ;PUT THE ADJUSTMENT
SCADA/BYTE5, 3T, LOAD SC, ; THE SC
J/EDNOP1 ;JOIN MAIN LOOP
.TOC "EXTEND -- EDIT -- ADVANCE PATTERN POINTER"
EDNOP: SC_0 ;NO SKIP
EDNOP1: READ [BRX], 3T, FE_P ;PUT PBN IN FE
FE_FE.AND.S#, S#/30 ;JUST BYTE #
FE_FE+SC ;ADD IN ANY SKIP DISTANCE
FE_FE+S#, S#/10 ;BUMP PBN
[AR]_FE, ;GET NUMBER OF WORDS
LOAD SC ;PUT MSB WHERE IT CAN BE TESTED
; QUICKLY
[AR]_[AR].AND.# CLR LH, ;KEEP ONLY 1 COPY
#/170, SKIP/SC ; ..
=0
EDN1A: [AR]_[AR]*.5, SC_0,
J/EDNOP2 ;READY TO SHIFT OFF BYTE WITHIN
; WORD
[AR]_[AR].OR.#, #/200, ;GET THE SIGN BIT OF THE FE
HOLD LEFT, ; INTO THE AR. ONLY HAPPENS ON
J/EDN1A ; SKP 76 OR SKP 77
=0
EDNOP2: [AR]_[AR]*.5, STEP SC, J/EDNOP2
[BRX]_[BRX]+[AR], ;UPDATE WORD ADDRESS
HOLD LEFT
[AR]_P ;PUT PBN BACK IN BRX
[BRX]_[BRX].AND.#, ;JUST KEEP FLAGS
#/700000, ; ..
HOLD RIGHT
[AR]_[AR].AND.#, ;JUST KEEP PBN
#/030000
[BRX]_[BRX].OR.[AR], ;FINAL ANSWER
HOLD RIGHT
AC_[BRX], J/EDITLP ;DO NEXT FUNCTION
.TOC "EXTEND SUBROUTINES -- FILL OUT DESTINATION"
;CALL WITH
; AC[DLEN]/ NEGATIVE NUMBER OF BYTES LEFT IN DEST
; FILL/ FILL BYTE
; RETURN [2] WITH FILLERS STORED
;
;NOTE: THIS ROUTINE NEED NOT TEST FOR INTERRUPTS ON EACH BYTE
; BECAUSE EVERY BYTE STORE DOES A MEMORY READ.
;
=01*
MOVF1: [AR]_WORK[FILL], 2T, ;GET FILL BYTE
CALL [PUTDST] ;PLACE IN DEST
[AR]_AC[DLEN] ;AMOUNT LEFT
AC[DLEN]_[AR]+1, 3T, ;STORE UPDATED LEN
SKIP DP0 ; AND SEE IF DONE
=0 RETURN [2] ;DONE
MOVFIL: WORK[FILL], J/MOVF1 ;DO ANOTHER BYTE
;ENTERING HERE SAVES 150NS
; PER BYTE BUT COSTS 300NS
; PER FIELD MOVED. I ASSUME (BUT DO
; NOT KNOW) THAT THIS SPEEDS
; THINGS UP.
.TOC"EXTEND SUBROUTINES -- GET MODIFIED SOURCE BYTE"
;CALL WITH:
;SLEN = MINUS LENGTH OF STRING
;MSK = MASK FOR BYTE SIZE (1 IF BIT MUST BE ZERO)
;E1 = EFFECTIVE ADDRESS OF OPERATION WORD (SIGN EXTENDED IF OFFSET)
; [AR]_WORK[SLEN]+1, CALL [SRCMOD]
;RETURNS:
; 1 LENGTH EXHAUSTED
; 2 (EDIT ONLY) NO SIGNIFICANCE
; 3 (EDIT ONLY) SIGNIFICANCE START:
; 4 ABORT: OUT OF RANGE OR TRANSLATE FAILURE
; 5 NORMAL: BYTE IN AR
;
;DROM B SET AS FOLLOWS:
; 0 TRANSLATE
; 1 OFFSET
; 2 EDIT
; 4 CVTDBT
=00
SRCMOD: WORK[SLEN]_[AR], ;PUT BACK SOURCE LENGTH
SKIP DP0, ;SEE IF DONE
CALL [GSRC] ;GET A SOURCE BYTE
END STATE, RETURN [1] ;DONE
WORK[E1], B DISP ;OFFSET OR TRANSLATE?
=
=1110 [AR]_[AR]*.5, J/XLATE ;TRANSLATE
FIX [AR] SIGN, WORK[E1] ;IF WE ARE PROCESSING FULL WORD
; BYTES, AND THEY ARE NEGATIVE,
; AND THE OFFSET IS POSITIVE THEN
; WE HAVE TO MAKE BITS -1 AND -2
; COPIES OF THE SIGN BIT.
[AR]_[AR]+WORK[E1], 2T ;OFFSET
[AR].AND.WORK[MSK], ;VALID BYTE?
SKIP AD.EQ.0, 4T, ;SKIP IF OK
RETURN [4] ;RETURN 4 IF BAD, 5 IF OK
.TOC "EXTEND SUBROUTINES -- TRANSLATE"
;HERE WITH BYTE IN AR 1-36. FETCH TABLE ENTRY.
XLATE: [AR]_[AR]+WORK[E1] ;COMPUTE ADDRESS
TRNAR: READ [AR], LOAD VMA, ;FETCH WORD
START READ ; ..
=0 [AR]_[AR]*2, ;GET BACK LSB
;BIT 36 IS NOT PRESERVED
; BY PAGE FAILS
CALL [LOADARX] ;PUT ENTRY IN ARX
TR [AR], #/1 ;WHICH HALF?
=0
XLATE1: [AR]_[ARX], 3T, ;RH -- COPY TO AR
DISP/DP LEFT, ;DISPATCH ON CODE
J/TRNFNC ;DISPATCH TABLE
[ARX]_[ARX] SWAP, ;LH -- FLIP AROUND
J/XLATE1 ;START SHIFT
;HERE ON TRANSLATE OPERATION TO PERFORM FUNCTIONS REQUIRED BY
; THE 3 HIGH ORDER BITS OF THE TRANSLATE FUNCTION HALFWORD. WE
; DISPATCH ON FUNCTION AND HAVE:
; BRX/ FLAGS
; ARX/ TABLE ENTRY IN RH
;
=0001
;(0) NOP
TRNFNC: READ [BRX], SKIP DP0, ;S FLAG ALREADY SET?
J/TRNRET ; ..
;(1) ABORT
RETURN [4]
;(2) CLEAR M FLAG
[BRX]_[BRX].AND.NOT.#,
#/100000, HOLD RIGHT,
J/TRNFNC
;(3) SET M FLAG
[BRX]_[BRX].OR.#,
#/100000, HOLD RIGHT,
J/TRNFNC
;(4) SET N FLAG
TRNSIG: [BRX]_[BRX].OR.#,
#/200000, HOLD RIGHT,
J/TRNFNC
;(5) SET N FLAG THEN ABORT
[BRX]_[BRX].OR.#,
#/200000, HOLD RIGHT,
RETURN [4]
;(6) CLEAR M THEN SET N
[BRX]_[BRX].AND.NOT.#,
#/100000, HOLD RIGHT,
J/TRNSIG
;(7) SET N AND M
[BRX]_[BRX].OR.#,
#/300000, HOLD RIGHT,
J/TRNFNC
;HERE TO COMPLETE A TRANSLATE
=0
TRNRET: READ [ARX], SKIP DP18, ;S-FLAG IS ZERO
B DISP, SKIP DP18, ;SEE IF EDIT OR SIG START
J/TRNSS ; ..
TRNSS1: [AR]_[ARX].AND.# CLR LH, ;S IS SET, JUST RETURN BYTE
#/77777, RETURN [5] ; ..
=1100
TRNSS: [AR]_AC[DLEN], ;NO SIG ON MOVE OR D2B
B DISP, J/TRNNS1 ;SEE IF D2B
[BRX]_[BRX].OR.#, ;SIG START ON MOVE OR D2B
#/400000, HOLD RIGHT,
J/TRNSS1 ;RETURN BYTE
[AR]_WORK[FILL], ;EDIT--NO SIG RETURN FILL
RETURN [2] ; ..
[AR]_AC[DSTP], ;EDIT--START OF SIG
RETURN [3] ; ..
=1011
TRNNS1: [AR]_[AR]-1, J/TRNNS2 ;COMPENSATE FOR IGNORING SRC
[AR]_WORK[SLEN]+1, ;DEC TO BIN HAS NO DEST LENGTH
J/SRCMOD ;JUST UPDATE SRC LENTH
TRNNS2: AC[DLEN]_[AR] TEST, ;PUT BACK DLEN AND
SKIP DP0 ; SEE WHICH IS NOW SHORTER
=0 [AR]_WORK[SLEN], ;DEST IS SHORTER. DO NOT CHANGE
J/SRCMOD ; AMOUNT LEFT
[AR]_WORK[SLEN]+1, ;GO LOOK AT NEXT BYTE
J/SRCMOD
.TOC "EXTEND SUBROUTINES -- GET UNMODIFIED SOURCE BYTE"
;CALL:
; GSRC WITH SKIP ON SOURCE LENGTH
; GETSRC IF LENGHT IS OK
;WITH:
; AC1/ SOURCE BYTE POINTER
;RETURNS:
; 1 IF LENGTH RAN OUT
; 2 IF OK (BYTE IN AR)
;
=0
GSRC: [AR]_AC[DLEN], ;LENGTH RAN OUT
RETURN [1] ;RESTORE AR AND RETURN
GETSRC: [AR]_AC[SRCP] ;GET SRC PTR
IBP DP, IBP SCAD, ;UPDATE BYTE POINTER
SCAD DISP, 3T ;SEE IF OFLOW
=01 [AR]_[BR], J/GSRC1 ;NO OFLOW
SET P TO 36-S ;RESET P
[AR]_[AR]+1, HOLD LEFT ;BUMP Y
GSRC1: AC[SRCP]_[AR] ;STORE UPDATED POINTER
=0 READ [AR], LOAD BYTE EA,;SETUP TO FIGURE OUT
FE_P, 3T, CALL [BYTEAS] ; EFFECTIVE ADDRESS
READ [AR], ;LOOK AT POINTER
BYTE DISP, ;SEE IF 7 BIT
FE_FE.AND.S#, S#/0770, ;MASK OUT P FIELD
J/LDB1 ;GO GET THE BYTE
.TOC "EXTEND SUBROUTINES -- STORE BYTE IN DESTINATION STRING"
;CALL WITH:
; AR/ BYTE TO STORE
; AC4/ DESTINATION BYTE POINTER
;RETURNS:
; AR & AC4/ UPDATED BYTE POINTER
; ARX/ BYTE TO STORE
; BR/ WORD TO MERGE WITH
; 6 ALWAYS
;
PUTDST: [ARX]_[AR] ;SAVE BYTE
=0 [AR]_AC[DSTP], ;GET DEST POINTER
CALL [IDST] ;BUMP DEST POINTER
AD/A+B, A/ARX, B/ARX, ;SHIFT 7-BIT BYTE TO
SCAD/A, 3T, ; NATURAL PLACE, AND PUT
SCADA/BYTE5, LOAD FE ; INTO FE
=0* READ [AR], BYTE DISP, ;GO PUT BYTE IN MEMORY
CALL [DPB1] ; ..
RETURN [6] ;ALL DONE
.TOC "EXTEND SUBROUTINES -- UPDATE DEST STRING POINTERS"
;SUBROUTINE TO BUMP DST POINTERS
;CALL WITH:
; AR/ AC[DSTP]
; RETURN 1 WITH UPDATED POINTER STORED
;
IDST: IBP DP, IBP SCAD, SCAD DISP, 3T
=0* [AR]_[BR], LOAD DST EA, J/IDSTX
SET P TO 36-S
[AR]_[AR]+1, HOLD LEFT, LOAD DST EA
IDSTX: AC[DSTP]_[AR], 3T, ;STORE PTR BACK
FE_P, DISP/EAMODE ;SAVE P FOR CMPDST
=100*
DSTEA: VMA_[AR]+XR, START READ, PXCT BYTE DATA, 3T, J/BYTFET
VMA_[AR], START READ, PXCT BYTE DATA, J/BYTFET
VMA_[AR]+XR, START READ, PXCT/BIS-DST-EA, 3T, J/DSTIND
VMA_[AR], START READ, PXCT/BIS-DST-EA, J/DSTIND
DSTIND: MEM READ, [AR]_MEM, HOLD LEFT, LOAD DST EA
EA MODE DISP, J/DSTEA
;HERE TO TEST ILLEGAL BITS SET
;CALL WITH:
; SKIP IF ALL BITS LEGAL
; RETURN [4] IF OK, ELSE DO UUO
;
3556: ;EXTEND OF 0 COMES HERE
BITCHK: UUO
3557: RETURN [4]
;HERE TO PUT FILL IN [AR] AND WORK[FILL]
GTFILL: MEM READ, ;WAIT FOR DATA
[AR]_MEM ;PLACE IN AR
WORK[FILL]_[AR], ;SAVE FOR LATER
RETURN [10] ;RETURN TO CALLER
;SUBROUTINE TO CLEAR FLAGS IN AR
CLRFLG: [AR]_[AR].AND.#, ;CLEAR FLAGS IN AR
#/000777, ; ..
HOLD RIGHT, RETURN [1]
.TOC "EXTEND -- PAGE FAIL CLEANUP"
;BACK UP SOURCE POINTER
=0
BACKS: [AR]_AC[SRCP],
CALL [BACKBP] ;BACKUP BP
AC[SRCP]_[BR], J/CLDISP
CMSDST: [AR]_WORK[SV.BRX] ;GET OLD SRC LEN
AC_[AR]+1, 3T ;BACK UP
;BACK UP DESTINATION POINTER
=0
BACKD: [AR]_AC[DSTP],
CALL [BACKBP]
AC[DSTP]_[BR], J/CLDISP
;FAILURES DURING MOVE STRING (BACKUP LENGTHS)
STRPF: [AR]_-WORK[SLEN] ;GET AMOUNT LEFT
STRPF0: [BR]_AC[DLEN], 4T, ;WHICH STRING IS LONGER?
SKIP DP0
=0
STRPF1: AC[DLEN]_[AR], J/STPF1A ;SRC LONGER
[ARX]_[AR] ;COPY SRC LENGTH
=0 [ARX]_[ARX].OR.WORK[SV.BRX], ;REBUILD FLAGS
CALL [AC_ARX] ;RESET AC]SLEN]
[AR]_[AR]-[BR] ;MAKE DEST LEN
STRPF3: AC[DLEN]_[AR], ;PUT BACK DEST LEN
J/CLDISP ;DO NEXT CLEANUP
STPF1A: [AR]_[AR]+[BR], J/STRPF2
PFDBIN: [AR]_-WORK[SLEN] ;RESTORE LENGTH
STRPF2: [AR]_[AR].OR.WORK[SV.BRX]
PFGAC0: AC_[AR], J/CLDISP ;PUT BACK SRC LEN AND FLAGS
STRPF4: [AR]_.NOT.WORK[SLEN], J/STRPF0
BACKBP: IBP DP, SCAD/A+B, SCADA/BYTE1, SCADB/SIZE, ;P_P+S
RETURN [1]