Trailing-Edge
-
PDP-10 Archives
-
klu2_442
-
bytsub.mic
There are 3 other files named bytsub.mic in the archive. Click here to see a list.
.TOC "BYTE GROUP -- Some Old Style Subroutines"
;
; This file once included all of the byte instruction code.
; With the coming of the new version of the byte instructions,
; however, much of this stuff became unnecessary and has
; been eliminated as a result. It is hoped to be able to
; eliminate more of this once we rewrite the string instructions.
; [345]
;
.TOC "INCREMENT BYTE POINTER SUBROUTINE"
;
; This subroutine is now called only by the 10/11 interface handler.
; Call testing sign of P-S. [Time=2+2(BP OVFLO)]
; CALL WITH BP IN AR, P_P-S,SKP SCAD0.
;
=0
IBPS: STORE,RETURN4 ;SIMPLE CASE
FE_#,#/36.,GEN AR+1,TIME/2T ;[424] POINTER OVERFLOW, B12=0
P_FE-S,AR_AR+1,TIME/2T, ;[424] SINGLE WORD BP
STORE,RETURN4
.TOC "BYTE EFFECTIVE ADDRESS EVALUATOR - XADDR"
;
; This code is no longer used by the single byte instructions.
; The string instructions get the second part of a two word pointer
; from an AC, and they do not set FPD. Thus, they enter at BFETCH
; (for single word pointers) or BYTEI (long word pointers). The
; DTE interface can only use single word pointers, and thus no longer
; requires the two word pointer test. [424]
; In the interest of saving space, we are now using the same indirec-
; tion evaluation technique as the single byte instructions. [427]
;
BYTEA: MEM_AR,FE_S,SET FPD,EA MOD DISP ;[424]
=1100 ;[427]
BFETCH: GEN AR,BYTE READ,RETURN1
GEN AR+XR,INDEXED,BYTE READ,RETURN1
GEN AR,BYTE INDRCT,SKP INTRPT,J/BYTEI
GEN AR+XR,INDEXED,BYTE INDRCT,
SKP INTRPT
=00 ;[427]
BYTEI: ARX_MEM,LONG EN,CALL [BYTIND] ;[427] Unwind indirection chain
ARX_MEM,SR DISP,J/CLEAN ;[427] Interrupted. Clean up first
XR,EA MOD DISP,TIME/3T,J/BFETCH ;[427] Local at end. Untangle above
XR,EA MOD DISP,TIME/3T ;[427] Global at end. Indexed?
=1110 GEN ARX,GLOBAL,BYTE READ,RETURN1;No. Read global word
GEN ARX+XR,GLOBAL,BYTE READ, ;Yes. Add index and do likewise
RETURN1
.TOC "Load and Deposit Byte Subroutines"
;
; Load byte subroutine. Enter with S in FE, P+S in SC, and
; AR load in progress. SKP INTRPT at entry is optional.
; RETURN2 WITH BYTE RIGHT JUSTIFIED IN AR. [TIME=7]
;
=0
LDB1: AR_MEM,SC_#-SC,#/36.,SKP SCAD0, ;36-(P+S)
TIME/3T,J/LDB2
AR_MEM,SR DISP,J/CLEAN ;HERE IF INTERRUPT PENDING
=0
LDB2: ARX_SHIFT,AR_0S,SC_FE,J/SHIFT ;BYTE IN ARX HI, READY TO SHIFT
ARX_AR,AR_0S, ;P+S > 36, PUT BYTE IN ARX HI
SC_FE+SC,SKP SCAD0 ;ADJUST S AND SHIFT BYTE
;PUT BYTE INTO AR RIGHT-JUSTIFIED
; THIS INSTRUCTION ALSO CALLED ALONE AS A SUBROUTINE
=0
SHIFT: AR_SHIFT,RETURN2 ;RETURN WITH BYTE IN AR
RETURN2 ;BYTE WAS OFF THE END, RETURN AR=0
;
; Deposit byte subroutine. Enter with byte right justified in AR,
; pointer in BR, S in FE, 36-P in SC, and LOAD AR-ARX in progress.
; Skip if P > 36. Return3 with final store going. [TIME=11]
;
=0
DPB1: MQ_AR,AR_MEM,ARX_MEM,GEN FE-SC-1,;[303] Keep byte, get data word.
SKP SCAD0,TIME/3T,J/DPB2 ; Is P+S <= 36?
AR_MEM,RETURN3 ;[226]P>36, STORE NOTHING
;
=0
DPB2: FE_SC ;P+S>36, S_36-P
ARX_SHIFT,AR_MQ,SC_FE, ;ARX HAS P,X,S
FE_#-SC,#/72. ;SC_S, FE_72-(36-P)=36+P
SC_#-SC,#/36. ;SC_36-S (KNOWN .LE. P)
AR_SHIFT,ARX_SHIFT, ;S,P,X
SC_FE-SC ;SC_(36+P)-(36-S)=P+S
AR_SHIFT,STORE,RETURN3 ;[335][345] DONE, STORE IT BACK
;SUBROUTINE TO GET CONTENTS OF SC RIGHT ALIGNED IN AR
;[TIME=6]
GETSC: AR0-8_SC ;PUT SC INTO AR
ARX_AR,SC_#,#/9.,J/SHIFT ;HERE WITH DATA IN AR0-8