Added base source
[retro-software/dec/tops10/v4.5.git] / src / ptpser.mac
1 TITLE   PTPSER - PAPER TAPE PUNCH SERVICE ROUTINE\r
2 SUBTTL  /RCC  TS 15 APR 69 V401 (FROM 002)\r
3 XP      VPTPSR,401\r
4                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
5 \r
6 EXTERNAL PTPCHN, PTPSAV, ADVBFE, ITMCT1, SETIOD, SETBYT, IOSET, CKS12\r
7 EXTERNAL ILLINP,  OUT, WAIT1,PTPCHL,PIOMOD\r
8 EXTERNAL SETACTSTOIOS\r
9 INTERNAL PTPINI,PTPDSP\r
10 \r
11 ;PTP DEVICE DATA BLOCK LINKAGE\r
12 \r
13 ENTRY PTPSER\r
14 \r
15 PTPSER:\r
16 \f, PARAMETER ASSIGMENTS\r
17 \r
18 ,   PTP CONTROL REGISTER\r
19         PTPDON=10\r
20 \r
21 ,   FORMAT CONTROL\r
22         PDPFDN=200\r
23 \r
24 ,   SPECIAL IO STATUS WORD ASSIGNMENTS\r
25         IODISC=400000\r
26         PTPFED=200000\r
27         PTPEOL=20000\r
28         PTPBIN=4000     ;CHECKSUM BINARY\r
29         PTPIB=2000      ;IMAGE BINARY\r
30 \r
31 ;   SPECIAL ASCII CHARACTERS\r
32 ;   DEFINED WITH THE CORRECT PARITY\r
33         RUBOUT=377\r
34         HORTAB=11\r
35         VERTAB=213\r
36         FORMED=14\r
37 \r
38 IFN FTCHECK+FTMONP,<\r
39 EXTERNAL PTPDDB,PTPIOS,PTPPTR,PTPADR,PTPCTR,PTPCNT,PTPCHA,PTPSIO,PTPCON\r
40 >\r
41 IFE FTCHECK+FTMONP,<\r
42 ;PTP DEVICE DATA BLOCK\r
43 \r
44         INTERN PTPDDB\r
45 PTPDDB:\r
46         SIXBIT  /PTP/\r
47         XWD     ^D10*HUNGST,41\r
48 PTPIOS: 0\r
49         EXP     PTPDSP\r
50         XWD     DVPTP+DVOUT,14403\r
51         0\r
52         0\r
53 PTPPTR: 0\r
54 PTPADR: XWD     PROG,0\r
55 PTPCTR: 0\r
56 PTPCNT: 0\r
57 PTPCHA: 0\r
58 PTPSIO: 0\r
59 PTPCON: 0\r
60 >\r
61 \f,PTP SERVICE DISPATCH TABLE\r
62         JRST PTPINI     ;INITILIZE\r
63         JRST    PTPREL  ;HUNG DEVICE TIME-OUT ERROR,\r
64 PTPDSP: JRST PTPREL     ;RELEASE\r
65         JRST PTPCLS     ;CLOSE\r
66         JRST PTPOUT     ;OUTPUT\r
67         JRST ILLINP     ;INPUT\r
68 \fPTPINI:\r
69 PTPREL: CONO PTP,0\r
70         HLLZS PTPCON            ;CLEAR CONSO FLAGS BITS\r
71         POPJ PDP,               ;RETURN\r
72 \r
73 \r
74 PTPCLS: PUSHJ PDP,OUT           ;OUTPUT REMAINING BUFFERS\r
75         PUSHJ PDP,WAIT1         ;WAIT FOR IOACT=0.\r
76         MOVE IOS,PTPIOS         ;C(IOS):=C(PTPIOS)\r
77         TLO IOS,IODISC+PTPFED+IOW       ;IODISC:=IOW:=PTPFED:=1\r
78         PUSHJ PDP,SETACT        ;SET ACTIVE FLAG,STORE IOS,AND\r
79                                 ;RESET HUNG DEVICE TIMEOUT COUNT\r
80         MOVEI TAC,200\r
81         MOVEM TAC,PTRCNT        ;PTPCNT:=200\r
82         MOVEI TAC,PTPDON        ;SET CONSO FLAG\r
83         HRRM TAC,PTPCON\r
84         MOVEI TAC,PTPCHN        ;TAC:=PTPCHN,PI CHANNEL ASSIGNMENT\r
85         CONO PTP,PTPDON(TAC)    ;DONE FLAG:=1, ASSIGN PI CHANNEL\r
86         JRST WAIT1              ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED\r
87 \fPTPOUT:        TLZE IOS,IOBEG          ;VIRGIN DEVICE?> (IOBEG:=0)\r
88         JRST PTPIN0             ;YES\r
89 \r
90 PTPIN1: \r
91         TLZ IOS,IODISC          ;CLEAR DISCONNECT BIT\r
92         PUSHJ PDP,SETACT        ;SET ACTIVE FLAG,STORE IOS, AND\r
93                                 ;RESET HUNG DEVICE TIMEOUT COUNT\r
94         HRLI TAC,PTPDON         ;CONSO FLAG\r
95         HRRI TAC,PTPCHN         ;CONO FLAGS\r
96         TRO TAC,PTPDON\r
97         STARTDV PTP\r
98         POPJ PDP,               ;RETURN\r
99 \r
100 PTPIN2: LDB TAC,PIOMOD\r
101 \r
102         TLO IOS, IOFST+PTPFED+IO        ;IOFST:=PTPFED:=IO:=1\r
103         TLZ IOS,PTPBIN+PTPIB    ;CLEAR BINARY AND IMAGE BINARY BITS\r
104         CAIN TAC,IB             ;IMAGE BINARY\r
105         TLO IOS,PTPIB           ;YES\r
106         CAIN TAC,B              ;MODE=BINARY?\r
107         TLO IOS,PTPBIN          ;YES, PTPBIN:=1\r
108         MOVEI TAC,PTPFDN        ;PTPCNT:=PTPFDN\r
109         MOVEM TAC,PTPCNT\r
110         PUSHJ PDP,SETBYT        ;SETBYT\r
111         HLLM TAC,PTPPTR         ;PTPPTR0-5:=PTPPTR12-13:=0,PTPPTR6-11:=BYTE\r
112                                 ;SIZE; PTPPTR14-17:=PROG\r
113         JRST PTPIN1\r
114 \f,PUNCH INTERRUPT SERVICE\r
115 \r
116 PTPINT: CONSO PTP,@PTPCON\r
117         JRST PTPINT\r
118         MOVEM IOS,PTPSIO        ;PTPSIO:=C(IOS)  SAVE IOS\r
119         MOVE IOS,PTPIOS         ;IOS:=C(PTPIOS)\r
120         TLNE IOS,PTPFED         ;FEED REQUEST> (PTPFED=1?)\r
121         JRST PTPS2              ;YES\r
122         MOVE IOS,PTPSIO         ;RESTORE IUOS\r
123         JSR PTPSAV              ;SAVE ACS AND ESTABLISH PDP\r
124         MOVEI DEVDAT,PTPDDB\r
125         PUSHJ PDP,IOSET         ;PROG:=(JBTADR 18-35),ITEM:=C(DEVCTR)\r
126                                 ;IOS:=C(PTRIOS)\r
127         TLZE IOS,IODISC         ;DISCONNECT?  (IODISC=1?)\r
128         JRST PTPADV             ;YES\r
129         TLZE IOS,IOFST          ;IOFST=1? IOFST:=0\r
130         JRST PTP9               ;YES\r
131         TLNN IOS,PTPBIN+PTPIB   ;BINARY PUNCH MOD?\r
132         JRST PTP3               ;NO\r
133 \r
134         MOVE TAC,PTPCHA         ;BINARY OUTPUT BYTE SIZE=36\r
135         ROT TAC,6\r
136         MOVEM TAC,PTPCHA\r
137         ANDI TAC,77             ;TAC:=XX, SIXBIT SUB-BYTE\r
138         ADDI TAC,200\r
139         DATAO PTP,TAC           ;PUNCH 2XX\r
140         SOSL PTPCNT             ;C(PTPCNT):=C(PTPCNT)-1,   WORD DONE?\r
141         JRST PTPXIT             ;NO\r
142         SOSL PTPCTR             ;C(PTPCTR):=C(PTPCTR)-1,   ITEM COUNT < 0?\r
143         JRST PTPB1              ;NO\r
144         TLNE IOS,PTPIB          ;IMAGE BINARY?\r
145         TLOA IOS,IODISC         ;YES, SUPPRESS TAPE FEED.\r
146         TLO IOS,IODISC+PTPFED   ;IODISC:=PTPFED:=1\r
147         MOVEI TAC,10\r
148         MOVEM TAC,PTPCNT        ;PTPCNT:=10\r
149         JRST PTPXIT\r
150 \r
151 PTPB1:  MOVEI TAC,5             ;PTPCNT:=5\r
152         MOVEM TAC,PTPCNT\r
153         MOVE DAT,@PTPPTR        ;PTPCHA:=OUTPUT DATA WORD\r
154         AOS PTPPTR              ;PTRPTR:=C(PTRPTR)+1. ADVANCE ITEM POINTER.\r
155         MOVEM DAT,PTRCHA\r
156         JRST PTPXIT\r
157 \fPTP3:  DATA PTP,PTPCHA         ;PUNCH CHARACTER\r
158         TRNE IOS,14             ;IS MODE AN ALPHA MODE\r
159         JRST PTP1               ;NO\r
160         MOVE DAT,PTPCHA\r
161         CAIE DAT,HORTAB         ;HORIZONTAL OR VERTICAL TAB?\r
162         CAIN DAT,VERTAB\r
163         JRST PTPP1              ;YES\r
164         CAIE DAT,FORMFD         ;FORM FEED?\r
165         JRST PTP1               ;NO\r
166         TLO IOS,PTPFED+PTPEOL   ;PTPFED:=PTPEOL:=1\r
167         MOVEI DAT,20\r
168         MOVEM DAT,PTPCNT        ;PTPCNT:=20\r
169         JRST PTPXIT\r
170 \f       EXTERNAL PEVEN8         ;IN IOCSS, FOR PARITY IN ASCII\r
171 \r
172 PTP1:   SOSGE   PTPCTR          ;C(PTPCTR):=C(PTPCTR)-1,  IS C(PTPCTR)<0?\r
173         JRST PTP5               ;YES\r
174         ILDB TEM,PTPPTR         ;TEM:=OUTPUT ITEM\r
175         LDB TAC,PIOMOD\r
176         CAIN TAC,I              ;MODE=IMAGE?\r
177         JRST PTP6               ;YES\r
178         IORI TEM,200            ;NO, INSERT EIGHTH HOLD\r
179         TRNN    TAC,14          ;AN ASCII MODE?\r
180         PUSHJ   PDP,PEVEN8      ;YES, TURN EIGHTH HOLE OFF IF\r
181                                 ; APPROPRIATE TO GET EVEN PARITY\r
182         JUMPE   TEM,PTP1        ;IF AN ASCII NULL, IGNORE IT\r
183                                 ; THEY ARE PUT IN BY PTPFED STUFF\r
184                                 ; ELSE FALL INTO PTP6\r
185 \r
186 PTP6:   MOVEM TEM,PTPCHA        ;PTPCHA:=OUTPUT ITEM\r
187         JRST PTPXIT\r
188 \r
189 PTPS2:  CLEARM  PTPCHA          ;PUNCH FEED\r
190         DATAO PTP,PTPCHA\r
191         SOSG PTPCNT             ;COUNT FEED LINES\r
192         TLZ IOS,PTPFED          ;PTPFED:=0\r
193         MOVEM IOS, PTPIOS       ;PTPIOS:=C(IOS)\r
194         MOVE IOS,PTPSIO         ;RESTORE IOS\r
195         JEN @PTPCHL             ;DISMISS\r
196 \r
197 \r
198 PTP5:   TLO IOS,IODISC          ;IODISC:=1\r
199         JRST PTPXIT\r
200 \r
201 PTPBN:  HRRZ TAC1,PTPADR        ;TAC1:=BUFFER ADDRESS\r
202         PUSHJ PDP,CKS12         ;TAC:=CALCULATE CHECKSUM\r
203         ADD TAC1, PTPADR\r
204         HLLM TAC,@TAC1          ;STORE CHECKSUM IN LEFT HALF OF FIRST BUFFER WORD,\r
205 \r
206         JRST PTPB1\r
207 \fPTPADV:        PUSHJ PDP,ADVBFE        ;ADVANCE BUFFER\r
208         JRST PTPDSC             ;EXIT1.  NEXT BUFFER EMPTY\r
209         TLZE IOS,IOW            ;IN A WAIT?  IOW:=0\r
210         PUSHJ PDP,SETIOD        ;YES.  IOWS:=1\r
211 PTP9:   TLZ IOS,IOFST           ;IOFST:=0\r
212         MOVE TAC,PTPADR\r
213         AOS TAC\r
214         HRRM TAC,PTPPTR         ;PTPTR18-35:=C(PTPADR18-35)+1\r
215         HRRZ ITEM,@TAC          ;ITEM:=WORD COUNT\r
216         LDB TAC1,PTP91          ;PICK UP BYTE SIZE\r
217         PUSHJ PDP,ITMCT1        ;ITEM:=WORD COUNT*[36/BYTE SIZE]\r
218         MOVEM ITEM,PTPCTR       ;PTPCTR:=C(ITEM)\r
219         JUMPE ITEM,PTPADV       ;IS ITEM COUNT=0?\r
220         TLNE IOS,PTPBIN         ;BINARY PUNCH MODE?\r
221         JRST PTPBN              ;YES\r
222         TLNN IOS,PTPIB          ;IMAGE BINARY?\r
223         JRST PTP1\r
224         AOS PTPPTR              ;YES\r
225 \r
226         SOS PTPCTR\r
227         JRST PTPB1\r
228 \r
229 PTP91:  POINT 6,PTRPTR,11\r
230 \r
231 PTRP1:  MOVEI DAT,RUBOUT        ;PTPCHA:=RUBOUT\r
232         MOVEM DAT,PTPCHA        \r
233         TLO IOS,PTPEOL          ;PTPEOL:=1\r
234         JRST PTPXIT\r
235 \r
236 PTPDSC: PUSHJ PDP,PTPREL        ;CLEAR PTP CONTROL REG AND CONSO BITS\r
237         TRZ IOS,IOACT           ;IOACT:=0\r
238         TLO IOS,IOFST           ;IOFST:=1\r
239         TLZE IOS,IOW            ;IN A WAIT?  IOW:=0\r
240         PUSHJ PDP,SETIOD        ;YES.  IOWS:=1\r
241 \r
242 PTPXIT: JRST STOIOS             ;STORE IOS, RESET HUNG TIMEOUT COUNT AND\r
243                                 ;DISMISS INTERRUPT\r
244 \r
245 END\r
246 \f\r