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
30 JRST PLTINI ;INITIALIZE
\r
31 JRST PLTHNG ;HUNG DEVICE ERROR
\r
32 PLTDSP: JRST PLTREL ;RELEASE
\r
37 PLTCLS: TLO IOS,PLTUP ;PLOTTER END FLAG SET
\r
39 JRST OUT ;DO AN OUTPUT
\r
43 PLTREL: CONO PLT,0 ;DEASSIGN PI CHANNEL, CLEAR DONE
\r
44 HLLZS PLTINT ;REMOVE PLOTTER FROM DEVICE CHAIN
\r
47 ;HERE BEGINS THE "OUTPUT" UUO
\r
49 PLTOUT: PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER
\r
50 JRST ADRERR ;ADDRESS ERR RETURN FROM PLTSET
\r
51 PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT
\r
53 CONO PLT,PLTCHN ;ASSIGN PRIORITY CHANNEL
\r
55 HLRM TAC,PLTINT ;PUT PLOTTER INTO DEVICE CHAIN
\r
56 TLZN IOS,IOBEG ;FIRST OUTPUT UUO?
\r
58 MOVEI TAC,40 ;YES, START PLOTTER WITH PEN UP
\r
59 TLZ IOS,PLTUP ;INIT "CLOSE" BIT
\r
61 DATAO PLT,TAC ;START PLOTTER BY SENDING 0 OR 40
\r
63 \f;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE
\r
65 PLTINT: CONSO PLT,10 ;PLOTTER DONE FLAG SET?
\r
66 JRST .-1 ;NO, CHAIN TO NEXT DEVICE
\r
67 SOSGE PLTCTR ;OUTPUT CHARACTERS LEFT?
\r
69 MOVEM TAC,TACSAV# ;YES, SAVE TAC
\r
70 ILDB TAC,PLTPTR ;GET NEXT CHARACTER
\r
71 DATAO PLT,TAC ;SEND CHARACTER
\r
72 MOVE TAC,TACSAV# ;RESTORE TAC
\r
73 JEN @PLTCHL ;DISMISS INTERRUPT
\r
75 PLT1: JSR PLTSAV ;SAVE AC'S. SET UP PUSH DOWN POINTER
\r
77 PUSHJ PDP,IOSET ;SETS UP PROG AND IOS
\r
78 PUSHJ PDP,ADVBFE ;ADVANCE AND LOOK AT NEXT BUFFER
\r
79 JRST PLTOFF ;NO MORE DATA AVAILABLE
\r
80 PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER
\r
81 JRST PLTOFF ;ADDRESS ERROR RET FROM PLTSET
\r
83 PUSHJ PDP,SETIOD ;LET JOB START AGAIN
\r
84 JRST STOIOS ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE
\r
85 ;FOUND MORE DATA (IT SKIPPED), ANOTHER
\r
86 ;INTERRUPT WILL IMMEDIATELY OCCUR BUT
\r
87 ;IT WILL BE HANDLED WITHOUT GOING TO PLT1
\r
89 PLTOFF: CONO PLT,0 ;SHUT DOWN PLOTTER
\r
90 HLLZS PLTINT ;REMOVE PLOTTER FROM CHAIN
\r
92 TLZE IOS,PLTUP ;HAS THE "CLOSE" BEEN DONE?
\r
93 DATAO PLT,[40] ;YES, LIFT PEN
\r
96 ;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR
\r
97 ;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA
\r
99 ; RETURN 1 ;ADDRESS ERROR RETURN
\r
100 ; RETURN 2 ;GOOD RETURN
\r
102 PLTSET: MOVEI TAC,@PLTADR ;GET ADDRESS OF CURRENT BUFFER
\r
103 ADD TAC,[POINT 6,1,35] ;CONVERT TO 6 BIT BYTE POINTER WITH
\r
104 ;ADDRESS OF BUFFER WORD COUNT
\r
105 TRNN IOS,16 ;IS THIS A TEST DATA MODE?
\r
106 TLO TAC,(POINT 7,0,35) ;YES, CONVERT TO 7 BIT BYTE POINTER
\r
107 MOVEM TAC,PLTPTR ;SAVE BYTE POINTER
\r
108 HRRZ TAC,@TAC ;GET BUFFER WORD COUNT
\r
109 MOVEM TAC,PLTCTR ;SAVE AS POSITIVE WORD COUNT
\r
110 ADD TAC,PLTADR ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE)
\r
111 MOVEI TAC,1(TAC) ;GET LAST ADR IN BUF (RELATIVE)
\r
112 PUSHJ PDP,IADRCK ;ADDRESS CHECK. OK?
\r
113 POPJ PDP, ;NO, OUTSIDE. RETURN WITH NO SKIP
\r
114 MOVEI TAC,6 ;IMAGE OR BIN MODES - 6 BYTES/WORD
\r
115 TRNN IOS,16 ;IS OUTPUT A TEXT MODE (0 OR 1)?
\r
116 MOVEI TAC,5 ;YES, 5 BYTES/WORD
\r
117 IMULM TAC,PLTCTR ;CHANGE WORD COUNT TO BYTE COUNT
\r
118 JRST CPOPJ1 ;RETURN WITH A SKIP
\r