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