Cleaned up more typos and fixed paging issues.
[retro-software/dec/tops10/v4.5.git] / src / cdrsrx.mac
1 TITLE   CDRSRX - CARD READER SERVICE FOR PDP-10(CR-10)
2 SUBTTL  T. WACHS/RCC TS  17 OCT 68  V004
3 XP      VCDRSX,004
4                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
5
6 CDRDDB: SIXBIT  /CDR/
7         XWD     36*HUNGST,34
8 CDRIOS: 0
9         CDRDSP
10         XWD     DVCDR+DVIN,10403
11         0
12         0
13 CDRIAD: XWD     PROG,0
14 CDRPTR: 0
15 CDRCTR: 0
16 CDRSUM: 0
17 CDRCHK: 0
18         EXTERN  ADVBFF,CDRCHN,CDRRET,CDRSAV,CPOPJ,CDRBTS
19         EXTERN  ILLOUT,NEWBF1,SETIOD,STOIOS,CLRACT,SETACT,ADRERR
20 CDR=150
21 ;CDRBTS=1670+CDRCHN.... CONO TO READ A CARD
22 COD029=5252             ;12-0-2-4-6-8
23 CODEOF=7400             ;12-11-0-1
24
25 ;BITS IN LH OF IOS
26 COLUM1=100
27 COLUM2=200
28 CR029=400
29 FORGET=1000
30 IGNRBT=2000
31
32
33 ENTRY   CDRSRX          ;THIS NAME LETS BUILD PICK BETWEEN 2 CDRSER'S
34 INTERN  CDRDDB,CDRINT,CDRDSP
35
36
37 ;DISPATCH TABLE
38         JRST    CDROFF+1        ;INITIALIZATION
39         JRST    CDRREL          ;HUNG DEVICE
40 CDRDSP: JRST    CDRREL          ;RELEASE
41         POPJ    PDP,            ;CLOSE
42         JRST    ILLOUT          ;OUTPUT IS ILLEGAL
43 \fCDRSRX:        TLZN    IOS,IOBEG       ;FIRST TIME THROUGH?
44         JRST    CDRGO           ;NO
45         TLZ     IOS,CR029+FORGET+IGNRBT ;YES. SET UP FOR 1ST TIME
46         TRNE    IOS,10          ;ASCII MODE?
47         JRST    .+4             ;NO
48         MOVEI   TAC,CDRASC      ;YES. SET UP FOR CODE CONVERSION
49         MOVSI   TAC1,700        ;BYTE SIZE =7
50         JRST    SETPTR
51         MOVEI   TAC,CDRBIN      ;SET UP FOR BINARY
52         TRNE    IOS,3           ;REALLY BINARY?
53         MOVEI   TAC,CPOPJ       ;IMAGE - NO PROCESSING
54         MOVSI   TAC1,1400       ;BYTE SIZE = 12
55 SETPTR: MOVEM   TAC1,CDRPTR     ;SET BYTE SIZE
56         HRRM    TAC,CDRDIS      ;AND PROCESSING LOC
57         MOVEI   TAC,770         ;SET UP INTERRUPT LOC
58         HRRM    TAC,CDRINT
59 CDRGO:  PUSHJ   PDP,NEWBF1      ;INITIALIZE NEW BUFFER
60         JRST    ADRERR          ;ADRESS ERROR
61         MOVEI   TAC,(PROG)      ;SET TO RELOCATE ADDRESS
62         ADDM    TAC,CDRPTR
63         MOVEM   PROG,USEPRG     ;SAVE PROG FOR INTERRUPT ROUTINE
64 CDRGO1: TLNE    IOS,IOEND       ;EOF?
65         JRST    EOF             ;YES. SHUT DOWN CDR
66         TLO     IOS,COLUM1+COLUM2 ;NO. INIT FOR COLUMN 1
67         MOVEI   TAC,1670        ;SET UP CONO FOR NEXT CARD
68         CONSO   CDR,400100      ;WAS TROUBLE ENCOUNTERED OR CARD READY?
69         MOVEI   TAC,370         ;YES. SET CONO FOR READY-TO-READ
70         CONO    CDR,CDRCHN(TAC) ;START CARD READER
71         TRO     IOS,IOACT       ;CANT USE SETACT AS IT ZEROES IOW
72         JRST    STOIOS          ;WHICH MAY BE ON AFTER IGNORING A CARD
73 \fEXTERN CDRCHL
74
75 CDRINT: CONSO   CDR,0           ;INTERRUPT FOR CDR?
76         JRST    .-1             ;NO. GO AWAY
77         CONSZ   CDR,270         ;MAYBE. A TRANSIENT INTERRUPT
78         JRST    CDINT1          ;YES. DEFINATELY FOR CDR
79         CONSZ   CDR,200000      ;NO. RDY-TO-RD ENABLED?
80         CONSO   CDR,100         ;AND READY-TO-READ ON?
81         JRST    CHKTRB          ;NO. CHECK FOR TROUBLE
82         CONO    CDR,CDRBTS      ;YES. TELL CDR TO START READING
83         JEN     @CDRCHL         ;AND DISMISS THE INTERRUPT
84 CHKTRB: CONSZ   CDR,400000      ;ENABLE FOR TROUBLE?
85         CONSO   CDR,400         ;AND TROUBLE OCCURRING?
86         JRST    CDRINT+1        ;NO. INTERRUPT IS NOT FOR CDR
87 CDINT1: JSR     CDRSAV          ;YES. SAVE ACS
88         MOVE    IOS,CDRIOS      ;RESTORE IOS
89         CONSO   CDR,10          ;DATA INTERRUPT?
90         JRST    NTDATA          ;NO
91         DATAI   CDR,DAT         ;YES. READ DATA
92         TLNE    IOS,FORGET+IGNRBT ;PROCESS IT?
93         JRST    CDRRET          ;NO. DISMISS INTERRUPT
94         TLZE    IOS,COLUM1      ;FIRST COLUMN?
95         JRST    FSTCOL          ;YES. MAKE SPECIAL CHECKS
96 CDRDIS: PUSHJ   PDP,.           ;NO. PROCESS PIECE OF DATA
97         IDPB    DAT,CDRPTR      ;STORE IT IN BUFFER
98         SOSLE   CDRCTR          ;ROOM FOR MORE?
99         POPJ    PDP,            ;YES. EXIT
100 IGNORE: TLO     IOS,IGNRBT      ;NO. IGNORE REST OF CARD
101 STODIS: MOVEM   IOS,CDRIOS      ;SAVE IOS
102         POPJ    PDP,            ;EXIT THE INTERRUPT
103 \f;HERE TO PROCESS A BINARY BYTE
104 CDRBIN: ADDM    DAT,CDRSUM      ;ADD 12 BITS TO CHECKSUM
105         POPJ    PDP,
106
107 ;HERE WHEN AN ASCII CHARACTER IS READ
108 CDRASC: SETZB   TAC,TAC1
109         JUMPE   DAT,CDRAS2      ;0-PICK UP AN ASCII BLANK
110         CAIN    DAT,5000
111         MOVEI   DAT,4202
112         CAIN    DAT,3000
113         MOVEI   DAT,2202
114         LDB     TAC1,[XWD 110300,DAT]
115         TRNE    DAT,3
116         TRC     TAC1,7
117         TRNE    DAT,74
118         TRO     TAC1,10
119         TRNE    DAT,314
120         TRO     TAC,2
121         TRNE    DAT,525
122         TRO     TAC,1
123         TLNN    IOS,CR029       ;AN 029 CARD READ?
124         TRO     TAC1,20         ;NO. BUMP TAC1 TO 026 TABLE
125 CDRAS2: LDB     DAT,CRCVPT(TAC) ;PICK UP ASCCII CHAR FROM TABLE
126         POPJ    PDP,            ;AND RETURN
127 \f;HERE WHEN THE 1ST COLUMN OF A CARD HES BEEN READ
128 FSTCOL: CAIN    DAT,CODEOF      ;AN EOF CARD?
129         JRST    EOFCRD          ;YES. HANDLE IT
130         TRNE    IOS,10          ;NO. ASCII CARD?
131         JRST    NOTASC          ;NO
132         CAIN    DAT,COD029      ;YES. IS IT AN 029 CARD?
133         TLO     IOS,CR029+FORGET ;TES. SET A BIT
134 SETIOS: MOVEM   IOS,CDRIOS      ;SAVE IOS
135         TLNN    IOS,FORGET      ;FORGET REST OF CARD?
136         JRST    CDRDIS          ;NO. PROCESS IT
137         JRST    CDRRET          ;YES. DISMISS INTERRUPT
138 SETFRG: TLOA    IOS,FORGET       ;SET BIT TO FORGET ABOUT CARD
139 NOTASC: TRNN    IOS,7           ;COL 1 OF A NOT ASCII CARD
140         JRST    SETIOS          ;IMAGE MODE - NO PROCESSING
141         TLZN    IOS,COLUM2      ;COLUMN1?
142         JRST    COL2IN          ;NO. COLUMN2 JUST READ
143         MOVEI   TAC,-5(DAT)     ;COL1 - IS THERE A 7-9 PUNCH?
144         TRNE    TAC,17
145         TRO     IOS,IOIMPM      ;NO. SET ERROR BIT
146         LSH     DAT,-6          ;COLUMNS 12-3 ARE WORD COUNT
147         JUMPE   DAT,SETFRG      ;FORGET CARD IF WRDCNT=0
148         PUSH    PDP,DAT         ;SAVE DAT
149         IMULI   DAT,3           ;COMPUTE ITEM COUNT
150         CAMGE   DAT,CDRCTR      ;MORE THAN THE BUFFER CAN HOLD?
151         MOVEM   DAT,CDRCTR      ;NO. SAVE AS REAL COUNT
152         POP     PDP,DAT         ;GET WRDCNT
153         HRRM    DAT,@CDRPTR     ;IN R.H. OF 1ST DATA WORD OF BUFFER
154         TLO     IOS,COLUM1      ;SET TO PICK UP COLUMN2 
155         JRST    STODIS          ;STORE IOS AND RETURN
156
157 ;HERE WHEN COL 2 OF A BINARY CARD WAS READ
158 COL2IN: MOVEM   DAT,CDRCHK      ;COLUMN2 IS CHECKSUM
159         HRLM    DAT,@CDRPTR     ;ALSO IN L.H. OF 1ST DATA WORD
160         SETZM   CDRSUM          ;ZERO COMPUTED CHKSUM
161         JRST    STODIS          ;STORE IOS AND RETURN
162 \f;HERE ON A NON-DATA CDR INTERRUPT
163 NTDATA: MOVEI   DEVDAT,CDRDDB   ;NO. SET DEVDAT
164         MOVE    PROG,USEPRG     ;RESTORE PROG
165         CONSO   CDR,20          ;END OF CARD?
166         JRST    NOTEOC          ;NO
167         TLZE    IOS,FORGET      ;YES. FORGET ABOUT CARD?
168         JRST    CDRGO1          ;YES. START READ NEXT CARD
169         TRNE    IOS,10          ;BINARY?
170         JRST    BINEOC          ;YES. CHECK CHKSUM
171         MOVEI   DAT,15          ;NO. INSERT <CR>
172         IDPB    DAT,CDRPTR
173         MOVEI   DAT,12          ;INSERT <LF>
174         IDPB    DAT,CDRPTR
175 NXTCRD: TLZ     IOS,IGNRBT      ;SET UP TO READ NEXT CARD
176         HRRZ    TAC,CDRPTR      ;LAST ADDRESS
177         MOVEI   TAC1,@CDRIAD    ;FIRST ADDRESS (-1)
178         SUBI    TAC,1(TAC1)     ;COMPUTE NUMBER OF WORDS STORED
179         HRRM    TAC,1(TAC1)     ;STORE IN 1ST WORD OF BUFFER
180         TLZE    IOS,IOW         ;IN IO WAIT?
181         PUSHJ   PDP,SETIOD      ;YES. TAKE OUT
182         PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS
183         JRST    CDROFF          ;NEXT BUFFER NOT EMPTY
184         JRST    CDRGO           ;AVAILABLE - START READ INTO IT
185
186
187 ;HERE ON THE END OF A BINARY CARD
188 BINEOC: TRNN    IOS,4           ;REALLY BINARY?
189         JRST    NXTCRD          ;IMAGE MODE 
190         MOVE    DAT,[POINT 12,CDRSUM,] ;COMPUTE CHKSUM
191         ILDB    TAC,DAT         ;BITS 0-11
192         ILDB    TAC1,DAT        ;PLUS 12-23
193         ADD     TAC,TAC1
194         ILDB    TAC1,DAT        ;PLUS 24-35
195         ADD     TAC,TAC1
196         TRZE    TAC,770000      ;OVERFLOW?
197         AOS     TAC             ;YES. ADD 1
198         CAME    TAC,CDRCHK      ;COMPARE WITH CARD'S CHKSUM?
199         TRO     IOS,IODTER      ;NO. LIGHT A BIT
200         JRST    NXTCRD          ;START READ OF NEXT CARD
201 EOFCRD: TLO     IOS,IOEND       ;EOF - LIGHT BIT
202         JRST    SETFRG          ;FORGET REST OF CARD
203 \fNOTEOC:        CONSZ   CDR,40          ;EOF BUTTON PRESSED?
204         JRST    EOF             ;YES.
205         CONSZ   CDR,400         ;TROUBLE?
206         CONO    CDR,CDRCHN      ;YES.TURN OFF TROUBLE ENABLE
207         CONSO   CDR,60200       ;ERROR EXCEPT PICK OR STOP BUTTON?
208         JRST    SETRDY          ;NO. GO SET READY-TO-READ INTERRUPT
209         TRO     IOS,IODERR      ;YES. SET  ERROR BIT
210         JRST    NXTCRD          ;ADVANCE BUFFERS, SET RDY-TO-READ
211 EOF:    TLO     IOS,IOEND+IOBEG ;EOF - LIGHT BIT
212 CDRREL: HLLZS   CDRINT          ;RESET INTERUPT LOC
213 CDROFF: CONO    CDR,10000       ;TURN OFF CDR
214         TLZE    IOS,IOW
215         PUSHJ   PDP,SETIOD      ;TAKE OUT OF IO WAIT
216         JRST    CLRACT          ;ZERO IOACT, STORE IOS AND RETURN
217
218 SETRDY: CONO    CDR,10000       ;RESET READ-A-CARD FLOP
219         JRST    CDRGO           ;ENABLE FOR READY TO READ
220 \fUSEPRG:        0
221
222 CRCVPT: XWD     350700+TAC1,CRCVTB
223         XWD     260700+TAC1,CRCVTB
224         XWD     170700+TAC1,CRCVTB
225         XWD     100700+TAC1,CRCVTB
226
227 ;CODE CONVERSION FOR THE 029 KEYPUNCH
228
229 ;THE FOLLOWING EQUIVALENCES ARE ARTIFICIALLY DEFINED
230
231 ;029 KEYTOP     ;ASCII 35       ;ASCII 37
232 ;CENT           [               [
233 ;0-8-2          ]               ]
234 ;VERT BAR       ^               HAT = L.C. VERT BAR
235 ;UNDERBAR       _               UNDERBAR
236 ;NEGATION       \               TILDE = L.C. NEGATION
237
238         ;CHARACTERS     ;ZONE/DIGITS
239 CRCVTB: ASCII / 123/    ;N/N-3
240         ASCII .0/ST.    ;0/N-3
241         ASCII /-JKL/    ;11/N-3
242         ASCII /HI[./    ;12,8/N-3
243         ASCII /&ABC/    ;12/N-3
244         ASCII /QR!$/    ;11,8/N-3
245         ASCII /YZ],/    ;0,8/N-3
246         ASCII /89:#/    ;8/N-3
247         ASCII /4567/    ;N/4-7
248         ASCII /UVWX/    ;0/4-7
249         ASCII /MNOP/    ;11/4-7
250         ASCII /<(+^/    ;12,8/4-7
251         ASCII /DEFG/    ;12/4-7
252         ASCII /*);\/    ;11,8/4-7
253         ASCII /%_>?/    ;0,8/4-7
254         ASCII /@'="/    ;8/4-7
255
256 ;CODE FOR THE 026 KEYPUNCH A LA H HYMAN
257
258         ASCII / 123/    ;N/N-3
259         ASCII .0/ST.    ;0/N-3
260         ASCII /-JKL/    ;11/N-3
261         ASCII /HI?./    ;12,8/N-3
262         ASCII /+ABC/    ;12/N-3
263         ASCII /QR:$/    ;11,8/N-3
264         ASCII /YZ;,/    ;0,8/N-3
265         ASCII /89_=/    ;8/N-3
266         ASCII /4567/    ;N/4-7
267         ASCII /UVWX/    ;0/4-7
268         ASCII /MNOP/    ;11/4-7
269         ASCII /)]<!/    ;12,8/4-7
270         ASCII /DEFG/    ;12/4-7
271         ASCII /*[>&/    ;11,8/4-7
272         ASCII /("#%/    ;0,8/4-7
273         ASCII /@^'\/    ;8/4-7
274
275
276 CDREND: END
277 \f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0