1 TITLE PLTSER - PLOTTER SERVICE ROUTINE
\r
2 SUBTTL T. EGGERS/GBH/TNM 20 MAY 1969 V012
\r
3 XP VPLTSR,012 ;PUT VERSION NUMBER IN STORAGE MAP AND GLOB LISTING
\r
5 PLT=140 ;DEFINE DEVICE CODE
\r
6 PLTUP=200000 ;LIFT PEN WHEN OUTPUT FINISHED
\r
11 ;PLOTTER DEVICE DATA BLOCK
\r
12 PLTDDB: SIXBIT /PLT/
\r
13 PLTCHR: XWD HUNGST*12,^D36 ;XWD (HUNG TIMEOUT),(BUFFER SIZE)
\r
15 PLTDSP ;DISPATCH TABLE ADDRESS
\r
16 XWD DVOUT,14403 ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL)
\r
19 PLTPTR: 0 ;OUTPUT BYTE POINTER
\r
21 PLTCTR: 0 ;OUTPUT BYTE COUNTER
\r
23 EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1
\r
24 EXTERNAL SETIOD,STOIOS,CLRACT,ILLINP,PLTSAV,IADRCK
\r
26 INTERN PLTDDB,PLTINT,PLTDSP
\r
29 JRST PLTINT ;INITIALIZE
\r
30 JRST PLTHNG ;HUNG DEVICE ERROR
\r
31 PLTDSP: JRST PLTREL ;RELEASE
\r
36 PLTCLS: TLO IOS,PLTUP ;PLOTTER END FLAG SET
\r
38 JRST OUT ;DO AN OUTPUT
\r
42 PLTREL: CONO PLT,0 ;DEASSIGN PI CHANNEL, CLEAR DONE
\r
43 HLLZS PLTINT ;REMOVE PLOTTER FROM DEVICE CHAIN
\r
46 \f;HERE BEGINS THE "OUTPUT" UUO
\r
48 PLTOUT: PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER
\r
49 JRST ADRERR ;ADDRESS ERR RETURN FROM PLTSET
\r
50 PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT
\r
52 CONO PLT,PLTCHN ;ASSIGN PRIORITY CHANNEL
\r
54 HLRM TAC,PLTINT ;PUT PLOTTER INTO DEVICE CHAIN
\r
55 TLZN IOS,IOBEG ;FIRST OUTPUT UUO?
\r
57 MOVEI TAC,40 ;YES, START PLOTTER WITH PEN UP
\r
58 TLZ IOS,PLTUP ;INIT "CLOSE" BIT
\r
60 DATAO PLT,TAC ;START PLOTTER BY SENDING 0 OR 40
\r
62 \f;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE
\r
64 PLTINT: CONSO PLT,10 ;PLOTTER DONE FLAG SET?
\r
65 JRST .-1 ;NO, CHAIN TO NEXT DEVICE
\r
66 SOSGE PLTCTR ;OUTPUT CHARACTERS LEFT?
\r
68 MOVEM TAC,TACSAV# ;YES, SAVE TAC
\r
69 ILDB TAC,PLTPTR ;GET NEXT CHARACTER
\r
70 DATAO PLT,TAC ;SEND CHARACTER
\r
71 MOVE TAC,TACSAV# ;RESTORE TAC
\r
72 JEN @PLTCHL ;DISMISS INTERRUPT
\r
74 PLT1: JSR PLTSAV ;SAVE AC'S. SET UP PUSH DOWN POINTER
\r
76 PUSHJ PDP,IOSET ;SETS UP PROG AND IOS
\r
77 PUSHJ PDP,ADVBFE ;ADVANCE AND LOOK AT NEXT BUFFERE
\r
78 JRST PLTOFF ;NO MORE DATA AVAILABLE
\r
79 PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER
\r
80 JRST PLTOFF ;ADDRESS ERROR RET FROM PLTSET
\r
82 PUSHJ PDP,SETIOD ;LET JOB START AGAIN
\r
83 JRST STOIOS ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE
\r
84 ;FOUND MORE DATA (IT SKIPPED), ANOTHER
\r
85 ;INTERRUPT WILL IMMEDIATELY OCCUR BUT
\r
86 ;IT WILL BE HANDLED WITHOUT GOING TO PLT1
\r
88 PLTOFF: CONO PLT,0 ;SHUT DOWN PLOTTER
\r
89 HLLZS PLTINT ;REMOVE PLOTTER FROM CHAIN
\r
91 TLZE IOS,PLTUP ;HAS THE "CLOSE" BEEN DONE?
\r
92 DATAO PLT,[40] ;YES, LIFT PEN
\r
94 \f;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR
\r
95 ;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA
\r
97 ; RETURN 1 ;ADDRESS ERROR RETURN
\r
98 ; RETURN 2 ;GOOD RETURN
\r
100 PLTSET: MOVEI TAC,@PLTADR ;GET ADDRESS OF CURRENT BUFFER
\r
101 ADD TAC,[POINT 6,1,35] ;CONVERT TO 6 BIT BYTE POINTER WITH
\r
102 ;ADDRESS OF BUFFER WORD COUNT
\r
103 TRNN IOS,16 ;IS THIS A TEST DATA MODE?
\r
104 TLO TAC,[POINT 7,0,35] ;YES, CONVERT TO 7 BIT BYTE POINTER
\r
105 MOVEM TAC,PLTPTR ;SAVE BYTE POINTER
\r
106 HRRZ TAC,@TAC ;GET BUFFER WORD COUNT
\r
107 MOVEM TAC,PLTCTR ;SAVE AS POSITIVE WORD COUNT
\r
108 ADD TAC,PLTADR ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE)
\r
109 MOVEI TAC,1(TAC) ;GET LAST ADR IN BUF (RELATIVE)
\r
110 PUSHJ PDP,IADRCK ;ADDRESS CHECK. OK?
\r
111 POPJ PDP, ;NO, OUTSIDE. RETURN WITH NO SKIP
\r
112 MOVEI TAC,6 ;IMAGE OR BIN MODES - 6 BYTES/WORD
\r
113 TRNN IOS,16 ;IS OUTPUT A TEXT MODE (0 OR 1)?
\r
114 MOVEI TAC,5 ;YES, 5 BYTES/WORD
\r
115 IMULM TAC,PLTCTR ;CHANGE WORD COUNT TO BYTE COUNT
\r
116 JRST CPOPJ1 ;RETURN WITH A SKIP
\r