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