|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 26112 (0x6600) Types: TextFileVerbose Names: »fefpalst«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »fefpalst«
\f fefpalst 81.05.13. 13.10. page 1 10 1 PROCESS fpadriver( 20 2 VAR sem : ! ts_pointer; level, blocktime : integer; rec: boolean; 30 3 op : sempointer); 40 4 50 5 CONST 60 6 version = "vers 1.01 /"; 70 7 polltime =156; pollexp=6; (* 9.984sec *) 80 8 90 9 sensecom = 0; 100 10 resetcom = 4; 110 11 autocom = 8; 120 12 timeransw = 5; 130 13 readcom = 1; 140 14 writecom = 2; 150 15 writereadcom= 3; 160 16 170 17 ok_result = 0; 180 18 rejected = 1; 190 19 soft_error= 2; 200 20 (* *) parity = 8; 210 21 (* *) timeout =16; 220 22 (* *) combined_write =32; 230 23 (* *) blocklength_error =64; 240 24 (* *) receiver_not_ready=128; 250 25 hard_error= 3; 260 26 (* *) disconnected = 8; 270 27 (* *) reset =16; 280 28 (* *)(*combined_write =32*) 290 29 (* *) autoload =64; 300 30 unintelligible= 4; 310 31 (* *) bad_message = 8; 320 32 (* *)(*combined_write =32*) 330 33 340 34 small_size=08; 350 35 medium_size= 2*64(*messbufsize*) - 6(*fi,la,ne*); 360 36 large_size= 2*120(*testbufsize*) - 6(*fi,la,ne*); 370 37 max_size =2*large_size;; 380 38 small_max =small_size + 5; 390 39 medium_max=medium_size+ 5; 400 40 large_max =large_size + 5; 410 41 420 42 TYPE 430 43 priority_table=PACKED ARRAY(ok_result..unintelligible) OF 0..7; 440 44 stype=PACKED RECORD 450 45 ! uu1: 0..1023; 460 46 ! ctmo,uu2: 0..1; \f fefpalst 81.05.13. 13.10. page 2 470 47 ! stp:0..7; 480 48 ! prty: 0..1; 490 49 END; 500 50 510 51 smallbuf=RECORD first,last,next: integer; 520 52 ! c: PACKED ARRAY (6..small_max) OF byte; 530 53 END; 540 54 550 55 mediumbuf= RECORD first,last,next: integer; 560 56 ! c: PACKED ARRAY (6..medium_max) OF byte; 570 57 END; 580 58 590 59 largebuf= RECORD first,last,next: integer; 600 60 ! c: PACKED ARRAY (6..large_max) OF byte; 610 61 END; 620 62 630 63 640 64 CONST 650 65 660 66 reset_dev = 0; 670 67 auto = 1; 680 68 repint = 2; 690 69 startread = 3; 700 70 710 71 small_top = small_max + 1 ; 720 72 medium_top = medium_max + 1; 730 73 large_top = large_max + 1; 740 74 min_data = 3; 750 75 small_data = small_size DIV 2 + min_data; 760 76 medium_data= medium_size DIV 2+ min_data; 770 77 large_data = large_size DIV 2 + min_data; 780 78 max_data = max_size DIV 2 + min_data; 790 79 800 80 priority = priority_table(0,6,3,4,5); 810 81 820 82 VAR 830 83 w, result, result_modif : integer; 840 84 dev,msg,mw,m: reference; 850 85 s: stype; 860 86 resetmode: boolean:=true; 870 87 880 88 headpool: pool 1; 890 89 z : zone; 900 90 910 91 PROCEDURE readram(VAR w: byte;i: integer); EXTERNAL; 920 92 PROCEDURE writeram(i,w: integer); EXTERNAL; \f fefpalst 81.05.13. 13.10. page 3 930 93 PROCEDURE outwordclr(w: integer; VAR dev: reference); EXTERNAL; 940 94 PROCEDURE controlclr(w: integer; VAR dev: reference); EXTERNAL; 950 95 PROCEDURE control(w: integer; VAR dev: reference); EXTERNAL; 960 96 PROCEDURE inword(VAR w: integer; VAR dev: reference); EXTERNAL; 970 97 PROCEDURE sense(VAR s: stype; w: integer; VAR dev: reference); EXTERNAL; 980 98 990 99 PROCEDURE set_result(res, modif : integer); 1000 100 VAR p1, p2 : integer; 1010 101 BEGIN 1020 102 1 ! p1 := priority(res); 1030 103 2 ! p2 := priority(result); 1040 104 3 ! IF res = hard_error THEN resetmode := true; 1050 105 4 ! IF p1 > p2 THEN 1060 106 5 ! BEGIN 1070 107 6 ! ! result := res; 1080 108 7 ! ! result_modif := modif; 1090 109 8 ! END ELSE 1100 110 9 ! IF p1 = p2 THEN 1110 111 10 ! IF modif > 0 THEN 1120 112 11 ! IF (result_modif DIV modif) MOD 2 = 0 THEN 1130 113 12 ! result_modif := result_modif + modif; 1140 114 13 END (* procedure to set actual result of operation *) ; 1150 115 1160 116 PROCEDURE write(b: boolean); 1170 117 VAR size, r : integer; 1180 118 data : boolean; 1190 119 BEGIN 1200 120 1 ! w := msg^.u3; 1210 121 2 ! size:= msg^.size; 1220 122 3 ! r := ok_result; 1230 123 4 ! WHILE (size>0) AND (r=ok_result) DO 1240 124 5 ! BEGIN 1250 125 6 ! ! IF size >= small_data THEN 1260 126 7 ! ! BEGIN 1270 127 8 ! ! ! IF size < medium_data THEN 1280 128 9 ! ! ! LOCK msg AS d: smallbuf DO WITH d DO 1290 129 10 ! ! ! BEGIN 1300 130 11 ! ! ! ! IF b THEN next:=last+1; 1310 131 12 ! ! ! ! IF next>first THEN 1320 132 13 ! ! ! ! IF (first>=6) AND (next<=small_top) THEN 1330 133 14 ! ! ! ! BEGIN 1340 134 15 ! ! ! ! ! outwordclr(w,dev); w:=c(next-1); 1350 135 16 ! ! ! ! ! outbyteblock(next,first,next-2,msg,dev); 1360 136 17 ! ! ! ! END ELSE r:=unintelligible; 1370 137 18 ! ! ! END ELSE 1380 138 19 ! ! ! IF size < large_data THEN \f fefpalst 81.05.13. 13.10. page 4 1390 139 20 ! ! ! LOCK msg AS d: mediumbuf DO WITH d DO 1400 140 21 ! ! ! BEGIN 1410 141 22 ! ! ! ! IF b THEN next:=last+1; 1420 142 23 ! ! ! ! IF next>first THEN 1430 143 24 ! ! ! ! IF (first>=6) AND (next<=medium_top) THEN 1440 144 25 ! ! ! ! BEGIN 1450 145 26 ! ! ! ! ! outwordclr(w,dev); w:=c(next-1); 1460 146 27 ! ! ! ! ! outbyteblock(next,first,next-2,msg,dev); 1470 147 28 ! ! ! ! END ELSE r:=unintelligible; 1480 148 29 ! ! ! END ELSE 1490 149 30 ! ! ! IF size <= max_data THEN 1500 150 31 ! ! ! LOCK msg AS d: largebuf DO WITH d DO 1510 151 32 ! ! ! BEGIN 1520 152 33 ! ! ! ! IF b THEN next:=last+1; 1530 153 34 ! ! ! ! IF next>first THEN 1540 154 35 ! ! ! ! IF (first>=6) AND (next<=large_top) THEN 1550 155 36 ! ! ! ! BEGIN 1560 156 37 ! ! ! ! ! outwordclr(w,dev); w:=c(next-1); 1570 157 38 ! ! ! ! ! outbyteblock(next,first,next-2,msg,dev); 1580 158 39 ! ! ! ! END ELSE r:=unintelligible; 1590 159 40 ! ! ! END ELSE r := unintelligible; 1600 160 41 ! ! END ELSE r := unintelligible; 1610 161 42 ! ! REPEAT pop(m,msg); data:=m^.size<>0; push(m,mw) UNTIL data; 1620 162 43 ! ! IF nil(msg) THEN size := 0 ELSE size := msg^.size; 1630 163 44 ! END; 1640 164 45 ! WHILE NOT nil(mw) DO BEGIN pop(m,mw); push(m,msg) END; 1650 165 46 ! outwordclr(256+w,dev); controlclr(repint,dev); 1660 166 47 ! IF r <> ok_result THEN set_result(r,0); 1670 167 48 END; 1680 168 1690 169 PROCEDURE read; 1700 170 VAR size, r : integer; 1710 171 data : boolean; 1720 172 BEGIN 1730 173 1 ! controlclr(startread,dev); 1740 174 2 ! IF own.timer>0 THEN 1750 175 3 ! BEGIN 1760 176 4 ! ! inword(w, dev); 1770 177 5 ! ! msg^.u3 := w MOD 256; 1780 178 6 ! ! size := msg^.size; 1790 179 7 ! ! r := ok_result; 1800 180 8 ! ! WHILE (size>0) AND (r=ok_result) DO 1810 181 9 ! ! BEGIN 1820 182 10 ! ! ! IF size >= small_data THEN 1830 183 11 ! ! ! BEGIN 1840 184 12 ! ! ! ! IF size < medium_data THEN \f fefpalst 81.05.13. 13.10. page 5 1850 185 13 ! ! ! ! LOCK msg AS d: smallbuf DO WITH d DO 1860 186 14 ! ! ! ! IF (last>=first) AND NOT eoi THEN 1870 187 15 ! ! ! ! BEGIN 1880 188 16 ! ! ! ! ! IF (first>=6) AND (last<=small_max) THEN 1890 189 17 ! ! ! ! ! BEGIN 1900 190 18 ! ! ! ! ! ! controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); 1910 191 19 ! ! ! ! ! END; 1920 192 20 ! ! ! ! END ELSE next:=first ELSE 1930 193 21 ! ! ! ! IF size < large_data THEN 1940 194 22 ! ! ! ! LOCK msg AS d: mediumbuf DO WITH d DO 1950 195 23 ! ! ! ! IF (last>=first) AND NOT eoi THEN 1960 196 24 ! ! ! ! BEGIN 1970 197 25 ! ! ! ! ! IF (first>=6) AND (last<=medium_max) THEN 1980 198 26 ! ! ! ! ! BEGIN 1990 199 27 ! ! ! ! ! ! controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); 2000 200 28 ! ! ! ! ! END; 2010 201 29 ! ! ! ! END ELSE next:=first ELSE 2020 202 30 ! ! ! ! IF size <= max_size THEN 2030 203 31 ! ! ! ! LOCK msg AS d: largebuf DO WITH d DO 2040 204 32 ! ! ! ! IF (last>=first) AND NOT eoi THEN 2050 205 33 ! ! ! ! BEGIN 2060 206 34 ! ! ! ! ! IF (first>=6) AND (last<=large_max) THEN 2070 207 35 ! ! ! ! ! BEGIN 2080 208 36 ! ! ! ! ! ! controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); 2090 209 37 ! ! ! ! ! END; 2100 210 38 ! ! ! ! END ELSE next:=first ELSE r := unintelligible; 2110 211 39 ! ! ! END ELSE r := unintelligible; 2120 212 40 ! ! ! REPEAT pop(m,msg); data:=m^.size<>0; push(m,mw) UNTIL data; 2130 213 41 ! ! ! IF nil(msg) THEN size := 0 ELSE size := msg^.size; 2140 214 42 ! ! END; 2150 215 43 ! ! IF r<>ok_result THEN 2160 216 44 ! ! BEGIN 2170 217 45 ! ! ! set_result(r,0); 2180 218 46 ! ! END ELSE 2190 219 47 ! ! IF NOT eoi THEN 2200 220 48 ! ! BEGIN 2210 221 49 ! ! ! controlclr(repint,dev); 2220 222 50 ! ! ! set_result(soft_error, blocklength_error); 2230 223 51 ! ! END; 2240 224 52 ! ! WHILE NOT nil(mw) DO BEGIN pop(m,mw); push(m,msg) END; 2250 225 53 ! END; 2260 226 54 ! IF own.timer=0 THEN set_result(soft_error, timeout); 2270 227 55 END; 2280 228 2290 229 2300 230 PROCEDURE status_test; \f fefpalst 81.05.13. 13.10. page 6 2310 231 VAR switch : byte; 2320 232 r : integer; 2330 233 BEGIN 2340 234 1 ! CASE s.stp OF 2350 235 2 ! ! 2,3,6,7: set_result(hard_error, disconnected); 2360 236 3 ! ! 4,5: BEGIN 2370 237 4 ! ! ! readram(switch,10); 2380 238 5 ! ! ! IF switch>=128 THEN BEGIN writeram(6,0); writeram(5,1); WHILE true DO END; 2390 239 6 ! ! ! set_result(hard_error, autoload); s.stp:=s.stp-4; status_test; 2400 240 7 ! ! END; 2410 241 8 ! ! 1: set_result(hard_error, reset); 2420 242 9 ! ! 0: BEGIN 2430 243 10 ! ! ! r := s.prty+2*s.ctmo; 2440 244 11 ! ! ! IF r <> 0 THEN 2450 245 12 ! ! ! BEGIN 2460 246 13 ! ! ! ! IF r >= 2 THEN 2470 247 14 ! ! ! ! BEGIN 2480 248 15 ! ! ! ! ! r := r - 2; 2490 249 16 ! ! ! ! ! set_result(soft_error, receiver_not_ready); 2500 250 17 ! ! ! ! END; 2510 251 18 ! ! ! ! IF r = 1 THEN set_result(soft_error, parity); 2520 252 19 ! ! ! END; 2530 253 20 ! ! END; 2540 254 21 ! END; 2550 255 22 END (* procedure test of fpa-status *) ; 2560 256 2570 257 BEGIN 2580 258 1 ! testopen(z,own.incname,op); 2590 259 2 ! testout( z, version, fe_env_version ); 2600 260 3 ! 2610 261 4 ! result:=reservech(dev,level,-1); 2620 262 5 ! IF result<>0 THEN exception(4*16+result); 2630 263 6 ! IF rec THEN 2640 264 7 ! BEGIN 2650 265 8 ! ! alloc(msg,headpool,sem.s^); 2660 266 9 ! ! WITH msg^ DO BEGIN u1:=timeransw; u3:=polltime; u4:=pollexp END; 2670 267 10 ! ! sendtimer(msg); 2680 268 11 ! END; 2690 269 12 ! definetimer(true); 2700 270 13 ! 2710 271 14 ! REPEAT 2720 272 15 ! ! wait(msg,sem.w^); 2730 273 16 ! ! result := ok_result; result_modif := 0; 2740 274 17 ! ! IF resetmode THEN CASE msg^.u1 OF 2750 275 18 ! ! ! sensecom,resetcom,autocom: resetmode:=false; 2760 276 19 ! ! ! timeransw: ; \f fefpalst 81.05.13. 13.10. page 7 2770 277 20 ! ! ! OTHERWISE set_result(rejected, 0); 2780 278 21 ! ! END; 2790 279 22 ! ! IF NOT resetmode THEN 2800 280 23 ! ! BEGIN 2810 281 24 ! ! ! own.timer:=50; 2820 282 25 ! ! ! CASE msg^.u1 OF 2830 283 26 ! ! ! ! sensecom: ; 2840 284 27 ! ! ! ! readcom: CHANNEL dev DO read; 2850 285 28 ! ! ! ! writecom: CHANNEL dev DO write(true); 2860 286 29 ! ! ! ! writereadcom: CHANNEL dev DO 2870 287 30 ! ! ! ! BEGIN 2880 288 31 ! ! ! ! ! write(false); 2890 289 32 ! ! ! ! ! sense(s,0,dev); status_test; 2900 290 33 ! ! ! ! ! IF result=ok_result 2910 291 34 ! ! ! ! ! THEN read ELSE set_result(result, combined_write); 2920 292 35 ! ! ! ! END; 2930 293 36 ! ! ! ! resetcom: control(reset_dev,dev); 2940 294 37 ! ! ! ! autocom: control(auto,dev); 2950 295 38 ! ! ! ! timeransw: ; 2960 296 39 ! ! ! ! OTHERWISE set_result(unintelligible, bad_message); 2970 297 40 ! ! ! END; 2980 298 41 ! ! END; 2990 299 42 ! ! sense(s,0,dev); 3000 300 43 ! ! status_test; 3010 301 44 ! ! WITH msg^ DO IF u1=timeransw THEN 3020 302 45 ! ! BEGIN 3030 303 46 ! ! ! u3:=polltime; u4:=pollexp; sendtimer(msg); 3040 304 47 ! ! END ELSE 3050 305 48 ! ! BEGIN 3060 306 49 ! ! ! u2:=result + result_modif; return(msg); 3070 307 50 ! ! END 3080 308 51 ! UNTIL false; 3090 309 52 END 3100 310 . 3110 311 \f fefpalst 81.05.13. 13.10. page 8 0 9* 17* 43* 45* 46* 47* 48* 66* 80* 111 112 123 161 162 166 174 180 212 213 217 226 238 242: 244 262 273 277 289 299 1 13* 18* 46* 48* 67* 71* 72* 73* 88* 130 134 141 145 152 156 238 241: 251 261 2 14* 19* 35* 36* 37* 68* 75* 76* 77* 78* 112 135 146 157 235: 243 246 248 3 15* 25* 69* 74* 80* 235: 4 10* 30* 80* 236: 239 262 5 12* 38* 39* 40* 80* 236: 238 6 7* 35* 36* 52* 56* 60* 80* 132 143 154 188 197 206 235: 238 7 43* 47* 235: 8 11* 20* 26* 31* 08 34* 10 237 16 21* 27* 262 32 22* 50 281 64 23* 29* 35* 120 36* 128 24* 238 156 7* 256 165 177 1023 45* alloc 265 as 128: 139: 150: 185: 194: 203: auto 67* 294 autocom 11* 275: 294: autoload 29* 239 b 116* 130 141 152 bad_message 31* 296 blocklength_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 23* 222 blocktime 2* boolean 2* 86* 116* 118* 171* byte 52* 56* 60* 91* 231* c 52* 56* 60* 134 145 156 channel 284 285 286 combined_write <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 22* 291 control 95* 293 294 controlclr 94* 165 173 190 199 208 221 ctmo 46* 243 d 128: 128 139: 139 150: 150 185: 185 194: 194 203: 203 data 118* 161= 161 171* 212= 212 \f fefpalst 81.05.13. 13.10. page 9 definetimer 269 dev 84* 93* 94* 95* 96* 97* 134 135 145 146 156 157 165 165 173 176 190 190 199 199 208 208 221 261 284 285 286 289 293 294 299 disconnected 26* 235 eoi 186 195 204 219 exception 262 external 91* 92* 93* 94* 95* 96* 97* false 275 288 308 fe_env_version <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 259 first 51* 55* 59* 131 132 135 142 143 146 153 154 157 186 188 190 192 195 197 199 201 204 206 208 210 fpadriver 1* hard_error 25* 104 235 239 241 headpool 88* 265 i 91* 92* inbyteblock 190 199 208 incname 258 integer 2* 51* 55* 59* 83* 91* 92* 93* 94* 95* 96* 97* 99* 100* 117* 170* 232* inword 96* 176 largebuf 59* 150 203 large_data 77* 138 193 large_max 40* 60* 73* 206 large_size 36* 37* 40* 77* large_top 73* 154 last 51* 55* 59* 130 141 152 186 188 190 195 197 199 204 206 208 level 2* 261 lock 128: 139: 150: 185: 194: 203: m 84* 161 161 161 164 164 212 212 212 224 224 max_data 78* 149 max_size 37* 78* 202 mediumbuf 55* 139 194 medium_data 76* 127 184 medium_max 39* 56* 72* 197 medium_size 35* 39* 76* medium_top 72* 143 min_data 74* 75* 76* 77* 78* modif 99* 108 111 112 113 msg 84* 120 121 128: 135 139: 146 150: 157 161 162 162 164 177 178 185: 190 194: 199 203: 208 212 213 213 224 265 266 267 272 274 282 301 303 306 mw 84* 161 164 164 212 224 224 \f fefpalst 81.05.13. 13.10. page 10 next 51* 55* 59* 130= 131 132 134 135 135 141= 142 143 145 146 146 152= 153 154 156 157 157 190 192= 199 201= 208 210= ok_result 17* 43* 122 123 166 179 180 215 273 290 op 3* 258 outbyteblock 135 146 157 outwordclr 93* 134 145 156 165 own 174 226 258 281 p1 100* 102= 105 110 p2 100* 103= 105 110 parity 20* 251 pollexp 7* 266 303 polltime 7* 266 303 pool 88* pop 161 164 212 224 priority 80* 102 103 priority_table <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 43* 80* process 1* prty 48* 243 push 161 164 212 224 r 117* 122= 123 136= 147= 158= 159= 160= 166 166 170* 179= 180 210= 211= 215 217 232* 243= 244 246 248= 248 251 read 169* 284 291 readcom 13* 284: readram 91* 237 rec 2* 263 receiver_not_ready <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 24* 249 reference 84* 93* 94* 95* 96* 97* rejected 18* 277 repint 68* 165 190 199 208 221 res 99* 102 104 107 reservech 261 reset 27* 241 resetcom 10* 275: 293: resetmode 86* 104= 274 275= 279 reset_dev 66* 293 result 83* 103 107= 261= 262 262 273= 290 291 306 result_modif 83* 108= 112 113= 113 273= 306 return 306 s 85* 97* 234 239 239 243 243 265 289 299 sem 2* 265 272 sempointer 3* sendtimer 267 303 \f fefpalst 81.05.13. 13.10. page 11 sense 97* 289 299 sensecom 9* 275: 283: set_result 99* 166 217 222 226 235 239 241 249 251 277 291 296 size 117* 121= 121 123 125 127 138 149 161 162= 162= 162 170* 178= 178 180 182 184 193 202 212 213= 213= 213 smallbuf 51* 128 185 small_data 75* 125 182 small_max 38* 52* 71* 188 small_size 34* 38* 75* small_top 71* 132 soft_error 19* 222 226 249 251 startread 69* 173 status_test 230* 239 289 300 stp 47* 234 239= 239 stype 44* 85* 97* switch 231* 237 238 testopen 258 testout 259 timeout 21* 226 timer 174 226 281= timeransw 12* 266 276: 295: 301 true 86* 104 238 269 285 ts_pointer 2* u1 266= 274 282 301 u2 306= u3 120 177= 266= 303= u4 266= 303= unintelligible <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30* 43* 136 147 158 159 160 210 211 296 uu1 45* uu2 46* version 6* 259 w 83* 91* 92* 93* 94* 95* 96* 97* 120= 134 134= 145 145= 156 156= 165 176 177 272 wait 272 write 116* 285 288 writecom 14* 285: writeram 92* 238 238 writereadcom 15* 286: z 89* 258 259 zone 89* \f fefpalst 81.05.13. 13.10. page 12 AND 11 ARRAY 4 BEGIN 38 CASE 3 CONST 2 DIV 5 DO 22 ELSE 20 END 45 IF 45 MOD 2 NIL 4 NOT 7 OF 7 OTHERWISE 2 PACKED 5 PROCEDURE 11 RECORD 4 REPEAT 3 THEN 45 TYPE 1 UNTIL 3 VAR 14 WHILE 5 WITH 8 \f jg7 1981.05.13 13.10 fefpa program 81.05.13. 13.10. pascal80 version 1981.04.01 name headline beginline endline appetite(words) set_result 100 102 114 : 7 write 117 120 167 : 15 read 170 173 227 : 16 status_test 231 235 255 : 12 fpadriver 6 258 310 : 115 code: 1 . 138 = 3138 bytes end of PASCAL80 compilation end blocksread = 53 «eof»