File: of Disk: Disks/Build-2007/Copy-of-m8-rka0-rkb0
(Source file text)
/LP.TK 21-MAY-80
/THIS TASK SERVES AS A LINEPRINTER BLOCKDRIVER. IT WRITES
/THE DATA IN THE DISKFILE "SPOOL.LP" ON THE SYSTEM DISK.
/INTERNAL IN THE TASK IS A SECOND TASK THAT MOVES THE DATA
/FROM THE DISKFILE TO THE LINEPRINTER.
/CONFIGURATION PARAMETERS:
LOWER=LE8E&4000
LS8E=LE8E&2000
NSPOOL=LE8E&1000
KL8E=LE8E&400
WIDTH=LE8E&376 /MAXIMUM LINE LENGTH
DKC8=LE8E&1
IFDEF DIABLO < IFZERO KL8E <LPERR,__ /DIABLO IS KL SERIAL >>
IFDEF IBMPRO < IFZERO LS8E <LPERR,__ /IBMPRO IS INTELL >>
IFDEF DIABLO < INTELL=1 >
IFDEF IBMPRO < INTELL=1 >
MASSDEV="S^100+"Y&3777 /NAME OF MASS STORAGE DEVICE
UNIT=0 /UNIT NUMBER
IFDEF SINGL8 <
IFZERO LE8E&1 < /ALL THIS FOR ZM16 REPLACEABLE LPT'S
*0
CDF 0
LPT^4+INT
6661 ///TEST LINEPRINTER FLAG
*0
CDF 0
LPT^4+INT+2
6662 ///CLEAR PRINTER FLAG
IFZERO LE8E&400 < ///FOR NORMAL INTERFACE
*0
CDF 0
LPTER^4+INT
6663 ///SKIP ON LINEPRINTER ERROR
*0
CDF 0
LPTER^4+INT+2
6667 ///DISABLE LPT INTERRUPTS >
IFNZRO LE8E&400 < ///FOR KL8E INTERFACE
*0
CDF 0
LPTER^4+INT
6651 ///SKIP ON INPUT FLAG
*0
CDF 0
LPTER^4+INT+2
6652 ///CLEAR INPUT FLAG >>
IFNZRO LE8E&1 <
*0
CDF 0
LPT^4+INT
6570 ///SKIP ON FLAG
*0
CDF 0
LPT^4+INT+2
NOP ///
*0
CDF 0
LPTER^4+INT
LPTER^4+INT+4&177+5200 ///NO ERRORS >
/// >
IFZERO NSPOOL <
*200
REQ, "L^100+"P&3777
1200 /A FIVE-PAGE TASK
XINIT, INIT /POINTER TO INITIALIZATION CODE AND BUFFER
XRTV, RTV /POINTER TO READER TRANSFER VECTOR
XTEST, TEST /ROUTINE TO TEST FOR ^Z AND ^Y
XCLDTV, CLODTV /POINTER TO CLOSE BLOCK DESCRIPTOR
LEN, 0 /NUMBER OF BLOCKS OF REQUEST
LP, JMP I XINIT //GO INITIALIZE THIS TASK. OVERLAYED WITH:
/ SNA //CLOSE OR EXIT CALL FROM WRITER ?
JMP SHUTUP //YES
DCA REQ //STORE POINTER TO USERS REQUEST PARAMETERS
DCA CLOSED //FILE IS NOW OPEN
TAD (SIGNAL HALT
DCA EXITS+1 //SETUP FOR PROPER RETURN
LP1, JMS MONITOR
RESERV RETURN CONTINUE
DCA EVENT
TAD I REQ //GET FUNCTION WORD
SMA //WRITE ?
JMP ERROR //NO, CAN'T READ FROM PRINTER
AND C3700 //EXTRACT LENGTH
BSW //
CLL IAC RAR //ROUND UP TO BLOCKS
CIA //MAKE NEGATIVE FOR COUNTING
DCA LEN //LENGTH OF TRANSFER IN BLOCKS
TAD I REQ //GET FUNCTION WORD AGAIN
AND C70 //FIELD OF BUFFER
TAD (4200+UNIT //WRITE 1 BLOCK
DCA RTV //STORE IN READ TRANSFER VECTOR
ISZ REQ
TAD I REQ //GET CORE ADDRESS
DCA RTV+1
/SEE IF THERE IS ENOUGH ROOM FOR THIS
TRY, CLA CLL //13BIT COMPARISON AHEAD
TAD COUNT //NUMBER OF BLOCKS OCCUPIED
TAD MLNGTH //COUNT-LENGTH+1
SNL CLA //OK ?
JMP GO //YES, PROCEED
JMS MONITOR //NO, WAIT A WHILE
STALL
DGNTICK //1 SECOND
JMP TRY //TRY AGAIN
/TRANSFER THE DATA TO DISK NOW:
GO, TAD FIRST
TAD INBLK //THE CURRENT INPUT BLOCK#
DCA RTV+2
CDTOIF /
TAD XRTV
JMS MONITOR
CALL
MASSDEV
JMP .-3 /LOOP ON BUSY
DCA EVNT1
JMS MONITOR
WAIT
EVNT1, 0
SZA CLA
JMP ERROR /DISK WRITE LOCK ?
CDTOIF
TAD INBLK
TAD MLNGTH /BLOCK-LENGTH+1
SZA /END OF FILE ?
TAD LENGTH /NO, BLOCK+1
DCA INBLK
ISZ COUNT /UPDATE COUNTER
TAD RTV+1
TAD (400 /UPDATE THE BUFFER ADDRESS
DCA RTV+1
JMS I XTEST /^Z IN BUFFER ?
JMP .+3 /^Z: IGNORE THE REST OF THIS TRANSFER
ISZ LEN /MORE TO DO ?
JMP TRY /YES
JMS MONITOR /START THE WRITER
RUN
TCBPW, 0 /GET TCBP OF WRITER TASK
LPHRDE, HRDERR /OK, HE'S RUNNING ALREADY
EXITS, JMS MONITOR
SIGNAL HALT
EVENT, 0
ERROR, TAD LPHRDE
JMP EXITS
SHUTUP, TAD CLOSED
SNA CLA //FILE OPEN ?
JMP CLOSE //YES, MUST BE CLOSE
TAD M4
TAD TCBPW
DCA X
CDF 0
TAD I LPHEAD
DCA I X
TAD X
DCA I LPHEAD
DCA I PNAME //CLEAR NAME TABLE ENTRY
ACM1
JMS MONITOR
EXIT SWPOUT
CLOSE, ISZ CLOSED
TAD (SIGNAL HALT CLEAR
DCA EXITS+1 /ADD CLEAR FOR FINAL RETURN
TAD XCLDTV
DCA REQ
CDTOIF
JMP LP1 /WRITE CLOSE BLOCK IN THE SPOOL FILE
END, JMS MONITOR /THIS PIECE BELONGS TO 'WRITER'
RUN
"L^100+"P&3777
LPHEAD, FHEAD /PAGE ZERO LOC = NOP
JMS MONITOR
EXIT
CLOSED, 0
MLNGTH, 0 /-LENGTH+1
LENGTH, 0 /LENGTH OF FILE
FIRST, 0
INBLK, 0
COUNT, 0
PNAME, 0
RTV, ZBLOCK 3
CLODTV, ZBLOCK 3
PAGE
YMLNGTH,MLNGTH
YLENGTH,LENGTH
YPRINT, PRINT
YCOUNT, COUNT
YFIRST, FIRST
YTCBPW, TCBPW
YEND, END
YBUF, BUFFER
YWTV, WTV
YRTV, RTV
YRTV1, RTV+1
YSKIPF, SKIPF
OUTBLK, 0
/THE OUTPUT WRITER. A SEPARATE TASK CREATED BY THE INITIALIZATION
WRITER, JMS MONITOR /TEST THE BREAK FLAG
BREAK
0
SKP /
JMP WRITR1 /NOT SET, CONTINUE
ACM1 /SET, SET SKIP FLAG TO SKIP THE REST
DCA I YSKIPF /OF THIS FILE
WRITR1, CDTOIF
TAD I YCOUNT /ANYTHING IN FILE
SNA CLA
JMP I YEND /NOTHING TO DO
TAD I YFIRST
TAD OUTBLK
DCA WTV+2 /ACTUAL BLOKNUMBER
TAD YWTV
JMS MONITOR
CALL
MASSDEV
JMP .-3 /LOOP ON BUSY
DCA .+3
JMS MONITOR
WAIT
0
CLA CLL /NO ERRORS EXPECTED
CDTOIF
JMS PRNT /OUTPUT THE STUFF
ACM1
TAD I YCOUNT
DCA I YCOUNT /UPDATE THE COUNTER
TAD OUTBLK
TAD I YMLNGTH /BLOCK-LENGTH+1
SZA /END OF FILE ?
TAD I YLENGTH /NO, BLOCK+1
DCA OUTBLK
JMP WRITER /MORE, CHECK BREAK FLAG FIRST
TEST, 0 /ROUTINE TO SCAN BUFFER FOR ^Z
CDTOIF
TAD (-401
TAD I YRTV1
DCA AUTO10 /ADDRESS OF BUFFER
TAD M200
DCA X /COUNTER
TAD I YRTV
CDTOAC /CDF TO FIELD OF BUFFER
TEST1, TAD I AUTO10
MQL /SAVE WORD
CLA MQA /GET WORD
TAD (-232
AND C177
SNA CLA /^Z ?
JMP TEST2 /YES, NON-SKIP RETURN OF TEST
CLA MQA /GET WORD AGAIN
AND (3400
TAD M400
SNA CLA /CHAR IN RANGE 220 - 237 ?
ACM1 /SET FLAG FOR NEXT BYTE
DCA FLAG
TAD I AUTO10
MQL
CLA MQA
TAD (-232
AND C177
SNA CLA
JMP TEST2
ISZ FLAG /NEED TO TEST HIGH BYTE ?
JMP TEST3 /NO
MQA /GET WORD AGAIN
AND C7400 /HIGH ORDER 4 BITS
TAD (-5000 /
SNA CLA /PART OF ^Z ?
JMP TEST2 /YES, END OF FILE DETECTED !
TEST3, ISZ X /NO, ALL BUFFER DONE ?
JMP TEST1 /NO, CYCLE
ISZ TEST /YES, NO ^Z IN THIS BUFFER (SKIP)
TEST2, CDTOIF /RETURN WITH NORMAL DATA FIELD
JMP I TEST /RETURN
PRNT, 0
TAD M200
DCA LPWC
TAD YBUF
DCA LPCA
LPLOOP, JMS LPSUB
CLL RTR
DCA PRNTEM
JMS LPSUB //SOME RECURRING INSTRUCTIONS
BSW
TAD PRNTEM
CLL RTR
JMS I YPRINT
ISZ LPWC
JMP LPLOOP
LPFINI, JMP I PRNT /RETURN
LPSUB, 0
TAD I LPCA
JMS I YPRINT
TAD I LPCA
AND C7400
ISZ LPCA
JMP I LPSUB
JMP I LPSUB
PRNTEM, 0
LPCA, 0
LPWC, 0
FLAG, 0
WTV, ZBLOCK 3
PAGE
ULFINI, LPFINI
/0
PRINT, 0
AND (377
DCA LPCHAR /SAVE 8-BIT CHAR
TAD SKIPF //SKIP THIS FILE?
SZA CLA
JMP I PRINT //YES, FLUSH
TAD LPCHAR
AND C177
IFNDEF INTELL <
SZA //SKIP NULL'S
TAD M177
SNA
JMP I PRINT //IGNORE RUBOUTS
TAD (177-33 >
IFDEF INTELL <
TAD (-33 >
SNA /ESCAPE ?
JMP LPESC /SPECIAL HANDLING?
IAC
SNA
JMP I ULFINI //^Z: IGNORE THE REST OF THE BUFFER
IAC
SNA
JMP LPEXIT //^Y: END OF FILE
TAD (31-15
SNA
JMP CRLF //CR OR LF
IAC
SNA
JMP FF //14 FF
TAD C2 //(14-12
SNA
JMP CRLF //LINE FEED
IFNDEF INTELL <
IAC //TAD (12-11
K7640, SZA CLA
JMP NOTAB
LPTAB, TAD C240
JMS LPOUT //PRINT SPACE
ISZ POS
TAD POS
AND C7
K7740, SZA CLA SMA
JMP LPTAB
JMP I PRINT
LPESC, TAD (244 /PUT $ FOR ESC
DCA LPCHAR >
NOTAB, CLL STA //
DCA FFFLG //FORMFEEDS ALLOWED FROM NOW
TAD POS
LF, TAD (-WIDTH
SMA
JMP LFEXTR
TAD (WIDTH+1 //INCREMENT POS
CRLF, DCA POS //RESET POS FOR CR AND LF
IFDEF INTELL <
LPESC, >
TAD LPCHAR
IFZERO LOWER < //IF YOUR LPT CAN'T HANDLE L.C.
TAD K7640
SMA
TAD K7740
TAD (340 / >
JMS LPOUT
IFDEF DIABLO <
ISZ DIACNT /BUFFER FULL ? >
JMP I PRINT
IFDEF DIABLO <
TAD M200 /HALF BUFFER
DCA DIACNT /RESET COUNTER
AC0003 /SEND ETX
JMS LPOUT
AC0001
LIION /ENABLE INTENA
TAD (-DGNTICK^20/16 SECONDS FOR FF BUT
JMS MONITOR /SHOULD ANSWER IN 1-2 SECONDS
WAIT
LPTER /BACK CHANNEL FROM KL
CLA /IGNORE TIMOUT
JMP I PRINT / >
LFEXTR,
M177, 7601 /CLA
TAD C215
JMS LPOUT
TAD C212
JMS LPOUT //GIVE EXTRA CR-LF
JMP LF
FF, JMS MONITOR /TEST THE BREAK FLAG
BREAK
0
JMP LPZAP /SET, SET SKIP FLAG TO SKIP THE REST
ISZ FFFLG //FORMFEED NECESARY ?
JMP I PRINT //NO
IFDEF INTELL <
JMP CRLF // >
IFNDEF INTELL <
IFZERO KL8E <
JMP CRLF // >
IFNZRO KL8E <
TAD LPCHAR //FORMFEED OUT
JMS LPOUT
TAD M100 //NOW INITIALIZE COUNTER TO 64
DCA POS //POS IS TO BE RESET ANYWAY
JMS LPOUT //GIVE SOME NULLS FOR DELAY
ISZ POS //
JMP .-2 //ALL 64
JMP I PRINT // >>
LISKIP=6661
LILOAD=6666
LIION=6665 /AC0001
LIIOF=6665 /AC0000
IFZERO LS8E <
LIIOF=6667 >
IFNZRO KL8E <
LIKLDV=6650
LISKIP=LIKLDV+11
LIION=LIKLDV+5 /AC0001
LIIOF=LIKLDV+5 /AC0000
LILOAD=LIKLDV+16 >
IFNZRO DKC8 <
LISKIP=6570
LIION=6575
LIIOF=6576
LILOAD=6574 >
IFNZRO IBMPRO <
LIIOF=6000+IBMPRO
LIION=6001+IBMPRO
LISKIP=6002+IBMPRO
LICI=6003+IBMPRO
LIRI=6004+IBMPRO
LICO=6005+IBMPRO
LISO=6006+IBMPRO
LIRO=6007+IBMPRO >
LPOUT, 0
AND C177 /SOME LINEPRINTERS LIKE THIS
IOF ///AVOID PROBLEMS
DCA LPTMP ///SAVE THE CHARACTER
LPQUICK,
IFNDEF IBMPRO <
LISKIP ///IS THE FLAG UP ALREADY (STILL)
SKP /// >
IFDEF IBMPRO <
LIRI ///READ INPUT
SPA CLA /// PRINTER READY ? >
JMP LPFAST ///YES, HURRY ON
ION ///INTERRUPTS ON AGAIN
AC0001 /FOR SOME IOTS
LIION /ENABLE PRINTER INT'S
TAD (-DGNTICK /DELAY 1 SECOND
JMS MONITOR
WAIT
LPT
SZA CLA /WAS THERE A TIME-OUT ?
JMP LPTIMO /YES
LPFAST, LIIOF /DISABLE INTERRUPTS
TAD LPTMP
IFNZRO DKC8 <
CMA /DKC8AA IS FUNNY >
LILOAD /PRINT THE CHARACTER, CLEAR THE FLAG
ION
CLA /
JMP I LPOUT
LPTIMO, LIIOF /TURN OFF LP INTENA
IOF /AND PDP8 INTENA
LILOAD /KICK LP AGAIN TO KEEP IT ALIVE
AND I 0
AND I 0
AND I 0 /DELAY 20MMS
JMP LPQUICK /AND CHECK FOR QUICK FLAG
LPZAP, ACM1 /SET THE SKIPFLAG
LPEXIT, DCA SKIPF /RESET THE SKIPFLAG
TAD C215
JMS LPOUT
TAD (214
JMS PRINT
STA
DCA FFFLG /ALLOW FF FOR NEXT JOB
JMP I ULFINI
IFDEF DIABLO <
DIACNT, -200 /HALF OF 256 CHAR BUFFER >
SKIPF, 0
POS, 0
FFFLG, -1
LPTMP, 0
LPCDF, 0
LPCHAR, 0
K231, 231 /FIRST WORD OF ^Y BUFFER
PAGE
BUFFER, /INIT AND BUFFER
ZFILE, FILE
ZTCBPW, TCBPW /ARGUMENT IN RUN-REQUEST
ZWRITER,WRITER /START ADDRESS OF WRITER TASK
ZFIRST, FIRST
ZMLNGTH,MLNGTH
ZLENGTH,LENGTH
ZLP, LP
ZBUF, BUFFER
ZWTV, WTV
ZWTV1, WTV+1
ZCLDTV, CLODTV
ZCLDT1, CLODTV+1
ZK231, K231
ZNAME, PNAME
0
INIT, SNA //CLOSE ?
JMP INCLOSE //YES, THATS EASY
DCA INIT //SAVE POINTER TO REQUEST PARAMETERS
TAD I ZMYCDF //CDF TO PARAMETERS
DCA CDF1
CDTOIF
TAD ZFILE /POINTER TO FILE LOOKUP REQUEST BLOCK
JMS MONITOR
CALL
"D^100+"I&3777
JMP .-3
SZA CLA
JMP INERROR /*** SPOOL.LP NOT FOUND ***
TAD FILE+2
CIA
DCA I ZLENGTH /LENGTH OF SPOOLFILE
TAD FILE+2
IAC
DCA I ZMLNGTH /-LENGTH+1
TAD FILE+4
DCA I ZFIRST /STARTBLOCK OF SPOOLFILE
INIT1, CDF 00
TAD I (FHEAD
SNA
JMP WAITS /NO BLOCKLET AVAILABLE
JMS DEFER
DCA I (FHEAD
TAD X
TAD (-TCBTAB /COMPUTE NAMETABLE ENTRY
CLL RTR
RAR
TAD (NAMLST
DCA ZTEM1 /POINTS IN NAMLST
TAD ("P^100+"S&3777
DCA I ZTEM1 /DROP "PS" AS NAME FOR SPOOL WRITER
ACM1
TAD X
DCA AUTO10
DCA I AUTO10 /ZERO BACKLINK
DCA I AUTO10 /ZERO THREAD
TAD ZWRITER
DCA I AUTO10 /START ADDRESS
DCA I AUTO10 /ZERO BLOCKNUMBER
RIF
DCA I AUTO10 /INSTRUCTION FIELD
TAD AUTO10
CDTOIF
DCA I ZTCBPW /TCBP OF WRITER TASK
TAD ZTEM1 /
DCA I ZNAME /AND GIVE SHUTUP A POINTER TO REMOVE IT
TAD (200+UNIT
RIF
DCA I ZWTV
TAD ZBUF
DCA I ZWTV1
TAD (4200 /WRITE ONE BLOCK
RIF /FROM THIS FIELD
DCA I ZCLDTV /THAT'S THE FUNCTION FOR CLOSE
TAD ZK231 /ADDRESS OF K231
DCA I ZCLDT1 /THAT'S THE BUFFER ADDRESS FOR CLOSE
RET, TAD (SNA
DCA I ZLP /PATCH FIRST INSTRUCTION OF TASK
CDF1, CDF //
TAD INIT
JMP I ZLP //START THE TASK
WAITS, JMS MONITOR
STALL
DGNTICK
CLA CLL
JMP INIT1
INCLOSE,ACM1
JMS MONITOR
EXIT SWPOUT
INERROR,TAD (-HRDERR-1
JMS MONITOR
EXIT SWPOUT
FILE, MASSDEV /NAME OF DEVICE HANDLER
UNIT /UNIT NUMBER
FILENAME SPOOL.LP /FILENAME
PAGE / >
IFNZRO NSPOOL <
*200
LPCA, "L^100+"P&3777
200
LPCHAR, 0
LP, SNA //CLOSE ?
JMP LPCLOSE //
JMS DEFER //GET FUNCTION WORD
AND C3700 //GET LENGTH BITS
CIA /WORDCOUNT IS NEGATIVE
DCA LPWC
TAD I X /GET FIELDBITS
AND C70
TAD C6201
DCA LPCDF
ISZ X //ADVANCE POINTER TO BUFFERADDRESS
TAD I X
DCA LPCA //SET UP CURRENT ADDRESS
JMS MONITOR
RESERV RETURN CONTINUE
DCA LPSLOT /EVENT # FOR COMPLETION
LPCDF, CDF //OVERLAID WITH CDF TO BUFFER FIELD
LPLOOP, JMS LPSUB
DCA LPCDF
JMS LPSUB //SOME RECURRING INSTRUCTIONS
CLL RTR
RTR
TAD LPCDF //ADD IN HIGHORDER BITS
RTR
RTR
JMS PRINT
ISZ LPWC
JMP LPLOOP
LPEND, JMS MONITOR
C14, SIGNAL HALT
LPSLOT, 0
LPSUB, 0
TAD I LPCA
JMS PRINT
TAD I LPCA
AND C7400
ISZ LPCA
NOP /PROTECT ISZ
JMP I LPSUB
LPCLOSE,TAD C215
JMS LPOUT
TAD C14
JMS PRINT /
ACM1
JMS MONITOR
EXIT SWPOUT
PRINT, 0
AND C177
TAD (-33
SNA /ESCAPE ?
TAD (44-33 /YES, MAKE "$
TAD (33
DCA LPCHAR
TAD LPCHAR
SZA //SKIP NULL'S
TAD M177
SNA
JMP I PRINT //IGNORE RUBOUTS
TAD (377-232
SNA
JMP LPEND //^Z
TAD (232-214
SNA
JMP FF //FORM FEED
TAD M1 //(214-215
SZA
TAD C3 //(215-212
SNA
JMP CRLF //LINE FEED
IAC //TAD (212-211
K7640, SZA CLA
JMP NOTAB
LPTAB, TAD C240
JMS LPOUT //PRINT SPACE
ISZ POS
TAD POS
AND C7
K7740, SZA CLA SMA
JMP LPTAB
JMP I PRINT
C340,
NOTAB, 7340 /CLL STA
DCA FFFLG //FORMFEEDS ALLOWED FROM NOW
TAD POS
LF, TAD (-WIDTH
SMA
JMP LFEXTR
TAD (WIDTH+1 //INCREMENT POS
CRLF, DCA POS //RESET POS FOR CR AND LF
TAD LPCHAR
IFZERO LOWER < //IF YOUR LPT CAN'T HANDLE L.C.
TAD K7640
SMA
TAD K7740
TAD C340 / >
JMS LPOUT
JMP I PRINT
LFEXTR,
M177, 7601 /CLA
TAD C212
JMS LPOUT //GIVE EXTRA LF
JMP LF
FF, ISZ FFFLG //FORMFEED NECESSARY ?
JMP I PRINT //NO
JMP CRLF
LPOUT, 0
DCA LPTMP
IFZERO DKC8 <AC0001
IFZERO KL8E <6665 /SET INTERRUPT ENABLE >>
IFNZRO KL8E <6655 /SET INTERRUPT ENABLE >
IFNZRO DKC8 <6575 /SET INTERRUPT ENABLE >
JMS MONITOR
WAIT
LPT
TAD LPTMP
IFZERO DKC8 <6666 / >
IFNZRO DKC8 <CMA
6574
6577 / >
CLA
JMP I LPOUT
LPWC, 0
POS, 0
FFFLG, 0
LPTMP, 0
PAGE /END IFNZRO NSPOOL >
$