!**************
!* DUP11E *
!*DA:10.APR.80*
!* FOR DU11 *
!**************
CONTROL K'100001'; ! 'SYSTEM' PROGRAM AND
! TRUSTED PROG
RECORDFORMAT PARF(INTEGER TYPE, ADDRESS, LEN)
EXTERNALROUTINE DUP11E(RECORD (PARF) NAME P)
SYSTEMROUTINESPEC MAPHWR(INTEGER SEG)
SYSTEMINTEGERFNSPEC GETID
SYSTEMROUTINESPEC LINKIN(INTEGER SER)
SYSTEMINTEGERFNSPEC MAP ABS(INTEGER ADR, LEN, REQ ID)
PERMINTEGERFNSPEC SVC(INTEGER EP, P0, P1)
RECORDFORMAT PF(BYTEINTEGER SER, REPLY, INTEGER A1, A2, A3)
RECORDFORMAT DUP11F(INTEGER RCS, RDB, TCS, TDB)
OWNRECORD (DUP11F) NAME DUP = 1; ! SET UP BY PROT ON INITIALISE
RECORDFORMAT DESF(INTEGER PT, BYTEINTEGER STATE, S1, C
INTEGER MAX LEN, P1, FLAG, SEG, SA, VEC)
RECORDFORMAT DES2F(RECORD (DESF) RX, TX)
RECORDFORMAT PAR2F(INTEGER TYPE, RECORD (DUP11F) NAME ADDRESS,LEN)
RECORDFORMAT R1F(INTEGER N)
RECORDFORMAT R2F(RECORD (DES2F) NAME DES)
RECORD (PAR2F) NAME P2
OWNRECORD (DES2F) NAME DES
RECORD (R1F) R1; RECORD (R2F) NAME R2
CONSTINTEGER INITIALISE = 0
CONSTINTEGER LINE INPUT = 1
CONSTINTEGER LINE OUTPUT = 2
CONSTINTEGER INPUT HERE = 3
CONSTINTEGER OUTPUT DONE = 4
CONSTINTEGER MARK = K'377'
CONSTINTEGER RSET=K'100',DSR=K'1000',DTR=2,RTS=4,CTS=K'20000'
CONSTINTEGER DCD=K'10000',RXEN=K'20',TXEN=K'20',DLEN=K'40'
CONSTINTEGER PARM = K'036062'; ! MODE=BYTE, NO CRC
CONSTINTEGER TSOM = K'400', TEOM = K'1000'
OWNINTEGER TX REPLY, RX REPLY
ROUTINESPEC OCTAL(INTEGER N)
SWITCH TYPESW(INITIALISE:OUTPUT DONE)
OWNINTEGER TYPE, F, CAD, OSEG, I, X
OWNINTEGER PAR, MID, PAD
OWNINTEGERARRAY RADDR(0:7)
-> TYPE SW(P_TYPE)
TYPE SW(INITIALISE):
MID = GET ID
MAPHWR(3)
P2 == P
DUP == P2_ADDRESS
CYCLE I = 1, 1, 7; ! FIND ABSOLUTE ADDRESSES
RADDR(I) = MAP ABS(I<<13, 256, MID); ! MY ADDRESSES
F = MAP ABS(I<<13, 0, MID); ! AND OFF AGAIN
REPEAT
X = SVC(22, 0, 0); ! MAP TO DUP DESCRIPTOR AREA
R2 == R1
R1_N = X&K'77'; ! JUST THE PAGE DISPLACEMENT
DES == R2_DES
DES_RX_VEC = K'160000'!(P_ADDRESS&K'17777')
DES_TX_VEC = DES_RX_VEC
DUP_RCS = RSET
DUP_RDB = PARM
DUP_RCS = DUP_RCS!DTR
WHILE DUP_RCS&DSR = 0 CYCLE ; REPEAT
DUP_RCS = DUP_RCS!RTS
WHILE DUP_RCS&CTS = 0 CYCLE ; REPEAT
WHILE DUP_RCS&DCD = 0 CYCLE ; REPEAT
DUP_RCS = DUP_RCS!RXEN!K'100'
RETURN
TYPE SW(OUTPUT DONE):
! TRANSMITTER
TYPE = LINE OUTPUT
IF DES_TX_FLAG < 0 OR TXREPLY = 0 START
!! TRANSMITTER ERROR
PRINTSTRING('TX ERROR
')
P_LEN = 1
ELSE
P_LEN = 0
FINISH
P_TYPE = LINE OUTPUT
TXREPLY = 0
RETURN
TYPE SW(INPUT HERE):
!! RECEIVER INTERRUPT
X = DES_RX_FLAG
IF X < 0 OR RX REPLY = 0 START
F = X; ! LOWER LEVEL INFORMS TYPE
ELSE
F = DES_RX_PT-CAD
! NUMBER OF BYTES TRANS
IF F> 2000 START
PRINTSTRING("DUP NASTY:")
OCTAL(DUP_RCS); SPACE; OCTAL(CAD); SPACE; OCTAL(F);NEWLINE
FINISH
FINISH
P_TYPE = LINE INPUT
P_ADDRESS = PAD; ! PASS BLOCK ADDRESS BACK
P_LEN = F
RX REPLY = 0
RETURN
TYPE SW(LINE INPUT):
!! USER CALL
!! READ REQUEST
IF RX REPLY # 0 THEN -> ABORT
RXREPLY = MID
PAD = P_ADDRESS
! PAR = MAP ABS(PAD, P_LEN, RXREPLY)
PAR = RADDR(PAD>>13)
IF PAR = 0 THEN -> ABORT
CAD = PAD&K'17777'!K'140000'; ! IN SEG NO 6
DES_RX_MAX LEN = P_LEN
DES_RX_SEG = PAR
DES_RX_PT = CAD
RETURN
TYPE SW(LINE OUTPUT):
!! OUTPUT REQUEST
IF TX REPLY # 0 THEN -> ABORT
TX REPLY = MID
OSEG = P_ADDRESS
! PAR = MAP ABS(OSEG, P_LEN, TX REPLY)
PAR = RADDR(OSEG>>13)
IF PAR = 0 THEN -> ABORT
DES_TX_SEG = PAR
DES_TX_PT = P_ADDRESS&K'17777'!K'140000'; ! IN SEG NO 6
DES_TX_SA = P_LEN; ! LENGHT IN CHARS
DES_TX_STATE = 1; ! TELL IT TO EXPECT INTS
DUP_TCS = DUP_TCS!TXEN
DES_TX_P1 = 7; ! STUFF PAD COUNTER
DUP_TDB = MARK+TSOM; ! PLANT CHAR
DUP_TCS = DUP_TCS!K'100'; ! NOW ALLOW INTS
RETURN
ABORT:
PRINTSTRING('DUP FAIL
')
CYCLE ; REPEAT
ROUTINE OCTAL(INTEGER N)
INTEGER I
PRINTSYMBOL((N >> I)&7+'0') FOR I = 15, -3, 0
END
END
ENDOFFILE