1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-21 14:47:36 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/kdpdpy/dzcom.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

2479 lines
77 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.TITLE KDZMC - KMC11 MICROCODE TO SUPPORT THE DZ11
.IDENT /V1.0/
;
; COPYRIGHT (C) 1978
; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON
; A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
; THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS
; SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED
; OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
; EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
; THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
; SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC
;
; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
; WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
; MITMENT BY DIGITAL EQUIPMENT CORPORATION.
;
; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY
; DEC.
;
; DISTRIBUTED SYSTEMS SOFTWARE ENGINEERING
;
MAXDEV=6.
; DZ-11 INTERFACE RELATED EQUATES
; CONTROL AND STATUS REGISTER
; LOW BYTE
DZCLR=BIT4 ;CLEAR
DZSCN=BIT5 ;MASTER SCAN ENABLE
DZRDN=BIT7 ;RECEIVE DONE
; HIGH BYTE
DZTXD=BIT7 ;TRANSMIT DONE
; RECEIVE BUFFER REGISTER
; HIGH BYTE
DZPE=BIT4 ;PARITY ERROR
DZFE=BIT5 ;FRAMING ERROR
DZOVR=BIT6 ;OVERRUN
DZDVL=BIT7 ;DATA VALID
; LINE PARAMETER REGISTER
; HIGH BYTE
DZREN=BIT4 ;RECEIVE ENABLE
SP.CRM=5 ;CURRENT RAM POINTER (SP.RM0 + RCV OR XMT OFFSET)
SP.XST=6 ;TRANSMIT STATUS
SP.COR=6 ;RELATIVE VALUE IN CORE TABLE
SP.CST=7 ;CHARACTER STATUS (RCV)
;NEXT LINE READY STATUS (XMT)
SP.SAV=7 ;HOLDING ACROSS SUBROUTINES REGISTER
SP.CHR=10 ;RECEIVE CHARACTER
SP.LN=11 ;CURRENT LINE NUMBER
SP.POL=12 ;DEVICE COUNTER FOR POLLING
SP.RM0=13 ;RAM ADDRESS 0-7 FOR CURRENT LINE TABLE
SP.RM1=14 ;RAM ADDRESS 8-9 FOR CURRENT LINE TABLE
SP.SB1=15 ;OUTER SUBROUTINE RETURN ADDRESS
SP.SUB=16 ;INNER SUBROUTINE RETURN ADDRESS
; CONTROL/BUFFER OUT CODES
C.BAOX=0 ;BA OUT FOR TRANSMIT
C.BAOR=4 ;BA OUT FOR RECEIVE
C.CLOX=1 ;CONTROL OUT FOR TRANSMIT
C.CLOR=5 ;CONTROL OUT FOR RECEIVE
; ERROR CODE DEFINITIONS
ER.CPE=2 ;CHARACTER PARITY ERROR
ER.FRE=4 ;FRAMING ERROR
ER.ABO=6 ;ABORT (CONTROL O TYPE FUNCTION)
ER.NBA=14 ;NO BUFFER AVAILABLE (RECEIVE)
ER.NXM=20 ;NON EXISTENT MEMORY
ER.OVR=24 ;RECEIVER OVERRUN
ER.KIL=26 ;KILL COMPLETE
ER.SRC=30 ;SPECIAL RECEIVE CHARACTER
.PAGE
.SBTTL TABLE OFFSET DEFINITIONS
BIT0=1
BIT1=2
BIT2=4
BIT3=10
BIT4=20
BIT5=40
BIT6=100
BIT7=200
; RAM TABLE OFFSET PER DZ11 LINE
L.STS=0 ;STATUS
L.SILO=0 ;RECEIVE CHARACTER SILO INDICATOR
LS.EPX=BIT7 ;ECHO PLEX
LS.FUL=BIT4 ;SILO FULL
LS.FDX=0 ;FULL DUPLEX
LS.SIL=BIT0!BIT1 ;RECEIVER SILO COUNT
L.RECO=L.STS+1 ;RECEIVE ECHO BUFFER
L.REC1=L.RECO ;FIRST ECHO CHARACTER
L.REC2=L.RECO+1 ;SECOND ECHO CHARACTER
L.REC3=L.RECO+2 ;THIRD ECHO CHARACTER
L.XBD=L.RECO ;CURRENT TRANSMIT BUFFER DESCRIPTOR (5 BYTES)
L.XBDC=L.XBD ;COUNT LOW BYTE
L.XBDA=L.XBD+2 ;ADDRESS LOW BYTE
L.XBDF=L.XBD+4 ;FLAG BITS BYTE
;FLAG BIT DEFINITIONS (L.XBDF)
LX.FST=BIT7 ;FLAG FOR FIRST CHARACTER UN-TRANSMITTED
LX.FNL=BIT5 ;FINAL DESCRIPTOR FLAG
LX.PIC=BIT4 ;TRANSFER PARAMETERS IN CORE FLAG
LX.EXM=BIT2!BIT3 ;EXTENDED MEMORY BITS
LX.XAL=BIT1 ;ALTERNATE BUFFER ASSIGNED
LX.XBF=BIT0 ;TRANSMIT BUFFER ASSIGNED
L.OXC=L.XBD+5 ;ODD TRANSMIT CHARACTER
L.RBD=L.OXC+1 ;CURRENT RECEIVE BUFFER DESCRIPTOR (5 BYTES)
L.RBDC=L.RBD ;COUNT LOW BYTE
L.RBDA=L.RBD+2 ;ADDRESS LOW BYTE
L.RBDF=L.RBD+4 ;FLAG BITS BYTE
;FLAG BIT DEFINITIONS (L.RBDF)
LR.BNR=BIT6 ;BINARY MODE IN PROGRESS (RECEIVE)
LR.FNL=BIT5 ;FINAL DESCRIPTOR FLAG
LR.EXM=BIT2!BIT3 ;EXTENDED MEMORY BITS
LR.RAL=BIT1 ;RECEIVE ALTERNATE ASSIGNED
LR.RBF=BIT0 ;RECEIVE BUFFER ASSIGNED
L.MODE=L.RBDF+1 ;MODE TABLE ADDRESS (3 BYTES)
L.CURM=L.MODE+2 ;CURRENT RECEIVE MODE
LM.RMD=BIT7!BIT6!BIT5 ;CURRENT RECV MODE
LM.EXM=BIT3!BIT2 ;EXTENDED MEMORY BITS
L.RUBO=L.CURM+1 ;CURRENT RUBOUT CHARACTER
L.LNG=20 ;LENGTH OF A LINE'S ENTRY
; CORE TABLE OFFSET PER LINE
C.RDP=0 ;CURRENT RECEIVE DESCRIPTOR POINTER
C.REX0=C.RDP+2 ;RECEIVE EXTENDED MEMORY BITS
C.ARLP=C.REX0+2 ;ALTERNATE RECEIVE LINK POINTER
C.REX1=C.ARLP+2 ;EXTENDED MEM BITS FOR ALTERNATE LINK POINTER
C.XDP=C.REX1+2 ;CURRENT TRANSMIT DESCRIPTOR POINTER
C.XEX0=C.XDP+2 ;TRANSMIT EXTENDED MEMORY BITS
C.AXLP=C.XEX0+2 ;ALTERNATE TRANSMIT LINK POINTER
C.XEX1=C.AXLP+2 ;TRANSMIT EXTENDED MEMORY BITS (CONTINUED)
C.BIP=C.XEX1+2 ;BUFFER IN PROGRESS VALUES (6 BYTES)
C.LNG=40 ;LENGTH IN BYTES
; RAM OFFSET PER COMM IOP
P.LTA=1775 ;MEMORY LINE TABLE ADDRESS FOR CURRENT LINE
P.MSTA=P.LTA-3 ;MEMORY STORAGE TABLE ADDRES (3 BYTES)
P.SLOT=P.MSTA-1 ;NPR SILO NEXT OUT POINTER
P.SLIN=P.SLOT-1 ;NPR SILO NEXT IN POINTER
P.PORT=P.SLIN-1 ;PORT STATUS BYTE
P.LNG=7 ;LENGTH OF AN ENTRY IN THE POLLING LIST
P.PLST=P.PORT-<P.LNG*MAXDEV> ;START OF POLLING LIST
P.RST=0 ;TIMER RESTART VALUE
P.TIME=P.RST+1 ;TIMER VALUES
P.CSR=P.TIME+1 ;CSR ADDRESS (2 BYTES)
P.TCR=P.CSR+2 ;TRANSMIT CONTROL REGISTER IMAGE
P.NRB=P.TCR+1 ;NO RECEIVE BUFFER INDICATOR
P.RCH=P.NRB+1 ;RECEIVED CHARACTER
SENTRY=6 ;SIZE OF A SILO ENTRY
NMSENT=34. ;NUMBER OF SILO ENTRIES
P.NPR=P.PLST-<SENTRY*NMSENT> ;NPR SILO
SILOED=P.PLST-SENTRY ;LAST ENTRY IN SILO
.PAGE
.PAGE
.SBTTL INIT - INITIALIZATION
;+
; **INIT-INITIALIZATION ROUTINE**
;
; INPUTS:
; BRG = 0 (MASTER CLEAR)
; MAR = 0 (MASTER CLEAR)
; OUTPUTS:
; RAM IS CLEARED EXCEPT FOR THE COUNTERS IN THE POLLING LIST
; WHICH ARE SET TO MINUS ONE TO INDICATE NO ACTIVE DEVICES.
; THE CSR'S ARE ALSO CLEARED
;-
$KDZMC::
INIT:
OUT BR,SELB!OINCON ;ZERO THE INPUT CONTROL CSR
OUT BR,SELB!OOCON ;ZERO THE OUTPUT CONTROL CSR
10$: MEMINC IMM,0 ;ZERO THE NEXT MEMORY LOCATION
SPBR IBUS,NPR,SP0 ;READ THE NPR CONTROL REGISTER
BRWRTE BR,<ADD!SP0> ;SHIFT IT LEFT
BR7 20$ ;OVERFLOWED MAR TO 10 BITS - ALL DONE
ALWAYS 10$ ;KEEP ZEROING RAM
20$: LDMAP IMM,P.PORT ;LOAD MAR HIGH WITH ADDRESS OF PORT STATUS BYTE
LDMA IMM,P.PORT ;LOAD MAR LOW
MEMADR RDOSET,INCMAR ;ADDRESS OF ROUTINE TO CHECK FOR OUTPUT COMPLETIONS
MEMINC IMM,P.NPR ;INITIALIZE COMPLETION SILO IN POINTER
MEM IMM,377 ;INITIALIZE COMPLETION SILO OUT POINTER (LOGICAL ZERO)
BRWRTE IMM,P.PLST+P.RST,LDMAR ;LOAD MAR LOW WITH ADDRESS OF COUNTER BYTE IN
;THE POLLING LIST - MAR ALREADY SET
SP BR,SELB,SP.RM0 ;SAVE ADDRESS IN RAM ADDRESS SCRTACH PAD
BRWRTE IMM,MAXDEV-1 ;MAXIMUM NUMBER OF DEVICES GENED FOR
SP BR,SELB,SP.POL ;SAVE IT IN POLLING SCRATCH PAD
30$: MEM IMM,377 ;INITIALIZE COUNTER TO MINUS ONE
BRWRTE IMM,P.LNG ;LENGTH OF POLLING LIST
SP BR,<ADD!LDMAR>,SP.RM0 ;POINT TO NEXT ENTRY IN THE POLLING LIST
SP BR,DECA,SP.POL ;ONE LESS COUNTER TO INITIALIZE
C 30$ ;BUT MORE TO GO IT CARRY SET
.SBTTL IDLE - IDLE LOOP
;+
; **IDLE-LOOP BETWEEN PORT AND DEVICE SERVICE
;
; INPUTS:
; P.PORT = ADDRESS OF NEXT PORT SERVICE ROUTINE
;
; OUTPUTS:
; IF THE PGMCLK BIT IN THE MISC REG HAS EXPIRED,
; THE DEVICES ARE POLLED AND SERVICED BY THE TIMER ROUTINE
; IN ANY CASE, THE NEXT PORT ROUTINE IS BRANCHED TO.
;
; MAR = P.PORT
; ALL PORT ROUTINES RETURN TO IDLE
;-
IDLE:
LDMAP IMM,P.PLST ;POINT TO POLLING LIST (MAR HI)
SPBR IBUS,UBBR,SP0 ;READ THE BUS REQUEST REGISTER AND
;STORE THE IMAGE IN SP0 AND THE BRG
BR4 TIMER ;BRANCH IF THE TIMER HAS EXPIRED
IDLE1: LDMA IMM,P.PORT ;LOAD MAR TO POINT TO PORT STATUS
;NOTE: MAR HI MUST BE PRESET.
.ALWAY MEMX,SELB,P0 ;TIMER HAS NOT EXPIRED YET, CHECK THE
;DATA PORT TO SEE IF ANY PROCESSING IS REQUIRED
;RAM CONTAINS THE ADDRESS OF THE APPROPRIATE
;SERVICE ROUTINE
; RQISET --> WAITING FOR RQI TO SET
; RDICLR --> WAITING FOR RDYI TO CLEAR
; RDOSET --> WAITING FOR A COMPLETION
; RDOCLR --> WAITING FOR RDYO TO CLEAR
.SBTTL DATA PORT PROCESSING ROUTINES
;+
; **RDOCLR-WAITING FOR READY OUT TO BE CLEARED BY THE PDP-11**
;
; INPUTS:
; MAR = PORT SERVICE ROUTINE (P.PORT)
; OUTPUTS:
; THIS ROUTINE WAITS FOR READY OUT TO BE CLEARED BY THE PDP-11
; THUS SIGNALING IT IS DONE. IT ALSO CHECKS IF OUTPUT INTERRUPTS
; ARE REQUESTED IN THE MEANTIME AND WILL GENERATE ONE IF THEY WERE
; NOT REQUESTED WHEN RDYO WAS SET.
;
; WHEN RDYO IS CLEARED, CONTROL IS PASSED TO RQISET TO CHECK
; FOR PENDING PORT REQUESTS
;
; NOTE: THESE EXISTS THE POSSIBILITY OF AN INTERRUPT BEING GENERATED
; IF IEO IS CLEARED AT ANY TIME AFTER IT IS TESTED BY THE MICROPROCESSOR
; (APPROX A 1.5US WINDOW)
;-
RDOCLR:
BRWRTE IBUS,OCON ;READ CONTROL CSR BSEL2
BR7 RDOST1 ;READY OUT STILL SET, CHECK INTERRUPTS
;
; ENTER HERE IF AN OUTPUT INTERRUPT HAS ALREADY BEEN GENERATED
;
RDOCL1:
BRWRTE IBUS,OCON ;READ OUTPUT CONTROL CSR
BR7 IDLE ;READY OUT STILL SET
BRWRTE IMM,0 ;CLEAR OUTPT CONTROL CSR
OUT BR,SELB,OOCON ;..
MEMADR RQISET ;LOOK FOR RQI NEXT
ALWAYS IDLE ;BACK TO IDLE LOOP
;+
; **RDOSET-MICROPROCESSOR COMPLETION POSTING**
;
; INPUTS:
; MAR = PORT SERVICE ROUTINE (P.PORT)
; OUTPUTS:
; CHECK THE COMPLETION SILO TO SEE IF ANY COMPLETIONS ARE PENDING.
; IF THERE ARE POST THE COMPLETION TO THE PDP-11
; SILO POINTERS (P.SLOT,P.SLIN) ARE UPDATED
; AND WAIT FOR RDYO TO CLEAR (RDOCLR)
; OTHERWISE CHECK TO SEE IF THE PDP-11 HAS ANY INPUT DATA (RQISET)
;-
RDOSET: MEMADR RQISET ;GO THROUGH RQISET NEXT TIME.
LDMA IMM,P.SLOT ;SET MAR TO NPR SILO NEXT OUT POINTER
LDMA MEMX,SELB ;POINT NPR TO NEXT OUT ENTRY
Z IDLE ;THE POINTER IS ZERO THEREFORE THE SILO IS EMPTY
; A COMPLETION OUTPUT IS PENDING IN THE NPR SILO. MAR POINTS TO THE
; NEXT ENTRY
OUT MEMI,SELB,OLINEN ;WRITE THE LINE NUMBER BYTE
OUT MEMI,SELB,OPORT1 ;WRITE PORT BYTE 1
OUT MEMI,SELB,OPORT2 ;AND PORT BYTE 2
OUT MEMI,SELB,OPORT3 ;WRITE PORT BYTE 3
OUT MEMI,SELB,OPORT4 ;AND PORT BYTE 4
OUT MEMI,SELB,OOCON ;WRITE THE NEW OUTPUT CNTRL CSR
; INCREMENT THE NEXT OUT POINTER
LDMA IMM,P.SLIN ;SET MAR TO POINT TO NPR SILO NEXT IN OFFSET
SP MEMI,SELB,SP1 ;SAVE THE NEXT IN POINTER IN SP1
SP MEMX,SELB,SP0 ;SAVE THE NEXT OUT POINTER IN SP0
MEM IMM,P.NPR ;ASSUME THE SILO IS GOING TO WRAP AROUND
BRWRTE IMM,SILOED ;OFFSET TO LAST SILO ENTRY
COMP BR,SP0 ;COMPARE CURRENT OUT POINTER WITH END OF SILO
Z 50$ ;IT DID WRAP AROUND - ALREADY SET UP
BRWRTE IMM,SENTRY ;GET THE SIZE OF A SILO ENTRY
MEM BR,ADD,SP0 ;INCREMENT NEXT OUT POINTER AND SAVE IT
; IF SILO IS NOW EMPTY "ZERO" THE NEXT OUT POINTER
50$: COMP MEMX,SP1 ;COMPARE OUT POINTER TO IN POINTER
Z 70$ ;THEY ARE THE SAME
ALWAYS 80$ ;THEY ARE DIFFERENT
70$: MEM IMM,377 ;THE SILO IS EMPTY - SET NEXT OUT POINTER
;TO A LOGICAL ZERO (-1)
80$: LDMA IMM,P.PORT ;SET MAR TO POINT TO PORT STATUS
RDOST1:
SPBR IBUS,INCON,SP0 ;READ INPUT CONTROL CSR
BR4 RDOST2 ;OUTPUT INTERRUPT REQUESTED
MEMADR RDOCLR ;STATE TO WAITING FOR READY OUT CLEARING
ALWAYS IDLE ;BACK TO IDLE LOOP
RDOST2: MEMADR RDOCL1 ;STATE TO WAITING FOR READY OUT CLEARING
BRWRTE IMM,300 ;MASK FOR BUS REQUEST AND XX4
RDOST3: OUT BR,SELB,OBR ;GENERATE AN INTERRUPT
ALWAYS IDLE ;BACK TO IDLE LOOP
;+
; **RQISET-REQUESTED IN SET, THE PDP-11 HAS REQUESTED THE DATA PORTS
;
; INPUTS:
; MAR = PORT SERVICE ROUTINE (P.PORT)
; OUTPUTS:
; CHECK TO SEE IF REQUEST IN HAS BEEN SET BY THE PDP-11. IF SO,
; SET READY IN AND LET THE PDP-11 SET UP A COMMAND IN THE DATA PORTS
; IF INPUTS INTERRUPTS ARE REQUESTED, GENERATE ONE
; TRANSFER CONTROL TO RDICLR TO WAIT UNTIL THE PDP-11 IS DONE
;-
RQISET: BRWRTE IBUS,INCON ;READ INPUT CONTROL CSR
BR7 10$ ;REQUEST IN SET
ALWAYS RDOSET ;SEE IF ANY COMPLETIONS TO POST
10$: SP IMM,20,SP0 ;MASK TO SET READY IN
OUT SELA,OOCON ;SET IN OUPUT CONTROL CSR
BR0 RQIST1 ;INTERRUPT ENABLE IS SET
MEMADR RDICLR ;STATE TO WAITING FOR RDI TO CLEAR
ALWAYS IDLE ;BACK TO IDLE LOOP
RQIST1: MEMADR RDICL1 ;STATE TO WAITING FOR RDYI TO CLEAR
BRWRTE IMM,200 ;MASK FOR BUS REQUEST AND XX0
ALWAYS RDOST3 ;GENERATE AN INTERRUPT
;+
; **RDICLR-WAIT FOR READY IN TO CLEAR (DATA PORTS HAVE BEEN SET UP)**
;
; INPUTS:
; MAR = PORT SERVICE ROUTINE (P.PORT)
; OUTPUTS:
; CHECK TO SEE IF THE PDP-11 HAS CLEARED READY IN SIGNIFYING
; THAT IT HAS SET UP THE DATA PORTS. IF SO THEN DISPATCH TO THE
; PROPER ROUTINE TO HANDLE THE REQUEST BASED ON
; BIT 0&1 OF THE CONTROL CSR BSEL2
;-
; RDYI CLEAR ROUTINE IS ENTERED HERE IS INTERRUPT ENABLE WAS NOT
; SET WHEN THE COMMIOP SET READY IN. IF IN THE MEANTIME INTERRUPT ENABLE
; WAS SET, IT WILL BE SEEN HERE AND AN INTERRUPT WILL BE GENERATED
.ENABL LSB
RDICLR:
BRWRTE IBUS,OCON ;READ OUTPUT CONTROL CSR
BR4 5$ ;READY IN STILL SET
ALWAYS 10$ ;PDP-11 CLEARED RDYI, DONT BOTHER
;CHECKING FOR IEI JUST PROCESS THE DATA
5$: BRWRTE IBUS,INCON ;READ INPUT CONTROL CSR
BR0 RQIST1 ;INTERRUPT REQUESTED
RDICL1:
BRWRTE IBUS,OCON ;READ OUTPUT CONTROL CSR
BR4 IDLE ;RDYI STILL SET
; READY IN CLEAR
10$: MEMADR RDOSET ;ADDRESS OF ROUTINE TO CHECK FOR COMPLETIONS
SPBR IBUS,LINENM,SP.LN ;SAVE THE LINE NUMBER IN SP.LN
SP BR,SELB,SP0 ;SAVE LINE NUMBER IN SP0 TOO
BRWRTE IMM,P.PLST-P.LNG ;GET ADDRESS OF POLLING LIST - ONE ENTRY
SP BR,SELB,SP17 ;SAVE IT IN SP17
15$: BRWRTE IMM,P.LNG ;LENGTH OF A POLLING LIST ENTRY
SP BR,ADD,SP17,LDMAR ;INCREMENT TO NEXT LIST ENTRY
BRWRTE IMM,10,INCMAR ;8 LINES PER DZ'S
SP BR,SUB,SP0,INCMAR ;SEE IF WE HAVE THE RIGHT POLLING LIST ENTRY
C 15$ ;NOT YET
OUTPUT MEMI,SELB,OBA1 ;SAVE THE CSR ADDRESS IN OUTADDRESS
OUTPUT MEMI,SELB,OBA2 ; ..
BRADDR 16$ ;RETURN HERE AFTER CALCULATING
ALWAYS TBLADR ;LINE TABLE ADDRESS
16$: BRWRTE IMM,14 ;SET EX.MEM. BITS IN OBR FOR BASEIN AND CONIN
OUT BR,SELB,OBR
BRWRTE IBUS,OCON ;GET ORIGINAL IMAGE OF OUTPUT CONTROL CSR
BR1 20$ ;BIT 1 SET
BR0 CONIN ;BIT 1=0 AND BIT 0=1 -> CONTROL IN REQUEST
ALWAYS BAIN ;BIT 0&1=0 -> BUFFER ADDRESS IN REQUEST
20$: BR0 BASEIN ;BIT 1=1 BIT 0=1 -> BASE IN REQUEST
.DSABL LSB
; ABOVE THREE ROUTINES RETURN HERE AFTER REQUEST HAS BEEN PROCESSED
RQICL2: BRWRTE IMM,0 ;CLEAR READY IN
OUT BR,SELB,OOCON ;..
SPBR IBUS,UBBR,SP0 ;READ MISC. REGISTER
BR0 NXMERR ;NON-EXISTENT MEMORY
ALWAYS IDLE ;BACK TO IDLE LOOP
.SBTTL TIMER - TIMER SERVICE
;+
; **TIMER-TIMER SERVICE ROUTINE**
;
; INPUTS:
; BRG & SP0 = IMAGE OF BUS REQUEST REGISTER
; MAR HI = POLLING LIST PAGE
;
; OUTPUTS:
; EACH DEVICES TIMER COUNTER IS DECREMENTED AND TESTED FOR
; AN EXPIRATION. IF THE COUNTER WENT TO ZERO THE DEVICE
; IS POLLED TO SEE IF IT HAS A TRANSMIT DONE OR A RECEIVE DONE
; AND IF SO IT IS SERIVICED. IF NONE OF THE DEVICES REQUIRES
; SERVICING THE MODEM TIMER IS DECREMENTED AND IF IT EXPIRED
; MODEM CHANGES ARE CHECKED.
; WHEN A DEVICE DONE SERVICE ROUTINE IS FINISHED THIS ROUTINE
; CONTINUES WITH THE NEXT DEVICE.
;-
.ENABL LSB
TIMER: BRWRTE IMM,121 ;MASK TO CLEAR ALL BUT TIMER, XX4 AND NXM
;N.B. THIS MASK IS GUARANTEED TO KEEP THE
;TIMER SET TO A ONE SINCE THE TIMER EXPIRES
;TO A ONE CONDITION
OUT BR,<AANDB!OBR> ;AND THE MASK WITH THE PREVIOUS CONTENTS OF
;THE BUS REQUEST REGISTER RESETING THE
;TIMER
BRWRTE IMM,-10 ;STORE DZ11 BEGINNING COMPARE VALUE.
SP BR,SELB,SP.POL ;SAVE THIS NUMBER IN SP.POL.
BRWRTE IMM,P.PLST-P.LNG ;SET UP POLLING ADDRESS REGISTER.
SP BR,SELB,SP17
ALWAYS 10$
; RECEIVE DONE AND TRANSMIT DONE ROUTINES RETURN HERE
; MAIN POLLING LOOP
TIMRTN: LDMAP IMM,P.PLST ;POINT TO POLLING LIST
BRWRTE IMM,P.NRB ;OFFSET TO RECEIVE CHARACTER INDICATOR
LDMA BR,ADD,SP17 ;POINT TO IT FOR THE CURRENT DZ
SPBR MEMX,SELB,SP.CST ;CHARACTER PRESENT?
BR7 65$ ;YES.
10$:
SPBR IBUS,UBBR,SP0 ;READ MISC. REGISTER
BR0 NXMERR ;NON-EXISTENT MEMORY ERROR
BRWRTE IMM,10 ;ONE LESS DEVICE TO POLL.
SP BR,ADD,SP.POL
BRWRTE IMM,MAXDEV*10 ;GET LAST DEVICE VALUE.
COMP BR,SP.POL ;ALL DEVICES CHECKED?
Z IDLE1 ;ALL DONE - BACK TO IDLE LOOP
BRWRTE IMM,P.LNG ;GET THE LENGTH OF AN ENTRY IN THE POLLING LIST
SP <BR!LDMAR>,ADD,SP17 ;POINT TO NEXT ENTRY AND LOAD THE MAR
BRWRTE MEMI,SELB ;SAVE THE RESTART VALUE IN THE BRG
;AND INCREMENT THE MAR
;IN CASE THE TIMER EXPIRED
Z 10$ ;THE DEVICE IS NOT ACTIVE
SP MEMX,SELB,SP0 ;READ THE COUNTER FOR THIS DEVICE
MEM BR,<DECA!SP0> ;DECREMENT THE COUNTER AND WRITE IT
;BACK TO MEMORY
C 10$ ;LOOK AT NEXT DEVICE'S COUNTER
; TIMER HAS EXPIRED - SEE IF THERE ARE ANY "DONES" PENDING
; INPUTS:
; BRG = RESET VALUE
30$: MEMINC BR,SELB ;RESET THE COUNTER TO THE INITIAL VALUE
OUTPUT MEMI,<SELB!IBA1> ;STORE THE LOW BYTE OF THE DEVICES
;CSR INTO THE LOW BYTE OF THE INPUT BUFFER
;ADDRESS REGISTER
OUTPUT MEMI,<SELB!IBA2> ;DO THE SAME WITH THE HIGH BYTE
BRWRTE <IMM!INCMAR>,15 ;MASK TO SET EXTENDED MEMORY BITS
;AND DO AN INPUT NPR
OUT BR,<SELB!ONPR> ;START THE NPR
40$: BRWRTE IBUS,NPR ;READ THE NPR REQUEST REGISTER
BR0 40$ ;WAIT FOR THE NPR TO COMPLETE
SP IBUS,INDAT2,SP.CST ;READ THE HIGH BYTE OF THE DEVICES CSR
BRWRTE IBUS,INDAT1 ;READ THE LOW BYTE OF THE DEVICES CSR
BR7 60$ ;RECEIVE DONE SET
45$: BRWRTE BR,<SELA!SP.CST> ;RETRIEVE HIGH BYTE OF CSR
BR7 50$ ;TRANSMIT DONE SET
ALWAYS TIMRTN ;NOTHING TO DO HERE - CHECK NEXT COUNTER
;
; TRANSMIT DONE FOUND SET
;
50$: BRADDR XMTDON ;WRITE ADDRESS OF TRANSMIT DONE SERVICE
;ROUTINE TO THE BRG
ALWAYS 70$ ;BRANCH TO COMMON DONE CODE TO FIND TABLE ADDRESSES
;
; RECEIVE DONE FOUND SET
;
60$: BRWRTE MEMX,SELB ;RECEIVE BUFFER UNASSIGNED?
BR4 45$ ;YES, DO NOT READ CHARACTER.
BR7 45$ ;IF ENTRY ALREADY PRESENT DON'T READ ANOTHER
SP IBUS,IIBA1,SP0 ;READ THE LAST INPUT DATA ADDRESS (LOW BYTE)
;WHICH IS THE CSR ADDRESS OF THE DEVICE
BRWRTE IMM,2 ;PREPARE TO ADD TWO TO THIS ADDRESS
OUTPUT BR,<ADD!IBA1> ;ADD TWO TO THIS ADDRESS GETTING THE ADDRESS
; OF CSR2 WHICH CONTAINS THE RECEIVE
;CHARACTER IN THE LOW BYTE AND THE LINE
;NUMBER IN THE HIGH BYTE
BRWRTE IMM,15 ;MASK TO SET EXTENDED MEMORY BITS
;AND TO START THE NPR
OUT BR,<SELB!ONPR> ;START THE NPR TO READ CSR2
80$: BRWRTE IBUS,NPR ;READ THE NPR STATUS REGISTER
;NOTE: THIS IS NECESSARY IN THE CASE THAT
;A RECEIVE DONE WAS FOUND AND CSR2 WAS
;REQUIRED. IN ANY CASE THE LINE NUMBER
;THAT GENERATED THE DONE IS IN
;BITS 0-2 OF THE HIGH BYTE OF THE INPUT DATA
BR0 80$ ;NPR TO READ CSR2 (IF NECESSARY) IS NOT
;DONE YET
MEMINC IBUS,INDAT2
MEM IBUS,INDAT1
ALWAYS 45$ ;GET ANY TRANSMIT COMPLETE PROCESSED.
65$: BRWRTE IMM,7 ;MASK TO CLEAR ALL BUT LINE NUMBER
MEMINC BR,AANDB,SP.CST ;CLEAR CHARACTER PRESENT FLAG
SP MEMX,SELB,SP.CHR ;GET RECEIVE CHARACTER.
BRADDR RCVDON ;WRITE ADDRESS OF RECEIVE DONE ROUTINE TO THE
;BRG
70$: SP BR,SELB,SP.SB1 ;SAVE DISPATCH ROUTINE ADDRESS IN SP.SB1
; CALCULATE THE COMM IOP LINE NUMBER FROM THE DEVICE NUMBER AND THE
; LINE NUMBER ON THE DEVICE
BRWRTE IMM,7 ;MASK TO ISOLATE THE LINE NUMBER
BRWRTE BR,<AANDB!SP.CST> ;ISOLATE THE LINE NUMBER
;AND SAVE THE STATUS.
BRWRTE BR,<ADD!SP.POL> ;ADD THE LINE NUMBER TO THE SHIFTED
SP BR,SELB,SP.LN ;DEVICE NUMBER RESULTING IN A "VIRTUAL" LINE NUMBER
; CALCULATE ADDRESS OF THE LINE'S MEMORY TABLE AND RAM TABLE
BRADDR DISPAT ;RETURN HERE AFTER CALCULATING
ALWAYS TBLADR ;LINE TABLE ADDRESS
DISPAT: .ALWAY BR,<SELA!SP.SB1>,P2 ;BRANCH TO RECEIVE OR TRANSMIT DONE ROUTINE
;THE FOLLOWING LOCATIONS HAVE BEEN SET UP
;FOR ENTRY TO THE "DONE" PROCESSOR:
; SP.RM1 -> BITS 8&9 OF RAM TABLE ADDRESS
; SP.RM0 -> BITS 0-7 OF RAM TABLE ADDRESS
; MAR --> RAM TABLE ADDRESS
; P.LTA+2 -> BITS 16&17 OF MEM STORAGE TABLE ENTRY
; P.LTA+1 -> BITS 8-15 OF MEM STORAGE TABLE ENTRY
; P.LTA -> BITS 0-7 OF MEM STORAGE TABLE ENTRY
; SP.LN --> LINE NUMBER
;IF RECV DONE, SP.CHR AND SP.CSR CONTAIN THE
;CHARACTER AND ANY ERROR BITS
.DSABL LSB
.SBTTL TBLADR - ROUTINE TO CALCULATE CORE AND RAM TABLE ADDRESS FOR A LINE
;+
; **TBLADR-CORE AND RAM LINE TABLE ENTRY ADDRESS**
;
; INPUTS:
; SP.LN = LINE NUMBER
; MAR HI = PAGE WHERE P.MSTA IS LOCATED
; OUTPUTS:
; P.LTA = LINE'S CORE TABLE ADDRESS
; SP.RM0 & SP.RM1 = LINE'S RAM TABLE ADDRESS (LOW, HIGH)
; MAR = LINE'S RAM TABLE ADDRESS
;
; NOTE:
; THIS ROUTINE IS HIGHLY CONFIGURATION DEPENDENT. IT ASSUMES THE NUMBER
; OF BYTES IN THE LINE TABLE IS 18 DECIMAL AND THE NUMBER OF BYTES
; IN THE CORE TABLE ENTRY IS 32 DECIMAL.
.IIF NE 40-C.LNG .ERROR TBLADR ROUTINE MUST BE RE-WRITTEN
.IIF NE 20-L.LNG .ERROR TBLADR ROUTINE MUST BE RE-WRITTEN
;
; USES SCRATCH PADS 0, 1, 2, AND 3
;-
TBLADR: SP BR,SELB,SP.SUB ;SAVE RETURN POINT.
BRWRTE IMM,0 ;STORE HIGH ORDER OF RAM ADDRESS.
SP BR,SELB,SP.RM1
BRWRTE BR,SELA!SP.LN ;GET THE LINE NUMBER
SP BR,SELB,SP.RM0 ;STORE IT IN A SCRATCH REGISTER
SP BR,TWOA,SP.RM0 ;LINE NUMBER X 2.
SP BR,TWOA,SP.RM0 ;LINE NUMBER X 4.
SP BR,TWOA,SP.RM0 ;LINE NUMBER X 10.
SP BR,APLUSC,SP.RM1 ;SAVE FIRST CARRY.
SPBR BR,TWOA,SP.RM0 ;LINE NUMBER X 20.
SP BR,SELB,SP1 ;SAVE LINE NUMBER X 20.
SPBR BR,TWOAC,SP.RM1 ;SAVE SECOND CARRY.
SP BR,SELB,SP0 ;SAVE HIGH BYTE OF LINE NUMBER X 20.
SP BR,TWOA,SP1 ;LINE NUMBER X 40
SP BR,TWOAC,SP0 ;SAVE THIRD CARRY.
; SCRATCH PAD SUMMARY:
; SP.RM0 AND SP.RM1 CONTAIN THE LINE # * 20 (16.)
; SP1 AND SP0 CONTAIN THE LINE # * 40 (32.)
;
; SP1 AND 2 CONTAIN THE OFFSET FOR THIS LINE'S CORE TABLE.
; SP.RM0 AND RM1 ALMOST CONTAIN THE OFFSET FOR THIS LINE'S RAM TABLE.
; AN ADJUSTMENT MUST BE MADE TO INSURE NO LINE'S TABLE CROSSES AN PAGE
; BOUNDARY.
10$: LDMA IMM,P.MSTA ;GET STARTING ADDRESS OF MEM STORAGE TABLE
SP MEMI,ADD,SP1 ;ADD LINE TABLE OFFSET TO START ADDRESS
SP MEMI,ADDC,SP0 ;ADD ON HIGH BYTE
SP MEMX,SELB,SP2 ;RETRIEVE EXTENDED MEMORY BITS
C 70$ ;CARRY CAUSED BY ADD TO HIGH BYTE
20$: LDMA IMM,P.LTA ;POINT MAR TO SLOT FOR LINE TABLE ADDRESS
MEMINC BR,SELA!SP1 ;LOAD MEM WITH LOW BYTE OF OFFSET
MEMINC BR,SELA!SP0 ;LOAD HIGH BYTE
BRWRTE IMM,14 ;MASK TO TAKE CARE OF EXTENDED MEM BITS OVERFLOW
MEM BR,<AANDB!SP2> ;LOAD EXTENDED MEMORY BITS
LDMAP BR,<SELA!SP.RM1> ;LOAD PAGE ADDRESS OF THIS LINE'S RAM TABLE
LDMA BR,<SELA!SP.RM0> ;POINT TO LINE'S RAM TABLE ENTRY
RTNSUB SP.SUB,P0 ;OTHERWISE WE ARE ALL DONE
70$: BRWRTE IMM,4 ;ADD ONE TO EXTENDED MEM BITS
SP BR,ADD,SP2 ;..
ALWAYS 20$ ;RETURN
.SBTTL PAGE ZERO OFF-PAGE RETURNS
; * * * * * *
; * * * * * *
.SBTTL STFSLO-STUFF NPR SILO SUBROUTINE
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; S T U F F N P R S I L O ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; INPUTS:
; THE THREE SILO WORDS MUST ALREADY BE IN RAM STARTING AT LOCATION
; POINTED TO BY P.SLIN.
; SP.SUB=RETURN ADDRESS IN PAGE THREE
; OUTPUTS:
; SILO POINTERS ARE UPDATED. IF THERE WAS A SILO OVERFLOW, BIT 15 OF
; THE FIRST WORD IS SET TO 1.
STFSLO: SP BR,SELB,SP.SUB ;STORE RETURN POINT.
; CHECK IF SILO IS EMPTY OR FULL
LDMA IMM,<P.SLIN> ;GET NEXT IN
SP MEMI,SELB,SP0 ;INTO SP0
BRWRTE MEMX,SELB ;AND NEXT OUT INTO BRG.
Z 30$ ;SILO IS EMPTY
COMP BR,SP0 ;NEXTIN=NEXT OUT?
Z 40$ ;YES,SILO IS FULL
; SILO IS NOT FULL
; INCREMENT NEXT IN BY ONE ENTRY LENGTH
10$:
LDMA IMM,<P.SLIN&377> ;MAR=ADDRESS OF NEXT IN POINTER
BRWRTE IMM,SILOED ;OFFSET OF LAST ENTRY
COMP BR,SP0 ;NEXT IN=LAST ENTRY IN SILO?
Z 20$ ;YES,WRAP NEXT IN
BRWRTE IMM,SENTRY ;BR=ONE ENTRY SIZE
MEM BR,<ADD!SP0> ;INCREMENT P.SLIN BY ONE ENTRY SIZE
RTNSUB SP.SUB,P3 ;RETURN
; WRAP NEXT IN
20$: MEM IMM,P.NPR ;SET NEXT IN=P.NPR
RTNSUB SP.SUB,P3
; SILO IS EMPTY,SET NEXT OUT=NEXT IN
30$: MEM BR,<SELA!SP0> ;STORE NEXT IN P.SLOT
ALWAYS 10$ ;STORE ONE ENTRY
; SILO IS FULL, SET ERROR BIT IN CURRENT NEXT IN RAM LOCATION
40$: LDMA SELA,SP0 ;ADDRESS FIRST BYTE OF SILO ENTRY
MEM IMM,200 ;LOAD ERROR BIT INTO IT
RTNSUB SP.SUB,P3 ;RETURN
.SBTTL BASEIN-BASE IN SERVICE ROUTINE
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; B A S E I N ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; INPUTS:
; CSR3 = LINE NUMBER
; CSR4,CSR5,CSR7 7:6 = MEMORY STORAGE TABLE ADDR. IF LINE#=0
; CSR6 7:3,CSR7 4:0 = CSR# OF DZ-11 FOR THE CURRENT LINE
; OUTPUTS:
; THE DZ-11 CORRESPONDING TO THE CURRENT LINE NUMBER IS CLEARED
; AND ITS MASTER SCANNER STARTED. CSR NUMBER OF THR DZ-11 IS
; STORED IN RAM.
; IF THE LINE NUMBER SUPPLIED IS ZERO, ADDRESS OF MEMORY STORAGE
; TABLE IS STORED IN RAM. THE DELAY TABLE IS BUILT WITHIN THE
; MEMORY STORAGE AREA SUPPLIED.
; PERFORMANCE:
; WORST CASE EXECUTION TIME = (TO BE DETERMINED)
BASEIN:
;ADDRESS RAM LOCATION OF DZ-11 CSR
LDMAP IMM,P.PLST
LDMA BR,<SELA!SP17>
; SAVE CURRENT DZ-11 CSR# IN RAM, OUT BA AND IN BA
SP IBUS,PORT3,SP1,INCMAR ;LOAD CSR#7:0 INTO SP1
BRWRTE IMM,370,INCMAR ; MASK TO STRIP 3 LSB'S OF CSR#
MEM BR,AANDB,SP1 ; STRIP LSB'S & STORE IN RAM
OUTPUT MEMX,SELB,IBA1 ; STORE IN INBA7:0
OUTPUT MEMI,SELB,OBA1 ;STORE IN OUTBA 7:0 & INC. MAR
SP IBUS,PORT4,SP0 ;LOAD CSR#15:8 INTO SP0
BRWRTE IMM,340 ;MASK TO SET 3 MSB'S TO 1'S
MEM BR,<AORB!SP0> ;SAVE IT IN RAM WITH HIGH ORDER BITS
OUTPUT MEMX,<SELB!IBA2> ;STORE IT IN INBA 15:8
OUTPUT MEMX,<SELB!OBA2> ;STORE IT IN OUTBA 15:8
; INBA 15:0 AND OUTBA 15:0 ARE NOW SET TO DZ-11 CSR#
; EXTENDED ADDRESS BITS SET IN RQICLR
; CLEAR DZ-11 AND START ITS MASTER SCANNER
; FOLLOWING PORTION OF THE CODE IS NOT OPTIMIZED FOR PERFORMANCE IN
; ORDER TO SAVE CRAM RESOURCES. EVENTHOUGH IT TAKES 15 MICRO SECS
; FOR THE DZ-11 TO CLEAR ITSELF, THE WAIT LOOP HERE IS NOT EXPECTED TO
; ADVERSELY AFFECT THE PERFORMANCE SINCE THERE WILL BE A MAXIMUM
; OF ONLY SIX(ONE FOR EACH DZ-11) BASE IN'S PER COMIOP.
BRWRTE IMM,DZCLR ;OUTDATA=CLEAR DZ BIT
OUTPUT BR,<SELB!OUTDA1>
; START DATOB NPR
BRWRTE IMM,DATOB ;BYTE OUT NPR
OUT BR,<SELB!ONPR> ;START NPR
; WAIT FOR NPR TO COMPLETE
10$: BRWRTE IBUS,NPR ;NPR REG--->BR
BR0 10$ ;WAIT TILL NPR IS COMPLETE
; NOW WAIT FOR CLEAR TO COMPLETE
15$: BRWRTE IBUS,UBBR
BR4 20$
ALWAYS 15$
; NOW POLL DZ-11 TO SEE IF CLEAR IS FINISHED(IT TAKES ABOUT 15 USECS)
20$:
BR0 RQICL2 ;IF NXM SET SKIP THE REST AND GO BACK TO
;PROCESS THE ERROR
BRWRTE IMM,DZSCN ;DZ-11 MASTER SCAN BITS
OUTPUT BR,<SELB!OUTDA1>;INTO OUTDATA
BRWRTE IMM,<DATI!14> ;START WORD IN NPR WITH EXT INBA SET TO 1'S
OUT BR,<SELB!ONPR>
; WAIT FOR NPR TO COMPLETE
25$: BRWRTE IBUS,NPR ;WAIT FOR NPR COMPLETTION
BR0 25$
BRWRTE IBUS,INDAT1 ; LOAD INDATA LB IN BR
BR4 15$ ;CLEAR IN PROGRESS,WAIT
BRWRTE IMM,DATOB ;SET MASTER SCANNER
; START DATOB NPR
OUT BR,<SELB!ONPR> ;START BYTE OUT NPR
;WAIT FOR NPR TO SET MASTER SCAN TO COMPLETE
30$: BRWRTE IBUS,NPR
BR0 30$
;CHECK TO SEE IF BASE IN CONTAINS MEMORY STORAGE TABLE ADDRESS
BRWRTE BR,DECA,SP1 ;DECREMENT IMAGE OF PORT3 SAVED FROM ABOVE
BR0 BASEXT ;IF BIT 0 WAS CLEAR THEN THE DEC WILL SET IT
;OTHERWISE IT WAS SET
; SAVE MST ADDRESS IN RAM
LDMA IMM,<P.MSTA&377> ;SET MAR TO MST STORAGE AREA
BRADDR BASEXT ;SHIFT EX.MEM. BITS, THEN EXIT.
XMSHFT: SP BR,SELB,SP.SUB
MEMINC IBUS,PORT1 ;STORE LOW BYTE OF MST ADDRESS
MEMINC IBUS,PORT2 ;STORE HIGH BYTE OF MST ADDRESS
; STORE EXTENDED ADDRESS
BRWRTE IBUS,PORT4 ;GET EXTENDED ADDRESS BITS.
SP IMM,300,SP0 ;MASK TO ISOLATE EXT ADDR BITS
BRWRTE BR,<AANDB!SP0> ;STRIP UNWANTED BITS
BRSHFT ;SHIFT IT FOUR TIMES SO THAT THE
BRSHFT ;EXT BITS ARE ALIGNED WITH EXT
BRSHFT ;BITS IN NPR & BUS REQ.
BRSHFT ;REGISTERS
MEM BR,<SELB> ;SAVE IT IN RAM
RTNSUB SP.SUB,P1
.ENABL LSB
.SBTTL INCIN/INCINH - EIGHTEEN BIT ADD TO INPUT ADDRESS
;+
; **INCIN/INCINH-ROUTINE TO DO 18 BIT TO THE INPUT ADDRESS**
;
; CALLING SEQUENCE:
; CALLSB SP.SUB,INCIN,ADDEND ;ADD "ADDEND" TO IN BA AND DO
; ;AN NPR WITH BUS HOLD CLEAR
; CALLSB SP.SUB,INCINH,ADDEND ;ADD "ADDEND TO IN BA AND DO
; ;AN NPR WITH BUS HOLD SET
;
; INPUTS:
; INPUT BUFFER ADDRESS MUST BE SET UP IN THE I/O BUS INCLUDING
; THE EXTENDED MEMORY BITS IN THE NPR CONTROL REGISTER
;
; BRG = ADDEND
;
; OUTPUTS:
; THE INPUT ADDRESS IS INCREMENTED BY THE BRG CONTENTS, THE NPR IS STARTED
; AND THE ROUTINE WAITS FOR IT TO COMPLETE.
;-
INCIN2: SP BR,SELB,SP.SUB ;STORE RETURN POINT.
BRWRTE IMM,2 ;READ IN NEXT WORD FROM CORE.
INCIN: SP IBUS,IIBA1,SP0 ;GET THE CURRENT LOW BYTE OF THE INPUT ADDRESS
OUTPUT BR,<ADD!IBA1> ;NEW LOW BYTE OF INPUT ADDRESS
SP IBUS,IIBA2,SP0 ;GET THE HIGH BYTE OF THE INPUT ADDRESS
OUTPUT BR,<APLUSC!IBA2> ;ADD ANY CARRY FROM PREVIOUS ADD TO HIGH BYTE
SP IBUS,NPR,SP0 ;GET PREVIOUS NPR REGISTER CONTENTS
C 50$ ;A PLUS C CAUSED A CARRY TO EXTENDED MEMORY BITS
30$: BRWRTE IMM,14 ;MASK TO CLEAR EXT. MEM. BIT OVERFLOW
SP BR,AANDB,SP0 ;MASK OFF UNWANTED BITS
OUT BR,<INCA!ONPR> ;WRITE THE NPR REGISTER AND START THE NPR
40$: BRWRTE IBUS,NPR ;READ THE NPR CONTROL REGISTER
BR0 40$ ;WAIT FOR THE NPR TO FINISH
RTNSUB SP.SUB,P3 ;RETURN TO CALLER
50$: BRWRTE IMM,4 ;VALUE TO ADD TO INCREMENT EXTENDED MEMORY
SP BR,ADD,SP0 ;ADD ANY CARRY FROM HIGH BYTE ADD AND SET NPR REQUEST
ALWAYS 30$ ;BRANCH TO COMMON CODE
.DSABL LSB
.SBTTL INCOUT/INCOUH/INCOB/INCOBH-OUT NPR TO CURRENT ADDRESS+OFFSET
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; INCREMENT OUTBA AND OUTPUT SUBROUTINE ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **
; INPUTS:
; BR =INCREMENT
; SP.SUB =RETURN ADDRESS
; FOUR ENTRY POINTS INCOUT,INCOUH,INCOB,INCOBH
; OUTPUTS:
; THE DEVICE ADDRESS (OUT BA 17:0) FOR AN OUT NPR OPERATION
; IS INCREMENTED BY A FACTOR EQUAL TO THE CONTENTS OF BR.
; THEN A BYTE OR WORD TRANSFER WITH OR WITHOUT BUSHOLD IS PERFORMED DEPENDING
; ON THE ENTRY POINT.
; RETURNED TO THE ADDRESS IN CURRENT PAGE SPECIFIED BY SP.SUB
;
; REGISTERS USED:
; BR,UBBR,SP0,SP1,SP.SUB
;
; REGISTERS DESTROYED (OR CHANGED)
; BR,UBBR,SP0,SP1
;
; ENTRY POINT TO DO BYTE NPR (ALWAYS ADDS TWO)
INCOB: SP BR,SELB,SP.SUB ;STORE RETURN POINT.
BRWRTE IMM,2 ;WRITE OUT LAST BYTE TO CORE.
SP IMM,DATOB,SP1 ;MASK FOR BYTE TRANSFER
ALWAYS INCOT1 ;COMMON CODE
; ENTRIES TO DO WORD TRANSFER
INCOU2: SP BR,SELB,SP.SUB ;STORE RETURN POINT.
BRWRTE IMM,2 ;WRITE OUT NEXT WORD TO CORE.
ALWAYS INCOT0
INCOUT:
BRWRTE IBUS,UBBR ;SAVE XX4 AND NXM.
SP IMM,101,SP1
BRWRTE BR,<AANDB!SP1>
OUT BR,<OBR!AORB!SP0> ;STORE EX.MEM. BITS IN OBR.
BRWRTE BR,<SELA!SP.COR> ;GET CORE OFFSET VALUE.
INCOT0: SP IMM,DATO,SP1 ;MASK TO DO WORD TRANSFER.
INCOT1: ;INCREMENT VALUE IS IN BR.
; INCREMENT OUTBA 7:0
SP IBUS,IOBA1,SP0 ;READ OUTBA7:0 INTO SP0
OUTPUT BR,<ADD!OBA1> ;ADD INCREMENT AND RESTORE (SP0 SELECTED)
; INCREMENT OUTBA 15:0
10$: SP IBUS,IOBA2,SP0 ;READ OUTBA15:8 INTO SP0
OUTPUT BR,<APLUSC!OBA2> ;ADD CARRY TO OUTBA15:8(SP0 SELECTED)
C 30$ ;CARRY,INCREMENT EXTENDED ADDRESS
;NOW DO THE NPR
40$:
SP IBUS,NPR,SP0 ;GET NPR REGISTER INTO SP0
BRWRTE IMM,155 ;STRIP NPR CONTROL BITS
BRWRTE BR,<AANDB!SP0> ;SAVE RESULTS IN BR
BRWRTE BR,<AORB!SP1> ;OR IN THE NEW NPR CONTROL BITS
OUT BR,<SELB!ONPR> ;LOAD THE NEW BYTE INTO NPR REGISTER
50$: BRWRTE IBUS,NPR ;WAIT FOR NPR TO COMPLETE
BR0 50$
RTNSUB SP.SUB,P3
;
; INCREMENT OUTBA 17:16
;
30$: SP IBUS,UBBR,SP0 ;LOAD UBBR INTO SP0
BRWRTE IMM,4 ;ADD ONE TO EXT. ADDRESS
SP BR,ADD,SP0
BRWRTE IMM,115 ;MASK TO SET CLOCK BIT=0
OUT BR,<AANDB!OBR> ;STORE UPDATED VALUE INTO UBBR
ALWAYS 40$ ;NPR AND RETURN
.SBTTL CONIN-CONTROL IN SERVICE ROUTINE
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; C O N T R O L I N ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; STORE MODE TABLE ADDRESS IN RAM
CONIN:
; P.LTA NOW CONTAINS THE CORE ADDRESS OF CURRENT LINE TABLE
; SP.RM0,SP.RM1 CONTAIN THE RAM ADDRESS OF CURRENT LINE TABLE
BRWRTE IMM,L.MODE ;SET MAR TO RAM ADDRESS OF LINE TABLE
LDMA BR,<ADD!SP.RM0>
BRADDR 5$ ;MOVE EX.MEM. BITS TO 2&3.
ALWAYS XMSHFT
;DZ11'S CSR WAS STORED IN OUTBA IN RQICLR.
; OUTBA IS NOW POINTING TO CURRENT DZ-11 CSR, NOW ISOLATE LINE SPEED
5$: SPBR IBUS,PORT4,SP0 ;LINE SPEED INTO SP0
BR4 10$ ;SET A SPEED.
ALWAYS 20$
10$: BRWRTE IMM,37 ;STRIP EXTRANEOUS BITS.
SP BR,AANDB,SP0
BRWRTE BR,AXORB!SP0 ;COMPLEMENT RESULTS.
BRSHFT ;HALF TIMER SPEED.
LDMAP IMM,P.PLST ;SET UP POLLING TABLE
LDMA BR,<SELA!SP17>
SP BR,SELB,SP1 ;SAVE CALCULATED POLLING RATE
NODST MEMX,SUB,SP1 ;SUBTRACT CURRENT RATE FROM CALCULATED
C 20$ ;CURRENT IS GREATER, LEAVE ALONE
MEM SELA,SP1 ;OTHERWISE USER FASTER RATE
20$: OUTPUT BR,<SELA!OUTDA2> ;WRITE OUT SPEED.
; PROCESS STOP CODE , PARITY ENABLE, PARITY SELECT AND LINE#
BRWRTE IMM,7 ;STRIP UNWANTED BITS
BRWRTE BR,<AANDB!SP.LN>
SP IBUS,PORT3,SP0 ;GET LINE FLAGS
OUTPUT BR,<AORB!OUTDA1> ;STORE FLAGS ,LINE # ETC IN OUTDATA LB
; WRITE IT INTO DZ-11 CSR+2 (IE ITS LINE PARAMETER REGISTER)
BRADDR RQICL3
ALWAYS INCOU2
.SBTTL BAIN-BUFFER ADDRESS IN SERVICE ROUTINE
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; B U F F E R A D D R E S S I N S E R V I C E R O U T I N E ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
BAIN:
; SP.RM0,SP.RM1 NOW CONTAINS RAM TABLE ADDRESS OF CURRENT LINE
; THE BRG CONTAINS THE IMAGE OF OCON
; CHECK IF IT IS A READ OR WRITE
BRSHFT ;SHIFT THE I/O BIT INTO POSITION 1
BR1 BAREAD ;BUFFER ADDRESS IN FOR READ
; BUFFER ADDRESS IN FOR A WRITE (TRANSMIT)
BAWRIT: BRWRTE IMM,C.CLOX ;STORE TERMINATION TYPE:
SP BR,SELB,SP.SAV ;XMT/CNTL OUT
BRWRTE IMM,C.XDP ;STORE POINTER TO CORE TRANSMIT AREA.
SP BR,SELB,SP.COR
BRWRTE IMM,L.XBD ;STORE FULL POINTER TO TRANSMIT
RANDX: BRWRTE BR,ADD,SP.RM0 ;AREA OF RAM IN CURRENT
SP BR,SELB,SP.CRM ;RAM REGISTER.
BRWRTE IMM,L.XBDF-L.XBD ;STORE POINTER TO RAM FLAGS.
LDMA BR,ADD,SP.CRM ;POINT TO BUFFER FLAGS WORD.
; CHECK FOR A KILL COMMAND
BRWRTE IBUS,PORT4
BR4 KILLAL ;KILL ALL
; STORE BUFFER DESCRIPTOR LIST ADDRESS 15:0 IN OUTDATA
BAIN0: OUTPUT IBUS,PORT1,OUTDA1
OUTPUT IBUS,PORT2,OUTDA2
BRWRTE IMM,L.XBDF-L.XBDC ;POINT TO FLAGS INDICATOR.
LDMA BR,ADD,SP.CRM
SPBR MEMX,SELB,SP2 ;GET FLAGS.
BR1 RQICL2 ;BOTH BUFFERS IN USE.
BR0 BASEC ;PRIMARY BUFFER IN USE.
BRWRTE IMM,LX.XBF+LX.PIC ;GET PRIMARY BUFFER ASSIGNED INDICATOR.
;SET PARAMETERS IN CORE ONLY FLAG.
BACONT: MEM BR,AORB,SP2 ;STORE NEW BUFFER ASSIGNED INDICATOR.
;ASSIGN NEW BUFFER LIST
BRADDR BAIN2 ;STORE OFF-PAGE RETURN POINT.
SP BR,SELB,SP.SUB
BRADDR INCOUT ;STORE ENTRY ADDRESS.
SP BR,SELB,SP1
ALWAYS ADDLTO
BAIN1:
; STORE EXTENDED ADDRESS OF LIST INTO CORE
SP IBUS,PORT4,SP4 ;GET EXT ADD
BRWRTE IMM,300 ;ISOLATE EXT ADDRESS
SPBR BR,AANDB,SP4
OUTPUT BR,SELB,OUTDA1 ;STORE IT IN OUTDA1
BRADDR BAIN4 ;SHIP IT OUT.
ALWAYS INCOB
BAIN3: BRWRTE SELA,SP2 ;IS PRIMARY BUFFER BEING ASSIGNED?
BR0 RQICL2 ;NO, SECONDARY.
BRWRTE IBUS,OCON ;GET OUTPUT CONTROL BYTE
BRSHFT
BR1 BAIN5 ;READ OPERATION,IDLE
LDMA SELA,SP.RM0
BRWRTE MEMX,SELB ;ECHOING IN PROGRESS?
BR4 RQICL2 ;YES.
; START TRANSMITTER IF BAIN WAS FOR TRANSMISSION
BRADDR BAIN6 ;NO. START TRANSMITTER AND
ALWAYS K ;COMPLETE TRANSMIT SET-UP.
BAIN5: SP IBUS,PORT1,SP3 ;STORE ADDRESS OF DESCRIPTOR
SP IBUS,PORT2,SP2 ;INTO SCRATCH PAD REGISTERS
CALLSR SP.SB1,STNWD3,RQICL8 ;CALL DESCRIPTOR SET-UP ROUTINE.
BASEC: BRWRTE IMM,<C.AXLP-C.XDP> ;POINT TO ALTERNATE BUFFER AREA.
SP BR,ADD,SP.COR
BRWRTE IMM,LX.XAL ;SET ALTERNATE BUFFER ASSIGNED INDICATOR.
ALWAYS BACONT
; BUFFER ADDRESS IN FOR A READ (RECEIVE)
BAREAD:
LDMAP IMM,P.PLST ;LOAD MAR HI TO POLLING LIST PAGE
BRWRTE IMM,P.NRB ;OFFSET TO RECEIVE CHARACTER INDICATOR
LDMA BR,ADD,SP17 ;POINT TO IT FOR CURRENT DEVICE
BRWRTE IMM,7 ;MASK TO ISOLATE CHANNEL NUMBER
BRWRTE BR,AANDB,SP.LN ;GET IT
SP IMM,20,SP0 ;GET MASK FOR "NO RECV BUFFER" FLAG
SP MEMX,AXORB,SP0 ;IF THE FLAG WAS SET IT WILL BE CLEARED
;SO THAT COMPARE BELOW WILL CHECK IF THE
;LINE NUMBERS MATCH.
;IF THE FLAG WAS CLEAR IT WILL BE SET
;SO THAT THE COMPARE WILL FAIL REGARDLESS
;OF THE LINE NUMBER - THIS INDICATES THAT
;NO LINES ON THIS DEVICE ARE WAITING FOR
;A RECEIVE BUFFER
COMP BR,SP0 ;IS THIS LINE WAITING FOR A RECEIVE BUFFER?
Z 10$ ;YES
5$: LDMAP SELA,SP.RM1 ;POINT TO PAGE WITH CURRENT LINE TABLE
BRWRTE IMM,L.RUBO ;POINT TO RUBOUT CHARACTER
LDMA BR,ADD,SP.RM0 ;..
MEM IBUS,PORT3 ;SAVE USER SUPPLIED RUBOUT CHARACTER
BRWRTE IMM,C.CLOR ;STORE TERMINATION TYPE IN CASE OF A KILL
SP BR,SELB,SP.SAV ;RCV/CNTL OUT
BRWRTE IMM,C.RDP ;STORE POINTER TO CORE AREA.
SP BR,SELB,SP.COR
BRWRTE IMM,L.RBD ;STORE FULL POINTER TO RECEIVE
ALWAYS RANDX
; PREPARE TO PROCESS THE PREVIOUSLY RECEIVED CHARACTER SINCE THERE IS NOW
; ONE BEING ASSIGNED
10$:
MEM IMM,0 ;ASSUME THIS IS A KILL
BRWRTE IBUS,PORT4 ;IS IT REALLY?
BR4 5$ ;YES, ALL DONE - FINISH PROCESSING THE BUFFER ASSIGN
BRWRTE IMM,200 ;MASK TO SET CHARACTER PRESENT FLAG SO
;POLLING LOOP WILL PROCESS IT
MEM BR,AORB,SP0 ;SET IT
ALWAYS 5$ ;BACK TO PROCESS BUFFER ASSIGN
.PAGE
.SBTTL KILLAL-KILLCR-KILL I/O SERVICE ROUTINE
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ;
; K I L L I / O ;
; ;
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;ENTRY TO KILL ALL READ OR WRITE IO
KILLAL: SP IMM,LX.FNL,SP0 ;SET "FINAL THREAD" FLAG.
MEM MEMX,<AORB!SP0>
BRWRTE IMM,LX.FNL+LX.EXM+LX.XBF ;CLEAR ALL OTHER FLAGS.
SP BR,SELB,SP0
MEM MEMX,<AANDB!SP0>
BRWRTE IMM,ER.KIL ;SAVE ERROR TYPE
SP BR,SELB,SP.CHR ;SAVE IN CHARACTER SCRATCH PAD
BRADDR KILLRT ;STORE RETURN POINT.
SP BR,SELB,SP.SB1
ALWAYS COMPLT ;KILL ALL BUFFERS FOR EITHER
;TRANSMIT OR RECEIVE.
; EXIT FROM KILL PROCESSOR
KILLEX:
SPBR IBUS,PORT4,SP0 ;SP0=PORT4
BRSHFT ;BAIN WITH KILL?
BR4 BAIN0 ;YES
BASEXT: ALWAYS RQICL2 ;NO,EXIT
.PAGE
.SBTTL PAGE ONE OFF-PAGE RETURNS
; * * * * * *
; * * * * * *
.PAGE
;NAME
;-----------------------------------------
;! ! ! ! ! ! ! ! !
;! ! ! ! ! ! ! ! !
;-----------------------------------------
;L.STS,L.SILO
;-----------------------------------------
;!ECO/! ! ! ! ! ! SILO !
;!FULL! ! ! ! ! ! COUNT !
;-----------------------------------------
;L.MODE (LM.RMD,LM.EXM)
;-----------------------------------------
;! CURRENT RCV. ! ! EX.MEM. ! ! !
;! !MODE! ! ! BITS ! ! !
;-----------------------------------------
;L.XBDF
;-----------------------------------------
;!1ST ! !LAST! IN ! EX.MEM. !ALT.!XMT.!
;!CHAR! !LINK!CORE! BITS !XMT.!ASN.!
;-----------------------------------------
;L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
;L.*BDF
;-----------------------------------------
;!1ST !BIN-!LAST! IN ! EX.MEM. !ALT.!BUF.!
;!CHAR!ARY !LINK!CORE! BITS !BUF.!ASN.!
;-----------------------------------------
.PAGE
.SBTTL ADDLT* - STORE LINE TABLE ADDRESS FOR ADDITION
;+
; THE LINE TABLE ADDRESS IS STORED IN BOTH THE INPUT AND OUTPUT
; BUS ADDRESS LOCATIONS.
; THE EXTENDED MEMORY BITS FOR OUTPUT ARE NOT STORED IN OBR,
; BUT IN SP0, TO PREVENT UNNECESSARY AND LENGTHY CALCULATIONS.
; FROM THIS CODE, CONTROL PASSES TO INCIN, INCOUT, OR INCOB, AND
; RETURNS FROM THERE.
; ON ENTRY:
; BR - OFFSET TO ADD TO LINE TABLE ADDRESS
; (FOR ADDLT4: BR - RETURN ADDRESS)
; SP0 - UNDETERMINED
; SP1 - ENTRY ADDRESS (INCIN, INCOUT, OR INCOB)
; SP.COR - OFFSET FROM START OF CORE LINE TABLE
; (FOR ADDLT4: SP.COR - UNDETERMINED)
; SP.SUB - RETURN ADDRESS
; ON EXIT:
; BR - OFFSET TO ADD TO LINE TABLE ADDRESS
; SP0 - EX.MEM. OF LINE TABLE ADDRESS
; SP1 - ENTRY ADDRESS (INCIN, INCOUT, OR INCOB)
; SP.COR - OFFSET FROM START OF CORE LINE TABLE
; SP.SUB - RETURN ADDRESS
;-
ADDLT4: SP BR,SELB,SP.SUB ;STORE RETURN POINT.
BRWRTE IMM,C.BIP+4 ;STORE OFFSET FOR CORE STORAGE
SP BR,SELB,SP.COR ;OF STARTING COUNT VALUE.
ADDLTO:
ADDLTI: LDMA IMM,P.LTA ;GET ADDRESS OF LINE
LDMAP IMM,P.LTA ;TABLE ADDRESS.
OUTPUT MEMX,<SELB!IBA1> ;STORE AS INPUT ADDRESS.
OUTPUT MEMI,<SELB!OBA1> ;STORE AS OUTPUT ADDRESS.
OUTPUT MEMX,<SELB!IBA2>
OUTPUT MEMI,<SELB!OBA2>
OUT MEMX,<SELB!ONPR>
SP MEMX,SELB,SP0 ;SAVE OUTPUT EX.MEM. BITS.
LDMAP BR,<SELA!SP.RM1>
.ALWAY BR,<SELA!SP1>,P1 ;GO TO SPECIFIED ROUTINE.
.PAGE
.SBTTL K & L - SUBROUTINE TO ENABLE AND DISABLE TRANSMISSION
;+
; PRIMATIVE K
; TURNS ON TRANSMIT SCANNER BIT FOR THE CURRENT LINE.
; ENTERED WITH:
; BR=RETURN ADDRESS
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP2=UNDETERMINED
; SP.SUB=UNDETERMINED
; EXITED WITH:
; SP0=377
; SP1=CHANNEL BIT MASK
; SP2=2
; SP.SUB=RETURN ADDRESS
;-
;+
; PRIMATIVE L
; TURNS OFF TRANSMIT SCANNER BIT FOR THE CURRENT LINE.
; ENTERED WITH:
; BR=RETURN ADDRESS
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP2=UNDETERMINED
; SP.SUB=UNDETERMINED
; EXITED WITH:
; SP0=377
; SP1=CHANNEL BIT MASK
; SP2=202
; SP.SUB=RETURN ADDRESS
;-
XON: BRADDR METATS ;TURN ON TRANSMIT INTERRUPT.
K: SP IMM,2,SP2 ;MARK K AS SUBROUTINE.
ALWAYS K.L
XOFF: BRADDR METATS ;TURN OFF TRANSMIT INTERRUPT.
L: SP IMM,202,SP2 ;MARK L AS SUBROUTINE.
K.L: SP BR,SELB,SP.SUB
LDMAP IMM,P.PLST ;POINT TO CSR ADDRESS
LDMA BR,<INCA!SP17> ;GET OFFSET TO P.CSR.
BRWRTE <IMM!INCMAR>,4 ;STORE OFFSET TO SCANNING REGISTER.
SP BR,SELB,SP0 ;(POINT TO CSR IN POLLING TABLE.)
OUTPUT MEMI,<OBA1!ADD!SP0> ;STORE ADDRESS OF SCANNING
OUTPUT MEMI,<SELB!OBA2> ;REGISTER FOR TRANSFER.
BRWRTE IMM,101 ;PREPARE UBBR FOR OBR.
SP IBUS,UBBR,SP0
SP BR,AANDB,SP0
BRWRTE IMM,14 ;SET EX.MEM. BITS.
OUT BR,<AORB!OBR>
SP IMM,1,SP1 ;GET CHANNEL BIT MASK.
BRWRTE IMM,7 ;GENERATE CHANNEL NUMBER OF
BRWRTE BR,<AANDB!SP.LN> ;THIS DZ11 FROM LINE NUMBER.
SP BR,SELB,SP0
5$: SPBR BR,DECA,SP0 ;IS THIS LINE THE CHANNEL?
Z 10$ ;YES.
SP BR,TWOA,SP1 ;NOT YET. SHIFT BIT IN CHANNEL
;BIT MASK.
ALWAYS 5$ ;CONTINUE SEARCH.
10$: NODST BR,<TWOA!SP2> ;SET OR CLEAR SCANNER?
C 20$ ;CLEAR IT.
MEM MEMX,<AORB!SP1> ;SET SCAN ENABLE BIT FOR
;THIS CHANNEL.
15$: OUTPUT MEMX,<SELB!OUTDA1> ;STORE NEW SCAN VALUE FOR CHANNEL.
BRWRTE IMM,DATOB ;START BYTE OUT TRANSFER
OUT BR,<SELB!ONPR> ;OF NEW SCAN VALUE.
LDMAP BR,<SELA!SP.RM1> ;RESTORE HIGH MAR.
16$: BRWRTE IBUS,NPR ;NEW VALUE STORED YET?
BR0 16$ ;NO.
RTNSUB SP.SUB,P3 ;RETURN TO CALLER.
20$: ;GET THE COMPLEMENT
SP BR,AXORB,SP1 ;OF CHANNEL BIT MASK.
;(BR=377 FROM 5$.)
MEM MEMX,<AANDB!SP1> ;CLEAR SCAN ENABLE BIT FOR
ALWAYS 15$ ;THIS CHANNEL ONLY.
;
.SBTTL CARRIAGE RETURN ROUTINES
;
CARTDY: BRADDR OUTEST ;ECHO CARRIAGE RETURN, LINE
ALWAYS CARENT ;FEED, BUT DO NOT STORE CHAR.
CARRET: BRADDR STORE ;STORE CHAR. AFTER ECHOING
CARENT: SP BR,SELB,SP.SB1 ;CARRIAGE RETURN, LINE FEED.
;+
; SETS UP ECHO OF CARRIAGE RETURN, AND LINE FEED.
; ENTERED WITH:
; SP.CHR=UNDETERMINED
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP2=UNDETERMINED
; SP3=TRANSMIT AND ECHOPLEX/FULL DUPLEX FLAGS
; EXITED WITH:
; SP.CHR=0
; SP0=377
; SP1=CHANNEL BIT MASK
; SP2=2
; SP3=UNCHANGED
; NO OTHER REGISTER CHANGED.
; RETURNS THROUGH ECHO SUBROUTINE
;-
BRWRTE BR,<SELA!SP3> ;CAN AN ECHO BE PERFORMED?
BR7 A1 ;NO. LINE IS FULL-DUPLEX.
;CONTINUE WITHOUT ECHOING.
BR0 RET ;NO. XMIT IN PROGRESS. EXIT.
LDMA BR,<SELA!SP.RM0> ;SET ECHO COUNT TO TWO.
MEMINC IMM,221
MEMINC IMM,215 ;STORE CARRIAGE RETURN.
MEM IMM,212 ;STORE LINE FEED.
ALWAYS AA ;START SCANNER.
.SBTTL CNTLR - PRIMATIVE FOR CONTROL R
R: BRWRTE IMM,L.RBDC ;SAVE COUNT REMAINING IN BUFFER.
LDMA BR,<ADD!SP.RM0>
SP MEMI,SELB,SP0
SP MEMX,SELB,SP1
BRWRTE IMM,30 ;INDICATE THAT A CONTROL R HAS
;BEEN RECEIVED.
ALWAYS CNTOUT ;ISSUE A CONTROL OUT TO THIS
;EFFECT AND EXIT.
;
.SBTTL CURSORS-ROUTINES TO HANDLE CURSOR RIGHT, CURSOR LEFT,
; AND RUBOUT WITH BACKSPACING.
;
CURGHT: BRADDR NOSTOR ;ECHO CHARACTER FOR CURSOR
;RIGHT, DO NOT STORE THE CHAR,
ALWAYS A ;THEN UPDATE COUNT AND ADDRESS.
CURLFT: BRADDR NXCURL ;SET BACK COUNT AND ADDRESS.
ALWAYS F
NXCURL: BRADDR OUTEST ;ECHO CURSOR LEFT CHARACTER
ALWAYS A ;WITHOUT STORING IT.
NXRUB: BRADDR OUTEST ;EXIT FROM A TO OUTEST.
SP BR,SELB,SP.SB1
;+
; ECHOES BACKSPACE, RUBOUT REPLACEMENT CHARACTER, AND BACKSPACE.
; ENTERED WITH:
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP2=RUBOUT CHARACTER
; SP3=TRANSMIT AND ECHOPLEX/FULL DUPLEX FLAGS
; EXITED WITH:
; NO REGISTERS CHANGED.
; RETURNS THROUGH ECHO SUBROUTINE.
;-
BRWRTE BR,<SELA!SP3> ;CAN AN ECHO BE PERFORMED?
BR7 A1 ;NO. LINE IS FULL-DUPLEX.
;CONTINUE WITHOUT ECHOING.
BR0 RET ;NO. XMIT IN PROGRESS. EXIT.
LDMA BR,<SELA!SP.RM0> ;SET ECHO COUNT TO THREE.
MEMINC IMM,222
MEMINC IMM,210 ;STORE BACKSPACE AS FIRST
;CHARACTER TO ECHO.
MEMINC SELA,SP2 ;FOLLOWED BY USER RUBOUT CHARACTER
MEM IMM,210 ;BACKSPACE AS NEXT CHARACTERS
;TO ECHO.
ALWAYS AA ;START SCANNER.
.PAGE
.SBTTL XMTDON - TRANSMISSION COMPLETE ROUTINE
.ENABL LSB
;+
; START OF CHARACTER TRANSMITTED PROCESSING CODE.
; CONTROL COMES FROM IDLE LOOP.
; ENTERED WHEN THE TRANSMIT SCANNER HAS FOUND A LINE READY TO ACCEPT
; A CHARACTER FOR TRANSMISSION.
; POSSIBLE ACTIONS:
; ECHOING OF RECEIVE CHARACTER
; TRANSMISSION OF CHARACTER FROM TRANSMIT BUFFER
; INSTALLATION OF TRANSMIT BUFFER FOLLOWED BY CHARACTER
; TRANSMISSION
; TURNING OFF OF TRANSMIT SCANNER FOR LINE
;-
XMTDON:
BRWRTE IMM,L.XBDF ;OFFSET TO FLAGS BYTE
LDMA BR,ADD,SP.RM0 ;SET MAR
SPBR MEMX,SELB,SP.XST ;SAVE FLAGS BYTE
BR4 XCORE ;TRANSMIT JUST STARTING.
;BRING BUFFER DESCRIPTOR INFO IN FROM CORE
LDMA BR,<SELA!SP.RM0> ;POINT TO SILO/STATUS.
SPBR MEMX,SELB,SP.SAV ;HOLD SILO COUNT.
;L.STS,L.SILO
;-----------------------------------------
;!ECO/! ! !SILO! ! ! SILO !
;!FULL! ! !FULL! ! ! COUNT !
;-----------------------------------------
;DETERMINE IF CHARACTER WAS TRANSMITTED OR ECHOED.
BR4 50$ ;YES.
;L.XBDF
;-----------------------------------------
;!1ST ! !LAST! IN ! EX.MEM. !ALT.!XMT.!
;!CHAR! !LINK!CORE! BITS !XMT.!ASN.!
;-----------------------------------------
BRWRTE SELA,SP.XST,INCMAR ;TEST TRANSMIT STATUS
BR0 100$ ;LINE IS TRANSMITTING.
;GO SEND NEXT CHARACTER.
BRADDR RET3 ;TURN OFF SCANNER AND EXIT.
ALWAYS L
XCORE: BRADDR XMTDON ;STORE RETURN POINT.
SP BR,SELB,SP.SB1
BRWRTE IMM,L.XBDC ;STORE RAM POINTER OFFSET
BRWRTE BR,ADD,SP.RM0 ;GET ADDRESS OF THIS OFFSET FOR CURRENT LINE
SP BR,SELB,SP.CRM ;SAVE IT
BRWRTE IMM,C.XDP ;STORE CORE OFFSET
ALWAYS XMTSRT ;READ IN BUFFER DESCRIPTOR INFO
50$: MEMINC BR,<DECA!SP.SAV> ;DECREMENT SILO COUNTER.
OUT MEMI,SELB,OUTDA1 ;STORE NEXT ECHO CHARACTER
SP MEMI,SELB,SP0 ;SAVE FOLLOWING ECHO CHARACTER IF ANY
SP MEMX,SELB,SP1 ;AND NEXT
LDMA INCA,SP.RM0 ;RESET TO START OF SILO
MEMINC SELA,SP0 ;STORE POSSIBLE ECHO CHARACTERS.
MEM SELA,SP1
ALWAYS PRINT ;ECHO CHARACTER. EXIT.
.PAGE
;
;TRANSMISSION OF TRANSMIT CHARACTER.
;
100$: SPBR MEMX,SELB,SP0 ;READ LOW ORDER COUNT
Z XMCNT1 ;COUNT MAY HAVE GONE TO ZERO.
MEMINC DECA,SP0 ;DECREMENT COUNT AND STORE IT BACK.
INCMA ;POINT TO LOW ADDR BYTE
XMRET1: SPBR MEMX,SELB,SP0 ;READ LOW ADDRESS BYTE
OUT BR,SELB,IBA1 ;SET UP FOR INPUT TRANSFER
MEMINC INCA,SP0 ;INCREMENT THE ADDRESS
SP MEMX,SELB,SP0 ;GET THE HIGH ADDR BYTE
BR0 XMCNT2 ;WAS THE ORIGINAL ADDR ODD?
XMRET2: OUT SELA,IBA2,INCMAR ;SET UP HIGH ADDR FOR INPUT TRANSFER
;AND SET MAR TO L.XBDF
;L.XBDF
;-----------------------------------------
;!1ST ! !LAST! IN ! EX.MEM. !ALT.!XMT.!
;!CHAR! !LINK!CORE! BITS !XMT.!ASN.!
;-----------------------------------------
BRWRTE IMM,LX.EXM+LX.XBF
BRWRTE BR,<AANDB!SP.XST>
OUT BR,<SELB!ONPR> ;SET NPR RQ AND EX.MEM. BITS.
BRWRTE IMM,377-LX.FST-LX.PIC ;CLEAR FIRST CHAR. FLAG (AND
MEMINC BR,<AANDB!SP.XST> ;IN CORE FLAG). POINT TO L.OXC.
105$: BRWRTE IBUS,NPR ;IS TRANSFER COMPLETE?
BR0 105$ ;NO.
OUT IBUS,INDAT2,OUTDA1 ;SET TO PRINT ODD CHARACTER
BRWRTE IBUS,IIBA1 ;WORD TRANSFER? (CHANGE SET-UP?)
BR0 PRINT ;NO, CONTINUE PROCESSING.
MEM IBUS,INDAT2 ;YES. SAVE ODD CHARACTER.
OUT IBUS,INDAT1,OUTDA1 ;STORE EVEN CHAR. IN OUT DATA.
.PAGE
.SBTTL PRINT - SUBROUTINE TO TRANSMIT CHARACTER
;+
; ROUTINE FOR SENDING A SINGLE CHARACTER OUT VIA THE DZ11.
; OUTDA1 - CHARACTER TO TRANSMIT
;-
PRINT: LDMAP IMM,P.PLST ;POINT TO CSR ADDRESS.
LDMA BR,<SELA!SP17>
BRWRTE <IMM!INCMAR>,6 ;STORE LOW SIXTEEN BITS FOR
SP <BR!INCMAR>,SELB,SP0 ;ADDRESS OF CHARACTER-
OUTPUT MEMI,<ADD!OBA1> ;TRANSMITTING REGISTER.
OUTPUT MEMX,<SELB!OBA2>
BRWRTE IMM,101 ;PREPARE UBBR FOR OBR.
SP IBUS,UBBR,SP0
SP BR,AANDB,SP0
BRWRTE IMM,14 ;SET EX.MEM.BITS (ALWAYS 1'S.)
OUT BR,<AORB!OBR>
BRWRTE IMM,DATOB ;SET UP FOR A BYTE
;OUTPUT TRANSFER.
OUT BR,<SELB!ONPR> ;SET NPR RQ BIT.
.PAGE
.SBTTL RET - RETURN POINT FOR CHARACTER PROCESSING
RET: BRWRTE IBUS,NPR ;COMPLETE ANY PENDING
BR0 RET ;TRANSFERS.
ALWAYS TIMRTN
.PAGE
XMCNT1: MEMINC DECA,SP0 ;DECREMENT LOW BYTE.
MEMINC MEMX,ADD,SP0 ;ADD MINUS ONE TO HIGH COUNT.
;STORE RESULT BACK.
Z XMCOMP ;COUNT IS ZERO.
;BUFFER HAS COMPLETED.
ALWAYS XMRET1 ;GET NEXT CHARACTER.
;GET CHARACTER FROM ODD BYTE.
XMCNT2: MEM APLUSC,SP0 ;STORE NEW HIGH BYTE.
C 115$ ;CARRY FORCES ADDITION TO
;THE EXTENDED MEMORY BITS.
BRWRTE SELA,SP.XST ;READ XMIT STATUS BYTE
110$: BR7 XMRET2 ;FIRST CHARACTER FLAG SET.
;DO NPR TO GET ODD 1ST CHAR.
;FROM CORE.
BRWRTE IMM,377-LX.PIC,INCMAR ;POINT TO L.XBDF.
;(CLEAR ANY EX.MEM. OVERFLOW.)
MEMINC BR,<AANDB!SP.XST> ;STORE STATUS.
OUT MEMX,SELB,OUTDA1 ;GET CHAR. FROM ODD BYTE HOLDER.
ALWAYS PRINT ;CONTINUE PROCESSING.
;L.XBDF
;-----------------------------------------
;!1ST ! !LAST! IN ! EX.MEM. !ALT.!XMT.!
;!CHAR! !LINK!CORE! BITS !XMT.!ASN.!
;-----------------------------------------
115$: BRWRTE IMM,4 ;INCREMENT EX.MEM. BITS.
SPBR BR,ADD,SP.XST ;OVERFLOW WILL BE CLEARED.
ALWAYS 110$
.PAGE
.SBTTL XMCOMP - TRANSMIT BUFFER HAS COMPLETED
;
XMCOMP:
BRWRTE IMM,C.BAOX ;STORE TRANSFER TYPE INDICATOR.
SP BR,SELB,SP.SAV
BRWRTE IMM,C.XDP ;STORE CORE PARAMETERS FOR FETCHING
SP BR,SELB,SP.COR ;A NEW DESCRIPTOR FROM CORE.
BRWRTE IMM,L.XBDC ;STORE RAM PARAMETERS.
ALWAYS H.XR ;CALL COMPLETION SUBROUTINE,
;AND GET NEXT BUFFER, IF ANY.
;EXIT.
.DSABL LSB
.SBTTL RCVDON - RECEPTION COMPLETION
.ENABL LSB
;+
; START OF CHARACTER RECEIVED PROCESSING CODE
; CONTROL COMES FROM IDLE LOOP
; ENTERED WHEN THE RECEIVER SILO HAS FOUND A CHARACTER RECEIVED
; ON A LINE.
; POSSIBLE ACTIONS:
; DISCARDING OF CHARACTER BECAUSE THE ECHO OF A PREVIOUS
; CHARACTER IS STILL IN PROGRESS
; SENDING OF RECEIVE CONTROL OUT BECAUSE:
; 1) THE CHARACTER IS BAD
; 2) THERE IS NO RECEIVE BUFFER ASSIGNED
; PROCESSING OF THE CHARACTER
;-
RCVDON: BRWRTE IMM,160 ;GET ERROR BIT MASK.
SPBR BR,AANDB,SP.SAV ;MASK OFF NON-ERROR BITS.
SP BR,SELB,SP1 ;SET SP1 TO A ZERO (ASSUMING NO ERRORS)
;IN CASE OF BINARY RECEIVE
;L.STS,L.SILO
;-----------------------------------------
;!ECO/! ! !SILO! ! ! SILO !
;!FULL! ! !FULL! ! ! COUNT !
;-----------------------------------------
SPBR MEMX,SELB,SP3 ;STORE STATUS INDICATOR.
BR4 RET ;ECHO IN PROGRESS.
BRWRTE BR,DECA,SP.CST ;ANY ERROR BITS SET?
Z 4$ ;NO, CONTINUE.
BR4 1$ ;YES, EITHER BIT 5 OR 6.
BRWRTE IMM,ER.CPE ;YES, BIT 4. SET UP "RECEIVE
ALWAYS 3$ ;CONTROL OUT, PARITY ERROR."
1$: BRWRTE BR,TWOA,SP.CST ;WAS BIT 6 SET?
BR7 2$ ;YES.
BRWRTE IMM,ER.FRE ;NO, BIT 5. SET UP "RECEIVE
ALWAYS 3$ ;CONTROL OUT, BREAK DETECTED."
2$: BRWRTE IMM,ER.OVR ;SET UP "RECEIVE CONTROL OUT,
3$: SP BR,SELB,SP.CHR ;SAVE ERROR CODE IN CHARACTER SP
BRWRTE IMM,C.CLOR ;CONTROL OUT CODE
ALWAYS H1 ;POST THE COMPLETION
.PAGE
;+
; CALCULATES OFFSET FROM START OF MODE TABLE
; TO CURRENT CHARACTER OF CURRENT MODE.
; FETCHES BYTE OF NEW MODE CODE AND FUNCTION CODE
; FROM MODE TABLE IN CORE.
; STORES RESULTANT BYTE IN SP.SAV AND THE BR.
;-
4$: ;NOTE THAT SP.CST IS SP.SAV.
;WITHOUT ERRORS, VALUE IS ZERO, FOR
;BINARY MODE AND CARRY FROM SP0.
BRWRTE IMM,L.RBDF ;GET RECEPTION FLAGS.
LDMA BR,<ADD!SP.RM0>
SP MEMI,SELB,SP4
BRWRTE <BR!INCMAR>,<TWOA!SP4> ;BINARY MODE?
BR7 RCVMOR ;YES. LEAVE FUNCTION CODE AS
;ZERO. DO NO XON/XOFF PROCESSING.
;L.MODE (LM.RMD,LM.EXM)
;-----------------------------------------
;! CURRENT RCV. ! ! EX.MEM. ! ! !
;! !MODE! ! ! BITS ! ! !
;-----------------------------------------
SP <IMM!INCMAR>,340,SP0 ;SEPARATE RECEIVE MODE FROM
SP MEMX,AANDB,SP0 ;EX.MEM. BITS.
SP BR,TWOA,SP0 ;MULTIPLY RECEIVE MODE BY
SP BR,APLUSC,SP.SAV ;FOUR. MOVE ANY OVERFLOW
SP BR,TWOA,SP0 ;TO SPECIAL COUNTER.
SP BR,TWOAC,SP.SAV
BRWRTE IMM,177 ;GET CURRENT CHARACTER AS
BRWRTE BR,<AANDB!SP.CHR> ;A SEVEN-BIT INDEX.
SP BR,ADD,SP0 ;ADD TO LOW BYTE OFFSET.
;(THERE IS NO CARRY.)
BRWRTE IMM,L.MODE ;GET MODE ADDRESS FROM RAM.
LDMA BR,<ADD!SP.RM0>
OUTPUT MEMI,<ADD!IBA1!SP0> ;STORE LOW EIGHT BITS OF MODE
;MODE TABLE ADDRESS OFFSET FOR
;THIS CHARACTER.
BRWRTE MEMI,<ADDC!SP.SAV> ;GET NEXT EIGHT BITS WITH
;ANY OFFSET.
OUTPUT BR,<SELB!IBA2> ;STORE NEXT EIGHT BITS.
SP MEMX,SELB,SP0 ;SAVE OUT EX.MEM. BITS.
C 20$ ;ADD OVERFLOW TO EX.MEM. ALSO.
5$: BRWRTE IMM,14 ;GET EX.MEM. BITS WITHOUT
SP BR,AANDB,SP0 ;ANY MODE BITS.
;L.MODE (LM.RMD,LM.EXM)
;-----------------------------------------
;! CURRENT RCV. ! ! EX.MEM. ! ! !
;! !MODE! ! ! BITS ! ! !
;-----------------------------------------
OUT BR,<INCA!ONPR> ;START TRANSFER.
6$: BRWRTE IBUS,NPR ;TRANSFER DONE YET?
BR0 6$ ;NO.
BRWRTE IBUS,IIBA1 ;IS INFORMATION IN LOW BYTE?
BR0 14$ ;NO, IN HIGH BYTE.
SPBR IBUS,INDAT1,SP.SAV ;YES. REMOVE FROM LOW BYTE.
ALWAYS 15$ ;STORE MODE&FUNCTION IN SP0.
;L.MODE (LM.RMD,LM.EXM)
;-----------------------------------------
;! CURRENT RCV. ! ! EX.MEM. ! ! !
;! !MODE! ! ! BITS ! ! !
;-----------------------------------------
20$: BRWRTE IMM,4 ;ADD THE CARRY BIT TO
SP BR,ADD,SP0 ;EX.MEM..
ALWAYS 5$
;GETS CURRENT RECEIVE MODE.
;POINTS TO CORRECT LOCATION
;IN MODE TABLES FOR THIS
;CHARACTER. GETS MODE&FUNCTION FROM CORE.
14$: SPBR IBUS,INDAT2,SP.SAV ;REMOVE FROM HIGH BYTE.
15$: SP IMM,340,SP0 ;MASK OFF AND SAVE
SP BR,AANDB,SP0 ;THE NEW RECEIVE MODE.
;L.MODE (LM.RMD,LM.EXM)
;-----------------------------------------
;! CURRENT RCV. ! ! EX.MEM. ! ! !
;! !MODE! ! ! BITS ! ! !
;-----------------------------------------
BRWRTE IMM,37 ;MASK OFF NEW MODE,
SP BR,AANDB,SP.SAV ;LEAVING THE FUNCTION CODE.
SP BR,SELB,SP1
MEM MEMX,<AANDB!SP1> ;SAVE EX.MEM. BITS.
MEMINC MEMX,<AORB!SP0> ;MERGE NEW AND EX.MEM..
SP MEMX,SELB,SP2 ;SAVE RUBOUT CHARACTER JUST IN CASE
BRWRTE IMM,17 ;REMOVE META FLAG BIT.
BRWRTE BR,<AANDB!SP.SAV>
SP BR,SELB,SP1 ;SAVE FUNCTION CODE LESS META FLAG
SP DECA,SP1 ;WAS THE FUNCTION ZERO?
Z XON ;YES, WAS AN X-ON
SP DECA,SP1 ;WAS THE FUNCTION A ONE
Z XOFF ;YES, WAS AN X-OFF
;OTHERWISE FALL INTO RCVMOR
.PAGE
;SP4=L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
;
; SP3=L.SILO
;
RCVMOR: BRWRTE SELA,SP4 ;IS RECEIVE BUFFER ASSIGNED?
BR0 100$ ;LINE IS RECEIVING.
LDMAP IMM,P.PLST ;POINT TO PAGE WITH POLLING LIST
BRWRTE IMM,P.NRB ;OFFSET TO RECEIVE CHARACTER FLAG
LDMA BR,ADD,SP17 ;POINT TO IT FOR CURRENT DEVICE
SP IMM,20,SP0 ;FLAG TO STOP RECEIVE CHARACTER PROCESSING
;ON THIS DEVICE UNTIL USER ASSIGNS A BUFFER
MEM MEMX,AORB,SP0 ;SET IT
SPBR IMM,0,SP0 ;INDICATE NO BUFFER ASSIGNED
SP BR,SELB,SP1 ;FOR CHARACTER RECEIVED.
BRWRTE IMM,ER.NBA ;SEND CONTROL OUT TO USER.
CNTOUT: LDMAP IMM,P.SLIN ;POINT TO USER SILO ENTRY POINT.
LDMA IMM,P.SLIN
LDMA MEMX,SELB
MEMINC SELA,SP.LN ;STORE LINE NUMBER.
MEMINC SELA,SP0 ;STORE ANY COUNT.
MEMINC SELA,SP1
MEMINC BR,SELB ;STORE ERROR TYPE.
MEMINC SELA,SP.CHR ;STORE CHARACTER RECEIVED.
MEMINC IMM,C.CLOR!200 ;INDICATE A RECEIVER CONTROL OUT.
BRADDR IDLE3 ;MAKE UP COMPLETE SILO ENTRY.
ALWAYS STFSLO ;EXIT.
;PROCESSING OF A NORMALLY RECEIVED CHARACTER
;L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
100$: BRWRTE IMM,L.XBDF ;POINT TO TRANSMIT FLAGS.
LDMA BR,<ADD!SP.RM0>
BRWRTE IMM,200 ;CHANGE STATE OF BIT 7
SP BR,AXORB,SP3 ;IN SCRATCH PAD 3
SP BR,AORNB,SP3 ;SET BIT 0 (AS WELL AS 1-6)
BRWRTE MEMX,SELB ;TRANSMIT IN PROGRESS?
BR0 106$ ;YES. LEAVE BIT 0 ON IN SP3.
SP BR,DECA,SP3 ;NO. TURN OFF TRANSMIT FLAG.
;+
; SP3:
; BIT7=1 => FULL DUPLEX
; BIT7=0 => ECHOPLEX
; BIT0=1 => TRANSMISSION IN PROGRESS
; BIT0=0 => NO CURRENT TRANSMISSION
;-
106$:
BRADDR JMPTBL
.ALWAY BR,<ADD!SP1>,P2 ;ENTER SUBROUTINE SEQUENCE
;USED TO PROCESS THE RECEIVED CHARACTER.
.DSABL LSB
.PAGE
;
;TABLE OF ACTIONS FOR CHARACTERS
; (ENTRY 0 USED BY BINARY OPERATION)
;
JMPTBL: ALWAYS STORE
ALWAYS ECHO
ALWAYS CARRET
ALWAYS CARTDY
ALWAYS CURGHT
ALWAYS CURLFT
ALWAYS RUBOUT
ALWAYS R
ALWAYS OUTEST
;END OF JMPTBL
.SBTTL PAGE TWO OFF-PAGE RETURNS
; * * * * * *
KILLRT: ALWAYS KILLEX
RQICL8: ALWAYS RQICL2 ;RETURN TO IDLE.
; * * * * * *
.SBTTL COMPLT - ROUTINE PROCESSES A COMPLETED BUFFER
COMP30: SP BR,TWOA,SP4 ;MOVE RECEIVE MODE BITS
SP BR,TWOAC,SP4 ;FROM BITS 5-7 TO BITS 0-2.
SP BR,TWOAC,SP4
SP BR,TWOAC,SP4
BRWRTE IMM,7 ;CLEAR NON-MODE BITS.
SP BR,AANDB,SP4 ;STORE THE RESULT
MEM MEMX,<AORB!SP4> ;WITH ANY META OR ERROR INDICATOR.
ALWAYS COMP4 ;CONTINUE.
COMP40: NODST SELA,SP10,INCMAR
Z COMP6 ;COUNT WENT TO ZERO. STARTING COUNT
;IN CORE IS CORRECT.
ALWAYS COMP5 ;STORE CORRECT COUNT.
.PAGE
.SBTTL RUBOUT - CHARACTER DELETION
RUBOUT: BRADDR NXRUB ;SET BACK COUNT AND ADDRESS.
;+
; PRIMATIVE F
; DELETES THE PREVIOUSLY ENTERED CHARACTER, IF ANY.
; ENTERED WITH:
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP.CHR=RUBOUT CHARACTER IF ENTERED FROM "RUBOUT"
; OTHERWISE RECEIVED CHARACTER
; SP.COR=UNDETERMINED
; EXITED WITH:
; SP0=DESTROYED
; SP1=DESTROYED
; SP.CHR=UNCHANGED
; SP.COR=C.BIP+4
; NO OTHER REGISTER CHANGED.
; RETURNS THROUGH SP.SB1
;-
F: SP BR,SELB,SP.SB1 ;STORE RETURN LOCATION.
BRADDR INCIN ;FETCH THE BUFFER STARTING
SP BR,SELB,SP1 ;COUNT FROM CORE.
BRADDR F1
ALWAYS ADDLT4
F2: BRWRTE IMM,L.RBDC ;POINT TO CURRENT BUFFER COUNT.
LDMA BR,<ADD!SP.RM0>
SP MEMX,SELB,SP0 ;GET LOW BYTE OF CURRENT COUNT.
BRWRTE IBUS,INDAT1 ;COMPARE LOW ORDER BYTES OF
COMP BR,SP0 ;THE TWO COUNTS.
Z 15$ ;EQUAL.
MEMINC BR,<INCA!SP0> ;INCREMENT COUNT OF UNRECEIVED
SP MEMX,SELB,SP0 ;CHARACTERS BY ONE.
MEMINC BR,<APLUSC!SP0>
SP MEMX,SELB,SP0 ;DECREMENT POINTER.
MEMINC BR,<DECA!SP0>
Z 20$ ;BYTE UNDERFLOWED.
10$: RTNSUB SP.SB1,P2 ;RETURN TO CALLER.
15$: SP <IBUS!INCMAR>,INDAT2,SP0 ;COMPARE HIGH ORDER BYTES OF
COMP MEMX,SP0 ;THE TWO COUNTS.
Z OUTEST ;NOW BACK AT START OF BUFFER.
OUTPUT BR,<INCA!OIDAT1!SP0> ;CHANGE COMPARISON VALUE.
ALWAYS F2 ;GO THROUGH COMPARES AGAIN.
;THIS TIME WILL FALL THROUGH.
20$: SP MEMX,SELB,SP0 ;DECREMENT HIGH ADDRESS.
MEMINC BR,<DECA!SP0>
Z 25$ ;GONE TO ZERO.
RTNSUB SP.SB1,P2 ;RETURN TO CALLER.
;L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
25$: BRWRTE IMM,4 ;DECREMENT EX.MEM.BITS.
SP MEMX,SELB,SP0 ;NO UNDERFLOW CARE NEED
MEM BR,<SUB!SP0> ;BE TAKEN.
RTNSUB SP.SB1,P1 ;RETURN TO CALLER.
.PAGE
ECHO: BRADDR STORE ;EXIT TO STORING THE CHARACTER
;AFTER ECHOING THE CHARACTER.
;+
; PRIMATIVE A
; STORES CHARACTER IN RECEIVE SPECIAL ECHO BUFFER.
; STARTS TRANSMIT SCANNER FOR LINE, IF NECESSARY.
; ENTERED WITH:
; SP.CHR=CHARACTER TO BE TRANSMITTED
; SP0=UNDETERMINED
; SP1=UNDETERMINED
; SP2=UNDETERMINED
; SP3=TRANSMIT AND ECHOPLEX/FULL DUPLEX FLAGS
; EXITED WITH:
; SP.CHR=UNCHANGED
; SP0=377
; SP1=CHANNEL BIT MASK
; SP2=2
; SP3=UNCHANGED
; NO OTHER REGISTER CHANGED.
; RETURNS THROUGH SP.SB1
;-
A: SP BR,SELB,SP.SB1 ;STORE RETURN POINT.
BRWRTE BR,<SELA!SP3> ;LINE IN ECHOPLEX MODE?
BR7 A1 ;NO, FULL DUPLEX. EXIT.
BR0 RET ;YES, BUT TRANSMIT IS IN PROGRESS.
;DO NOTHING.
LDMA BR,<SELA!SP.RM0> ;POINT TO RECEIVE ECHO COUNTER.
MEMINC IMM,220 ;SET ECHO COUNT TO ONE.
MEM BR,<SELA!SP.CHR> ;STORE CHARACTER.
AA: BRADDR A1 ;START SCANNER. EXIT TO CALLER.
ALWAYS K
A1: RTNSUB SP.SB1,P3 ;EXIT.
.IIF NE <A1-START>/1000-3 .ERROR ;PAGE 3 RELOCATION ERROR - A1
.PAGE
.SBTTL STORE - STORE CHARACTER IN USER-ASSIGNED BUFFER.
STORE: BRWRTE IMM,L.RBDA ;POINT TO RECEIVE BUFFER
LDMA BR,<ADD!SP.RM0> ;ADDRESS.
OUTPUT MEMI,<SELB!OBA1> ;STORE TRANSFER ADDRESS.
OUTPUT MEMI,<SELB!OBA2>
SP MEMX,SELB,SP0 ;GET FLAGS INDICATOR.
BRWRTE IMM,14 ;MASK OFF JUST EX.MEM. BITS.
SP BR,AANDB,SP0
;L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
BRWRTE IBUS,UBBR ;SAVE XX4 AND NXM BITS FROM UBBR.
SP IMM,101,SP1
BRWRTE BR,<AANDB!SP1>
OUT BR,<AORB!OBR> ;SEND OUT EX.MEM. BITS.
BRWRTE BR,<SELA!SP.CHR> ;STORE CHARACTER.
OUTPUT BR,<SELB!OUTDA1>
OUTPUT BR,<SELB!OUTDA2>
BRWRTE IMM,DATOB ;PERFORM A BYTE TRANSFER.
OUT BR,<SELB!ONPR> ;START TRANSFER.
.PAGE
.ENABL LSB
.SBTTL NOSTOR - INCREMENT BUFFER POINTER AND COUNTER.
NOSTOR: BRWRTE IMM,L.RBDC ;POINT TO DATA COUNTER.
LDMA BR,<ADD!SP.RM0>
SP MEMX,SELB,SP1 ;GET LOW BYTE OF COUNT.
MEMINC BR,<DECA!SP1> ;STORE DECREMENTED COUNT.
SP BR,DECA,SP1 ;IS THIS THE LAST CHARACTER?
C 5$ ;NO.
MEM MEMX,<ADD!SP1> ;ADD MINUS ONE TO HIGH BYTE.
5$: SP MEMI,SELB,SP0 ;STORE COUNT VALUE AS FLAG.
SP MEMX,SELB,SP1 ;INCREMENT CHARACTER POINTER.
MEMINC BR,<INCA!SP1>
SP MEMX,SELB,SP1 ;GET HIGH BYTE OF MEMORY
MEMINC BR,<APLUSC!SP1> ;INCREMENTED.
C 20$ ;OVERFLOW. INCREMENT EX.MEM..
10$: BRWRTE BR,<SELA!SP0> ;GET ZERO/NON-ZERO FLAG.
Z ZERBUF ;COUNT GONE TO ZERO.
OUTEST: BRWRTE BR,<SELA!SP.SAV> ;META CHARACTER?
.IIF NE <OUTEST-START>/1000-3 .ERROR ;OUTEST AND RET3 ARE NOT ON PAGE 3
BR4 ENDBUF ;YES.
RET3: ALWAYS RET ;EXIT.
;L.RBDF
;-----------------------------------------
;! !BIN-!LAST! ! EX.MEM. !ALT.!RCV.!
;! !ARY !LINK! ! BITS !RCV.!ASN.!
;-----------------------------------------
20$: SP IMM,4,SP4 ;INCREMENT EX.MEM. BITS.
MEM MEMX,<ADD!SP4> ;(CAN IGNORE BIT 4 OVERFLOW.)
ALWAYS 10$
.DSABL LSB
; TEST FOR META ON FUNCTION 27 (CONTROL O)
METATS: BRWRTE SELA,SP.SAV ;META CHARACTER
BR4 10$ ;YES
ALWAYS RET ;OTHERWISE JUST RETURN
10$: BRWRTE IMM,ER.ABO ;PREPARE TO GIVE CONTROL OUT WITH THE ABORT CODE
ALWAYS CNTOUT ;POST THE COMPLETION
.SBTTL ZERBUF - RECEIVE BUFFER COMPLETION ROUTINE
.SBTTL ENDBUF - RECEIVE BUFFER COMPLETION ROUTINE
;+
; THIS CODE INITIATES THE COMPLETION PROCESSING FOR A RECEIVE
; BUFFER. TRANSMIT BUFFER COMPLETION AND TRANSMIT BUFFER START-UP
; (AFTER CHARACTER ECHO COMPLETION) ENTER AT H.XR.
; CONTROL PASSES TO COMPLT OR TO XMTSRT.
; ON EXIT:
; SP0 - ENTRY ADDRESS
; SP.SB1 - RETURN ADDRESS (RET OR XRETRY)
; SP.COR - OFFSET WITHIN CORE LINE TABLE ADDRESS
; SP.CRM - OFFSET WITHIN RAM TABLE
; SP.SAV - MODE TYPE:
;* 0=TRANSMIT
;* 4=RECEIVE
;*
;* 0=BA OUT
;* 1=CONTROL OUT
;*:.0=NORMAL TERMINATION
;*:.1=ERROR TERMINATION
;*
;* 10=PARITY ERROR
;* 20=FRAMING ERROR
;* 30=ABORT
;* 60=RECEIVER ERROR
; (HARDWARE OR NO BUFFER)
;*100=NON-EXISTANT MEMORY
;*120=RECEIVE BUFFER OVERFLOW
;*130=KILL COMPLETE
;*200=META TERMINATION
;-
H.META: BRWRTE IMM,200!C.BAOR ;INDICATE A GOOD RECEIVE
;BUFFER OUT ENDED BY A META-
ALWAYS H1 ;CHARACTER.
ZERBUF: BRWRTE IMM,L.RBDC ;POINT TO CURRENT BUFFER
LDMA BR,<ADD!SP.RM0> ;COUNTER.
MEM BR,<DECA!SP0> ;STORE -2 IN LOW BYTE.
ENDBUF: BRWRTE IBUS,NPR ;ANY TRANSFER COMPLETE?
BR0 ENDBUF ;NOT YET.
BRWRTE BR,<SELA!SP.SAV> ;RE-CHECK MODE TYPE.
BR4 H.META ;BUFFER ENDED ON META CHARACTER.
BRWRTE IMM,C.BAOR ;INDICATE A GOOD RECEIVE
;BUFFER OUT.
H1: SP BR,SELB,SP.SAV ;STORE RECEIVE TYPE CODE.
BRWRTE IMM,C.RDP ;STORE CORE RECEIVE BUFFER
SP BR,SELB,SP.COR ;ADDRESS.
BRWRTE IMM,L.RBDC ;STORE RAM RECEIVE
H.XR: BRWRTE BR,<ADD!SP.RM0> ;BUFFER ADDRESS IN
SP BR,SELB,SP.CRM ;CURRENT RAM REGISTER.
BRADDR RET ;STORE RETURN.
SP BR,SELB,SP.SB1
;FALL INTO COMPLT TO POST COMPLETION
;AND SET UP NEXT BUFFER
.SBTTL COMPLT - ROUTINE PROCESSES A COMPLETED BUFFER
;+
; PERFORMS COMPLETION AND FETCHING OF NEXT BUFFER.
; SP0=UNDEFINED
; SP1=UNDEFINED
; SP2=UNDEFINED
; SP3=UNDEFINED
; SP4=UNDEFINED
; SP.CRM=CURRENT RAM POINTER
; SP.COR =CORE POINTER
; SP.SAV=COMPLETION CODE (0=XMIT DONE, 4=RECV DONE, 5=RECV CNTRL OUT
; 1=XMIT CNTRL OUT)
; SP.CHR=LAST CHARACTER(RECEIVE) OR ERROR CODE IF CONTROL OUT
;-
COMPLT:
;SUBROUTINE CALL:
;** CALLSB SP.SUB,ADDLTI(TO INCIN),@SP.COR
BRADDR INCIN ;REQUEST INPUT TRANSFER.
SP BR,SELB,SP1
BRADDR COMPL1 ;SET UP SUBROUTINE RETURN.
SP BR,SELB,SP.SUB
BRWRTE BR,<SELA!SP.COR> ;GET OFFSET TO CORE.
ALWAYS ADDLTI ;CALL ROUTINE TO HAVE OFFSET ADDED
;TO LINE TABLE ADDRESS, AND
;START NPR IN TRANSFER FROM
;RESULTANT LOCATION.
COMPL1: BRWRTE IMM,L.CURM ;SAVE CURRENT MODE VALUE.
LDMA BR,<ADD!SP.RM0>
SP MEMX,SELB,SP4
LDMAP IMM,P.SLIN ;POINT TO SILO INPUT AREA
LDMA IMM,P.SLIN ;FOR THE NEXT ENTRY.
LDMA MEMX,SELB
MEMINC SELA,SP.LN ;AND LINE NUMBER.
MEM IBUS,INDAT1 ;STORE FIRST 16 BITS OF
SP MEMX,SELB,SP3 ;DESCRIPTOR ADDRESS.
OUTPUT MEMI,SELB,OBA1
MEM IBUS,INDAT2
SP MEMX,SELB,SP2
OUTPUT MEMI,SELB,OBA2
;
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=CURRENT RECEIVE MODE
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;SP7=TYPE INDICATOR FLAGS
;SP10=LAST CHARACTER
.PAGE
MEMINC SELA,SP.CHR ;STORE ENDING CHARACTER OR ERROR CODE
MEM IMM,20 ;ASSUME META CHARACTER BY SETTING META FLAG
BRWRTE SELA,SP.SAV ;META CHARACTER END BUFFER?
BR7 COMP30 ;YES.
MEM IMM,0 ;NO META CHARACTER
COMP2: BRWRTE SELA,SP.CRM ;IS THIS DRIVEN BY RECEPTION?
;(SP.CRM=SP.LN*20+7, NOT =SP.LN*20+1)
BR1 COMP30 ;YES.
COMP4: BRADDR 1$ ;GET 3RD BYTE OF DESCRIPTOR
ALWAYS INCIN2 ;ADDRESS.
1$: SP IBUS,UBBR,SP0 ;SAVE XX4 AND NXM.
BRWRTE IMM,101
SP BR,AANDB,SP0
SPBR IBUS,INDAT1,SP4 ;EX.MEM. BITS ARE IN BITS 6&7.
BRSHFT ;MOVE EX.MEM. BITS TO 2&3.
BRSHFT
BRSHFT
BRSHFT
OUT BR,AORB,OBR ;STORE EX.MEM. BITS IN OBR
OUT BR,SELB,ONPR ;AND ONPR.
OUTPUT IBUS,IOBA1,IBA1 ;STORE DESCRIPTOR ADDRESS
OUTPUT IBUS,IOBA2,IBA2 ;IN INPUT REGISTER.
MEMINC MEMX,AORB,SP4 ;STORE EX.MEM. BITS.
BRWRTE IMM,200 ;OR IN READY OUT BIT
MEMINC BR,AORB,SP.SAV ;WITH COMPLETION CODE
;
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;SP7=UNIMPORTANT
;
BRADDR 5$ ;CALL NPR TRANSFER QUEUE.
ALWAYS STFSLO
5$: LDMAP SELA,SP.RM1 ;POINT TO BUFFER COUNT.
LDMA SELA,SP.CRM ;GET CURRENT COUNT.
SP MEMI,SELB,SP7 ;GET LOW BYTE OF COUNT.
SP MEMI,SELB,SP10 ;GET HIGH BYTE OF COUNT
SP INCA,SP7,INCMAR ;SAVE COUNT.
Z COMP40 ;COULD BE ZERO.
SP BR,APLUSC,SP10,INCMAR ;ADD CARRY FROM INCREMENTING
COMP5:
;LOW BYTE OF COUNT.
.PAGE
;
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;SP7=LOW BYTE OF CURRENT COUNT
;SP10=HIGH BYTE OF CURRENT COUNT
;OBA=DESCRIPTOR ADDRESS
;IBA=DESCRIPTOR ADDRESS
;
BRADDR 44$ ;READ IN STARTING COUNT.
ALWAYS INCIN2
; MAR IS POINTING TO FLAGS BYTE
44$:
BRWRTE MEMX,SELB ;READ THE FLAGS BYTE
BR0 45$ ;THERE IS A REAL BUFFER ASSIGNED
ALWAYS COMP6 ;NO BUFFER ASSIGNED (FROM KILL)
;DONT WRITE A COUNT OUT
45$: BRWRTE SELA,SP7 ;CALCULATE RECEIVED BYTE
SP IBUS,INDAT1,SP0 ;COUNT. STORE BACK INTO CORE.
OUTPUT BR,SUB,OUTDA1
BRWRTE SELA,SP10
SP IBUS,INDAT2,SP0
OUTPUT BR,SUBC,OUTDA2
BRADDR COMP6 ;SEND OUT TO SECOND WORD
ALWAYS INCOU2 ;OF DESCRIPTOR.
; MAR IS POINTING TO L.*BDF
COMP6:
;L.*BDF
;-----------------------------------------
;!1ST !BIN-!LAST! IN ! EX.MEM. !ALT.!BUF.!
;!CHAR!ARY !LINK!CORE! BITS !BUF.!ASN.!
;-----------------------------------------
BRWRTE MEMX,SELB ;IS THIS THE FINAL DESCRIPTOR?
BRSHFT
BR4 50$ ;YES. GET NEXT DESCRIPTOR CHAIN,
;IF ANY.
BRWRTE IMM,6 ;GET DESCRIPTOR OFFSET.
ALWAYS STNWDS ;STORE NEW DESCRIPTOR.
.PAGE
;PROCESSING FOR FINAL THREAD IN A DESCRIPTOR LINK.
;L.*BDF
;-----------------------------------------
;!1ST !BIN-!LAST! IN ! EX.MEM. !ALT.!BUF.!
;!CHAR!ARY !LINK!CORE! BITS !BUF.!ASN.!
;-----------------------------------------
50$: ;IS THERE AN ALTERNATE LINK
;TO THE CHAIN?
BR0 55$ ;YES.
MEM IMM,0 ;NO. ZERO ALL INDICATOR FLAGS.
RTNSUB SP.SB1,P2 ;EXIT.
55$: BRWRTE IMM,377-LX.XAL-LX.FNL ;CLEAR FLAG FOR ALTERNATE
SP BR,SELB,SP0 ;LINK PRESENT & LAST DESC..
MEM MEMX,<AANDB!SP0>
BRWRTE IMM,C.AXLP-C.XDP ;GET RELATIVE ADDRESS OF
BRWRTE BR,<ADD!SP.COR> ;DESCRIPTOR POINTER.
SP BR,SELB,SP.SAV ;SAVE OFFSET.
;
;SP0=UNIMPORTANT
;SP1=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP2=UNIMPORTANT
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;SP7=NEW DESCRIPTOR CORE POINTER
;SP10=UNIMPORTANT
;
;** CALLSB SP.SUB,ADDLTI(TO INCIN),@SP.SAV
XMTSRT: BRADDR INCIN ;REQUEST INPUT TRANSFER.
SP BR,SELB,SP1
BRADDR COMPL5 ;SET UP SUBROUTINE RETURN.
SP BR,SELB,SP.SUB
BRWRTE BR,<SELA!SP.SAV> ;RETRIEVE CORE OFFSET.
ALWAYS ADDLTI ;HAVE OFFSET IN THE BR ADDED
;TO LINE ADDRESS, AND START
;NPR IN FROM RESULT.
COMPL5: SP IBUS,INDAT1,SP3 ;STORE LINK STARTING
SP IBUS,INDAT2,SP2 ;ADDRESS.
BRADDR 60$ ;READ IN EX.MEM. BITS.
ALWAYS INCIN2
60$: SP IBUS,INDAT1,SP4 ;STORE FROM LOW BYTE.
BRWRTE IMM,0 ;GET DESCRIPTOR OFFSET.
.SBTTL STNWDS - ROUTINE TO STORE AND START A NEW DESCRIPTOR
.ENABL LSB
;+
; SUBROUTINE FOR TRANSFERRING IN THE NEW DESCRIPTOR PARAMETERS
; AND STORING THEIR POINTER'S ADDRESS IN CORE.
; USED BY BOTH RECEIVE AND TRANSMIT.
; USED BY BOTH FIRST AND OTHER ENTRIES IN A LINK.
;-
;BR=0 (NEW LINK) OR 6 (NEXT ENTRY IN LINK)
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER (SP.CRM)
;SP6=CORE POINTER (SP.COR)
;
STNWDS: SPBR BR,ADD,SP3 ;ADD OFFSET IN BR TO ADDRESS IN
OUTPUT BR,<SELB!OUTDA1> ;SP2-SP4. SAVE TO WRITE INTO
;CORE TABLE.
SPBR BR,APLUSC,SP2 ;ADD ANY CARRY.
OUTPUT BR,<SELB!OUTDA2>
C 2$ ;CARRIES INTO EX.MEM.
ALWAYS 3$
2$: BRWRTE IMM,100 ;ADD IN EX.MEM. INCREMENT.
SP BR,ADD,SP4 ;(EX.MEM. IN BITS 6&7.)
.PAGE
;
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;
; THE ADDRESS OF THE NEW CURRENT DESCRIPTOR
; IS STORED IN CORE AT THE PRIMARY BUFFER
; LOCATION AT C.*DP.
;
;SUBROUTINE CALL:
;** CALLSB SP.SUB,ADDLTO(TO INCOUT),@SP.ST
3$: BRADDR INCOUT ;REQUEST OUTPUT TRANSFER.
SP BR,SELB,SP1
BRADDR STRET1 ;SAVE RETURN POINT.
SP BR,SELB,SP.SUB
ALWAYS ADDLTO ;HAVE OFFSET IN SP.COR ADDED
;TO LINE TABLE ADDRESS, AND
;START NPR OUT TRANSFER FROM
;RESULTANT LOCATION.
STRET1: BRWRTE BR,<SELA!SP4> ;YES. STORE EX.MEM. BYTE AS
OUTPUT BR,<SELB!OUTDA1> ;DATA.
BRADDR STNWD3
ALWAYS INCOB
.PAGE
;ENTRY POINT FOR START-UP AFTER
;SETTING ON TRANSMIT SCANNER ENABLE FOR LINE.
;
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;
STNWD3: SP TWOA,SP4 ;SHIFT EX.MEM. BITS FROM
SP TWOAC,SP4 ;BITS 6&7 TO BITS 2&3.
SP TWOAC,SP4
SP TWOA,SP4
SP TWOA,SP4
;
; READ IN BUFFER ADDRESS IN CORE
; FROM DESCRIPTOR ADDRESS IN SP2-4.
;
BRWRTE SELA,SP3 ;GET STARTING ADDRESS FROM
OUTPUT BR,SELB,IBA1 ;DESCRIPTOR ADDRESS.
BRWRTE SELA,SP2 ;HIGH BYTE
OUTPUT BR,SELB,IBA2
LDMA INCA,SP.CRM ;POINT TO ADDRESS LOCATION
BRWRTE INCA,SP4,INCMAR ;IN RAM.
OUT BR,SELB,ONPR ;START WORD IN TRANSFER.
15$: BRWRTE IBUS,NPR ;FIRST WORD OF DESCRIPTOR IN?
BR0 15$ ;NOT YET.
MEMINC IBUS,INDAT1 ;YES, STORE AS NEW BUFFER
MEM IBUS,INDAT2 ;ADDRESS.
;
; READ IN BUFFER COUNT IN CORE
; FROM DESCRIPTOR ADDRESS.
;
BRADDR 20$ ;POINT TO NEXT WORD OF DES-
ALWAYS INCIN2 ;CRIPTOR, AND START TRANSFER.
20$: LDMA BR,<SELA!SP.CRM> ;POINT TO RAM AREA TO
;STORE NEW BUFFER COUNT.
;SP0=UNIMPORTANT
;SP1=UNIMPORTANT
;SP2=HIGH BYTE OF DESCRIPTOR ADDRESS
;SP3=LOW BYTE OF DESCRIPTOR ADDRESS
;SP4=DESCRIPTOR ADDRESS EX.MEM. BITS
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;
SP IBUS,INDAT1,SP0 ;STORE AS NEW BUFFER
SP IBUS,INDAT2,SP1 ;COUNT.
MEMINC BR,<DECA!SP0> ;STORE COUNT (DECREMENTED BY ONE
;FOR ALU PURPOSES).
OUTPUT BR,<DECA!OUTDA1> ;SAVE STARTING COUNT MINUS ONE.
C 21$ ;NO UNDERFLOW.
SP BR,DECA,SP1 ;UNDERFLOW. CORRECT HIGH BYTE.
21$: MEM BR,<SELA!SP1>
OUTPUT MEMI,<SELB!OUTDA2> ;STORE HIGH BYTE OF COUNT.
;STORED IN CORE ONLY ON RECEIVE SIDE.
;
; READ IN BUFFER FLAGS AND EX.MEM. IN CORE
; FROM DESCRIPTOR ADDRESS.
;
BRADDR 22$ ;POINT TO NEXT WORD OF DES-
ALWAYS INCIN2 ;CRIPTOR,AND START LAST TRANSFER IN.
;INDAT1
;-----------------------------------------
;! MODE TYPE ! ! ! ! !MODE!
;! ! ! ! ! ! ! !FLAG!
;-----------------------------------------
;INDAT2
;-----------------------------------------
;!FIN.!BIN-! ! ! EX.MEM. ! !ECO-!
;!DES.!ARY ! ! ! BITS ! !PLEX!
;-----------------------------------------
22$:
SP <IBUS!INCMAR>,INDAT2,SP1 ;EX.MEM. BITS AND BINARY AND
;FINAL DESCRIPTOR FLAGS.
BRWRTE IMM,14,INCMAR ;MASK FOR EXTENDED MEMORY BITS
SP MEMX,SELB,SP0 ;SAVE OLD FLAG VALUES.
MEM BR,AANDB,SP1
BRWRTE IMM,LX.XAL+LX.XBF ;SAVE BUFFER ASSIGNMENT
SP BR,AANDB,SP0 ;VALUES FROM OLD FLAGS.
MEM MEMX,<AORB!SP0> ;STORE BACK WITH EX.MEM. BITS.
;L.*BDF
;-----------------------------------------
;!1ST !BIN-!LAST! IN ! EX.MEM. !ALT.!BUF.!
;!CHAR!ARY !LINK!CORE! BITS !BUF.!ASN.!
;-----------------------------------------
BRWRTE IMM,<LX.FST+LR.BNR+LX.FNL+LX.XBF>
SP BR,SELB,SP0 ;STORE POSSIBLE FLAGS.
BRWRTE TWOA,SP1 ;SHIFT HIGH BYTE OF DESCR FLAGS WORD LEFT
;SETTING C BIT IF LAST DECSR FLAG WAS SET
BR7 26$ ;BINARY FLAG IS SET
BRWRTE IMM,377-LR.BNR ;IT IS NOT. SET NO FLAG FOR IT.
SP BR,AANDB,SP0
26$: C 27$ ;IS CARRY SET THEN THIS IS THE FINAL DESCR
BRWRTE IMM,377-LX.FNL ;OTHERWISE CLEAR THE BIT
SP BR,AANDB,SP0 ;..
27$: MEM MEMX,<AORB!SP0> ;ADD IN FLAGS TO INDICATOR.
BRWRTE BR,<SELA!SP.CRM> ;CALLED BY RECEPTION?
;(SP.CRM=SP.LN*20+7)
BR1 30$ ;YES.
RTNSUB SP.SB1,P2 ;NO, TRANSMISSION.
.PAGE
;SP0=UNIMPORTANT
;SP1=CONTENTS OF INDAT2
;SP2=CONTENTS OF INDAT1
;SP5=CURRENT RAM POINTER
;SP6=CORE POINTER
;
30$: LDMA BR,<SELA!SP.RM0> ;POINT TO STATUS INDICATOR.
SP IMM,200,SP0 ;START IT AS ECHOPLEX.
MEM MEMX,<AORB!SP0>
;L.STS,L.SILO
;-----------------------------------------
;!ECO/! ! !SILO! ! ! SILO !
;!FULL! ! !FULL! ! ! COUNT !
;-----------------------------------------
;INDAT2
;-----------------------------------------
;!FIN.!BIN-! ! ! EX.MEM. ! !ECO-!
;!DES.!ARY ! ! ! BITS ! !PLEX!
;-----------------------------------------
BRWRTE SELA,SP1 ;FULL-DUPLEX?
BR0 35$ ;NO, ECHOPLEX.
MEM MEMX,AXORB,SP0 ;SET FLAG TO FULL-DUPLEX.
;TURN OFF BIT 7 SET ABOVE
35$: BRADDR INCOUT ;STORE STARTING RECEIVE
SP BR,SELB,SP1 ;COUNT IN BUFFER IN PROGRESS
BRADDR STNWD5 ;AREA IN CORE.
ALWAYS ADDLT4
STNWD5: SPBR IBUS,INDAT1,SP2 ;CHANGE TO NEW MODE?
BR0 41$ ;YES.
RTNSUB SP.SB1,P2 ;RETURN TO CALLER.
;INDAT1
;-----------------------------------------
;! MODE TYPE ! ! ! ! !MODE!
;! ! ! ! ! ! ! !FLAG!
;-----------------------------------------
41$: BRWRTE IMM,L.CURM ;POINT TO CURRENT MODE INDICATOR.
LDMA BR,ADD,SP.RM0
BRWRTE IMM,37 ;STORE MASK TO CLEAR RCV. BITS.
SP MEMX,SELB,SP0
SP BR,AANDB,SP0 ;CLEAR OLD RECEIVE BITS
BRWRTE DECA,SP2 ;CLEAR NEW MODE FLAG
MEM BR,AORB,SP0 ;STORE NEW MODE.
RTNSUB SP.SB1,P2 ;RETURN TO CALLER.
.DSABL LSB
.PAGE
.SBTTL NXMERR - NONEXISTENT MEMORY ERROR
;+
; **NXMERR-ROUTINE TO REPORT A NON-EXISTENT MEMORY ERROR*
;
; INPUTS:
; SP0=IMAGE OF UBBR REGISTER
;-
NXMERR:
BRWRTE IMM,100 ;MASK TO CLEAR NXM BIT
OUT BR,AANDB,OBR ;CLEAR ALL BUT XX4 BIT
BRWRTE IMM,ER.NXM ;GET ERROR CODE
ALWAYS CNTOUT ;GENERATE A CONTROL OUT
.SBTTL PAGE THREE OFF-PAGE RETURNS
; * * * * * *
BAIN2: ALWAYS BAIN1 ;RETURN TO BUFFER ADDRESS IN ROUTINE
BAIN4: ALWAYS BAIN3 ;RETURN TO BUFFER ADDRESS IN ROUTINE
BAIN6: ALWAYS BAIN5 ;RETURN TO BUFFER ASSIGNMENT ROUTINE.
RQICL3: ALWAYS RQICL2 ;RETURN TO CLEAR BSEL2.
F1: ALWAYS F2
IDLE3: ALWAYS IDLE ;RETURN TO IDLE LOOP
; * * * * * *
$KDZML==.-$KDZMC+63./64. ;LENGTH OF MICROCODE IN 32. WORD BLOCKS
.END