Fixed typos.
[retro-software/dec/tops10/v4.5.git] / src / pltser.mac
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
4 \r
5 PLT=140         ;DEFINE DEVICE CODE\r
6 PLTUP=200000    ;LIFT PEN WHEN OUTPUT FINISHED\r
7 \r
8 ENTRY PLTSER\r
9 PLTSER:\r
10 \r
11 ;PLOTTER DEVICE DATA BLOCK\r
12 PLTDDB: SIXBIT /PLT/\r
13 PLTCHR: XWD HUNGST*12,^D36      ;XWD (HUNG TIMEOUT),(BUFFER SIZE)\r
14 PLTIOS: 0\r
15         PLTDSP                  ;DISPATCH TABLE ADDRESS\r
16         XWD DVOUT,14403         ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL)\r
17         0\r
18         0\r
19 PLTPTR: 0                       ;OUTPUT BYTE POINTER\r
20 PLTADR: XWD PROG,0\r
21 PLTCTR: 0                       ;OUTPUT BYTE COUNTER\r
22 \r
23 EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1\r
24 EXTERNAL SETIOD,STOIOS,CLRACT,ILLINP,PLTSAV,IADRCK\r
25 \r
26 INTERN PLTDDB,PLTINT,PLTDSP\r
27 \f;DISPATCH TABLE\r
28 \r
29         JRST PLTINT             ;INITIALIZE\r
30         JRST PLTHNG             ;HUNG DEVICE ERROR\r
31 PLTDSP: JRST PLTREL             ;RELEASE\r
32         JRST PLTCLS             ;CLOSE\r
33         JRST PLTOUT             ;OUTPUT\r
34         JRST ILLINP             ;INPUT\r
35 \r
36 PLTCLS: TLO IOS,PLTUP           ;PLOTTER END FLAG SET\r
37         MOVEM IOS,PLTIOS\r
38         JRST OUT                ;DO AN OUTPUT\r
39 \r
40 PLTINI:\r
41 PLTHNG:\r
42 PLTREL: CONO PLT,0              ;DEASSIGN PI CHANNEL, CLEAR DONE\r
43         HLLZS PLTINT            ;REMOVE PLOTTER FROM DEVICE CHAIN\r
44         POPJ PDP,\r
45 \r
46 \f;HERE BEGINS THE "OUTPUT" UUO\r
47 \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
51         TLO IOS,IO\r
52         CONO PLT,PLTCHN         ;ASSIGN PRIORITY CHANNEL\r
53         MOVSI TAC,10\r
54         HLRM TAC,PLTINT         ;PUT PLOTTER INTO DEVICE CHAIN\r
55         TLZN IOS,IOBEG          ;FIRST OUTPUT UUO?\r
56         JRST .+3                ;NO\r
57         MOVEI TAC,40            ;YES, START PLOTTER WITH PEN UP\r
58         TLZ IOS,PLTUP           ;INIT "CLOSE" BIT\r
59         MOVE IOS,PLTIOS\r
60         DATAO PLT,TAC           ;START PLOTTER BY SENDING 0 OR 40\r
61         POPJ PDP,\r
62 \f;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE\r
63 \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
67         JRST PLT1               ;NO\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
73 \r
74 PLT1:   JSR PLTSAV              ;SAVE AC'S. SET UP PUSH DOWN POINTER\r
75         MOVEI DEVDAT,PLTDDB\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
81 PLT2:   TLZE IOS,IOW\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
87 \r
88 PLTOFF: CONO PLT,0              ;SHUT DOWN PLOTTER\r
89         HLLZS PLTINT            ;REMOVE PLOTTER FROM CHAIN\r
90         PUSHJ PDP,CLRACT\r
91         TLZE IOS,PLTUP          ;HAS THE "CLOSE" BEEN DONE?\r
92         DATAO PLT,[40]          ;YES, LIFT PEN\r
93         JRST PLT2\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
96 ;       PUSHJ PDP,PLTSET\r
97 ;          RETURN 1     ;ADDRESS ERROR RETURN\r
98 ;          RETURN 2     ;GOOD RETURN\r
99 \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
117 \r
118         LIT\r
119         VAR\r
120 PLTEND: END\r