Add README.md
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rka / paroff / clock.ra
1 / \ eCLOCK.RA - DK8-EP HANDLER
2 /
3 / TO ASSEMBLE DK8-EP HANDLER FOR FIRST CLOCK: NO SWITCHES
4 / TO ASSEMBLE DK8-EP HANDLER FOR 2 ND CLOCK: /1 SWITCH
5 / TO ENABLE TIME ROUTINE TO APPROPIATE CLOCK : /2 SWITCH
6 / TO ENABLE CLOCK STATUS TO GENERAL RTS ROUTINES: /3 SWITCH
7 / SO NORMALLY FOR FIRST CLOCK USE /3 SWITCH!
8 / TO ENABLE CLOCK TO SCHMITT TRIGGER EVENT USE /4 SWITCH
9 / DO NOT COMBINE /2 AND /4 SWITCHES!
10 / THIS GENERATES CLOCK4:
11 / NO PRESET TO DK8-EP
12 / MODE BITS: 11
13 / SELECT RATE: N/4096
14 / APPLICABLE FOR BOTH DK8-EP CLOCKS. BUT ONLY FOR ONE PER PROGRAM!
15 /
16 /
17 / 1.0 18-MAR-85 H.A. (COPY OF CLOCK.RA )
18 / 1.1 26-JUN-85 H.A.
19 /
20 EXTERN #DISP /SYSTEM PAGE 0,NEEDED TO
21 /PUT CLOCK STATUS ON PG0
22 /(CSTAT) FOR USE BY GEN
23 /USER CLOCK SERVICE ROUTS
24 EXTERN #T812 /RTS CPTYP
25 EXTERN ONQI /INTERRUPT QUEUER
26 /
27 IFNSW 1 <
28 ENTRY #CLINT /USER EXTENDED CLOCK ROUTINE
29 DEVICE=13*10
30 >
31 IFSW 3 <
32 CSTAT=157 /IDOCLK PUTS CLSA BITS OF FIRST CLOCK
33 /IN HERE FOR SOMEBODY ELSE
34 >
35 IFSW 2 <
36 ENTRY TIME / ENABLE TIME ROUTINE TO RTS
37 >
38 IFSW 1 <
39 ENTRY #CLIN1 /USER EXTENDED CLOCK ROUTINE
40 DEVICE=17*10
41 >
42 CLZE=6000!DEVICE /CLOCK IOTS
43 CLSK=6001!DEVICE
44 CLLR=6002!DEVICE /ALSO CLOE
45 CLAB=6003!DEVICE
46 CLEN=6004!DEVICE
47 CLSA=6005!DEVICE
48 \f BASE FTMP0
49 INDEX FCNWD
50 IFNSW 2 <
51 IFSW 1 <
52 FIELD1 #SYNC >
53 IFSW 4 <
54 FIELD1 SYNC4 >
55 >
56 IFSW 2 <
57 FIELD1 SYNC >
58 BASE FTMP0
59 INDEX FCNWD
60 JSA SETUP /HERE TO READ A STRIG
61 /INITIALIZE ARGS
62 TRAP4 DOSYNC /FCNWD (XR) HOLDS STRIG
63 /TO READ
64 XTA FCNWD /=ANS=0,1
65 FSTA% FTMP1 /GIVE ANS TO CALLER
66 JA GOBAK
67 FTMP0, F 0.0 /BASE PAGE
68 FTMP1, F 0.0
69 RPTR, 27;ADDR RTBL /PTR TO RATE TBL, ALSO
70 /USED TO FLT OVRCNT (NOTE
71 /THAT THE EXPONENT=27)
72 MINRAT, F .02 /MIN ALLOWABLE RATE
73 TOVR, F 0.0
74 IFNSW 4 <
75 IFNSW 1 <
76 NAME, TEXT +CLOCK + >
77 IFSW 1 <
78 NAME, TEXT +CLOCK1+ >
79 >
80 IFSW 4 <
81 IFNSW 1 <
82 NAME, TEXT +CLOCK4+ >
83 IFSW 1 <
84 NAME, TEXT +CLOC14+ >
85 >
86 ORG 10*3+FTMP0
87 FNOP
88 JA NAME+3
89 0
90 GOBAK, JA .
91 RTBL, F 16.0 /CONSTANT USED TO CHK FOR
92 /EXT CLK BIT IN FCNWD
93 /THIS CONST MUST BE NE 0
94 MAXRAT,
95 F4096, F 4096.0 /USED TO GET OVRFLO COUNT
96 F 100000.0 /FASTEST RATE IN HERTZ
97 F 10000.0 /NEXT FASTEST RATE
98 F 1000.0
99 F 100.0 /SLOWEST RATE
100 F 1.0 /USED BY TIME FOR EXT CLK
101 \f BASE 0
102
103 SETUP, 0;0 /HERE TO INIT ALL FPP SUBS
104 STARTD
105 FLDA 30 /PICK UP RTN TO CALLER
106 FSTA GOBAK
107 FLDA 0 /GET PTR TO CALLERS ARGS
108 SETX FCNWD /CLOCK XR AND BASE
109 SETB FTMP0
110 BASE FTMP0
111 FSTA FTMP1
112 FLDA% FTMP1,P1
113 FSTA FTMP0 /PTR TO 1ST ARG
114 FLDA% FTMP1,P2
115 FSTA FTMP1 /PTR TO 2ND ARG
116 FLDA #T812 /TELLS PDP8,PDP12
117 ATX CPTYP /0=8=DK8ES,1=12=KW12A
118 STARTF
119 FLDA% FTMP0 /=1ST ARG
120 ATX FCNWD /ALWAYS IN FCNWD
121 JA SETUP
122 \f IFNSW 4 <
123 IFNSW 2 <
124 IFNSW 1 <
125 ENTRY CLOCK
126 CLOCK, > >
127 IFSW 1 <
128 ENTRY CLOCK1
129 CLOCK1, >
130 >
131 IFSW 2 <
132 ENTRY CLOCK
133 CLOCK, >
134 IFSW 4 <
135 IFNSW 1 <
136 ENTRY CLOCK4
137 CLOCK4, >
138 IFSW 1 <
139 ENTRY CLOC14
140 CLOC14, >
141 >
142 JSA SETUP /HERE FOR CLOCK START
143 FLDA% FTMP0
144 FSUB RTBL /FCNWD IS IN FAC,IF GE 16
145 JGE ITSEXT /(RTBL=16.0) THEN USER IS
146 /REQUESTING AN EXTERNAL
147 /CLOCK I.E. B8 OF FCNWD
148 /IS SET.
149 FLDA% FTMP1 /=REQUESTED RATE IN HERTZ
150 FSUB MINRAT /.LE. MINUMUM RATE
151 JLE GOTR-2 /MEANS STOP CLOCK.
152 FADD MINRAT
153 FSUB MAXRAT /CHK FOR TOO FAST
154 JGT GOTR-2
155 LDX -4,OVRFLO /THERE ARE 4 BASIC RATES
156 LDX 1,RATE /=INDEX INTO RTBL; UPON
157 /TRAP(CLOCK) RATE=(0,
158 /2,3,4,5,6) 0=STOP,
159 /6=EXTERNAL
160 /2-5=PROGRAMMABLE RATES
161 LOP0, FLDA% RPTR,RATE+
162 /GET NEXT SLOWEST RATE
163 FDIV% FTMP1 /=REQUESTED RATE IN HZ.
164 /FAC=OVRFLO COUNT;
165 FSUB F4096 /MUST BE MODULO 12 BITS.
166 JLE GOTR /FOUND IT
167 JXN LOP0,OVRFLO+
168 LDX 0,RATE /RATE IS TOO SLOW, STOP
169 /CLOCK.
170 GOTR, FADD F4096 /RESTORE
171 FSTA TOVR
172 ATX OVRFLO /OVER FLOW COUNT
173 TRAP4 SETCLK /GO START CLOCK
174 JA GOBAK /RTN TO CALLER
175 ITSEXT, LDX 6,RATE /=RATE FOR EXT CLK
176 FLDA% FTMP1 /REQUESTED RATE IS
177 /INTERPRETED AS OVRFLO
178 JA GOTR+1 /WHEN RATE IS EXTERNAL
179 \f/MAGIC TABLE USED BY SETCLK TO SET CLOCK ENABLE
180 /BITS. EVEN NUMBERED ENTRIES ARE FOR THE DK8ES;
181 /ODD NUMBERED ONES ARE FOR THE KW12A.
182
183 CLKTBL,
184 IFNSW 4 <
185 0675 > /"STANDARD" DK BITS
186 IFSW 4 <
187 0670 > / MODE BITS 10
188 300 /STND KW BITS
189 1 /DK STRIG1 BIT
190 60 /KW STRIG1 BITS
191 2 /DK S2
192 14 /KW S2
193 4 /S3
194 P3, 3 /S3
195 40 /DK ADC ON OVR BIT
196 400 /KW ADC ON OVR BIT
197
198 /IF NOT NEXT PAGE DO ORG
199 IFNEG .-200 < ORG .-SYNC&7600+200+SYNC >
200 \fSETCLK, 0 /TRAP HERE TO START CLK
201 /THIS ROUT HANDLES BOTH
202 /DK8ES AND KW12A.
203 CLLR /STOP KW AND SET MODE 0;
204 /NOP FOR DK.
205 CLEN /CLR KW12 ENABLE OR
206 /READ DK ENABLE.
207 CLA
208 TAD P7540 /TOGGLE KW MODE 0 TO 1 TO
209 CLLR /CLR CLK COUNTER, OR SET
210 /DK ENABLE BITS, RATE FOR
211 CLA CMA /BOTH NOW=7=STOP.
212 CLZE /CLR ALL DK ENABLE BITS,
213 CLSA /CLR STATUS OF BOTH, ALL
214 CLA /IS NOW CLEAR.
215 TAD FCNTBL+1 /SET PTR TO CLKTBL FOR
216 /SETTING OF ENABLE REGS.
217 TAD CPTYP /=0 IF PDP8 =1 IF PDP12
218 DCA FCNPTR /TBL ENTRIES ALTERNATE
219 /FOR 8 AND 12. CPTYP SETS
220 /PTR TO 1ST 8 OR 1ST 12
221 /ENTRY
222 TAD IDOCLK /(AC=JMP AROUND). THE
223 /FOLLOWING IS ONCE ONLY
224 /CODE. THESE LOCS ARE
225 /SUBSEQUENTLY USED AS
226 /OPERANDS
227 DCA .-1
228 /THE TAG "ISVBIT" MUST BE
229 /IN FRONT OF THE STRIG
230 /FLAGS (STFLG) TO COVER
231 /THE ILLEGAL CASE OF
232 /STRIG 0 IN A FORT CALL
233 /TO SYNC.
234 ISVBIT, TAD CPTYP /(AC=0,1) MAKE THE INST
235 /RAR CLL (FOR DK) OR THE
236 /INST RTR CLL FOR IDOCLK;
237 STFLG, RAL CLL /BECAUSE STATUS BITS FOR
238 TAD RARCLL /STRIGS DIFFER ON DK,KW.
239 DCA LOP2+1 /SEE SUB IDOCLK.
240 /THE ABOVE 3 LOCS ARE
241 /SCHMITT TRIGGER FLAGS.
242 /THE ORDER IS S1,S2,S3
243 /FOR PDP8 AND S3,S2,S1
244 /FOR PDP12. THE MAIN
245 /REASON FOR REVERSING
246 /THE ORDER IS BECAUSE
247 /ENGINEERS NEVER CONSULT
248 /PROGRAMMERS WHEN THEY
249 /ARE BUILDING NEW
250 /HARDWARE (CHK THE STATUS
251 /BITS FOR DK AND KW).
252 JMS% KONQI+1 /PUT CLOCK ON THE
253 ITMP0, CLSK /INTERRUPT QUE
254 /VIA ONQI.
255 CLENAB, ADDR IDOCLK /THIS LOC WILL HOLD THE
256 /ENABLE BITS FOR DK,KW
257 AROUND, TAD RATE /(AC=0,2,3,4,5,6) RATE IS
258 /SET BY FPP
259 RTR CLL /START TO POSITION RATE
260 RAR /BITS. B3-B5 FOR DK
261 /B0-B2 FOR KW
262 TAD CPTYP /(THIS IS TRICKY) NEED
263 RAR /CPTYP IN LNK BECAUSE
264 /POSITION OF RATE BITS
265 /DIFFER FOR DK KW.
266 TAD% FCNPTR /AC="STANDARD"
267 /ENABLE BITS FOR DK,KW.
268 SZL /IF ITS A KW THE RATE AND
269 /AND STND BITS ARE ALREADY
270 /POSITIONED AS FOLLOWS:
271 /RRR011000000
272 /B0-B3 AND B5 WILL GO TO
273 /KW CONTROL. B4,B5 WILL
274 /GO TO ENABLE. B3 IS ADC
275 /ON OVRFLO AND MAY BE SET
276 /BELOW. B5 ON CONTROL IS
277 /MODE 1. B4 AND B5 ON
278 /ENABLE ARE BUFF PRESET TO
279 /CLOCK COUNTER AND INTRUPT
280 /ON OVRFLO RESPECTIVELY.
281 JMP NOBIT-1 /ITS KW GO PUT IN CLENAB.
282 RAR STL /ITS DK; POSITION RATE TO
283 RTR /B3-B5. NOTE THAT THE LNK
284 /(CPTYP=0) IS BEING USED.
285 CMA /NOTE ALSO THAT THE RATE
286 /AND STND BITS ARE THE 1S
287 /COMP. OF WHAT THEY SHOULD
288 /BE, IE CPTYP=LNK=0
289 /BECOMES
290 /B2=1 OF ENABLE=BUFF
291 /PRESET TO CLK CNTR ON
292 /OVERFLO. LOOK AT THE RATE
293 /BITS IN THE HANDBOOK FOR
294 /BOTH DK,KW. R2,R5
295 /FOR DK IS 100HZ, 100KHZ
296 /RESPECTIVELY. R2,R5 FOR
297 /KW IS 100KHZ,100HZ.
298 /1S COMP.OF 2=5 ETC.
299 /SMARTEN UP STEVE!
300 /THE FINAL VALUE OF THE
301 /STND DK ENABLE BITS (1ST
302 /ENTRY IN CLKTBL) IS LEFT
303 /AS AN EXERCISE FOR THE
304 /PROGRAMMER.
305 JMP NOBIT-1 /GO PUT IN CLENAB
306 LOP1, RAR CLL /ROT 1 FCN BIT INTO LNK.
307 /B7=EXT CLK AND IS
308 /IGNORED HERE. B8=ADC ON
309 /OVRFLO, B9-B11 ARE STRIG3
310 /-STRIG1 RESP. BX=1=ENABLE
311 /FCN. 0=DISABLE
312 DCA FCNWD /PUT IT BACK (FCNWD IS
313 /SET BY FPP)
314 SNL /ENABLE FCN ?
315 JMP NOBIT /NO
316 TAD% FCNPTR /GET BITS FROM THE MAGIC
317 TAD CLENAB /TABLE.
318 DCA CLENAB /UPDATE ENABLE WORD.
319 NOBIT, ISZ FCNPTR /ADV TO NEXT
320 ISZ FCNPTR /TBL ENTRY.
321 TAD FCNWD /WHEN FCNWD GOES TO 0
322 AND P17 /WE ARE ALL DONE.
323 /THE "AND" IS DONE TO
324 /PROTECT AGAINST A BAD
325 /ARG FROM THE FORT CALL.
326 /IN A FRIENDLY ENIVORN,
327 /ITS NOT NECESSARY.
328 /NEVER TRUST A FORTRAN
329 /"PROGRAMMER".
330 P7540, SMA SZA /SMA IS SUPERFLOUS TO
331 /THE ROUT; BUT IT
332 /CREATES A NICE CONST.
333 JMP LOP1 /MORE TO DO
334 DCA STFLG /CLR THE SCHMITT
335 DCA STFLG+1 /TRIGGER FLAGS.
336 DCA STFLG+2
337 TAD OVRFLO /SET BUFF PRESET
338 CIA /(FPP SET THIS ARG)
339 IFNSW 4 <
340 CLAB > / SET PRESET COUNTER
341 CLA
342 IFSW 4 < / ZERO PRESET COUNTER
343 CLAB >
344 TAD CLENAB /THIS IS FOR KW ONLY.
345 AND P377 /AC=3XX. 3= OR BUFF PRE
346 /INTO CLK CNTR AND ENAB
347 /INT ON OVRFLO.
348 /XX ARE THE STRIGS.
349 CLEN /SET KW ENABLE OR
350 CLA /READ DK ENABLE.
351 DCA OVRCNT+1 /CLR NUM OF CLK OVRFLOS
352 DCA OVRCNT /SINCE TIME 0.
353 TAD CPTYP /NEED TYPE IN ORDER TO
354 RARCLL, RAR CLL /ISOLATE CONTROL
355 TAD CLENAB /BITS FOR
356 SZL /KW ?
357 AND P7540 /YES, B0-B2 IS RATE,
358 /B3 IS ADC, B5 IS BUFF
359 /PRE TO CLK CNTR ON
360 /OVRFLO, B6 IS MOX NIX.
361 /IF DK ALL BITS MAY HAVE
362 /MEANING
363 CLLR /START THE CLOCK
364 CLA
365 CIF CDF
366 JMP% SETCLK /RTN TO RTS
367 \fDOSYNC, 0 /HERE TO DISPOSITION A
368 /A SCHMITT TRIGGER.
369 TAD CPTYP /DK AND KW FLAGS ARE IN
370 RAR CLL /REVERSE ORDER. IF DK
371 /ARG IS OK; IF KW THEN
372 /MUST SET 1=3, 2=2, 3=1
373 /TO GET INDEX TO
374 /CORRECT FLAG.
375 TAD FCNWD /=REQUESTED STRIG=1,2,3
376 /(SET BY FPP)
377 SZL /DK ?
378 CIA /NO KW
379 AND P3 /IE 1 GOES TO -1 GOES
380 /TO 3 ETC. "AND" ALSO
381 /INSURES RANGE IS 0-3.
382 /IF ARG IS 0 RESULT IS
383 /ALWAYS 0.
384 TAD KSTFLG+1 /GET PTR TO FLAG
385 DCA SETCLK
386 TAD% SETCLK /FLAG=0 IF TRIG HAS NOT
387 /TRIPPED SINCE THE LAST
388 /CALL TO SYNC; =1
389 /OTHERWISE IE RTN 0=FALSE
390 DCA FCNWD /,1=TRUE (FPP WILL PICK
391 / UP FCNWD)
392 DCA% SETCLK /CLR FLAG ANYWAY
393 CIF CDF
394 JMP% DOSYNC /RTN TO RTS
395 \f/ INTERRUPT SERVICE ROUTINE
396 /
397 IDOCLK, JMP AROUND /HERE ON CLOCK INTERRUPT
398 /(JMP AROUND IS A ONCE
399 /ONLY CONSTANT).
400 TAD KSTFLG+1 /SET PTR TO STRIG FLAGS.
401 DCA ITMP0
402 CLSA /GET CLOCK BITS.
403 IFREF CSTAT <
404 DCAZ CSTAT /SAVE THEM FOR SOME
405 TADZ CSTAT /BODY ELSE.
406 >
407 IFNDEF CSTAT <
408 JMP .+2 / WE DO NOT SAVE STATUS OF SECOND CLOCK
409 NOP >
410 SPA /OVER FLOW ?
411 ISZ OVRCNT+1 /YES BUMP LO ORD CNTR
412 SKP
413 ISZ OVRCNT /BUMP HI ORD
414 JMP DOTRIG /(HI ORD ISZ SKP IS
415 /HARMLESS)
416 LOP2, ISZ ITMP0 /ADV STRIG FLAG PTR.
417 RAR CLL /(OR RTR CLL IF KW)
418 /IE PUT STRIG BIT IN LNK.
419 /IF DK THE ORDER OF
420 /INTERROGATION IS S1,S2,S3
421 /IF KW THE ORDER IS S3,
422 /S2,S1. THE STATUS BITS
423 /FOR DK ARE ADJACENT IE
424 / B9(S3),B10(S2),B11(S1)
425 /FOR KW ITS EVERY OTHER,
426 /B6(S1),B8(S2),B10(S3).
427 DCA ISVBIT /SAVE WHATS LEFT.
428 / RAL /COPY LNK INTO FLAG IF=1
429 / SZA /IE DONT CLR FLAG WHEN
430 / DCA% ITMP0 /ITS SET.
431 /
432 SZL / HERE WE COUNT THE NUMBER OF EVENTS BETWEEN
433 ISZ% ITMP0 / CALL TO SYNC ROUTINE (NO OVERFLOW PROTECTION!)
434 ISZ% ITMP0 / HERE TO PROTECT ISZ
435 /
436 TAD ISVBIT
437 DOTRIG, AND P377 /THE "AND" INSURES THAT
438 /THE HI ORD BITS ARE
439 /CLRED SO THAT ISVBIT
440 /GOES TO 0 WHEN ALL
441 /STRIGS HAVE BEEN
442 /DISPOSITIONED. IE
443 /CLR OVRFLO BIT FOR DK,KW
444 /AND CLR PRE-EVENT BIT
445 /ON KW IF IT IS SET
446 SZA /DONE ?
447 JMP LOP2 /NO
448 TAD CLINT /CALL USER EXTENDED
449 SZA CLA /CLOCK ROUT ?
450 JMS% CLINT+1 /YES
451 JMP% IDOCLK /RTN TO IHANDL
452 \fFCNPTR,
453 OVRCNT,
454 KONQI, ADDR ONQI
455 P17, 17
456 P377, 377
457 FCNWD, 0 /FPP XRS
458 CPTYP, 0
459 RATE, 0
460 P1, 1
461 P2, 2
462 OVRFLO,
463 FCNTBL, ADDR CLKTBL
464 KSTFLG, ADDR STFLG-1
465 IFNSW 1 <
466 #CLINT, 0;0
467 CLINT= #CLINT >
468 IFSW 1 <
469 #CLIN1, 0;0
470 CLINT= #CLIN1 >
471 IFNSW 4 <
472 IFSW 2 <
473 / ENTRY TIME /FIGURE WHAT TIME IT IS
474 TIME, >
475 >
476 JSA SETUP
477 FLDA RPTR /=27;X;X IS USED TO FLOAT
478 STARTD
479 FLDA# OVRCNT /NUM OF CLK OVRFLOS SINCE
480 STARTF /TIME 0
481 FNORM
482 FMUL TOVR /=NUM OF BASIC TICKS PER
483 /CLOCK OVER FLOW.
484 /FAC=NUM OF TICKS SINCE
485 /TIME 0.
486 FDIV% RPTR,RATE /DIV BY BASIC RATE IN HZ
487 /OR 1 IF EXTERNAL CLK.
488 FSTA% FTMP0 /GIVE ANS TO CALLER, ALSO
489 /LEAVE ANS IN FAC IN
490 /CASE TIME WAS A FCN
491 /CALL. ANS=ELAPSED TIME IN
492 /SECONDS SINCE TIME 0 OR
493 /NUM OF EXTERNAL UNIT
494 JA GOBAK /TICKS
495 \f\1a